Newer
Older
/* Copyright (C) 2020-2021 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
/**
* CbmDeviceMcbmEventSink.h
*
* @since 2020-05-04
* @author P.-A. Loizeau
*/
#ifndef CBMDEVICEMCBMEVTSINK_H_
#define CBMDEVICEMCBMEVTSINK_H_
/// CBM headers
#include "CbmMqTMessage.h"

Pierre-Alain Loizeau
committed
#include "CbmMuchBeamTimeDigi.h"

Pierre-Alain Loizeau
committed
#include "CbmRichDigi.h"

Pierre-Alain Loizeau
committed
#include "CbmTofDigi.h"

Pierre-Alain Loizeau
committed
#include "TimesliceMetaData.h"
/// FAIRROOT headers
#include "FairMQDevice.h"
/// FAIRSOFT headers (geant, boost, ...)
#include "Rtypes.h"
#include "TClonesArray.h"

Pierre-Alain Loizeau
committed
/// C/C++ headers
#include <chrono>

Pierre-Alain Loizeau
committed
class TFile;
class TList;
class TClonesArray;
//class TimesliceMetaData;
class FairRunOnline;
class FairRootManager;
class CbmUnpackedTimeslice {
/// TODO: rename to CbmTsWithEvents
public:
CbmUnpackedTimeslice(FairMQParts& parts);

Pierre-Alain Loizeau
committed
~CbmUnpackedTimeslice();
std::vector<CbmStsDigi> fvDigiSts;
std::vector<CbmMuchBeamTimeDigi> fvDigiMuch;
std::vector<CbmTrdDigi> fvDigiTrd;
std::vector<CbmTofDigi> fvDigiTof;
std::vector<CbmRichDigi> fvDigiRich;
std::vector<CbmPsdDigi> fvDigiPsd;
TClonesArray fEventsArray;

Pierre-Alain Loizeau
committed
};
class CbmDeviceMcbmEventSink : public FairMQDevice {
public:
CbmDeviceMcbmEventSink();
virtual ~CbmDeviceMcbmEventSink();
protected:
virtual void InitTask();
bool HandleMissTsData(FairMQMessagePtr&, int);
bool HandleData(FairMQParts&, int);
bool HandleCommand(FairMQMessagePtr&, int);
private:
/// Constants
/// Control flags
Bool_t fbFillHistos = kFALSE; //! Switch ON/OFF filling of histograms
Bool_t fbFinishDone = kFALSE; //! Keep track of whether the Finish was already called
/// User settings parameters
/// Algo enum settings
std::string fsOutputFileName = "mcbm_digis_events.root";
/// message queues
std::string fsChannelNameMissedTs = "missedts";
std::string fsChannelNameDataInput = "events";
std::string fsChannelNameCommands = "commands";
std::string fsChannelNameHistosInput = "histogram-in";
std::string fsChannelNameHistosConfig = "histo-conf";
std::string fsChannelNameCanvasConfig = "canvas-conf";
/// Histograms management
uint32_t fuPublishFreqTs = 100;
double_t fdMinPublishTime = 0.5;
double_t fdMaxPublishTime = 5.0;
/// List of MQ channels names
std::vector<std::string> fsAllowedChannels = {fsChannelNameDataInput};
/// Parameters management
// TList* fParCList = nullptr;
// Bool_t InitParameters( TList* fParCList );
/// Statistics & missed TS detection
uint64_t fuPrevTsIndex = 0;
uint64_t fulNumMessages = 0;
uint64_t fulTsCounter = 0;
uint64_t fulMissedTsCounter = 0;
std::chrono::system_clock::time_point fLastPublishTime = std::chrono::system_clock::now();
/// Control Commands reception
bool fbReceivedEof = false;
uint64_t fuLastTsIndex = 0;
uint64_t fuTotalTsCount = 0;
/// Data reception
/// Event (TS) header
// FairEventHeader* fEvtHeader;
/// TS MetaData storage
TClonesArray* fTimeSliceMetaDataArray = nullptr; //!
TimesliceMetaData* fTsMetaData = nullptr;
/// Digis storage
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
std::vector<CbmStsDigi>* fvDigiSts = nullptr;
std::vector<CbmMuchBeamTimeDigi>* fvDigiMuch = nullptr;
std::vector<CbmTrdDigi>* fvDigiTrd = nullptr;
std::vector<CbmTofDigi>* fvDigiTof = nullptr;
std::vector<CbmRichDigi>* fvDigiRich = nullptr;
std::vector<CbmPsdDigi>* fvDigiPsd = nullptr;
/// CbmEvents
TClonesArray* fEventsArray = nullptr; //! output container of CbmEvents
// std::vector< CbmEvent * > & fEventVector; //! vector with all created events
/// Storage for re-ordering
/// Missed TS vector
std::vector<uint64_t> fvulMissedTsIndices = {};
/// Buffered TS
std::map<uint64_t, CbmUnpackedTimeslice> fmFullTsStorage = {};
/// Data storage
FairRunOnline* fpRun = nullptr;
FairRootManager* fpFairRootMgr = nullptr;
/// Array of histograms to send to the histogram server
TObjArray fArrayHisto = {};
/// Vector of string pairs with ( HistoName, FolderPath ) to send to the histogram server
std::vector<std::pair<std::string, std::string>> fvpsHistosFolder = {};
/// Vector of string pairs with ( CanvasName, CanvasConfig ) to send to the histogram server
/// Format of Can config is "NbPadX(U);NbPadY(U);ConfigPad1(s);....;ConfigPadXY(s)"
/// Format of Pad config is "GrixX(b),GridY(b),LogX(b),LogY(b),LogZ(b),HistoName(s),DrawOptions(s)"
std::vector<std::pair<std::string, std::string>> fvpsCanvasConfig = {};
/// Internal methods
bool IsChannelNameAllowed(std::string channelName);
// Bool_t InitContainers();
void CheckTsQueues();
void PrepareTreeEntry(CbmUnpackedTimeslice unpTs);
void DumpTreeEntry();
bool SendHistograms();
void Finish();

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