26#include "FairMQLogger.h"
27#include "FairMQProgOptions.h"
28#include "FairParGenericSet.h"
29#include "FairRunOnline.h"
31#include "BoostSerializer.h"
33#include "RootSerializer.h"
42#include <boost/archive/binary_iarchive.hpp>
43#include <boost/serialization/utility.hpp>
51 using std::runtime_error::runtime_error;
61 LOG(info) <<
"Init options for CbmDeviceBuildDigiEvents.";
65 fsEvtOverMode = fConfig->GetValue<std::string>(
"EvtOverMode");
66 fsRefDet = fConfig->GetValue<std::string>(
"RefDet");
67 fvsAddDet = fConfig->GetValue<std::vector<std::string>>(
"AddDet");
68 fvsDelDet = fConfig->GetValue<std::vector<std::string>>(
"DelDet");
69 fvsSetTrigWin = fConfig->GetValue<std::vector<std::string>>(
"SetTrigWin");
70 fvsSetTrigMinNb = fConfig->GetValue<std::vector<std::string>>(
"SetTrigMinNb");
71 fvsSetTrigMaxNb = fConfig->GetValue<std::vector<std::string>>(
"SetTrigMaxNb");
95 int noChannel = fChannels.size();
96 LOG(info) <<
"Number of defined channels: " << noChannel;
97 for (
auto const& entry : fChannels) {
98 LOG(info) <<
"Channel name: " << entry.first;
123 LOG(info) <<
"CbmDeviceBuildDigiEvents::InitTask => Trying to change "
124 "reference to unsupported detector, ignored! "
129 for (std::vector<std::string>::iterator itStrAdd =
fvsAddDet.begin();
137 LOG(info) <<
"CbmDeviceBuildDigiEvents::InitTask => Trying to add "
138 "unsupported detector, ignored! "
145 for (std::vector<std::string>::iterator itStrRem =
fvsDelDet.begin();
153 LOG(info) <<
"CbmDeviceBuildDigiEvents::InitTask => Trying to remove "
154 "unsupported detector, ignored! "
161 for (std::vector<std::string>::iterator itStrTrigWin =
fvsSetTrigWin.begin();
164 size_t charPosDel = (*itStrTrigWin).find(
',');
165 if (std::string::npos == charPosDel) {
167 <<
"CbmDeviceBuildDigiEvents::InitTask => "
168 <<
"Trying to set trigger window with invalid option pattern, ignored! "
169 <<
" (Should be ECbmModuleId,dWinBeg,dWinEnd but instead found "
170 << (*itStrTrigWin) <<
" )";
175 std::string sSelDet = (*itStrTrigWin).substr(0, charPosDel);
179 <<
"CbmDeviceBuildDigiEvents::InitTask => "
180 <<
"Trying to set trigger window for unsupported detector, ignored! "
187 std::string sNext = (*itStrTrigWin).substr(charPosDel);
188 charPosDel = sNext.find(
',');
189 if (std::string::npos == charPosDel) {
191 <<
"CbmDeviceBuildDigiEvents::InitTask => "
192 <<
"Trying to set trigger window with invalid option pattern, ignored! "
193 <<
" (Should be ECbmModuleId,dWinBeg,dWinEnd but instead found "
194 << (*itStrTrigWin) <<
" )";
197 Double_t dWinBeg = std::stod(sNext.substr(0, charPosDel));
201 Double_t dWinEnd = std::stod(sNext.substr(charPosDel));
207 for (std::vector<std::string>::iterator itStrMinNb =
fvsSetTrigMinNb.begin();
210 size_t charPosDel = (*itStrMinNb).find(
',');
211 if (std::string::npos == charPosDel) {
213 <<
"CbmDeviceBuildDigiEvents::InitTask => "
214 <<
"Trying to set trigger min Nb with invalid option pattern, ignored! "
215 <<
" (Should be ECbmModuleId,uMinNb but instead found " << (*itStrMinNb)
221 std::string sSelDet = (*itStrMinNb).substr(0, charPosDel);
225 <<
"CbmDeviceBuildDigiEvents::InitTask => "
226 <<
"Trying to set trigger min Nb for unsupported detector, ignored! "
233 UInt_t uMinNb = std::stoul((*itStrMinNb).substr(charPosDel));
239 for (std::vector<std::string>::iterator itStrMaxNb =
fvsSetTrigMaxNb.begin();
242 size_t charPosDel = (*itStrMaxNb).find(
',');
243 if (std::string::npos == charPosDel) {
245 <<
"CbmDeviceBuildDigiEvents::InitTask => "
246 <<
"Trying to set trigger Max Nb with invalid option pattern, ignored! "
247 <<
" (Should be ECbmModuleId,uMaxNb but instead found " << (*itStrMaxNb)
253 std::string sSelDet = (*itStrMaxNb).substr(0, charPosDel);
257 <<
"CbmDeviceBuildDigiEvents::InitTask => "
258 <<
"Trying to set trigger Max Nb for unsupported detector, ignored! "
265 Int_t iMaxNb = std::stol((*itStrMaxNb).substr(charPosDel));
273 ++itStrMinLayersNb) {
274 size_t charPosDel = (*itStrMinLayersNb).find(
',');
275 if (std::string::npos == charPosDel) {
277 <<
"CbmDeviceBuildDigiEvents::InitTask => "
278 <<
"Trying to set trigger min layers Nb with invalid option pattern, ignored! "
279 <<
" (Should be ECbmModuleId,uMinLayersNb but instead found " << (*itStrMinLayersNb)
285 std::string sSelDet = (*itStrMinLayersNb).substr(0, charPosDel);
289 <<
"CbmDeviceBuildDigiEvents::InitTask => "
290 <<
"Trying to set trigger min layers Nb for unsupported detector, ignored! "
297 UInt_t uMinLayersNb = std::stoul((*itStrMinLayersNb).substr(charPosDel));
305 ++itStrHistMaxDigi) {
306 size_t charPosDel = (*itStrHistMaxDigi).find(
',');
307 if (std::string::npos == charPosDel) {
309 <<
"CbmDeviceBuildDigiEvents::InitTask => "
310 <<
"Trying to set Histos max Digi nb with invalid option pattern, ignored! "
311 <<
" (Should be ECbmModuleId,dMaxDigiNb but instead found " << (*itStrHistMaxDigi)
317 std::string sSelDet = (*itStrHistMaxDigi).substr(0, charPosDel);
321 <<
"CbmDeviceBuildDigiEvents::InitTask => "
322 <<
"Trying to set Histos max Digi nb for unsupported detector, ignored! "
329 Double_t dHistMaxDigiNb = std::stod((*itStrHistMaxDigi).substr(charPosDel));
331 LOG(debug) <<
"set Histos max Digi nb to " << dHistMaxDigiNb;
339 fvDigiBmon =
new std::vector<CbmBmonDigi>(1000000);
340 fvDigiSts =
new std::vector<CbmStsDigi>(1000000);
341 fvDigiMuch =
new std::vector<CbmMuchDigi>(1000000);
342 fvDigiTrd =
new std::vector<CbmTrdDigi>(1000000);
343 fvDigiTof =
new std::vector<CbmTofDigi>(1000000);
344 fvDigiRich =
new std::vector<CbmRichDigi>(1000000);
345 fvDigiPsd =
new std::vector<CbmPsdDigi>(1000000);
375 LOG(error) << e.what();
383 std::size_t pos1 = channelName.find(entry);
384 if (pos1 != std::string::npos) {
385 const vector<std::string>::const_iterator
pos =
388 LOG(info) <<
"Found " << entry <<
" in " << channelName;
389 LOG(info) <<
"Channel name " << channelName <<
" found in list of allowed channel names at position " << idx;
393 LOG(info) <<
"Channel name " << channelName <<
" not found in list of allowed channel names.";
394 LOG(error) <<
"Stop device.";
448 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
453 std::pair<std::string, std::string> psHistoConfig(vHistos[uHisto].
first->GetName(), vHistos[uHisto].second);
456 LOG(info) <<
"Config of hist " << psHistoConfig.first.data() <<
" in folder " << psHistoConfig.second.data();
462 for (UInt_t uCanv = 0; uCanv < vCanvases.size(); ++uCanv) {
465 std::string sCanvName = (vCanvases[uCanv].first)->GetName();
468 std::pair<std::string, std::string> psCanvConfig(sCanvName, sCanvConf);
472 LOG(info) <<
"Config string of Canvas " << psCanvConfig.first.data() <<
" is " << psCanvConfig.second.data();
482 LOG(debug) <<
"Received message number " <<
fulNumMessages <<
" with " << parts.Size() <<
" parts"
483 <<
", size0: " << parts.At(0)->GetSize();
488 uint32_t uPartIdx = 0;
496 if (0 < (parts.At(uPartIdx))->GetSize()) {
497 std::string msgStrBmon(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
498 std::istringstream issBmon(msgStrBmon);
499 boost::archive::binary_iarchive inputArchiveBmon(issBmon);
505 if (0 < (parts.At(uPartIdx))->GetSize()) {
506 std::string msgStrSts(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
507 std::istringstream issSts(msgStrSts);
508 boost::archive::binary_iarchive inputArchiveSts(issSts);
514 if (0 < (parts.At(uPartIdx))->GetSize()) {
515 std::string msgStrMuch(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
516 std::istringstream issMuch(msgStrMuch);
517 boost::archive::binary_iarchive inputArchiveMuch(issMuch);
523 if (0 < (parts.At(uPartIdx))->GetSize()) {
524 std::string msgStrTrd(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
525 std::istringstream issTrd(msgStrTrd);
526 boost::archive::binary_iarchive inputArchiveTrd(issTrd);
532 if (0 < (parts.At(uPartIdx))->GetSize()) {
533 std::string msgStrTof(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
534 std::istringstream issTof(msgStrTof);
535 boost::archive::binary_iarchive inputArchiveTof(issTof);
541 if (0 < (parts.At(uPartIdx))->GetSize()) {
542 std::string msgStrRich(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
543 std::istringstream issRich(msgStrRich);
544 boost::archive::binary_iarchive inputArchiveRich(issRich);
550 if (0 < (parts.At(uPartIdx))->GetSize()) {
551 std::string msgStrPsd(
static_cast<char*
>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize());
552 std::istringstream issPsd(msgStrPsd);
553 boost::archive::binary_iarchive inputArchivePsd(issPsd);
560 RootSerializer().Deserialize(*parts.At(uPartIdx),
fTsMetaData);
565 LOG(debug) <<
"Bmon Vector size: " <<
fvDigiBmon->size();
566 LOG(debug) <<
"STS Vector size: " <<
fvDigiSts->size();
567 LOG(debug) <<
"MUCH Vector size: " <<
fvDigiMuch->size();
568 LOG(debug) <<
"TRD Vector size: " <<
fvDigiTrd->size();
569 LOG(debug) <<
"TOF Vector size: " <<
fvDigiTof->size();
570 LOG(debug) <<
"RICH Vector size: " <<
fvDigiRich->size();
571 LOG(debug) <<
"PSD Vector size: " <<
fvDigiPsd->size();
611 std::chrono::system_clock::time_point currentTime = std::chrono::system_clock::now();
612 std::chrono::duration<double_t> elapsedSeconds = currentTime -
fLastPublishTime;
635 LOG(debug) <<
"Vector size: " << vEvents.size();
636 std::vector<CbmEvent> vOutEvents;
638 LOG(debug) <<
"Vector ptr: " <<
event->ToString();
639 vOutEvents.push_back(std::move(*event));
640 LOG(debug) <<
"Vector obj: " << vOutEvents[(vOutEvents.size()) - 1].ToString();
645 FairMQMessagePtr message(NewMessage());
647 RootSerializer().Serialize(*message, &(vOutEvents));
657 FairMQParts partsOut(std::move(partsIn));
658 partsOut.AddPart(std::move(message));
682 LOG(debug) <<
"In Vector size: " << vEvents.size();
683 std::vector<CbmDigiEvent> vOutEvents;
684 vOutEvents.reserve(vEvents.size());
687 selEvent.
fTime =
event->GetStartTime();
688 selEvent.
fNumber =
event->GetNumber();
697 event->SortIndices();
765 vOutEvents.push_back(std::move(selEvent));
768 LOG(debug) <<
"Out Vector size: " << vEvents.size();
770 std::stringstream ossEvt;
771 boost::archive::binary_oarchive oaEvt(ossEvt);
773 std::string* strMsgEvt =
new std::string(ossEvt.str());
774 FairMQMessagePtr message(NewMessage(
775 const_cast<char*
>(strMsgEvt->c_str()),
777 [](
void*,
void*
object) { delete static_cast<std::string*>(object); },
779 LOG(debug) <<
"Serializing done";
783 FairMQParts partsOut;
784 partsOut.AddPart(std::move(partsIn.At(0)));
785 partsOut.AddPart(std::move(partsIn.At(partsIn.Size() - 1)));
786 partsOut.AddPart(std::move(message));
787 LOG(debug) <<
"Message preparation done";
803 FairMQMessagePtr messageHeader(NewMessage());
805 BoostSerializer<std::pair<uint32_t, uint32_t>>().Serialize(*messageHeader, pairHeader);
806 FairMQParts partsOut;
807 partsOut.AddPart(std::move(messageHeader));
811 FairMQMessagePtr messageHist(NewMessage());
813 BoostSerializer<std::pair<std::string, std::string>>().Serialize(*messageHist,
fvpsHistosFolder[uHisto]);
814 partsOut.AddPart(std::move(messageHist));
820 FairMQMessagePtr messageHist(NewMessage());
821 partsOut.AddPart(std::move(messageHist));
826 FairMQMessagePtr messageCan(NewMessage());
828 BoostSerializer<std::pair<std::string, std::string>>().Serialize(*messageCan,
fvpsCanvasConfig[uCanv]);
829 partsOut.AddPart(std::move(messageCan));
835 FairMQMessagePtr messageHist(NewMessage());
836 partsOut.AddPart(std::move(messageHist));
840 FairMQMessagePtr msgHistos(NewMessage());
842 RootSerializer().Serialize(*msgHistos, &
fArrayHisto);
843 partsOut.AddPart(std::move(msgHistos));
847 LOG(error) <<
"CbmTsConsumerReqDevExample::SendHistoConfAndData => Problem sending data";
860 FairMQMessagePtr message(NewMessage());
862 RootSerializer().Serialize(*message, &
fArrayHisto);
865 LOG(error) <<
"Problem sending data";
static const RawEventBuilderDetector kRawEventBuilderDetSts
Pre-defined detector types.
static const RawEventBuilderDetector kRawEventBuilderDetTrd2D
static const RawEventBuilderDetector kRawEventBuilderDetBmon
static const RawEventBuilderDetector kRawEventBuilderDetTrd
static const RawEventBuilderDetector kRawEventBuilderDetPsd
static const RawEventBuilderDetector kRawEventBuilderDetRich
static const RawEventBuilderDetector kRawEventBuilderDetTof
static const RawEventBuilderDetector kRawEventBuilderDetMuch
static const RawEventBuilderDetector kRawEventBuilderDetUndef
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kTrd2d
TRD-FASP Detector (FIXME)
@ kMuch
Muon detection system.
@ kRich
Ring-Imaging Cherenkov Detector.
void SetFillHistos(Bool_t var)
void SetEventOverlapMode(EOverlapModeRaw mode)
Control flags.
void SetTimeSliceMetaDataArray(TClonesArray *TimeSliceMetaDataArray)
std::vector< std::pair< TNamed *, std::string > > GetHistoVector()
void SetHistogramMaxDigiNb(ECbmModuleId selDet, Double_t dDigiNbMax)
void SetIgnoreTsOverlap(Bool_t bFlagIn=kTRUE)
std::vector< std::pair< TCanvas *, std::string > > GetCanvasVector()
void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength)
void RemoveDetector(RawEventBuilderDetector selDet)
void AddDetector(ECbmModuleId selDet, ECbmDataType dataTypeIn, std::string sNameIn, UInt_t uTriggerMinDigisIn=0, Int_t iTriggerMaxDigisIn=-1, Double_t fdTimeWinBegIn=-100, Double_t fdTimeWinEndIn=100)
std::vector< CbmEvent * > & GetEventVector()
Data output access.
void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
void ResetHistograms(Bool_t bResetTime=kTRUE)
void SetTriggerMinLayersNumber(ECbmModuleId selDet, UInt_t uVal)
void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal)
void SetDigis(std::vector< CbmBmonDigi > *BmonDigis)
Set digi containers.
void SetReferenceDetector(ECbmModuleId refDet, ECbmDataType dataTypeIn, std::string sNameIn, UInt_t uTriggerMinDigisIn=0, Int_t iTriggerMaxDigisIn=-1, Double_t fdTimeWinBegIn=-100, Double_t fdTimeWinEndIn=100)
void SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd)
std::vector< CbmBmonDigi > fDigis
Data vector.
TimesliceMetaData * fTsMetaData
Bool_t fbFillHistos
Ignore data in Overlap part of the TS.
ECbmModuleId GetDetectorId(std::string detName)
Get detector type from string containing name.
std::vector< std::string > fvsSetTrigMinNb
bool SendHistoConfAndData()
std::string fsEvtOverMode
Switch ON/OFF filling of histograms.
std::vector< std::string > fvsAddDet
bool HandleData(FairMQParts &, int)
bool SendDigiEvents(FairMQParts &partsIn)
std::vector< std::string > fvsSetTrigWin
uint32_t fuPublishFreqTs
Histograms management.
std::vector< CbmMuchDigi > * fvDigiMuch
std::vector< std::string > fvsSetTrigMinLayersNb
std::vector< std::string > fvsSetHistMaxDigiNb
CbmAlgoBuildRawEvents * fpAlgo
Processing algos.
std::string fsChannelNameHistosInput
virtual ~CbmDeviceBuildDigiEvents()
std::vector< CbmTrdDigi > * fvDigiTrd
std::vector< CbmPsdDigi > * fvDigiPsd
std::string fsChannelNameDataInput
message queues
std::vector< CbmBmonDigi > * fvDigiBmon
Digis storage.
std::vector< CbmRichDigi > * fvDigiRich
std::string fsChannelNameDataOutput
std::vector< CbmStsDigi > * fvDigiSts
std::vector< std::pair< std::string, std::string > > fvpsCanvasConfig
CbmDeviceBuildDigiEvents()
std::vector< CbmTofDigi > * fvDigiTof
Bool_t fbIgnoreTsOverlap
Constants.
TObjArray fArrayHisto
Array of histograms to send to the histogram server.
std::vector< std::string > fsAllowedChannels
List of MQ channels names.
CbmTsEventHeader * fCbmTsEventHeader
Total size of all MS in a TS, [nanoseconds].
double_t fdMaxPublishTime
std::vector< std::pair< std::string, std::string > > fvpsHistosFolder
Vector of string pairs with ( HistoName, FolderPath ) to send to the histogram server.
TClonesArray * fTimeSliceMetaDataArray
TS MetaData storage.
std::chrono::system_clock::time_point fLastPublishTime
std::vector< std::string > fvsSetTrigMaxNb
uint64_t fulNumMessages
Statistics & first TS rejection.
std::vector< std::string > fvsDelDet
bool fbDoNotSend
I/O control.
bool fbConfigSent
Flag indicating whether the histograms and canvases configurations were already published.
RawEventBuilderDetector GetDetectorBuilderCfg(std::string detName)
Get detector event builder config from string containing name.
bool SendEvents(FairMQParts &partsIn)
double_t fdMinPublishTime
bool IsChannelNameAllowed(std::string channelName)
Check wether an MQ channel name is among those expected for this device.
CbmPsdDigiData fPsd
PSD data.
CbmTrdDigiData fTrd
TRD data.
CbmTofDigiData fTof
TOF data.
CbmStsDigiData fSts
STS data.
CbmRichDigiData fRich
RICH data.
CbmMuchDigiData fMuch
MUCH data.
CbmBmonDigiData fBmon
Beam monitor data.
Collection of digis from all detector systems within one event.
double fTime
Event trigger time [ns].
CbmDigiData fData
Event data.
uint64_t fNumber
Event identifier.
Class characterising one event by a collection of links (indices) to data objects,...
std::vector< CbmMuchDigi > fDigis
Data vector.
std::vector< CbmPsdDigi > fDigis
Data vector.
std::vector< CbmRichDigi > fDigis
Data vector.
std::vector< CbmStsDigi > fDigis
Data vector.
std::vector< CbmTofDigi > fDigis
Data vector.
std::vector< CbmTrdDigi > fDigis
Data vector.
void ChangeState(FairMQDevice *device, cbm::mq::Transition transition)