Newer
Older
/* Copyright (C) 2020 Facility for Antiproton and Ion Research in Europe, Darmstadt
SPDX-License-Identifier: GPL-3.0-only
Authors: Pierre-Alain Loizeau [committer] */

Pierre-Alain Loizeau
committed
/**
* CbmDeviceMcbmUnpack.h
*
* @since 2020-05-04
* @author P.-A. Loizeau
*/
#ifndef CBMDEVICEMCBMUNPACK_H_
#define CBMDEVICEMCBMUNPACK_H_
#include "CbmMqTMessage.h"

Pierre-Alain Loizeau
committed
#include "Timeslice.hpp"

Pierre-Alain Loizeau
committed
#include "Rtypes.h"
#include "TObjArray.h"
#include <map>

Pierre-Alain Loizeau
committed
class TList;
class CbmMcbm2018UnpackerAlgoSts;
class CbmMcbm2018UnpackerAlgoMuch;
class CbmMcbm2018UnpackerAlgoTrdR;
class CbmMcbm2018UnpackerAlgoTof;
class CbmMcbm2018UnpackerAlgoRich;
class CbmMcbm2018UnpackerAlgoPsd;
class TimesliceMetaData;
class CbmDeviceMcbmUnpack : public FairMQDevice {
public:
CbmDeviceMcbmUnpack();
virtual ~CbmDeviceMcbmUnpack();
protected:
virtual void InitTask();
bool HandleData(FairMQMessagePtr&, int);
bool HandleCommand(FairMQMessagePtr&, int);
private:
/// Constants
static const uint16_t kusSysIdSts = 0x10;
static const uint16_t kusSysIdMuch = 0x50;
static const uint16_t kusSysIdTrd = 0x40;
static const uint16_t kusSysIdTof = 0x60;
static const uint16_t kusSysIdRich = 0x30;
static const uint16_t kusSysIdPsd = 0x80;
/// Control flags
Bool_t fbIgnoreOverlapMs = false; //! Ignore Overlap Ms: all fuOverlapMsNb MS at the end of timeslice
Bool_t fbComponentsAddedToList = kFALSE;
/// User settings parameters
std::string fsChannelNameDataInput = "fullts";
std::string fsChannelNameDataOutput = "unpts_0";
std::string fsChannelNameCommands = "commands";
UInt_t fuDigiMaskId = 0x0001FFFF;
/// List of MQ channels names
std::vector<std::string> fsAllowedChannels = {fsChannelNameDataInput};
/// Parameters management
// TList* fParCList = nullptr;
Bool_t InitParameters(TList* fParCList);
/// Statistics & first TS rejection
uint64_t fulNumMessages = 0;
uint64_t fulTsCounter = 0;
/// Processing algos
CbmMcbm2018UnpackerAlgoSts* fUnpAlgoSts = nullptr;
CbmMcbm2018UnpackerAlgoMuch* fUnpAlgoMuch = nullptr;
CbmMcbm2018UnpackerAlgoTrdR* fUnpAlgoTrd = nullptr;
CbmMcbm2018UnpackerAlgoTof* fUnpAlgoTof = nullptr;
CbmMcbm2018UnpackerAlgoRich* fUnpAlgoRich = nullptr;
CbmMcbm2018UnpackerAlgoPsd* fUnpAlgoPsd = nullptr;
/// Time offsets
std::vector<std::string> fvsSetTimeOffs = {};
/// TS MetaData storage
size_t fuNbCoreMsPerTs = 0; //!
size_t fuNbOverMsPerTs = 0; //!
Double_t fdMsSizeInNs = 1280000; //! Size of a single MS, [nanoseconds]
Double_t fdTsCoreSizeInNs = -1.0; //! Total size of the core MS in a TS, [nanoseconds]
Double_t fdTsOverSizeInNs = -1.0; //! Total size of the overlap MS in a TS, [nanoseconds]
Double_t fdTsFullSizeInNs = -1.0; //! Total size of all MS in a TS, [nanoseconds]
TimesliceMetaData* fTsMetaData;
bool IsChannelNameAllowed(std::string channelName);
Bool_t InitContainers();
Bool_t DoUnpack(const fles::Timeslice& ts, size_t component);
void Finish();
bool SendUnpData();

Pierre-Alain Loizeau
committed
};
#endif /* CBMDEVICEMCBMUNPACK_H_ */