CbmRoot
Loading...
Searching...
No Matches
CbmDeviceBuildDigiEvents.cxx
Go to the documentation of this file.
1/* Copyright (C) 2021 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau[committer] */
4
13
15#include "CbmDigiEvent.h"
16#include "CbmEvent.h"
17#include "CbmFlesCanvasTools.h"
18#include "CbmMQDefs.h"
19#include "CbmMatch.h"
20#include "CbmMvdDigi.h"
21#include "CbmTsEventHeader.h"
22
23#include "TimesliceMetaData.h"
24
26#include "FairMQLogger.h"
27#include "FairMQProgOptions.h" // device->fConfig
28#include "FairParGenericSet.h"
29#include "FairRunOnline.h"
30
31#include "BoostSerializer.h"
32
33#include "RootSerializer.h"
34
36#include "TCanvas.h"
37#include "TFile.h"
38#include "TH1.h"
39#include "TList.h"
40#include "TNamed.h"
41
42#include <boost/archive/binary_iarchive.hpp>
43#include <boost/serialization/utility.hpp>
44
46#include <array>
47#include <iomanip>
48#include <stdexcept>
49#include <string>
50struct InitTaskError : std::runtime_error {
51 using std::runtime_error::runtime_error;
52};
53
54using namespace std;
55
57
59try {
61 LOG(info) << "Init options for CbmDeviceBuildDigiEvents.";
62 fbFillHistos = fConfig->GetValue<bool>("FillHistos");
63 fbIgnoreTsOverlap = fConfig->GetValue<bool>("IgnOverMs");
64
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");
72 fvsSetTrigMinLayersNb = fConfig->GetValue<std::vector<std::string>>("SetTrigMinLayersNb");
73 fvsSetHistMaxDigiNb = fConfig->GetValue<std::vector<std::string>>("SetHistMaxDigiNb");
74
75 fbDoNotSend = fConfig->GetValue<bool>("DoNotSend");
76 fbDigiEventOutput = fConfig->GetValue<bool>("DigiEventOutput");
77 fsChannelNameDataInput = fConfig->GetValue<std::string>("TsNameIn");
78 fsChannelNameDataOutput = fConfig->GetValue<std::string>("EvtNameOut");
79 fsChannelNameHistosInput = fConfig->GetValue<std::string>("ChNameIn");
81
82 fuPublishFreqTs = fConfig->GetValue<uint32_t>("PubFreqTs");
83 fdMinPublishTime = fConfig->GetValue<double_t>("PubTimeMin");
84 fdMaxPublishTime = fConfig->GetValue<double_t>("PubTimeMax");
85
86 // Get the information about created channels from the device
87 // Check if the defined channels from the topology (by name)
88 // are in the list of channels which are possible/allowed
89 // for the device
90 // The idea is to check at initilization if the devices are
91 // properly connected. For the time beeing this is done with a
92 // nameing convention. It is not avoided that someone sends other
93 // data on this channel.
94 //logger::SetLogLevel("INFO");
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;
99 if (std::string::npos != entry.first.find(fsChannelNameDataInput)) {
100 if (!IsChannelNameAllowed(entry.first)) throw InitTaskError("Channel name does not match.");
101 OnData(entry.first, &CbmDeviceBuildDigiEvents::HandleData);
102 }
103 }
104
106 /* clang-format off */
107
113 : ("MergeOverlap" == fsEvtOverMode ? EOverlapModeRaw::MergeOverlap
114 : ("AllowOverlap" == fsEvtOverMode ? EOverlapModeRaw::AllowOverlap
119 if (kRawEventBuilderDetUndef != refDet) {
121 }
122 else {
123 LOG(info) << "CbmDeviceBuildDigiEvents::InitTask => Trying to change "
124 "reference to unsupported detector, ignored! "
125 << fsRefDet;
126 }
127
129 for (std::vector<std::string>::iterator itStrAdd = fvsAddDet.begin();
130 itStrAdd != fvsAddDet.end();
131 ++itStrAdd) {
133 if (kRawEventBuilderDetUndef != addDet) {
134 fpAlgo->AddDetector(addDet);
135 }
136 else {
137 LOG(info) << "CbmDeviceBuildDigiEvents::InitTask => Trying to add "
138 "unsupported detector, ignored! "
139 << (*itStrAdd);
140 continue;
141 }
142 }
143
145 for (std::vector<std::string>::iterator itStrRem = fvsDelDet.begin();
146 itStrRem != fvsDelDet.end();
147 ++itStrRem) {
149 if (kRawEventBuilderDetUndef != remDet) {
150 fpAlgo->RemoveDetector(remDet);
151 }
152 else {
153 LOG(info) << "CbmDeviceBuildDigiEvents::InitTask => Trying to remove "
154 "unsupported detector, ignored! "
155 << (*itStrRem);
156 continue;
157 }
158 }
159
161 for (std::vector<std::string>::iterator itStrTrigWin = fvsSetTrigWin.begin();
162 itStrTrigWin != fvsSetTrigWin.end();
163 ++itStrTrigWin) {
164 size_t charPosDel = (*itStrTrigWin).find(',');
165 if (std::string::npos == charPosDel) {
166 LOG(info)
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) << " )";
171 continue;
172 }
173
175 std::string sSelDet = (*itStrTrigWin).substr(0, charPosDel);
176 ECbmModuleId selDet = GetDetectorId(sSelDet);
177 if (ECbmModuleId::kNotExist == selDet) {
178 LOG(info)
179 << "CbmDeviceBuildDigiEvents::InitTask => "
180 << "Trying to set trigger window for unsupported detector, ignored! "
181 << sSelDet;
182 continue;
183 }
184
186 charPosDel++;
187 std::string sNext = (*itStrTrigWin).substr(charPosDel);
188 charPosDel = sNext.find(',');
189 if (std::string::npos == charPosDel) {
190 LOG(info)
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) << " )";
195 continue;
196 }
197 Double_t dWinBeg = std::stod(sNext.substr(0, charPosDel));
198
200 charPosDel++;
201 Double_t dWinEnd = std::stod(sNext.substr(charPosDel));
202
203 fpAlgo->SetTriggerWindow(selDet, dWinBeg, dWinEnd);
204 }
205
207 for (std::vector<std::string>::iterator itStrMinNb = fvsSetTrigMinNb.begin();
208 itStrMinNb != fvsSetTrigMinNb.end();
209 ++itStrMinNb) {
210 size_t charPosDel = (*itStrMinNb).find(',');
211 if (std::string::npos == charPosDel) {
212 LOG(info)
213 << "CbmDeviceBuildDigiEvents::InitTask => "
214 << "Trying to set trigger min Nb with invalid option pattern, ignored! "
215 << " (Should be ECbmModuleId,uMinNb but instead found " << (*itStrMinNb)
216 << " )";
217 continue;
218 }
219
221 std::string sSelDet = (*itStrMinNb).substr(0, charPosDel);
222 ECbmModuleId selDet = GetDetectorId(sSelDet);
223 if (ECbmModuleId::kNotExist == selDet) {
224 LOG(info)
225 << "CbmDeviceBuildDigiEvents::InitTask => "
226 << "Trying to set trigger min Nb for unsupported detector, ignored! "
227 << sSelDet;
228 continue;
229 }
230
232 charPosDel++;
233 UInt_t uMinNb = std::stoul((*itStrMinNb).substr(charPosDel));
234
235 fpAlgo->SetTriggerMinNumber(selDet, uMinNb);
236 }
237
239 for (std::vector<std::string>::iterator itStrMaxNb = fvsSetTrigMaxNb.begin();
240 itStrMaxNb != fvsSetTrigMaxNb.end();
241 ++itStrMaxNb) {
242 size_t charPosDel = (*itStrMaxNb).find(',');
243 if (std::string::npos == charPosDel) {
244 LOG(info)
245 << "CbmDeviceBuildDigiEvents::InitTask => "
246 << "Trying to set trigger Max Nb with invalid option pattern, ignored! "
247 << " (Should be ECbmModuleId,uMaxNb but instead found " << (*itStrMaxNb)
248 << " )";
249 continue;
250 }
251
253 std::string sSelDet = (*itStrMaxNb).substr(0, charPosDel);
254 ECbmModuleId selDet = GetDetectorId(sSelDet);
255 if (ECbmModuleId::kNotExist == selDet) {
256 LOG(info)
257 << "CbmDeviceBuildDigiEvents::InitTask => "
258 << "Trying to set trigger Max Nb for unsupported detector, ignored! "
259 << sSelDet;
260 continue;
261 }
262
264 charPosDel++;
265 Int_t iMaxNb = std::stol((*itStrMaxNb).substr(charPosDel));
266
267 fpAlgo->SetTriggerMaxNumber(selDet, iMaxNb);
268 }
269
271 for (std::vector<std::string>::iterator itStrMinLayersNb = fvsSetTrigMinLayersNb.begin();
272 itStrMinLayersNb != fvsSetTrigMinLayersNb.end();
273 ++itStrMinLayersNb) {
274 size_t charPosDel = (*itStrMinLayersNb).find(',');
275 if (std::string::npos == charPosDel) {
276 LOG(info)
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)
280 << " )";
281 continue;
282 }
283
285 std::string sSelDet = (*itStrMinLayersNb).substr(0, charPosDel);
286 ECbmModuleId selDet = GetDetectorId(sSelDet);
287 if (ECbmModuleId::kNotExist == selDet) {
288 LOG(info)
289 << "CbmDeviceBuildDigiEvents::InitTask => "
290 << "Trying to set trigger min layers Nb for unsupported detector, ignored! "
291 << sSelDet;
292 continue;
293 }
294
296 charPosDel++;
297 UInt_t uMinLayersNb = std::stoul((*itStrMinLayersNb).substr(charPosDel));
298
299 fpAlgo->SetTriggerMinLayersNumber(selDet, uMinLayersNb);
300 }
301
303 for (std::vector<std::string>::iterator itStrHistMaxDigi = fvsSetHistMaxDigiNb.begin();
304 itStrHistMaxDigi != fvsSetHistMaxDigiNb.end();
305 ++itStrHistMaxDigi) {
306 size_t charPosDel = (*itStrHistMaxDigi).find(',');
307 if (std::string::npos == charPosDel) {
308 LOG(info)
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)
312 << " )";
313 continue;
314 }
315
317 std::string sSelDet = (*itStrHistMaxDigi).substr(0, charPosDel);
318 ECbmModuleId selDet = GetDetectorId(sSelDet);
319 if (ECbmModuleId::kNotExist == selDet) {
320 LOG(info)
321 << "CbmDeviceBuildDigiEvents::InitTask => "
322 << "Trying to set Histos max Digi nb for unsupported detector, ignored! "
323 << sSelDet;
324 continue;
325 }
326
328 charPosDel++;
329 Double_t dHistMaxDigiNb = std::stod((*itStrHistMaxDigi).substr(charPosDel));
330
331 LOG(debug) << "set Histos max Digi nb to " << dHistMaxDigiNb;
332 fpAlgo->SetHistogramMaxDigiNb(selDet, dHistMaxDigiNb);
333 }
334
336 /* clang-format on */
337
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);
346
348
357
358 // Mvd currently not implemented in event builder
359 //std::vector<CbmMvdDigi>* pMvdDigi = new std::vector<CbmMvdDigi>();
360
361 fTimeSliceMetaDataArray = new TClonesArray("TimesliceMetaData", 1);
362 if (NULL == fTimeSliceMetaDataArray) { throw InitTaskError("Failed creating the TS meta data TClonesarray "); }
364
366 if (kFALSE == fpAlgo->InitAlgo()) { throw InitTaskError("Failed to initialize the algorithm class."); }
367
369 if (kTRUE == fbFillHistos) {
371 if (kFALSE == InitHistograms()) { throw InitTaskError("Failed to initialize the histograms."); }
372 }
373}
374catch (InitTaskError& e) {
375 LOG(error) << e.what();
376 // Wrapper defined in CbmMQDefs.h to support different FairMQ versions
378}
379
381{
382 for (auto const& entry : fsAllowedChannels) {
383 std::size_t pos1 = channelName.find(entry);
384 if (pos1 != std::string::npos) {
385 const vector<std::string>::const_iterator pos =
386 std::find(fsAllowedChannels.begin(), fsAllowedChannels.end(), entry);
387 const vector<std::string>::size_type idx = pos - fsAllowedChannels.begin();
388 LOG(info) << "Found " << entry << " in " << channelName;
389 LOG(info) << "Channel name " << channelName << " found in list of allowed channel names at position " << idx;
390 return true;
391 }
392 }
393 LOG(info) << "Channel name " << channelName << " not found in list of allowed channel names.";
394 LOG(error) << "Stop device.";
395 return false;
396}
397
399{
401 /* clang-format off */
402 RawEventBuilderDetector cfgDet = ("kBmon" == detName ? kRawEventBuilderDetBmon
403 : ("kSts" == detName ? kRawEventBuilderDetSts
404 : ("kMuch" == detName ? kRawEventBuilderDetMuch
405 : ("kTrd" == detName ? kRawEventBuilderDetTrd
406 : ("kTrd2D" == detName ? kRawEventBuilderDetTrd2D
407 : ("kTof" == detName ? kRawEventBuilderDetTof
408 : ("kRich" == detName ? kRawEventBuilderDetRich
409 : ("kPsd" == detName ? kRawEventBuilderDetPsd
410 : kRawEventBuilderDetUndef))))))));
411 return cfgDet;
413 /* clang-format on */
414}
415
417{
419 /* clang-format off */
420 ECbmModuleId detId = ("kBmon" == detName ? ECbmModuleId::kBmon
421 : ("kSts" == detName ? ECbmModuleId::kSts
422 : ("kMuch" == detName ? ECbmModuleId::kMuch
423 : ("kTrd" == detName ? ECbmModuleId::kTrd
424 : ("kTrd2D" == detName ? ECbmModuleId::kTrd2d
425 : ("kTof" == detName ? ECbmModuleId::kTof
426 : ("kRich" == detName ? ECbmModuleId::kRich
427 : ("kPsd" == detName ? ECbmModuleId::kPsd
428 : ECbmModuleId::kNotExist))))))));
429 return detId;
431 /* clang-format on */
432}
433
434
436{
437 bool initOK = true;
438
440 std::vector<std::pair<TNamed*, std::string>> vHistos = fpAlgo->GetHistoVector();
442 std::vector<std::pair<TCanvas*, std::string>> vCanvases = fpAlgo->GetCanvasVector();
443
448 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
449 // LOG(info) << "Registering " << vHistos[ uHisto ].first->GetName()
450 // << " in " << vHistos[ uHisto ].second.data()
451 // ;
452 fArrayHisto.Add(vHistos[uHisto].first);
453 std::pair<std::string, std::string> psHistoConfig(vHistos[uHisto].first->GetName(), vHistos[uHisto].second);
454 fvpsHistosFolder.push_back(psHistoConfig);
455
456 LOG(info) << "Config of hist " << psHistoConfig.first.data() << " in folder " << psHistoConfig.second.data();
457 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
458
462 for (UInt_t uCanv = 0; uCanv < vCanvases.size(); ++uCanv) {
463 // LOG(info) << "Registering " << vCanvases[ uCanv ].first->GetName()
464 // << " in " << vCanvases[ uCanv ].second.data();
465 std::string sCanvName = (vCanvases[uCanv].first)->GetName();
466 std::string sCanvConf = GenerateCanvasConfigString(vCanvases[uCanv].first);
467
468 std::pair<std::string, std::string> psCanvConfig(sCanvName, sCanvConf);
469
470 fvpsCanvasConfig.push_back(psCanvConfig);
471
472 LOG(info) << "Config string of Canvas " << psCanvConfig.first.data() << " is " << psCanvConfig.second.data();
473 } // for( UInt_t uCanv = 0; uCanv < vCanvases.size(); ++uCanv )
474
475 return initOK;
476}
477
478// handler is called whenever a message arrives on "data", with a reference to the message and a sub-channel index (here 0)
479bool CbmDeviceBuildDigiEvents::HandleData(FairMQParts& parts, int /*index*/)
480{
482 LOG(debug) << "Received message number " << fulNumMessages << " with " << parts.Size() << " parts"
483 << ", size0: " << parts.At(0)->GetSize();
484
485 if (0 == fulNumMessages % 10000) LOG(info) << "Received " << fulNumMessages << " messages";
486
488 uint32_t uPartIdx = 0;
489
491 // Deserialize<RootSerializer>(*parts.At(uPartIdx), fCbmTsEventHeader);
492 RootSerializer().Deserialize(*parts.At(uPartIdx), fCbmTsEventHeader);
493 ++uPartIdx;
494
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);
500 inputArchiveBmon >> *fvDigiBmon;
501 }
502 ++uPartIdx;
503
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);
509 inputArchiveSts >> *fvDigiSts;
510 }
511 ++uPartIdx;
512
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);
518 inputArchiveMuch >> *fvDigiMuch;
519 }
520 ++uPartIdx;
521
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);
527 inputArchiveTrd >> *fvDigiTrd;
528 }
529 ++uPartIdx;
530
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);
536 inputArchiveTof >> *fvDigiTof;
537 }
538 ++uPartIdx;
539
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);
545 inputArchiveRich >> *fvDigiRich;
546 }
547 ++uPartIdx;
548
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);
554 inputArchivePsd >> *fvDigiPsd;
555 }
556 ++uPartIdx;
557
559 // Deserialize<RootSerializer>(*parts.At(uPartIdx), fTsMetaData);
560 RootSerializer().Deserialize(*parts.At(uPartIdx), fTsMetaData);
561 new ((*fTimeSliceMetaDataArray)[fTimeSliceMetaDataArray->GetEntriesFast()])
562 TimesliceMetaData(std::move(*fTsMetaData));
563 ++uPartIdx;
564
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();
572
573 if (1 == fulNumMessages) {
576 }
577
579 fpAlgo->ProcessTs();
580
582 if (!fbDoNotSend) {
583 if (fbDigiEventOutput) {
584 if (!(SendDigiEvents(parts))) return false;
585 }
586 else {
587 if (!(SendEvents(parts))) return false;
588 }
589 }
590
593
595 fvDigiBmon->clear();
596 fvDigiSts->clear();
597 fvDigiMuch->clear();
598 fvDigiTrd->clear();
599 fvDigiTof->clear();
600 fvDigiRich->clear();
601 fvDigiPsd->clear();
602
605
607 if (kTRUE == fbFillHistos) {
611 std::chrono::system_clock::time_point currentTime = std::chrono::system_clock::now();
612 std::chrono::duration<double_t> elapsedSeconds = currentTime - fLastPublishTime;
613 if ((fdMaxPublishTime < elapsedSeconds.count())
614 || (0 == fulNumMessages % fuPublishFreqTs && fdMinPublishTime < elapsedSeconds.count())) {
615 if (!fbConfigSent) {
616 // Send the configuration only once per run!
618 } // if( !fbConfigSent )
619 else
621
622 fLastPublishTime = std::chrono::system_clock::now();
623 } // if( ( fdMaxPublishTime < elapsedSeconds.count() ) || ( 0 == fulNumMessages % fuPublishFreqTs && fdMinPublishTime < elapsedSeconds.count() ) )
624 }
625
626 return true;
627}
628
629bool CbmDeviceBuildDigiEvents::SendEvents(FairMQParts& partsIn)
630{
632 std::vector<CbmEvent*> vEvents = fpAlgo->GetEventVector();
633
635 LOG(debug) << "Vector size: " << vEvents.size();
636 std::vector<CbmEvent> vOutEvents;
637 for (CbmEvent* event : vEvents) {
638 LOG(debug) << "Vector ptr: " << event->ToString();
639 vOutEvents.push_back(std::move(*event));
640 LOG(debug) << "Vector obj: " << vOutEvents[(vOutEvents.size()) - 1].ToString();
641 }
642
645 FairMQMessagePtr message(NewMessage());
646 // Serialize<RootSerializer>(*message, &(vOutEvents));
647 RootSerializer().Serialize(*message, &(vOutEvents));
648 /*
649 std::stringstream ossEvt;
650 boost::archive::binary_oarchive oaEvt(ossEvt);
651 oaEvt << vOutEvents;
652 std::string* strMsgEvt = new std::string(ossEvt.str());
653*/
654
657 FairMQParts partsOut(std::move(partsIn));
658 partsOut.AddPart(std::move(message));
659 /*
660 partsOut.AddPart(NewMessage(
661 const_cast<char*>(strMsgEvt->c_str()), // data
662 strMsgEvt->length(), // size
663 [](void*, void* object) { delete static_cast<std::string*>(object); },
664 strMsgEvt)); // object that manages the data
665*/
666 if (Send(partsOut, fsChannelNameDataOutput) < 0) {
667 LOG(error) << "Problem sending data to " << fsChannelNameDataOutput;
668 return false;
669 }
670
671 vOutEvents.clear();
672
673 return true;
674}
675
677{
679 std::vector<CbmEvent*> vEvents = fpAlgo->GetEventVector();
680
682 LOG(debug) << "In Vector size: " << vEvents.size();
683 std::vector<CbmDigiEvent> vOutEvents;
684 vOutEvents.reserve(vEvents.size());
685 for (CbmEvent* event : vEvents) {
686 CbmDigiEvent selEvent;
687 selEvent.fTime = event->GetStartTime();
688 selEvent.fNumber = event->GetNumber();
689
694
697 event->SortIndices();
698
702 uint32_t uNbDigis =
703 (0 < event->GetNofData(ECbmDataType::kBmonDigi) ? event->GetNofData(ECbmDataType::kBmonDigi) : 0);
704 if (uNbDigis) {
705 auto startIt = fvDigiBmon->begin() + event->GetIndex(ECbmDataType::kBmonDigi, 0);
706 auto stopIt = fvDigiBmon->begin() + event->GetIndex(ECbmDataType::kBmonDigi, uNbDigis - 1);
707 ++stopIt;
708 selEvent.fData.fBmon.fDigis.assign(startIt, stopIt);
709 }
710
712 uNbDigis = (0 < event->GetNofData(ECbmDataType::kStsDigi) ? event->GetNofData(ECbmDataType::kStsDigi) : 0);
713 if (uNbDigis) {
714 auto startIt = fvDigiSts->begin() + event->GetIndex(ECbmDataType::kStsDigi, 0);
715 auto stopIt = fvDigiSts->begin() + event->GetIndex(ECbmDataType::kStsDigi, uNbDigis - 1);
716 ++stopIt;
717 selEvent.fData.fSts.fDigis.assign(startIt, stopIt);
718 }
719
721 uNbDigis = (0 < event->GetNofData(ECbmDataType::kMuchDigi) ? event->GetNofData(ECbmDataType::kMuchDigi) : 0);
722 if (uNbDigis) {
723 auto startIt = fvDigiMuch->begin() + event->GetIndex(ECbmDataType::kMuchDigi, 0);
724 auto stopIt = fvDigiMuch->begin() + event->GetIndex(ECbmDataType::kMuchDigi, uNbDigis - 1);
725 ++stopIt;
726 selEvent.fData.fMuch.fDigis.assign(startIt, stopIt);
727 }
728
730 uNbDigis = (0 < event->GetNofData(ECbmDataType::kTrdDigi) ? event->GetNofData(ECbmDataType::kTrdDigi) : 0);
731 if (uNbDigis) {
732 auto startIt = fvDigiTrd->begin() + event->GetIndex(ECbmDataType::kTrdDigi, 0);
733 auto stopIt = fvDigiTrd->begin() + event->GetIndex(ECbmDataType::kTrdDigi, uNbDigis - 1);
734 ++stopIt;
735 selEvent.fData.fTrd.fDigis.assign(startIt, stopIt);
736 }
737
739 uNbDigis = (0 < event->GetNofData(ECbmDataType::kTofDigi) ? event->GetNofData(ECbmDataType::kTofDigi) : 0);
740 if (uNbDigis) {
741 auto startIt = fvDigiTof->begin() + event->GetIndex(ECbmDataType::kTofDigi, 0);
742 auto stopIt = fvDigiTof->begin() + event->GetIndex(ECbmDataType::kTofDigi, uNbDigis - 1);
743 ++stopIt;
744 selEvent.fData.fTof.fDigis.assign(startIt, stopIt);
745 }
746
748 uNbDigis = (0 < event->GetNofData(ECbmDataType::kRichDigi) ? event->GetNofData(ECbmDataType::kRichDigi) : 0);
749 if (uNbDigis) {
750 auto startIt = fvDigiRich->begin() + event->GetIndex(ECbmDataType::kRichDigi, 0);
751 auto stopIt = fvDigiRich->begin() + event->GetIndex(ECbmDataType::kRichDigi, uNbDigis - 1);
752 ++stopIt;
753 selEvent.fData.fRich.fDigis.assign(startIt, stopIt);
754 }
755
757 uNbDigis = (0 < event->GetNofData(ECbmDataType::kPsdDigi) ? event->GetNofData(ECbmDataType::kPsdDigi) : 0);
758 if (uNbDigis) {
759 auto startIt = fvDigiPsd->begin() + event->GetIndex(ECbmDataType::kPsdDigi, 0);
760 auto stopIt = fvDigiPsd->begin() + event->GetIndex(ECbmDataType::kPsdDigi, uNbDigis - 1);
761 ++stopIt;
762 selEvent.fData.fPsd.fDigis.assign(startIt, stopIt);
763 }
764
765 vOutEvents.push_back(std::move(selEvent));
766 }
767
768 LOG(debug) << "Out Vector size: " << vEvents.size();
770 std::stringstream ossEvt;
771 boost::archive::binary_oarchive oaEvt(ossEvt);
772 oaEvt << vOutEvents;
773 std::string* strMsgEvt = new std::string(ossEvt.str());
774 FairMQMessagePtr message(NewMessage(
775 const_cast<char*>(strMsgEvt->c_str()), // data
776 strMsgEvt->length(), // size
777 [](void*, void* object) { delete static_cast<std::string*>(object); },
778 strMsgEvt)); // object that manages the data
779 LOG(debug) << "Serializing done";
780
783 FairMQParts partsOut;
784 partsOut.AddPart(std::move(partsIn.At(0))); // TsHeader
785 partsOut.AddPart(std::move(partsIn.At(partsIn.Size() - 1))); // TsMetaData
786 partsOut.AddPart(std::move(message)); // DigiEvent vector
787 LOG(debug) << "Message preparation done";
788
789 if (Send(partsOut, fsChannelNameDataOutput) < 0) {
790 LOG(error) << "Problem sending data to " << fsChannelNameDataOutput;
791 return false;
792 }
793
794 vOutEvents.clear();
795
796 return true;
797}
798
800{
802 std::pair<uint32_t, uint32_t> pairHeader(fvpsHistosFolder.size(), fvpsCanvasConfig.size());
803 FairMQMessagePtr messageHeader(NewMessage());
804 // Serialize<BoostSerializer<std::pair<uint32_t, uint32_t>>>(*messageHeader, pairHeader);
805 BoostSerializer<std::pair<uint32_t, uint32_t>>().Serialize(*messageHeader, pairHeader);
806 FairMQParts partsOut;
807 partsOut.AddPart(std::move(messageHeader));
808
809 for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto) {
811 FairMQMessagePtr messageHist(NewMessage());
812 // Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageHist, fvpsHistosFolder[uHisto]);
813 BoostSerializer<std::pair<std::string, std::string>>().Serialize(*messageHist, fvpsHistosFolder[uHisto]);
814 partsOut.AddPart(std::move(messageHist));
815 } // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
816
819 if (0 == fvpsHistosFolder.size()) {
820 FairMQMessagePtr messageHist(NewMessage());
821 partsOut.AddPart(std::move(messageHist));
822 }
823
824 for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
826 FairMQMessagePtr messageCan(NewMessage());
827 // Serialize<BoostSerializer<std::pair<std::string, std::string>>>(*messageCan, fvpsCanvasConfig[uCanv]);
828 BoostSerializer<std::pair<std::string, std::string>>().Serialize(*messageCan, fvpsCanvasConfig[uCanv]);
829 partsOut.AddPart(std::move(messageCan));
830 } // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
831
834 if (0 == fvpsCanvasConfig.size()) {
835 FairMQMessagePtr messageHist(NewMessage());
836 partsOut.AddPart(std::move(messageHist));
837 }
838
840 FairMQMessagePtr msgHistos(NewMessage());
841 // Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
842 RootSerializer().Serialize(*msgHistos, &fArrayHisto);
843 partsOut.AddPart(std::move(msgHistos));
844
846 if (Send(partsOut, fsChannelNameHistosInput) < 0) {
847 LOG(error) << "CbmTsConsumerReqDevExample::SendHistoConfAndData => Problem sending data";
848 return false;
849 } // if( Send( partsOut, fsChannelNameHistosInput ) < 0 )
850
852 fpAlgo->ResetHistograms(kFALSE);
853
854 return true;
855}
856
858{
860 FairMQMessagePtr message(NewMessage());
861 // Serialize<RootSerializer>(*message, &fArrayHisto);
862 RootSerializer().Serialize(*message, &fArrayHisto);
864 if (Send(message, fsChannelNameHistosInput) < 0) {
865 LOG(error) << "Problem sending data";
866 return false;
867 } // if( Send( message, fsChannelNameHistosInput ) < 0 )
868
870 fpAlgo->ResetHistograms(kFALSE);
871
872 return true;
873}
874
876{
879
881 if (fvDigiBmon) fvDigiBmon->clear();
882 if (fvDigiSts) fvDigiSts->clear();
883 if (fvDigiMuch) fvDigiMuch->clear();
884 if (fvDigiTrd) fvDigiTrd->clear();
885 if (fvDigiTof) fvDigiTof->clear();
886 if (fvDigiRich) fvDigiRich->clear();
887 if (fvDigiPsd) fvDigiPsd->clear();
888
892 delete fTsMetaData;
893
895 }
896 if (fpAlgo) delete fpAlgo;
897}
898
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
ECbmModuleId
Definition CbmDefs.h:39
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kNotExist
If not found.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kTrd2d
TRD-FASP Detector (FIXME)
@ kMuch
Muon detection system.
@ kRich
Ring-Imaging Cherenkov Detector.
std::string GenerateCanvasConfigString(TCanvas *pCanv)
bool first
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.
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
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::vector< CbmTrdDigi > * fvDigiTrd
std::vector< CbmPsdDigi > * fvDigiPsd
std::string fsChannelNameDataInput
message queues
std::vector< CbmBmonDigi > * fvDigiBmon
Digis storage.
std::vector< CbmRichDigi > * fvDigiRich
std::vector< CbmStsDigi > * fvDigiSts
std::vector< std::pair< std::string, std::string > > fvpsCanvasConfig
std::vector< CbmTofDigi > * fvDigiTof
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].
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 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)
bool IsChannelNameAllowed(std::string channelName)
Check wether an MQ channel name is among those expected for this device.
CbmPsdDigiData fPsd
PSD data.
Definition CbmDigiData.h:42
CbmTrdDigiData fTrd
TRD data.
Definition CbmDigiData.h:39
CbmTofDigiData fTof
TOF data.
Definition CbmDigiData.h:41
CbmStsDigiData fSts
STS data.
Definition CbmDigiData.h:36
CbmRichDigiData fRich
RICH data.
Definition CbmDigiData.h:38
CbmMuchDigiData fMuch
MUCH data.
Definition CbmDigiData.h:37
CbmBmonDigiData fBmon
Beam monitor data.
Definition CbmDigiData.h:35
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,...
Definition CbmEvent.h:34
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.
uint64_t GetOverlapDuration() const
uint64_t GetDuration() const
void ChangeState(FairMQDevice *device, cbm::mq::Transition transition)
Definition CbmMQDefs.h:26
Hash for CbmL1LinkKey.