CbmRoot
Loading...
Searching...
No Matches
CbmAlgoBuildRawEvents.cxx
Go to the documentation of this file.
1/* Copyright (C) 2020-2024 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer], Dominik Smith, Alexandru Bercuci */
4
6
8#include "CbmBmonDigi.h"
9#include "CbmEvent.h"
10#include "CbmFsdDigi.h"
11#include "CbmMuchBeamTimeDigi.h"
12#include "CbmMuchDigi.h"
13#include "CbmMvdDigi.h"
14#include "CbmPsdDigi.h"
15#include "CbmRichDigi.h"
16#include "CbmStsDigi.h"
17#include "CbmTofDigi.h"
18#include "CbmTrdAddress.h"
19#include "CbmTrdDigi.h"
20#include "TimesliceMetaData.h"
21
23#include <FairRootManager.h>
24#include <FairRunOnline.h>
25#include <Logger.h>
26
28#include <TCanvas.h>
29#include <TClonesArray.h>
30#include <TDirectoryFile.h>
31#include <TH1.h>
32#include <TH2.h>
33#include <THttpServer.h>
34#include <TProfile.h>
35#include <TStopwatch.h>
36
38#include <algorithm>
39
40#define VERBOSE 0
41
42template<>
44
46{
47 LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Starting sequence";
48
49 if (fbGetTimings) {
50 fTimer = new TStopwatch;
51 fTimer->Start();
52 }
53
56 if (fRefDet.detId == ECbmModuleId::kNotExist) {
57 if (fSeedTimes == nullptr) {
58 LOG(fatal) << "No reference detector set and no seed times supplied, stopping there!";
59 }
60 }
61 else {
62 if (fSeedTimes != nullptr) {
63 LOG(fatal) << "Cannot have explicit seed times and reference detector, stopping there!";
64 }
65 if (kFALSE == CheckDataAvailable(fRefDet)) {
66 LOG(fatal) << "Reference detector set but no digi input found, stopping there!";
67 }
68 }
69
71 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
72 if (kFALSE == CheckDataAvailable(*det)) {
73 LOG(fatal) << "No digi input for one of selection detector, stopping there!";
74 }
75 }
76
78 if (fbUseTsMetaData) {
80 LOG(fatal) << "No TS metadata input found"
81 << " => Please check in the unpacking macro if the following line was "
82 "present!"
83 << std::endl
84 << "source->SetWriteOutputFlag(kTRUE); // For writing TS metadata";
85 }
86 }
87 if (fbFillHistos) {
89 }
90 if (fTimer != nullptr) {
91 fTimer->Stop();
92 Double_t rtime = fTimer->RealTime();
93 Double_t ctime = fTimer->CpuTime();
94 LOG(info) << "CbmAlgoBuildRawEvents::Init(): Real time " << rtime << " s, CPU time " << ctime << " s";
95 }
96
97 LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Done";
98 return kTRUE;
99}
100
102{
103 if (fbGetTimings) {
104 PrintTimings();
105 }
106}
107
109{
110 if (fTimer == nullptr) {
111 LOG(fatal) << "Trying to print timings but timer not set";
112 }
113 else {
114 Double_t rtime = fTimer->RealTime();
115 Double_t ctime = fTimer->CpuTime();
116 LOG(info) << "CbmAlgoBuildRawEvents: Real time " << rtime << " s, CPU time " << ctime << " s";
117 }
118}
119
121{
123 int counter = 0;
124 for (CbmEvent* event : fEventVector) {
125 LOG(debug) << "Event " << counter << " has " << event->GetNofData() << " digis";
126 delete event;
127 counter++;
128 }
129 fEventVector.clear();
130}
131
133{
134 LOG_IF(info, fuNrTs % 1000 == 0) << "Begin of TS " << fuNrTs;
135 TStopwatch timerTs;
136 timerTs.Start();
137
138 if (fTimer != nullptr) {
139 fTimer->Start(kFALSE);
140 }
141 InitTs();
143 BuildEvents();
144
146 if (nullptr != fCurrentEvent) {
148 // fCurrentEvent->SetStartTime( fPrevTime ); // Replace Seed time with time of first digi in event?
149 fCurrentEvent->SetEndTime(fdPrevEvtEndTime);
150 if (fbBmonInUse) {
153 }
154 fEventVector.push_back(fCurrentEvent);
155 fuCurEv++;
156
158 fCurrentEvent = nullptr;
159 }
160
161 if (fbFillHistos) {
162 timerTs.Stop();
163 fhCpuTimePerTs->Fill(fuNrTs, timerTs.CpuTime() * 1000.);
164 fhRealTimePerTs->Fill(fuNrTs, timerTs.RealTime() * 1000.);
165 timerTs.Start();
166 }
167
168 LOG(debug) << "Found " << fEventVector.size() << " triggered events";
169 if (fbFillHistos) {
170 FillHistos();
171 }
172 if (fTimer != nullptr) {
173 fTimer->Stop();
174 }
175
176 if (fbFillHistos) {
177 timerTs.Stop();
178 fhCpuTimePerTsHist->Fill(fuNrTs, timerTs.CpuTime() * 1000.);
179 fhRealTimePerTsHist->Fill(fuNrTs, timerTs.RealTime() * 1000.);
180 }
181
182 fuNrTs++;
183}
184
186{
188 fuCurEv = 0;
189
191 if (fRefDet.detId != ECbmModuleId::kNotExist) {
192 fRefDet.fuStartIndex = 0;
193 fRefDet.fuEndIndex = 0;
194 }
196 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
197 (*det).fuStartIndex = 0;
198 (*det).fuEndIndex = 0;
199 }
200}
201
203{
205 Double_t dTsStartTime = fdTsStartTime;
206 Double_t dOverlapStart = fdTsStartTime + fdTsLength;
207 Double_t dOverlapSize = fdTsOverLength;
208
209 if (fbUseTsMetaData) {
210 const TimesliceMetaData* pTsMetaData = dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0));
211 if (nullptr == pTsMetaData)
212 LOG(fatal) << Form("CbmAlgoBuildRawEvents::LoopOnSeeds => "
213 "No TS metadata found for TS %6u.",
214 fuNrTs);
215 dTsStartTime = pTsMetaData->GetStartTime();
216 dOverlapStart = pTsMetaData->GetOverlapStartTime();
217 dOverlapSize = pTsMetaData->GetOverlapDuration();
218 }
219
221 if ((0.0 < fdEarliestTimeWinBeg && dOverlapSize < fdLatestTimeWinEnd) || (dOverlapSize < fdWidestTimeWinRange)) {
222 LOG(warning) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
223 << Form("Event window not fitting in TS overlap, risk of "
224 "incomplete events: %f %f %f %f",
226 } // if end of event window does not fit in overlap for a seed at edge of TS core
227
230 if (fbIgnoreTsOverlap) {
232 fdSeedWindowEnd = dOverlapStart;
233 }
234 else {
236 fdSeedWindowEnd = dOverlapStart + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
237 }
238}
239
241{
243 switch (fRefDet.detId) {
244 case ECbmModuleId::kMvd: {
246 break;
247 }
248 case ECbmModuleId::kSts: {
250 break;
251 }
252 case ECbmModuleId::kMuch: {
255 }
256 else {
258 }
259 break;
260 }
261 case ECbmModuleId::kTrd: {
263 break;
264 }
267 break;
268 }
269 case ECbmModuleId::kTof: {
271 break;
272 }
273 case ECbmModuleId::kRich: {
275 break;
276 }
277 case ECbmModuleId::kPsd: {
279 break;
280 }
281 case ECbmModuleId::kFsd: {
283 break;
284 }
285 case ECbmModuleId::kBmon: {
287 break;
288 }
289 case ECbmModuleId::kNotExist: { //explicit seed times
291 break;
292 }
293 default: {
294 LOG(fatal) << "CbmAlgoBuildRawEvents::BuildEvents => "
295 << "Trying to search event seeds with unsupported det: " << fRefDet.sName;
296 break;
297 }
298 }
299}
300
301template<>
303{
304 if (ECbmModuleId::kNotExist == fRefDet.detId) {
305 const UInt_t uNbSeeds = fSeedTimes->size();
307 for (UInt_t uSeed = 0; uSeed < uNbSeeds; ++uSeed) {
308 LOG(debug) << Form("Checking seed %6u / %6u", uSeed, uNbSeeds);
309 Double_t dTime = fSeedTimes->at(uSeed);
310
312 if (dTime < fdSeedWindowBeg) {
313 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: reject for time %f < %f\n", dTime, fdSeedWindowBeg);
314 continue;
315 }
316 else if (fdSeedWindowEnd < dTime) {
317 break;
318 }
320 CheckSeed(dTime, uSeed);
321 }
322 }
323 else {
324 LOG(fatal) << "Trying to read explicit seeds while reference detector is set.";
325 }
326}
327
328template<class DigiSeed>
330{
331 const UInt_t uNbRefDigis = GetNofDigis(fRefDet.detId);
333 for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
334 LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
335 const DigiSeed* pDigi = GetDigi<DigiSeed>(uDigi);
336 // hack for mCBM2024 data and Bmon station selection
337 if (fRefDet.detId == ECbmModuleId::kBmon && !filterBmon(pDigi->GetAddress())) continue;
338
339 const Double_t dTime = pDigi->GetTime();
340 //printf("time = %f %d %d\n", dTime, CbmTofAddress::GetChannelSide(add), CbmTofAddress::GetChannelId(add));
341
343 if (dTime < fdSeedWindowBeg) {
344 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: reject for time %f < %f\n", dTime, fdSeedWindowBeg);
345 continue;
346 }
347 else if (fdSeedWindowEnd < dTime) {
348 break;
349 }
351 CheckSeed(dTime, uDigi);
352 }
353}
354
356{
357 if (ECbmModuleId::kNotExist != fRefDet.detId) {
358 return fRefDet.GetTimeWinRange();
359 }
360 else {
362 }
363}
364
365void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx)
366{
369
370 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: CheckSeed(%f, %d)\n", dSeedTime, uSeedDigiIdx);
371 if (nullptr != fCurrentEvent
373 && dSeedTime - fdPrevEvtTime < fdWidestTimeWinRange) {
375 switch (fOverMode) {
378 LOG(debug1) << "Reject seed due to overlap";
379 return;
380 break;
381 }
384 break;
385 }
389 LOG(debug1) << "Reject seed because part of cluster of previous one";
390 return;
391 break;
392 }
393 default: break;
394 }
395 } // if( prev Event exists and mode forbiden overlap present )
396 else {
399 if (nullptr != fCurrentEvent) {
401 // fCurrentEvent->SetStartTime( fPrevTime ); // Replace Seed time with time of first digi in event?
402 fCurrentEvent->SetEndTime(fdPrevEvtEndTime);
403 if (fbBmonInUse) {
406 }
407 fEventVector.push_back(fCurrentEvent);
408
409 fuCurEv++;
410 }
411 if (fbBmonInUse) {
413 fCurrentEvent = new CbmEvent(fuCurEv, -1, 0.);
414 }
415 else {
416 fCurrentEvent = new CbmEvent(fuCurEv, dSeedTime, 0.);
417 }
418 } // else of if( prev Event exists and mode forbiden overlap present )
419
420 if (fRefDet.detId != ECbmModuleId::kNotExist) {
423 if (fRefDet.fdTimeWinBeg < fRefDet.fdTimeWinEnd) {
424 SearchMatches(dSeedTime, fRefDet);
426 if (0 < fRefDet.fdTimeWinBeg) {
427 AddDigiToEvent(fRefDet, uSeedDigiIdx);
428 }
429 }
430 else {
431 AddDigiToEvent(fRefDet, uSeedDigiIdx);
432 }
433 }
434
435
440
442 bool bAllTriggersOk = true;
443 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
444 SearchMatches(dSeedTime, *det);
445
447 if (kFALSE == CheckTriggerConditions(fCurrentEvent, *det)) { //
448 bAllTriggersOk = false;
449 break;
450 }
451 }
452 if (bAllTriggersOk) {
453 fdPrevEvtTime = dSeedTime;
454
459 if (fRefDet.detId != ECbmModuleId::kNotExist) {
460 fRefDet.fuStartIndex = fRefDet.fuEndIndex;
461 }
463 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
464 (*det).fuStartIndex = (*det).fuEndIndex;
465 }
466 }
467 // LOG(info) << Form("Accept seed %9.0f due to Selection Trigger requirements", dSeedTime);
468 }
469 else {
470 // LOG(info) << Form("Reject seed %9.0f due to Selection Trigger requirements", dSeedTime);
471 LOG(debug1) << "Reject seed due to Trigger requirements";
472 delete fCurrentEvent;
473 fCurrentEvent = nullptr;
474 }
475 }
476 else {
477 // LOG(info) << Form("Reject seed %9.0f due to Reference Trigger requirements", dSeedTime);
478 LOG(debug1) << "Reject seed due to Trigger requirements";
479 delete fCurrentEvent;
480 fCurrentEvent = nullptr;
481 }
482 /*
484 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
485 SearchMatches(dSeedTime, *det);
486 }
487
488 CheckTriggerCondition(dSeedTime);
489 */
490}
491
492//----------------------------------------------------------------------
494
495template<>
497{
498 return &((*fMvdDigis)[uDigi]);
499}
500template<>
502{
503 return &((*fStsDigis)[uDigi]);
504}
505template<>
507{
508 return &((*fMuchBeamTimeDigis)[uDigi]);
509}
510template<>
512{
513 return &((*fMuchDigis)[uDigi]);
514}
515template<>
517{
518 return &((*fTrdDigis)[uDigi]);
519}
520template<>
522{
523 return &((*fTofDigis)[uDigi]);
524}
525template<>
527{
528 return &((*fRichDigis)[uDigi]);
529}
530template<>
532{
533 return &((*fPsdDigis)[uDigi]);
534}
535template<>
537{
538 return &((*fFsdDigis)[uDigi]);
539}
540template<>
542{
543 return &((*fBmonDigis)[uDigi]);
544}
545
546
547//----------------------------------------------------------------------
548
550{
551 switch (detMatch.detId) {
552 case ECbmModuleId::kSts: {
553 SearchMatches<CbmStsDigi>(dSeedTime, detMatch);
554 break;
555 }
556 case ECbmModuleId::kMuch: {
558 SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, detMatch);
559 }
560 else {
561 SearchMatches<CbmMuchDigi>(dSeedTime, detMatch);
562 }
563 break;
564 }
565 case ECbmModuleId::kTrd2d: // Same data storage as trd 1d
566 case ECbmModuleId::kTrd: {
567 SearchMatches<CbmTrdDigi>(dSeedTime, detMatch);
568 break;
569 }
570 case ECbmModuleId::kTof: {
571 SearchMatches<CbmTofDigi>(dSeedTime, detMatch);
572 break;
573 }
574 case ECbmModuleId::kRich: {
575 SearchMatches<CbmRichDigi>(dSeedTime, detMatch);
576 break;
577 }
578 case ECbmModuleId::kPsd: {
579 SearchMatches<CbmPsdDigi>(dSeedTime, detMatch);
580 break;
581 }
582 case ECbmModuleId::kFsd: {
583 SearchMatches<CbmFsdDigi>(dSeedTime, detMatch);
584 break;
585 }
586 case ECbmModuleId::kBmon: {
587 SearchMatches<CbmBmonDigi>(dSeedTime, detMatch);
588 break;
589 }
590 default: {
591 LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
592 << "Trying to search matches with unsupported det: " << detMatch.sName << std::endl
593 << "You may want to add support for it in the method.";
594 break;
595 }
596 }
597}
598
599template<class DigiCheck>
601{
603 UInt_t uLocalIndexStart = detMatch.fuStartIndex;
604 UInt_t uLocalIndexEnd = detMatch.fuStartIndex;
605 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: SearchMatches(%f, %s)\n", dSeedTime, detMatch.sName.data());
607 const UInt_t uNbSelDigis = GetNofDigis(detMatch.detId);
609 for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
610 const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi);
611 const Double_t dTime = pDigi->GetTime();
612 const Double_t dTimeDiff = dTime - dSeedTime;
613 LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
614 // int32_t add = pDigi->GetAddress(), dId[3] = {-1, -1, -1};
615 // switch (detMatch.detId) {
616 // case ECbmModuleId::kBmon:
617 // dId[0] = CbmTofAddress::GetChannelSide(add);
618 // dId[1] = CbmTofAddress::GetChannelId(add);
619 // break;
620 // case ECbmModuleId::kSts:
621 // dId[0] = CbmStsAddress::GetElementId(add, EStsElementLevel::kStsUnit);
622 // dId[1] = CbmStsAddress::GetElementId(add, EStsElementLevel::kStsLadder);
623 // dId[2] = CbmStsAddress::GetElementId(add, EStsElementLevel::kStsModule);
624 // break;
625 // case ECbmModuleId::kTrd:
626 // case ECbmModuleId::kTrd2d:
627 // dId[0] = CbmTrdAddress::GetLayerId(add);
628 // dId[1] = CbmTrdAddress::GetModuleId(add);
629 // dId[2] = CbmTrdAddress::GetModuleAddress(add);
630 // break;
631 // case ECbmModuleId::kTof:
632 // dId[0] = CbmTofAddress::GetSmId(add);
633 // dId[1] = CbmTofAddress::GetSmType(add);
634 // dId[2] = CbmTofAddress::GetRpcId(add);
635 // break;
636 // default: break;
637 // }
638 // LOG(debug4) << Form("CbmAlgoBuildRawEvents :: Checking match %6u / %6u, dt=%f %s[%d %d %d]\n", uDigi, uNbSelDigis, dTimeDiff, detMatch.sName.data(), dId[0], dId[1], dId[2]);
639
641 if (dTimeDiff < detMatch.fdTimeWinBeg) {
642 ++uLocalIndexStart;
643 continue;
644 }
645 else if (detMatch.fdTimeWinEnd < dTimeDiff) {
648 uLocalIndexEnd = uDigi;
649 break;
650 }
651
652 // Filter TRD2D digis if 1D and reverse
653 if (detMatch.detId == ECbmModuleId::kTrd) {
654 const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi);
655 if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) { //
656 continue;
657 }
658 }
659 else if (detMatch.detId == ECbmModuleId::kTrd2d) {
660 const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi);
661 if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) { //
662 continue;
663 }
664 }
665
666 AddDigiToEvent(detMatch, uDigi);
667 if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
668 }
670 if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
671
673 detMatch.fuStartIndex = uLocalIndexStart;
674 detMatch.fuEndIndex = uLocalIndexEnd;
675 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: SearchMatches(%d, %d)\n", uLocalIndexStart, uLocalIndexEnd);
676}
677
679{
680 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: :: AddDigiToEvent(%s)\n", det.sName.data());
681 fCurrentEvent->AddData(det.dataType, _entry);
682}
683
685{
686 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: :: CheckTriggerCondition(%f)\n", dSeedTime);
689 fdPrevEvtTime = dSeedTime;
690
695 if (fRefDet.detId != ECbmModuleId::kNotExist) {
696 fRefDet.fuStartIndex = fRefDet.fuEndIndex;
697 }
699 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
700 (*det).fuStartIndex = (*det).fuEndIndex;
701 }
702 }
703 }
704 else {
705 LOG(debug1) << "Reject seed due to Trigger requirements";
706 delete fCurrentEvent;
707 fCurrentEvent = nullptr;
708 }
709}
710
712{
714 if (fRefDet.detId != ECbmModuleId::kNotExist) {
715 if (kFALSE == CheckTriggerConditions(event, fRefDet)) {
716 return kFALSE;
717 }
718 }
720 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
721 if (kFALSE == CheckTriggerConditions(event, *det)) return kFALSE;
722 }
724 return kTRUE;
725}
726
728{
729 const int32_t iNbDigis = event->GetNofData(ECbmDataType::kBmonDigi);
730 double eventTime(0.);
731 bool timeSet(false);
732
733 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: SetBmonEventTime(%p, %d)\n", (void*) event, iNbDigis);
734 for (int idigi = 0; idigi < iNbDigis; ++idigi) {
735 uint idx = event->GetIndex(ECbmDataType::kBmonDigi, idigi);
736 const CbmBmonDigi* pDigi = GetDigi<CbmBmonDigi>(idx);
737 if (nullptr == pDigi) continue;
738 if (!filterBmon(pDigi->GetAddress())) continue;
739
740 if (!timeSet) {
741 eventTime = pDigi->GetTime();
742 timeSet = true;
743 }
744 else
745 eventTime = std::min(pDigi->GetTime(), eventTime);
746 }
747
748 if (timeSet) {
749 event->SetStartTime(eventTime);
750 }
751 else
752 LOG(warning) << "CbmAlgoBuildRawEvents::SetBmonEventTime : failed";
753
754 return timeSet;
755}
756
758{
759 LOG(debug4) << Form("CbmAlgoBuildRawEvents :: :: CheckTriggerConditions(%p, %s)\n", (void*) event, det.sName.data());
761 if (0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0) {
762 return kTRUE;
763 }
764
766 if (!CheckDataAvailable(det.detId)) {
767 LOG(debug2) << "Event does not have digis storage for " << det.sName
768 << " while the following trigger min/max are defined: " << det.fuTriggerMinDigis << " "
769 << det.fiTriggerMaxDigis;
770 return kFALSE;
771 }
772
774 int32_t iNbDigis = event->GetNofData(det.dataType);
775 int32_t iNbFilteredDigis = (det.detId == ECbmModuleId::kBmon ? getNofFilteredBmonDigis(event) : iNbDigis);
776
778 if (0 < det.fuTriggerMinDigis
779 && ((-1 == iNbFilteredDigis) || (static_cast<UInt_t>(iNbFilteredDigis) < det.fuTriggerMinDigis))) {
780 LOG(debug2) << "Event does not have enough digis: " << iNbFilteredDigis << " vs " << det.fuTriggerMinDigis
781 << " for " << det.sName;
782 return kFALSE;
783 }
784
786 if (0 <= det.fiTriggerMaxDigis && det.fiTriggerMaxDigis < iNbFilteredDigis) {
787 LOG(debug2) << "Event Has too many digis: " << iNbFilteredDigis << " vs " << det.fiTriggerMaxDigis << " for "
788 << det.sName;
789 return kFALSE;
790 }
791
793 if (0 < det.fuTriggerMinLayers) {
794 switch (det.detId) {
795 case ECbmModuleId::kSts: {
798 std::set<uint32_t> setStations; // Use set instead of vector as search by value later
799 std::map<uint32_t, int> mModules;
800
801 for (int idigi = 0; idigi < iNbDigis; ++idigi) {
802 uint idx = event->GetIndex(det.dataType, idigi);
803 const CbmStsDigi* pDigi = GetDigi<CbmStsDigi>(idx);
804 if (nullptr == pDigi) continue;
805
806 int iAddr = pDigi->GetAddress();
811 //int iStationAddr = CbmStsAddress::GetElementId(iAddr, EStsElementLevel::kStsUnit) / 2;
812
813 std::map<uint32_t, int>::iterator itModule = mModules.find(iModuleAddr);
814 if (itModule == mModules.end()) {
815 // LOG(info) << Form("Found new module 0x%08x, side %u", iModuleAddr,
816 // static_cast<uint32_t>(pDigi->GetChannel() / 1024));
817 mModules[iModuleAddr] = static_cast<int32_t>(pDigi->GetChannel() / 1024); // extend map
818 }
819 else {
820 // LOG(info) << Form("Check side %u of module 0x%08x: %d ?",
821 // static_cast<int32_t>(pDigi->GetChannel() / 1024),
822 // iModuleAddr, itModule->second);
823 if (static_cast<int32_t>(pDigi->GetChannel() / 1024) == (1 - itModule->second)) {
825 auto itStation = setStations.find(iStationAddr);
826 if (itStation == setStations.end()) {
827 // LOG(info) << Form("Add station 0x%08x ", iStationAddr);
828 setStations.insert(iStationAddr);
829 }
830 }
831 }
832 }
833 // LOG(info) << "Found " << setStations.size() << " Sts stations, " << " in " << iNbDigis << " Sts digis";
834 if (setStations.size() < det.fuTriggerMinLayers) {
835 LOG(debug2) << "Event does not have enough layers fired: " << setStations.size() << " vs "
836 << det.fuTriggerMinLayers << " for " << det.sName;
837 return kFALSE;
838 }
839 break;
840 }
841 case ECbmModuleId::kMuch: {
842 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
843 << det.sName;
844 return kFALSE;
845 break;
846 }
847 case ECbmModuleId::kTrd2d: // Same data storage as trd 1d
848 case ECbmModuleId::kTrd: {
849 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
850 << det.sName;
851 return kFALSE;
852 break;
853 }
854 case ECbmModuleId::kTof: {
857 std::set<uint32_t> setRpcs; // Use set instead of vector as search by value later
858 std::map<uint32_t, int> mStrips;
859
860 for (int idigi = 0; idigi < iNbDigis; ++idigi) {
861 uint idx = event->GetIndex(det.dataType, idigi);
862 const CbmTofDigi* pDigi = GetDigi<CbmTofDigi>(idx);
863 if (nullptr == pDigi) continue;
864
865 int iAddr = pDigi->GetAddress();
866 int iStripAddr = CbmTofAddress::GetStripFullId(iAddr);
867 int iRpcAddr = CbmTofAddress::GetRpcFullId(iAddr);
868
869 std::map<uint32_t, int>::iterator itStrip = mStrips.find(iStripAddr);
870 if (itStrip == mStrips.end()) {
871 // LOG(info) << Form("Found new strip 0x%08x, side %u", iStripAddr, pDigi->GetSide());
872 mStrips[iStripAddr] = (int) pDigi->GetSide(); // extend map
873 }
874 else {
875 // LOG(info) << Form("Check side %u of strip 0x%08x: %d ?", pDigi->GetSide(), iStripAddr, itStrip->second);
876 if ((int) pDigi->GetSide() == (1 - itStrip->second)) {
878 auto itRpc = setRpcs.find(iRpcAddr);
879 if (itRpc == setRpcs.end()) {
880 // LOG(info) << Form("Add counter 0x%08x ", iRpcAddr);
881 setRpcs.insert(iRpcAddr);
882 }
883 }
884 }
885 }
886 // LOG(info) << "Found " << setRpcs.size() << " Tof RPCs, " << " in " << iNbDigis << " Tof digis";
887 if (setRpcs.size() < det.fuTriggerMinLayers) {
888 LOG(debug2) << "Event does not have enough RPCs fired: " << setRpcs.size() << " vs " << det.fuTriggerMinLayers
889 << " for " << det.sName;
890 return kFALSE;
891 }
892 break;
893 }
894 case ECbmModuleId::kRich: {
895 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
896 << det.sName;
897 return kFALSE;
898 break;
899 }
900 case ECbmModuleId::kPsd: {
901 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
902 << det.sName;
903 return kFALSE;
904 break;
905 }
906 case ECbmModuleId::kFsd: {
907 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
908 << det.sName;
909 return kFALSE;
910 break;
911 }
912 case ECbmModuleId::kBmon: {
913 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
914 << det.sName;
915 return kFALSE;
916 break;
917 }
918 default: {
919 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
920 << det.sName;
921 return kFALSE;
922 break;
923 }
924 }
925 }
926
928 return kTRUE;
929}
930
931//----------------------------------------------------------------------
932
934{
935 if (!CheckDataAvailable(det.detId)) {
936 LOG(info) << "No " << det.sName << " digi input found.";
937 return kFALSE;
938 }
939 return kTRUE;
940}
941
943{
944 switch (detId) {
945 case ECbmModuleId::kSts: {
946 return fStsDigis != nullptr;
947 }
948 case ECbmModuleId::kMuch: {
950 return fMuchBeamTimeDigis != nullptr;
951 }
952 else {
953 return fMuchDigis != nullptr;
954 }
955 }
956 case ECbmModuleId::kTrd2d: // Same data storage as trd 1d
957 case ECbmModuleId::kTrd: {
958 return fTrdDigis != nullptr;
959 }
960 case ECbmModuleId::kTof: {
961 return fTofDigis != nullptr;
962 }
963 case ECbmModuleId::kRich: {
964 return fRichDigis != nullptr;
965 }
966 case ECbmModuleId::kPsd: {
967 return fPsdDigis != nullptr;
968 }
969 case ECbmModuleId::kFsd: {
970 return fFsdDigis != nullptr;
971 }
972 case ECbmModuleId::kBmon: {
973 return fBmonDigis != nullptr;
974 }
975 default: {
976 LOG(fatal) << "CbmAlgoBuildRawEvents::CheckDataAvailable => "
977 << "Unsupported detector.";
978 return -1;
979 }
980 }
981}
982
984{
985 switch (detId) {
986 case ECbmModuleId::kSts: {
987 return fStsDigis->size();
988 }
989 case ECbmModuleId::kMuch: {
991 return fMuchBeamTimeDigis->size();
992 }
993 else {
994 return fMuchDigis->size();
995 }
996 }
997 case ECbmModuleId::kTrd2d: // Same data storage as trd 1d
998 case ECbmModuleId::kTrd: {
999 return fTrdDigis->size();
1000 }
1001 case ECbmModuleId::kTof: {
1002 return fTofDigis->size();
1003 }
1004 case ECbmModuleId::kRich: {
1005 return fRichDigis->size();
1006 }
1007 case ECbmModuleId::kPsd: {
1008 return fPsdDigis->size();
1009 }
1010 case ECbmModuleId::kFsd: {
1011 return fFsdDigis->size();
1012 }
1013 case ECbmModuleId::kBmon: {
1014 return fBmonDigis->size();
1015 }
1016 default: {
1017 LOG(fatal) << "CbmAlgoBuildRawEvents::GetNofDigis => "
1018 << "Trying to get digi number with unsupported detector.";
1019 return -1;
1020 }
1021 }
1022}
1024{
1025 switch (detId) {
1026 case ECbmModuleId::kSts: {
1027 return ulNbDigis * sizeof(CbmStsDigi);
1028 }
1029 case ECbmModuleId::kMuch: {
1031 return ulNbDigis * sizeof(CbmMuchBeamTimeDigi);
1032 }
1033 else {
1034 return ulNbDigis * sizeof(CbmMuchDigi);
1035 }
1036 }
1037 case ECbmModuleId::kTrd2d: // Same data storage as trd 1d
1038 case ECbmModuleId::kTrd: {
1039 return ulNbDigis * sizeof(CbmTrdDigi);
1040 }
1041 case ECbmModuleId::kTof: {
1042 return ulNbDigis * sizeof(CbmTofDigi);
1043 }
1044 case ECbmModuleId::kRich: {
1045 return ulNbDigis * sizeof(CbmRichDigi);
1046 }
1047 case ECbmModuleId::kPsd: {
1048 return ulNbDigis * sizeof(CbmPsdDigi);
1049 }
1050 case ECbmModuleId::kFsd: {
1051 return ulNbDigis * sizeof(CbmFsdDigi);
1052 }
1053 case ECbmModuleId::kBmon: {
1054 return ulNbDigis * sizeof(CbmBmonDigi);
1055 }
1056 default: {
1057 LOG(fatal) << "CbmAlgoBuildRawEvents::GetSizeFromDigisNb => "
1058 << "Trying to get digi number with unsupported detector.";
1059 return -1;
1060 }
1061 }
1062}
1063
1064//----------------------------------------------------------------------
1066{
1067 outFolder = new TDirectoryFile("AlgoBuildRawEventsHist", " AlgoBuildRawEvents Histos");
1068 outFolder->Clear();
1069
1070 fhEventTime = new TH1F("hEventTime", "seed time of the events; Seed time within TS [s]; Events", 100000, 0, 0.2);
1071 // fhEventTime->SetCanExtend(TH1::kAllAxes); // Breaks the MQ histogram server as cannot be merged!
1072
1073 fhEventDt =
1074 new TH1F("fhEventDt", "interval in seed time of consecutive events; Seed time dt [ns]; Events", 10000, 0, 100000);
1075 // fhEventDt->SetCanExtend(TH1::kAllAxes); // Breaks the MQ histogram server as cannot be merged!
1076
1077 double_t dHistMaxTotDigis = fRefDet.fdHistMaxDigiNb;
1078 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1079 dHistMaxTotDigis += (*det).fdHistMaxDigiNb;
1080 }
1081 fhEventSize = new TH1F("hEventSize", "nb of all digis in the event; Nb Digis []; Events []", dHistMaxTotDigis, 0,
1082 dHistMaxTotDigis);
1083 // fhEventSize->SetCanExtend(TH1::kAllAxes); // Breaks the MQ histogram server as cannot be merged!
1084
1085 fhNbDigiPerEvtTime = new TH2I("hNbDigiPerEvtTime",
1086 "nb of all digis per event vs seed time of the events; Seed time "
1087 "[s]; Nb Digis []; Events []",
1088 1000, 0, 0.2, dHistMaxTotDigis, 0, dHistMaxTotDigis);
1089 // fhNbDigiPerEvtTime->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged!
1090
1091 fhCpuTimePerTs = new TH1D("hCpuTimePerTs", "CPU Processing time of TS vs TS; Ts; CPU time [ms]", 6000, 0, 6000);
1092 fhRealTimePerTs = new TH1D("hRealTimePerTs", "Real Processing time of TS vs TS; Ts; Real time [ms]", 6000, 0, 6000);
1093
1095 new TH1D("hCpuTimePerTsHist", "CPU Histo filling time of TS vs TS; Ts; CPU time [ms]", 6000, 0, 6000);
1097 new TH1D("hRealTimePerTsHist", "Real Histo filling time of TS vs TS; Ts; Real time [ms]", 6000, 0, 6000);
1098
1099 AddHistoToVector(fhEventTime, "evtbuild");
1100 AddHistoToVector(fhEventDt, "evtbuild");
1101 AddHistoToVector(fhEventSize, "evtbuild");
1103 AddHistoToVector(fhCpuTimePerTs, "evtbuild-eff");
1104 AddHistoToVector(fhRealTimePerTs, "evtbuild-eff");
1105 AddHistoToVector(fhCpuTimePerTsHist, "evtbuild-eff");
1106 AddHistoToVector(fhRealTimePerTsHist, "evtbuild-eff");
1107 outFolder->Add(fhEventTime);
1108 outFolder->Add(fhEventDt);
1109 outFolder->Add(fhEventSize);
1115
1117 fhOverEventShare = new TH1I("fhOverEventShare", "Share of overlap evt; Overlap? []; Events", 2, -0.5, 1.5);
1118 fhOverEventShareTs = new TProfile(
1119 "fhOverEventShareTs", "Share of overlap evt per TS; TS index []; Overlap Events prop. []", 2500, 0, 2500);
1121 new TH2I("fhOverEventSizeTs", "Size of overlap of evt per TS; TS index []; Size of overlap between events [ns]",
1122 2500, 0, 2500, 200, 0, 1000);
1129 }
1130
1132 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1134 if ("Invalid" == (*det).sName) {
1135 fvhNbDigiPerEvtTimeDet.push_back(nullptr);
1136 fvhNbDigiPerEvtDet.push_back(nullptr);
1137 continue;
1138 }
1139 TH2I* hNbDigiPerEvtTimeDet = new TH2I(Form("hNbDigiPerEvtTime%s", (*det).sName.data()),
1140 Form("nb of %s digis per event vs seed time of the events; Seed time in TS "
1141 "[s]; Nb Digis []; Events []",
1142 (*det).sName.data()),
1143 1000, 0, 0.2, (*det).fdHistMaxDigiNb, 0, (*det).fdHistMaxDigiNb);
1144 // hNbDigiPerEvtTimeDet->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged!
1145 fvhNbDigiPerEvtTimeDet.push_back(hNbDigiPerEvtTimeDet);
1146
1147 TH1* hNbDigiPerEvtDet = new TH1I(Form("hNbDigiPerEvt%s", (*det).sName.data()),
1148 Form("nb of %s digis per event; Nb Digis []", (*det).sName.data()),
1149 (*det).fdHistMaxDigiNb, 0, (*det).fdHistMaxDigiNb);
1150 fvhNbDigiPerEvtDet.push_back(hNbDigiPerEvtDet);
1151
1152 TH1* hTDiff =
1153 new TH1I(Form("hTDiff%s", (*det).sName.data()),
1154 Form("#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []", (*det).sName.data()), 200,
1155 (*det).fdTimeWinBeg, (*det).fdTimeWinEnd);
1156 fvhTDiff.push_back(hTDiff);
1157
1158 // clang-format off
1159 TH1* hSelRatioPerTsNb = new TH1D(Form("hSelRatioPerTsNb%s", (*det).sName.data()),
1160 Form("ratio of sel digis per TS vs TS for %s; TS; Sel Digis Ratio []",
1161 (*det).sName.data()),
1162 6000, 0, 6000);
1163 TH1* hInpRatioPerTsSz = new TH1D(Form("hInpRatioPerTsSz%s", (*det).sName.data()),
1164 Form("ratio of input digi size in total input size vs TS for %s; TS; Size Ratio []",
1165 (*det).sName.data()),
1166 6000, 0, 6000);
1167 TH1* hOutRatioPerTsSz = new TH1D(Form("hOutRatioPerTsSz%s", (*det).sName.data()),
1168 Form("ratio of selected digi size in event size vs TS for %s; TS; Size Ratio []",
1169 (*det).sName.data()),
1170 6000, 0, 6000);
1171 // clang-format on
1172
1173 fvhSelRatioPerTsNb.push_back(hSelRatioPerTsNb);
1174 fvhInpRatioPerTsSz.push_back(hInpRatioPerTsSz);
1175 fvhOutRatioPerTsSz.push_back(hOutRatioPerTsSz);
1176
1177 AddHistoToVector(hSelRatioPerTsNb, "evtbuild-eff");
1178 AddHistoToVector(hInpRatioPerTsSz, "evtbuild-eff");
1179 AddHistoToVector(hOutRatioPerTsSz, "evtbuild-eff");
1180
1181 outFolder->Add(hSelRatioPerTsNb);
1182 outFolder->Add(hInpRatioPerTsSz);
1183 outFolder->Add(hOutRatioPerTsSz);
1184 }
1185
1187 if (ECbmModuleId::kNotExist != fRefDet.detId) {
1188 TH2I* hNbDigiPerEvtTimeDet = new TH2I(Form("hNbDigiPerEvtTime%s", fRefDet.sName.data()),
1189 Form("nb of %s digis per event vs seed time of the events; Seed time in TS "
1190 "[s]; Nb Digis []; Events []",
1191 fRefDet.sName.data()),
1192 1000, 0, 0.2, fRefDet.fdHistMaxDigiNb, 0, fRefDet.fdHistMaxDigiNb);
1193 fvhNbDigiPerEvtTimeDet.push_back(hNbDigiPerEvtTimeDet);
1194
1195 TH1I* hNbDigiPerEvtDet = new TH1I(Form("hNbDigiPerEvt%s", fRefDet.sName.data()),
1196 Form("nb of %s digis per event; Nb Digis []", fRefDet.sName.data()),
1197 fRefDet.fdHistMaxDigiNb, 0, fRefDet.fdHistMaxDigiNb);
1198 fvhNbDigiPerEvtDet.push_back(hNbDigiPerEvtDet);
1199
1200 TH1I* hTDiff =
1201 new TH1I(Form("hTDiff%s", fRefDet.sName.data()),
1202 Form("#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []", fRefDet.sName.data()), 200,
1203 fRefDet.fdTimeWinBeg, fRefDet.fdTimeWinEnd); // FIXME, adjust to configured window
1204 fvhTDiff.push_back(hTDiff);
1205
1206 // clang-format off
1207 TH1* hSelRatioPerTsNb = new TH1D(Form("hSelRatioPerTsNb%s", fRefDet.sName.data()),
1208 Form("ratio of sel digis per TS vs TS for %s; TS; Sel Digis Ratio []",
1209 fRefDet.sName.data()),
1210 6000, 0, 6000);
1211 TH1* hInpRatioPerTsSz = new TH1D(Form("hInpRatioPerTsSz%s", fRefDet.sName.data()),
1212 Form("ratio of input digi size in total input size vs TS for %s; TS; Size Ratio []",
1213 fRefDet.sName.data()),
1214 6000, 0, 6000);
1215 TH1* hOutRatioPerTsSz = new TH1D(Form("hOutRatioPerTsSz%s", fRefDet.sName.data()),
1216 Form("ratio of selected digi size in event size vs TS for %s; TS; Size Ratio []",
1217 fRefDet.sName.data()),
1218 6000, 0, 6000);
1219 // clang-format on
1220
1221 fvhSelRatioPerTsNb.push_back(hSelRatioPerTsNb);
1222 fvhInpRatioPerTsSz.push_back(hInpRatioPerTsSz);
1223 fvhOutRatioPerTsSz.push_back(hOutRatioPerTsSz);
1224
1225 AddHistoToVector(hSelRatioPerTsNb, "evtbuild-eff");
1226 AddHistoToVector(hInpRatioPerTsSz, "evtbuild-eff");
1227 AddHistoToVector(hOutRatioPerTsSz, "evtbuild-eff");
1228
1229 outFolder->Add(hSelRatioPerTsNb);
1230 outFolder->Add(hInpRatioPerTsSz);
1231 outFolder->Add(hOutRatioPerTsSz);
1232 }
1233
1235 new TH1D("hSizeReductionPerTs", "ratio of tot. sel. digi size to tot. input digi size vs TS; TS; Size Ratio []",
1236 6000, 0, 6000);
1237 AddHistoToVector(fhSizeReductionPerTs, "evtbuild-eff");
1239
1240 for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end();
1241 ++itHist) {
1242 if (nullptr != (*itHist)) {
1243 AddHistoToVector((*itHist), "evtbuild");
1244 outFolder->Add((*itHist));
1245 }
1246 }
1247
1248 for (std::vector<TH1*>::iterator itHist = fvhNbDigiPerEvtDet.begin(); itHist != fvhNbDigiPerEvtDet.end(); ++itHist) {
1249 if (nullptr != (*itHist)) {
1250 AddHistoToVector((*itHist), "evtbuild");
1251 outFolder->Add((*itHist));
1252 }
1253 }
1254 for (std::vector<TH1*>::iterator itHist = fvhTDiff.begin(); itHist != fvhTDiff.end(); ++itHist) {
1255 if (nullptr != (*itHist)) {
1256 AddHistoToVector((*itHist), "evtbuild");
1257 outFolder->Add((*itHist));
1258 }
1259 }
1260
1262 // std::vector<std::pair<TCanvas*, std::string>> vCanvases = {};
1263
1264 TCanvas* fcSummary = new TCanvas("cEvBSummary", "EvB monitoring plots");
1265 fcSummary->Divide(2, 2);
1266
1267 fcSummary->cd(1);
1268 gPad->SetGridx();
1269 gPad->SetGridy();
1270 fhEventTime->Draw("hist");
1271
1272 fcSummary->cd(2);
1273 gPad->SetGridx();
1274 gPad->SetGridy();
1275 gPad->SetLogx();
1276 gPad->SetLogy();
1277 fhEventDt->Draw("hist");
1278
1279 fcSummary->cd(3);
1280 gPad->SetGridx();
1281 gPad->SetGridy();
1282 gPad->SetLogy();
1283 fhEventSize->Draw("hist");
1284
1285 fcSummary->cd(4);
1286 gPad->SetGridx();
1287 gPad->SetGridy();
1288 fhNbDigiPerEvtTime->Draw("colz");
1289
1290
1292 AddCanvasToVector(fcSummary, "canvases");
1293
1294 // ------------------------ //
1295 TCanvas* fcNbDigi = new TCanvas("cEvBNbDigi", "EvB NbDigi evolution ");
1296 if (fvhNbDigiPerEvtDet.size() <= 6) { //
1297 fcNbDigi->Divide(2, 3);
1298 }
1299 else { //
1300 fcNbDigi->Divide(3, 3);
1301 }
1302 int iPad = 1;
1303 for (std::vector<TH1*>::iterator itHist = fvhNbDigiPerEvtDet.begin(); itHist != fvhNbDigiPerEvtDet.end(); ++itHist) {
1304 if (nullptr != (*itHist)) {
1305 fcNbDigi->cd(iPad++);
1306 gPad->SetGridx();
1307 gPad->SetGridy();
1308 gPad->SetLogy();
1309 (*itHist)->Draw(); //"colz");
1310 }
1311 }
1312 AddCanvasToVector(fcNbDigi, "canvases");
1313
1314 // ------------------------ //
1315 TCanvas* fcTdif = new TCanvas("cEvBTdif", "EvB Time Difference plots");
1316 if (fvhNbDigiPerEvtDet.size() <= 6) { //
1317 fcTdif->Divide(2, 3);
1318 }
1319 else { //
1320 fcTdif->Divide(3, 3);
1321 }
1322 iPad = 1;
1323 for (std::vector<TH1*>::iterator itHist = fvhTDiff.begin(); itHist != fvhTDiff.end(); ++itHist) {
1324 if (nullptr != (*itHist)) {
1325 fcTdif->cd(iPad++);
1326 gPad->SetGridx();
1327 gPad->SetGridy();
1328 gPad->SetLogy();
1329 (*itHist)->Draw();
1330 }
1331 }
1332 AddCanvasToVector(fcTdif, "canvases");
1333}
1334
1336{
1338 uint32_t uRefDetIdx = fvDets.size();
1339 uint64_t ulTotalInputSize = 0;
1340 uint64_t ulTotalOutputSize = 0;
1341 std::vector<uint64_t> vulTotalInputSizeDet(fvDets.size() + 1, 0);
1342 std::vector<uint64_t> vulTotalOutputSizeDet(fvDets.size() + 1, 0);
1343
1345 Double_t dPreEvtTime = -1.0;
1346 for (CbmEvent* evt : fEventVector) {
1347 fhEventTime->Fill(evt->GetStartTime() * 1e-9);
1348 if (0.0 <= dPreEvtTime) {
1349 fhEventDt->Fill((evt->GetStartTime() - dPreEvtTime) * 1e-9);
1350
1352 if (evt->GetStartTime() - dPreEvtTime < fdWidestTimeWinRange) {
1353 fhOverEventShare->Fill(1);
1354 fhOverEventShareTs->Fill(fuNrTs, 1);
1355 fhOverEventSizeTs->Fill(fuNrTs, fdWidestTimeWinRange - (evt->GetStartTime() - dPreEvtTime));
1356 }
1357 else {
1358 fhOverEventShare->Fill(0);
1359 fhOverEventShareTs->Fill(fuNrTs, 0);
1360 }
1361 }
1362 }
1365 fhOverEventShare->Fill(0);
1366 fhOverEventShareTs->Fill(fuNrTs, 0);
1367 }
1368
1369 fhEventSize->Fill(evt->GetNofData());
1370 fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData());
1371
1373 uint32_t uNbDataTrd1d = 0;
1374 uint32_t uNbDataTrd2d = 0;
1375 for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
1376 if (nullptr == fvhNbDigiPerEvtDet[uDetIdx]) continue;
1377
1378 for (size_t idigi = 0; idigi < evt->GetNofData(fvDets[uDetIdx].dataType); ++idigi) {
1379 double dTimeDiff = 1.E30;
1380 uint idx = evt->GetIndex(fvDets[uDetIdx].dataType, idigi);
1381 switch (fvDets[uDetIdx].dataType) {
1383 auto pDigi = GetDigi<CbmBmonDigi>(idx);
1384 if (nullptr == pDigi) continue;
1385 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1386 break;
1387 }
1389 auto pDigi = GetDigi<CbmStsDigi>(idx);
1390 if (nullptr == pDigi) continue;
1391 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1392 break;
1393 }
1396 auto pDigi = GetDigi<CbmMuchBeamTimeDigi>(idx);
1397 if (nullptr == pDigi) continue;
1398 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1399 }
1400 else {
1401 auto pDigi = GetDigi<CbmMuchDigi>(idx);
1402 if (nullptr == pDigi) continue;
1403 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1404 }
1405 break;
1406 }
1408 auto pDigi = GetDigi<CbmTofDigi>(idx);
1409 if (nullptr == pDigi) continue;
1410 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1411 break;
1412 }
1414 auto pDigi = GetDigi<CbmTrdDigi>(idx);
1415 if (nullptr == pDigi) continue;
1416 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1417 if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
1418 if (fvDets[uDetIdx].sName == "Trd2D") continue;
1419 ++uNbDataTrd1d;
1420 }
1421 else if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
1422 if (fvDets[uDetIdx].sName == "Trd1D") continue;
1423 ++uNbDataTrd2d;
1424 }
1425 break;
1426 }
1428 auto pDigi = GetDigi<CbmRichDigi>(idx); // FIXME, need to find the proper digi template
1429 if (nullptr == pDigi) continue;
1430 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1431 break;
1432 }
1434 auto pDigi = GetDigi<CbmPsdDigi>(idx); // FIXME, need to find the proper digi template
1435 if (nullptr == pDigi) continue;
1436 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1437 break;
1438 }
1440 auto pDigi = GetDigi<CbmFsdDigi>(idx); // FIXME, need to find the proper digi template
1441 if (nullptr == pDigi) continue;
1442 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1443 break;
1444 }
1445 default: LOG(error) << "Unkown dataType " << fvDets[uDetIdx].dataType;
1446 }
1447
1448 if (dTimeDiff < 1.E30) fvhTDiff[uDetIdx]->Fill(dTimeDiff);
1449 }
1450 }
1451
1453 if (ECbmModuleId::kNotExist != fRefDet.detId) {
1454 if (nullptr != fvhNbDigiPerEvtDet[uRefDetIdx]) {
1455 for (size_t idigi = 0; idigi < evt->GetNofData(fRefDet.dataType); ++idigi) {
1456 double dTimeDiff = 1.E30;
1457 uint idx = evt->GetIndex(fRefDet.dataType, idigi);
1458 switch (fRefDet.dataType) {
1460 auto pDigi = GetDigi<CbmBmonDigi>(idx);
1461 if (nullptr == pDigi) continue;
1462 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1463 break;
1464 }
1466 auto pDigi = GetDigi<CbmStsDigi>(idx);
1467 if (nullptr == pDigi) continue;
1468 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1469 break;
1470 }
1473 auto pDigi = GetDigi<CbmMuchBeamTimeDigi>(idx);
1474 if (nullptr == pDigi) continue;
1475 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1476 }
1477 else {
1478 auto pDigi = GetDigi<CbmMuchDigi>(idx);
1479 if (nullptr == pDigi) continue;
1480 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1481 }
1482 break;
1483 }
1485 auto pDigi = GetDigi<CbmTofDigi>(idx);
1486 if (nullptr == pDigi) continue;
1487 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1488 break;
1489 }
1491 auto pDigi = GetDigi<CbmTrdDigi>(idx);
1492 if (nullptr == pDigi) continue;
1493 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1494 if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
1495 if (fRefDet.sName == "Trd2D") continue;
1496 ++uNbDataTrd1d;
1497 }
1498 else if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
1499 if (fRefDet.sName == "Trd1D") continue;
1500 ++uNbDataTrd2d;
1501 }
1502 break;
1503 }
1505 auto pDigi = GetDigi<CbmRichDigi>(idx); // FIXME, need to find the proper digi template
1506 if (nullptr == pDigi) continue;
1507 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1508 break;
1509 }
1511 auto pDigi = GetDigi<CbmPsdDigi>(idx); // FIXME, need to find the proper digi template
1512 if (nullptr == pDigi) continue;
1513 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1514 break;
1515 }
1517 auto pDigi = GetDigi<CbmFsdDigi>(idx); // FIXME, need to find the proper digi template
1518 if (nullptr == pDigi) continue;
1519 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1520 break;
1521 }
1522 default: LOG(error) << "Unkown dataType " << fRefDet.dataType;
1523 }
1524
1525 if (dTimeDiff < 1.E30) fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
1526 }
1527 }
1528 }
1529
1531 for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
1532 if (nullptr == fvhNbDigiPerEvtTimeDet[uDetIdx]) continue;
1533
1534 if (fvDets[uDetIdx].sName == "Trd1D") {
1535 fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTrd1d);
1536 fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d);
1537
1538 if (0 < GetNofDigis(fvDets[uDetIdx].detId)) {
1540 uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fvDets[uDetIdx].detId, uNbDataTrd1d + uNbDataTrd2d);
1541
1542 ulTotalOutputSize += ulDigiSizeOut;
1543 vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
1544 }
1545 }
1546 else if (fvDets[uDetIdx].sName == "Trd2D") {
1547 fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTrd2d);
1548 fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd2d);
1549 }
1550 else {
1551 fvhNbDigiPerEvtDet[uDetIdx]->Fill(evt->GetNofData(fvDets[uDetIdx].dataType));
1552 fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(fvDets[uDetIdx].dataType));
1553
1554 if (0 < GetNofDigis(fvDets[uDetIdx].detId)) {
1556 uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fvDets[uDetIdx].detId, evt->GetNofData(fvDets[uDetIdx].dataType));
1557
1558 ulTotalOutputSize += ulDigiSizeOut;
1559 vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
1560 }
1561 }
1562 }
1563
1565 if (ECbmModuleId::kNotExist != fRefDet.detId) {
1566 if (fRefDet.sName == "Trd1D") {
1567 fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTrd1d);
1568 fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d);
1569
1570 if (0 < GetNofDigis(fRefDet.detId)) {
1572 uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fRefDet.detId, uNbDataTrd1d + uNbDataTrd2d);
1573
1574 ulTotalOutputSize += ulDigiSizeOut;
1575 vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
1576 }
1577 }
1578 else if (fRefDet.sName == "Trd2D") {
1579 fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTrd2d);
1580 fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd2d);
1581 }
1582 else {
1583 fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(evt->GetNofData(fRefDet.dataType));
1584 fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(fRefDet.dataType));
1585
1586 if (0 < GetNofDigis(fRefDet.detId)) {
1588 uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fRefDet.detId, evt->GetNofData(fRefDet.dataType));
1589
1590 ulTotalOutputSize += ulDigiSizeOut;
1591 vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
1592 }
1593 }
1594 }
1595
1596 dPreEvtTime = evt->GetStartTime();
1597 }
1598
1600 for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
1601 if (fvDets[uDetIdx].sName == "Trd2D") {
1604 continue;
1605 }
1606 uint64_t ulDigiSizeIn = GetSizeFromDigisNb(fvDets[uDetIdx].detId, GetNofDigis(fvDets[uDetIdx].detId));
1607 ulTotalInputSize += ulDigiSizeIn;
1608 vulTotalInputSizeDet[uDetIdx] += ulDigiSizeIn;
1609 }
1610 if (ECbmModuleId::kNotExist != fRefDet.detId) {
1611 uint64_t ulDigiSizeIn = GetSizeFromDigisNb(fRefDet.detId, GetNofDigis(fRefDet.detId));
1612 ulTotalInputSize += ulDigiSizeIn;
1613 vulTotalInputSizeDet[uRefDetIdx] += ulDigiSizeIn;
1614 }
1615
1617 for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
1618 if (0 != vulTotalInputSizeDet[uDetIdx]) { //
1619 fvhSelRatioPerTsNb[uDetIdx]->Fill(fuNrTs, vulTotalOutputSizeDet[uDetIdx] * 1.0 / vulTotalInputSizeDet[uDetIdx]);
1620 }
1621 if (0 != ulTotalInputSize) { //
1622 fvhInpRatioPerTsSz[uDetIdx]->Fill(fuNrTs, vulTotalInputSizeDet[uDetIdx] * 1.0 / ulTotalInputSize);
1623 }
1624 if (0 != ulTotalOutputSize) { //
1625 fvhOutRatioPerTsSz[uDetIdx]->Fill(fuNrTs, vulTotalOutputSizeDet[uDetIdx] * 1.0 / ulTotalOutputSize);
1626 }
1627 }
1629 if (ECbmModuleId::kNotExist != fRefDet.detId) {
1630 if (0 != vulTotalInputSizeDet[uRefDetIdx]) { //
1631 fvhSelRatioPerTsNb[uRefDetIdx]->Fill(fuNrTs,
1632 vulTotalOutputSizeDet[uRefDetIdx] * 1.0 / vulTotalInputSizeDet[uRefDetIdx]);
1633 }
1634 if (0 != ulTotalInputSize) { //
1635 fvhInpRatioPerTsSz[uRefDetIdx]->Fill(fuNrTs, vulTotalInputSizeDet[uRefDetIdx] * 1.0 / ulTotalInputSize);
1636 }
1637 if (0 != ulTotalOutputSize) { //
1638 fvhOutRatioPerTsSz[uRefDetIdx]->Fill(fuNrTs, vulTotalOutputSizeDet[uRefDetIdx] * 1.0 / ulTotalOutputSize);
1639 }
1640 }
1642 if (0 != ulTotalInputSize) { //
1643 fhSizeReductionPerTs->Fill(fuNrTs, ulTotalOutputSize * 1.0 / ulTotalInputSize);
1644 }
1645 LOG(debug) << "I/O Size ratio: " << (ulTotalOutputSize * 1.0 / ulTotalInputSize);
1646}
1647
1649{
1650 fhEventTime->Reset();
1651 fhEventDt->Reset();
1652 fhEventSize->Reset();
1653
1654 fhNbDigiPerEvtTime->Reset();
1656 for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end();
1657 ++itHist) {
1658 (*itHist)->Reset();
1659 }
1660
1661 for (std::vector<TH1*>::iterator itHist = fvhNbDigiPerEvtDet.begin(); itHist != fvhNbDigiPerEvtDet.end(); ++itHist) {
1662 (*itHist)->Reset();
1663 }
1664
1665 for (std::vector<TH1*>::iterator itHist = fvhTDiff.begin(); itHist != fvhTDiff.end(); ++itHist) {
1666 (*itHist)->Reset();
1667 }
1668
1669 /*
1670 if( kTRUE == bResetTime )
1671 {
1673 fdStartTime = -1.0;
1674 }
1675 */
1676}
1677
1678void CbmAlgoBuildRawEvents::SetReferenceDetector(ECbmModuleId refDet, ECbmDataType dataTypeIn, std::string sNameIn,
1679 UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn,
1680 Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn)
1681{
1683 SetReferenceDetector(RawEventBuilderDetector(refDet, dataTypeIn, sNameIn, uTriggerMinDigisIn, iTriggerMaxDigisIn,
1684 fdTimeWinBegIn, fdTimeWinEndIn));
1685}
1686void CbmAlgoBuildRawEvents::AddDetector(ECbmModuleId selDet, ECbmDataType dataTypeIn, std::string sNameIn,
1687 UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn,
1688 Double_t fdTimeWinEndIn)
1689{
1691 AddDetector(RawEventBuilderDetector(selDet, dataTypeIn, sNameIn, uTriggerMinDigisIn, iTriggerMaxDigisIn,
1692 fdTimeWinBegIn, fdTimeWinEndIn));
1693}
1694
1696{
1698 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1699 if ((*det) == refDetIn) {
1700 LOG(warning) << "CbmAlgoBuildRawEvents::SetReferenceDetector => "
1701 "Reference detector already in selection detector list! "
1702 << refDetIn.sName;
1703 LOG(warning) << " => "
1704 "It will be automatically removed from selection detector list!";
1705 LOG(warning) << " => "
1706 "Please also remember to update the selection windows to store "
1707 "clusters!";
1708 RemoveDetector(refDetIn);
1709 break;
1710 }
1711 }
1712
1713 if (fRefDet == refDetIn) {
1714 LOG(warning) << "CbmAlgoBuildRawEvents::SetReferenceDetector => "
1715 "Doing nothing, identical reference detector already in use";
1716 }
1717 else {
1718 LOG(info) << "CbmAlgoBuildRawEvents::SetReferenceDetector => "
1719 << "Replacing " << fRefDet.sName << " with " << refDetIn.sName << " as reference detector";
1720 LOG(warning) << " => "
1721 "You may want to use AddDetector after this command to add in "
1722 "selection "
1723 << fRefDet.sName;
1724 LOG(warning) << " => "
1725 "Please also remember to update the selection windows!";
1726 }
1727 fRefDet = refDetIn;
1728
1735
1736 if (fbBmonInUse) {
1737 if (select.size()) {
1738 LOG(info) << "CbmAlgoBuildRawEvents::SetReferenceDetector => Detected Bmon station selection.";
1739 fUseBmonMap.assign(select.size(), false);
1740 int it0(0);
1741 for (auto t0 : select)
1742 SwitchBmonStation(it0++, (t0 > 0));
1743 }
1744 }
1745 else {
1746 if (select.size())
1747 LOG(warning) << "CbmAlgoBuildRawEvents::SetReferenceDetector => Detected use of selector\nfor a reference "
1748 "detector which does not support this option. Skip selection for the moment.";
1749 }
1750}
1751
1753{
1754 if (fRefDet == selDet) {
1755 LOG(fatal) << "CbmAlgoBuildRawEvents::AddDetector => Cannot "
1756 "add the reference detector as selection detector!"
1757 << std::endl
1758 << "=> Maybe first change the reference detector with "
1759 "SetReferenceDetector?";
1760 }
1761
1763 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1764 if ((*det) == selDet) {
1765 LOG(warning) << "CbmAlgoBuildRawEvents::AddDetector => "
1766 "Doing nothing, selection detector already in list! "
1767 << selDet.sName;
1768 return;
1769 }
1770 }
1771 fvDets.push_back(selDet);
1772
1779}
1780
1782{
1784 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1785 if ((*det) == selDet) {
1786 fvDets.erase(det);
1789 return;
1790 }
1791 }
1792 LOG(warning) << "CbmAlgoBuildRawEvents::RemoveDetector => Doing "
1793 "nothing, selection detector not in list! "
1794 << selDet.sName;
1795}
1796
1798{
1799 if (ECbmModuleId::kBmon == fRefDet.detId) { //
1800 fbBmonInUse = true;
1801 }
1802 else {
1803 fbBmonInUse = std::any_of(fvDets.cbegin(), fvDets.cend(),
1804 [](RawEventBuilderDetector det) { return ECbmModuleId::kBmon == det.detId; });
1805 }
1806}
1807
1809{
1811 if (fRefDet.detId == selDet) {
1812 fRefDet.fuTriggerMinDigis = uVal;
1813 LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to " << uVal;
1814 return;
1815 }
1816
1818 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1819 if ((*det).detId == selDet) {
1820 (*det).fuTriggerMinDigis = uVal;
1821 LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to " << uVal;
1822 return;
1823 }
1824 }
1825 LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMinNumber => "
1826 "Doing nothing, detector neither reference nor in selection list! "
1827 << selDet;
1828}
1829
1831{
1833 if (fRefDet.detId == selDet) {
1834 fRefDet.fiTriggerMaxDigis = iVal;
1835 LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to " << iVal;
1836 return;
1837 }
1838
1840 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1841 if ((*det).detId == selDet) {
1842 (*det).fiTriggerMaxDigis = iVal;
1843 LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to " << iVal;
1844 return;
1845 }
1846 }
1847 LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMaxNumber => "
1848 "Doing nothing, detector neither reference nor in selection list! "
1849 << selDet;
1850}
1851
1853{
1855 if (fRefDet.detId == selDet) {
1856 fRefDet.fuTriggerMinLayers = uVal;
1857 LOG(debug) << "Set Trigger min fired layers limit for " << fRefDet.sName << " to " << uVal;
1858 return;
1859 }
1860
1862 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1863 if ((*det).detId == selDet) {
1864 (*det).fuTriggerMinLayers = uVal;
1865 LOG(debug) << "Set Trigger min fired layers limit for " << (*det).sName << " to " << uVal;
1866 return;
1867 }
1868 }
1869 LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMinLayersNumber => "
1870 "Doing nothing, detector neither reference nor in selection list! "
1871 << selDet;
1872}
1873
1874void CbmAlgoBuildRawEvents::SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd)
1875{
1877 if (dWinEnd <= dWinBeg) {
1878 LOG(fatal) << "CbmAlgoBuildRawEvents::SetTriggerWindow => "
1879 "Invalid time window: [ "
1880 << dWinBeg << ", " << dWinEnd << " ]";
1881 }
1882
1883 Bool_t bFound = kFALSE;
1885 if (fRefDet.detId == selDet) {
1886 fRefDet.fdTimeWinBeg = dWinBeg;
1887 fRefDet.fdTimeWinEnd = dWinEnd;
1888 bFound = kTRUE;
1889 }
1890
1892 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1893 if ((*det).detId == selDet) {
1894 (*det).fdTimeWinBeg = dWinBeg;
1895 (*det).fdTimeWinEnd = dWinEnd;
1896 bFound = kTRUE;
1897 }
1898 }
1899
1900 if (kFALSE == bFound) {
1901 LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerWindow => "
1902 "Doing nothing, detector neither reference nor in selection list! "
1903 << selDet;
1904 }
1905
1910}
1911
1913{
1915 if (fRefDet.detId == selDet) {
1916 fRefDet.fdHistMaxDigiNb = dVal;
1917 LOG(debug) << "Set histogram max digi nb for " << fRefDet.sName << " to " << dVal;
1918 return;
1919 }
1920
1922 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1923 if ((*det).detId == selDet) {
1924 (*det).fdHistMaxDigiNb = dVal;
1925 LOG(debug) << "Set histogram max digi nb " << (*det).sName << " to " << dVal;
1926 return;
1927 }
1928 }
1929 LOG(warning) << "CbmAlgoBuildRawEvents::SetHistogramMaxDigiNb => "
1930 "Doing nothing, detector neither reference nor in selection list! "
1931 << selDet;
1932}
1933
1935{
1937 if (fRefDet.detId != ECbmModuleId::kNotExist) {
1938 fdEarliestTimeWinBeg = fRefDet.fdTimeWinBeg;
1939 fdLatestTimeWinEnd = fRefDet.fdTimeWinEnd;
1940 }
1941 else {
1944 }
1945
1947 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1948 fdEarliestTimeWinBeg = std::min(fdEarliestTimeWinBeg, (*det).fdTimeWinBeg);
1949 fdLatestTimeWinEnd = std::max(fdLatestTimeWinEnd, (*det).fdTimeWinEnd);
1950 }
1951}
1952
1954{
1957
1959 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
1960 fdWidestTimeWinRange = std::max(fdWidestTimeWinRange, (*det).fdTimeWinEnd - (*det).fdTimeWinBeg);
1961 }
1962}
1963
1965{
1966 if (id < 0 || id >= (int) fUseBmonMap.size()) {
1967 LOG(warning) << "CbmAlgoBuildRawEvents::SwitchBmonStation: Bmon station id outside range. Skip.";
1968 return;
1969 }
1970 LOG(info) << "CbmAlgoBuildRawEvents::SwitchBmonStation: Bmon" << id << " station switched " << (on ? "ON" : "OFF")
1971 << " for trigger.";
1972 fUseBmonMap[id] = on;
1973}
1974
1976{
1977 // skip any filtering if not explicitly requested by user.
1978 if (!fUseBmonMap.size()) return true;
1979
1980 // consistency check on the Bmon detector
1981 if (CbmTofAddress::GetSmType(add) != 5) {
1982 LOG(warning) << "CbmAlgoBuildRawEvents::filterBmon: Bmon digi with wrong address [GetSmType() != 5]. Skip.";
1983 return false;
1984 }
1985 size_t mod = (size_t) CbmTofAddress::GetChannelSide(add);
1986 // select Bmon detector
1987 if (!fUseBmonMap[mod]) {
1988 LOG(debug2) << "CbmAlgoBuildRawEvents::filterBmon : reject seed from Bmon" << mod;
1989 return false;
1990 }
1991 return true;
1992}
1993
1995{
1996 // skip any filtering if not explicitly requested by user.
1997 if (!fUseBmonMap.size()) return event->GetNofData(ECbmDataType::kBmonDigi);
1998
1999 int32_t ndigi(0);
2000 for (size_t idigi = 0; idigi < event->GetNofData(ECbmDataType::kBmonDigi); ++idigi) {
2001 uint idx = event->GetIndex(ECbmDataType::kBmonDigi, idigi);
2002 const CbmBmonDigi* pDigi = GetDigi<CbmBmonDigi>(idx);
2003 if (!filterBmon(pDigi->GetAddress())) continue;
2004 ndigi++;
2005 }
2006 return ndigi;
2007}
2008
ClassImp(CbmConverterManager)
ECbmDataType
Enumerator for CBM data types.
Definition CbmDefs.h:122
ECbmModuleId
Enumerator for module Identifiers.
Definition CbmDefs.h:45
@ kMvd
Micro-Vertex Detector.
Definition CbmDefs.h:47
@ kTrd
Transition Radiation Detector.
Definition CbmDefs.h:51
@ kTof
Time-of-flight Detector.
Definition CbmDefs.h:52
@ kNotExist
If not found.
Definition CbmDefs.h:68
@ kPsd
Projectile spectator detector.
Definition CbmDefs.h:54
@ kSts
Silicon Tracking System.
Definition CbmDefs.h:48
@ kTrd2d
TRD-FASP Detector (FIXME)
Definition CbmDefs.h:58
@ kMuch
Muon detection system.
Definition CbmDefs.h:50
@ kFsd
Forward spectator detector.
Definition CbmDefs.h:59
@ kBmon
Bmon Counter.
Definition CbmDefs.h:57
@ kRich
Ring-Imaging Cherenkov Detector.
Definition CbmDefs.h:49
@ kStsModule
@ kStsUnit
static double dTsStartTime
Helper class to convert unique channel ID back and forth.
int Int_t
bool Bool_t
Bool_t CheckTriggerConditions(CbmEvent *event, const RawEventBuilderDetector &det)
UInt_t fuCurEv
histogram with size of overlap between evt vs TS index, AllowOverlap only
const std::vector< CbmTrdDigi > * fTrdDigis
const std::vector< CbmBmonDigi > * fBmonDigis
void AddDigiToEvent(const RawEventBuilderDetector &det, Int_t uIdx)
TH1 * fhCpuTimePerTsHist
Processing time per TS.
std::vector< TH1 * > fvhOutRatioPerTsSz
ratio of input digi size in total input size vs TS in run
void SetHistogramMaxDigiNb(ECbmModuleId selDet, Double_t dDigiNbMax)
int32_t getNofFilteredBmonDigis(CbmEvent *ev)
TH2 * fhOverEventSizeTs
histogram with proportion of overlap evt vs TS index, AllowOverlap only
uint64_t GetSizeFromDigisNb(ECbmModuleId detId, uint64_t ulNbDigis)
const std::vector< Double_t > * fSeedTimes
EOverlapModeRaw fOverMode
bit map for Bmon trigger. Defined by user
TH2 * fhNbDigiPerEvtTime
histogram with the nb of all digis in the event
std::vector< TH2 * > fvhNbDigiPerEvtTimeDet
Plotting time per TS.
TH1 * fhEventSize
histogram with the interval in seed time of consecutive events
void CheckTriggerCondition(Double_t dSeedTime)
Double_t fdPrevEvtEndTime
Save previous time information.
std::vector< TH1 * > fvhSelRatioPerTsNb
void SwitchBmonStation(int id, bool on=true)
Bool_t fbUseMuchBeamtimeDigi
Switch ON/OFF filling of histograms.
const std::vector< CbmTofDigi > * fTofDigis
CbmEvent * fCurrentEvent
Data ouptut.
std::vector< RawEventBuilderDetector > fvDets
TH1 * fhCpuTimePerTs
histogram with the nb of all digis per event vs seed time of the events
UInt_t GetNofDigis(ECbmModuleId detId)
UInt_t fuNrTs
Event Counter.
Double_t fdSeedWindowBeg
Seed window.
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 * > fEventVector
pointer to the event which is currently build
Bool_t fbFillHistos
Ignore data in Overlap part of the TS.
void AddHistoToVector(TNamed *pointer, std::string sFolder="")
For monitor algos.
void SearchMatches(Double_t dSeedTime, RawEventBuilderDetector &detMatch)
TH1 * fhSizeReductionPerTs
ratio of selected digi size in total event size vs TS in run
void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
const std::vector< CbmRichDigi > * fRichDigis
TH1 * fhRealTimePerTsHist
Plotting time per TS.
const std::vector< CbmStsDigi > * fStsDigis
TH1 * fhEventTime
Vector of pointers to canvases + optional folder name.
Bool_t fbGetTimings
Switch between MUCH digi classes.
const std::vector< CbmMuchBeamTimeDigi > * fMuchBeamTimeDigis
std::vector< TH1 * > fvhTDiff
histograms with the nb of digis in each detector per event
const std::vector< CbmMuchDigi > * fMuchDigis
void ResetHistograms(Bool_t bResetTime=kTRUE)
TH1 * fhRealTimePerTs
Processing time per TS.
TProfile * fhOverEventShareTs
histogram with proportion of overlap evt, AllowOverlap only
bool filterBmon(int32_t add)
Filter Bmon stations. Hack added for the mCBM2024 data (AB)
void AddCanvasToVector(TCanvas *pointer, std::string sFolder="")
Bool_t fbUseTsMetaData
Measure CPU time using stopwatch.
std::vector< TH1 * > fvhNbDigiPerEvtDet
histograms with the nb of digis in each detector per event vs seed time of the events
void CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx)
void SetTriggerMinLayersNumber(ECbmModuleId selDet, UInt_t uVal)
Double_t fdPrevEvtTime
Timeslice Counter.
void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal)
TH1 * fhOverEventShare
ratio of total selected size to input size selected vs TS in run
TClonesArray * fTimeSliceMetaDataArray
Data input.
Bool_t CheckDataAvailable(const RawEventBuilderDetector &det)
Internal methods.
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)
bool SetBmonEventTime(CbmEvent *event)
const std::vector< CbmPsdDigi > * fPsdDigis
RawEventBuilderDetector fRefDet
is create when fbGetTimings is set before init
void SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd)
const Digi * GetDigi(UInt_t uDigi)
const std::vector< CbmFsdDigi > * fFsdDigis
TH1 * fhEventDt
histogram with the seed time of the events
std::vector< bool > fUseBmonMap
Read Ts Parameters from input tree.
std::vector< TH1 * > fvhInpRatioPerTsSz
ratio of selected/input digi vs TS in run
Data class for a signal in the t-zero detector.
Definition CbmBmonDigi.h:31
double GetTime() const
Time.
Definition CbmBmonDigi.h:87
int32_t GetAddress() const
Address.
Definition CbmBmonDigi.h:81
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
Data class for FSD digital information.
Definition CbmFsdDigi.h:36
Data class for PSD digital information.
Definition CbmPsdDigi.h:36
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
XPU_D uint16_t GetChannel() const
Channel number in module @value Channel number.
Definition CbmStsDigi.h:93
XPU_D int32_t GetAddress() const
Definition CbmStsDigi.h:74
static int32_t GetStripFullId(uint32_t address)
static int32_t GetSmType(uint32_t address)
static int32_t GetRpcFullId(uint32_t address)
static int32_t GetChannelSide(uint32_t address)
Data class for expanded digital TOF information.
Definition CbmTofDigi.h:47
double GetSide() const
Channel Side.
Definition CbmTofDigi.h:161
int32_t GetAddress() const
Inherited from CbmDigi.
Definition CbmTofDigi.h:113
eCbmTrdAsicType GetType() const
Channel FEE SPADIC/FASP according to CbmTrdAsicType.
Definition CbmTrdDigi.h:170
Int_t fiTriggerMaxDigis
Maximum number of digis per detector needed to generate an event, -1 means no cut,...
UInt_t fuTriggerMinLayers
Minimum number of fired layers needed to generate an event, 0 means do not require for event selectio...
ECbmModuleId detId
Settings.
Double_t fdTimeWinBeg
Selection Window.
UInt_t fuTriggerMinDigis
Minimum number of digis per detector needed to generate an event, 0 means do not use for event select...
UInt_t fuStartIndex
Book-keeping variables.
uint64_t GetOverlapDuration() const
uint64_t GetOverlapStartTime() const
uint64_t GetStartTime() const
int32_t GetMotherAddress(int32_t address, int32_t level)
Construct the address of an element from the address of a descendant element.
uint32_t GetElementId(int32_t address, int32_t level)
Get the index of an element.