23#include <FairRootManager.h>
24#include <FairRunOnline.h>
29#include <TClonesArray.h>
30#include <TDirectoryFile.h>
33#include <THttpServer.h>
35#include <TStopwatch.h>
47 LOG(info) <<
"CbmAlgoBuildRawEvents::InitAlgo => Starting sequence";
58 LOG(fatal) <<
"No reference detector set and no seed times supplied, stopping there!";
63 LOG(fatal) <<
"Cannot have explicit seed times and reference detector, stopping there!";
66 LOG(fatal) <<
"Reference detector set but no digi input found, stopping there!";
71 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
73 LOG(fatal) <<
"No digi input for one of selection detector, stopping there!";
80 LOG(fatal) <<
"No TS metadata input found"
81 <<
" => Please check in the unpacking macro if the following line was "
84 <<
"source->SetWriteOutputFlag(kTRUE); // For writing TS metadata";
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";
97 LOG(info) <<
"CbmAlgoBuildRawEvents::InitAlgo => Done";
111 LOG(fatal) <<
"Trying to print timings but timer not set";
114 Double_t rtime =
fTimer->RealTime();
115 Double_t ctime =
fTimer->CpuTime();
116 LOG(info) <<
"CbmAlgoBuildRawEvents: Real time " << rtime <<
" s, CPU time " << ctime <<
" s";
125 LOG(debug) <<
"Event " <<
counter <<
" has " <<
event->GetNofData() <<
" digis";
134 LOG_IF(info,
fuNrTs % 1000 == 0) <<
"Begin of TS " <<
fuNrTs;
168 LOG(debug) <<
"Found " <<
fEventVector.size() <<
" triggered events";
196 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
197 (*det).fuStartIndex = 0;
198 (*det).fuEndIndex = 0;
211 if (
nullptr == pTsMetaData)
212 LOG(fatal) << Form(
"CbmAlgoBuildRawEvents::LoopOnSeeds => "
213 "No TS metadata found for TS %6u.",
222 LOG(warning) <<
"CbmAlgoBuildRawEvents::LoopOnSeeds => "
223 << Form(
"Event window not fitting in TS overlap, risk of "
224 "incomplete events: %f %f %f %f",
294 LOG(fatal) <<
"CbmAlgoBuildRawEvents::BuildEvents => "
295 <<
"Trying to search event seeds with unsupported det: " <<
fRefDet.sName;
307 for (UInt_t uSeed = 0; uSeed < uNbSeeds; ++uSeed) {
308 LOG(debug) << Form(
"Checking seed %6u / %6u", uSeed, uNbSeeds);
313 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: reject for time %f < %f\n", dTime,
fdSeedWindowBeg);
324 LOG(fatal) <<
"Trying to read explicit seeds while reference detector is set.";
328template<
class DigiSeed>
333 for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
334 LOG(debug) << Form(
"Checking seed %6u / %6u", uDigi, uNbRefDigis);
339 const Double_t dTime = pDigi->GetTime();
344 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: reject for time %f < %f\n", dTime,
fdSeedWindowBeg);
358 return fRefDet.GetTimeWinRange();
370 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: CheckSeed(%f, %d)\n", dSeedTime, uSeedDigiIdx);
378 LOG(debug1) <<
"Reject seed due to overlap";
389 LOG(debug1) <<
"Reject seed because part of cluster of previous one";
426 if (0 <
fRefDet.fdTimeWinBeg) {
442 bool bAllTriggersOk =
true;
443 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
448 bAllTriggersOk =
false;
452 if (bAllTriggersOk) {
463 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
464 (*det).fuStartIndex = (*det).fuEndIndex;
471 LOG(debug1) <<
"Reject seed due to Trigger requirements";
478 LOG(debug1) <<
"Reject seed due to Trigger requirements";
484 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
485 SearchMatches(dSeedTime, *det);
488 CheckTriggerCondition(dSeedTime);
498 return &((*fMvdDigis)[uDigi]);
503 return &((*fStsDigis)[uDigi]);
508 return &((*fMuchBeamTimeDigis)[uDigi]);
513 return &((*fMuchDigis)[uDigi]);
518 return &((*fTrdDigis)[uDigi]);
523 return &((*fTofDigis)[uDigi]);
528 return &((*fRichDigis)[uDigi]);
533 return &((*fPsdDigis)[uDigi]);
538 return &((*fFsdDigis)[uDigi]);
543 return &((*fBmonDigis)[uDigi]);
551 switch (detMatch.
detId) {
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.";
599template<
class DigiCheck>
605 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: SearchMatches(%f, %s)\n", dSeedTime, detMatch.
sName.data());
609 for (UInt_t uDigi = detMatch.
fuStartIndex; uDigi < uNbSelDigis; ++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);
648 uLocalIndexEnd = uDigi;
670 if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
675 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: SearchMatches(%d, %d)\n", uLocalIndexStart, uLocalIndexEnd);
680 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: :: AddDigiToEvent(%s)\n", det.
sName.data());
686 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: :: CheckTriggerCondition(%f)\n", dSeedTime);
699 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
700 (*det).fuStartIndex = (*det).fuEndIndex;
705 LOG(debug1) <<
"Reject seed due to Trigger requirements";
720 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
730 double eventTime(0.);
733 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: SetBmonEventTime(%p, %d)\n", (
void*) event, iNbDigis);
734 for (
int idigi = 0; idigi < iNbDigis; ++idigi) {
737 if (
nullptr == pDigi)
continue;
745 eventTime = std::min(pDigi->
GetTime(), eventTime);
749 event->SetStartTime(eventTime);
752 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetBmonEventTime : failed";
759 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: :: CheckTriggerConditions(%p, %s)\n", (
void*) event, det.
sName.data());
767 LOG(debug2) <<
"Event does not have digis storage for " << det.
sName
768 <<
" while the following trigger min/max are defined: " << det.
fuTriggerMinDigis <<
" "
774 int32_t iNbDigis =
event->GetNofData(det.
dataType);
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;
787 LOG(debug2) <<
"Event Has too many digis: " << iNbFilteredDigis <<
" vs " << det.
fiTriggerMaxDigis <<
" for "
798 std::set<uint32_t> setStations;
799 std::map<uint32_t, int> mModules;
801 for (
int idigi = 0; idigi < iNbDigis; ++idigi) {
802 uint idx =
event->GetIndex(det.
dataType, idigi);
804 if (
nullptr == pDigi)
continue;
813 std::map<uint32_t, int>::iterator itModule = mModules.find(iModuleAddr);
814 if (itModule == mModules.end()) {
817 mModules[iModuleAddr] =
static_cast<int32_t
>(pDigi->
GetChannel() / 1024);
823 if (
static_cast<int32_t
>(pDigi->
GetChannel() / 1024) == (1 - itModule->second)) {
825 auto itStation = setStations.find(iStationAddr);
826 if (itStation == setStations.end()) {
828 setStations.insert(iStationAddr);
835 LOG(debug2) <<
"Event does not have enough layers fired: " << setStations.size() <<
" vs "
842 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
849 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
857 std::set<uint32_t> setRpcs;
858 std::map<uint32_t, int> mStrips;
860 for (
int idigi = 0; idigi < iNbDigis; ++idigi) {
861 uint idx =
event->GetIndex(det.
dataType, idigi);
863 if (
nullptr == pDigi)
continue;
869 std::map<uint32_t, int>::iterator itStrip = mStrips.find(iStripAddr);
870 if (itStrip == mStrips.end()) {
872 mStrips[iStripAddr] = (int) pDigi->
GetSide();
876 if ((
int) pDigi->
GetSide() == (1 - itStrip->second)) {
878 auto itRpc = setRpcs.find(iRpcAddr);
879 if (itRpc == setRpcs.end()) {
881 setRpcs.insert(iRpcAddr);
888 LOG(debug2) <<
"Event does not have enough RPCs fired: " << setRpcs.size() <<
" vs " << det.
fuTriggerMinLayers
889 <<
" for " << det.
sName;
895 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
901 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
907 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
913 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
919 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
936 LOG(info) <<
"No " << det.
sName <<
" digi input found.";
976 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckDataAvailable => "
977 <<
"Unsupported detector.";
1017 LOG(fatal) <<
"CbmAlgoBuildRawEvents::GetNofDigis => "
1018 <<
"Trying to get digi number with unsupported detector.";
1057 LOG(fatal) <<
"CbmAlgoBuildRawEvents::GetSizeFromDigisNb => "
1058 <<
"Trying to get digi number with unsupported detector.";
1067 outFolder =
new TDirectoryFile(
"AlgoBuildRawEventsHist",
" AlgoBuildRawEvents Histos");
1070 fhEventTime =
new TH1F(
"hEventTime",
"seed time of the events; Seed time within TS [s]; Events", 100000, 0, 0.2);
1074 new TH1F(
"fhEventDt",
"interval in seed time of consecutive events; Seed time dt [ns]; Events", 10000, 0, 100000);
1077 double_t dHistMaxTotDigis =
fRefDet.fdHistMaxDigiNb;
1078 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1079 dHistMaxTotDigis += (*det).fdHistMaxDigiNb;
1081 fhEventSize =
new TH1F(
"hEventSize",
"nb of all digis in the event; Nb Digis []; Events []", dHistMaxTotDigis, 0,
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);
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);
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);
1117 fhOverEventShare =
new TH1I(
"fhOverEventShare",
"Share of overlap evt; Overlap? []; Events", 2, -0.5, 1.5);
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);
1132 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1134 if (
"Invalid" == (*det).sName) {
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);
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);
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);
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()),
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()),
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()),
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 []",
1192 1000, 0, 0.2,
fRefDet.fdHistMaxDigiNb, 0,
fRefDet.fdHistMaxDigiNb);
1195 TH1I* hNbDigiPerEvtDet =
new TH1I(Form(
"hNbDigiPerEvt%s",
fRefDet.sName.data()),
1196 Form(
"nb of %s digis per event; Nb Digis []",
fRefDet.sName.data()),
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,
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 []",
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 []",
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 []",
1235 new TH1D(
"hSizeReductionPerTs",
"ratio of tot. sel. digi size to tot. input digi size vs TS; TS; Size Ratio []",
1242 if (
nullptr != (*itHist)) {
1249 if (
nullptr != (*itHist)) {
1254 for (std::vector<TH1*>::iterator itHist =
fvhTDiff.begin(); itHist !=
fvhTDiff.end(); ++itHist) {
1255 if (
nullptr != (*itHist)) {
1264 TCanvas* fcSummary =
new TCanvas(
"cEvBSummary",
"EvB monitoring plots");
1265 fcSummary->Divide(2, 2);
1295 TCanvas* fcNbDigi =
new TCanvas(
"cEvBNbDigi",
"EvB NbDigi evolution ");
1297 fcNbDigi->Divide(2, 3);
1300 fcNbDigi->Divide(3, 3);
1304 if (
nullptr != (*itHist)) {
1305 fcNbDigi->cd(iPad++);
1315 TCanvas* fcTdif =
new TCanvas(
"cEvBTdif",
"EvB Time Difference plots");
1317 fcTdif->Divide(2, 3);
1320 fcTdif->Divide(3, 3);
1323 for (std::vector<TH1*>::iterator itHist =
fvhTDiff.begin(); itHist !=
fvhTDiff.end(); ++itHist) {
1324 if (
nullptr != (*itHist)) {
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);
1345 Double_t dPreEvtTime = -1.0;
1348 if (0.0 <= dPreEvtTime) {
1349 fhEventDt->Fill((evt->GetStartTime() - dPreEvtTime) * 1e-9);
1373 uint32_t uNbDataTrd1d = 0;
1374 uint32_t uNbDataTrd2d = 0;
1375 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
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) {
1384 if (
nullptr == pDigi)
continue;
1385 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1390 if (
nullptr == pDigi)
continue;
1391 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1397 if (
nullptr == pDigi)
continue;
1398 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1402 if (
nullptr == pDigi)
continue;
1403 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1409 if (
nullptr == pDigi)
continue;
1410 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1415 if (
nullptr == pDigi)
continue;
1416 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1418 if (
fvDets[uDetIdx].sName ==
"Trd2D")
continue;
1422 if (
fvDets[uDetIdx].sName ==
"Trd1D")
continue;
1429 if (
nullptr == pDigi)
continue;
1430 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1435 if (
nullptr == pDigi)
continue;
1436 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1441 if (
nullptr == pDigi)
continue;
1442 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1445 default: LOG(error) <<
"Unkown dataType " <<
fvDets[uDetIdx].dataType;
1448 if (dTimeDiff < 1.E30)
fvhTDiff[uDetIdx]->Fill(dTimeDiff);
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);
1461 if (
nullptr == pDigi)
continue;
1462 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1467 if (
nullptr == pDigi)
continue;
1468 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1474 if (
nullptr == pDigi)
continue;
1475 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1479 if (
nullptr == pDigi)
continue;
1480 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1486 if (
nullptr == pDigi)
continue;
1487 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1492 if (
nullptr == pDigi)
continue;
1493 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1495 if (
fRefDet.sName ==
"Trd2D")
continue;
1499 if (
fRefDet.sName ==
"Trd1D")
continue;
1506 if (
nullptr == pDigi)
continue;
1507 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1512 if (
nullptr == pDigi)
continue;
1513 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1518 if (
nullptr == pDigi)
continue;
1519 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1522 default: LOG(error) <<
"Unkown dataType " <<
fRefDet.dataType;
1525 if (dTimeDiff < 1.E30)
fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
1531 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1534 if (
fvDets[uDetIdx].sName ==
"Trd1D") {
1542 ulTotalOutputSize += ulDigiSizeOut;
1543 vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
1546 else if (
fvDets[uDetIdx].sName ==
"Trd2D") {
1558 ulTotalOutputSize += ulDigiSizeOut;
1559 vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
1566 if (
fRefDet.sName ==
"Trd1D") {
1574 ulTotalOutputSize += ulDigiSizeOut;
1575 vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
1578 else if (
fRefDet.sName ==
"Trd2D") {
1590 ulTotalOutputSize += ulDigiSizeOut;
1591 vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
1596 dPreEvtTime = evt->GetStartTime();
1600 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1601 if (
fvDets[uDetIdx].sName ==
"Trd2D") {
1607 ulTotalInputSize += ulDigiSizeIn;
1608 vulTotalInputSizeDet[uDetIdx] += ulDigiSizeIn;
1612 ulTotalInputSize += ulDigiSizeIn;
1613 vulTotalInputSizeDet[uRefDetIdx] += ulDigiSizeIn;
1617 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1618 if (0 != vulTotalInputSizeDet[uDetIdx]) {
1621 if (0 != ulTotalInputSize) {
1624 if (0 != ulTotalOutputSize) {
1630 if (0 != vulTotalInputSizeDet[uRefDetIdx]) {
1632 vulTotalOutputSizeDet[uRefDetIdx] * 1.0 / vulTotalInputSizeDet[uRefDetIdx]);
1634 if (0 != ulTotalInputSize) {
1637 if (0 != ulTotalOutputSize) {
1642 if (0 != ulTotalInputSize) {
1645 LOG(debug) <<
"I/O Size ratio: " << (ulTotalOutputSize * 1.0 / ulTotalInputSize);
1665 for (std::vector<TH1*>::iterator itHist =
fvhTDiff.begin(); itHist !=
fvhTDiff.end(); ++itHist) {
1679 UInt_t uTriggerMinDigisIn,
Int_t iTriggerMaxDigisIn,
1680 Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn)
1684 fdTimeWinBegIn, fdTimeWinEndIn));
1687 UInt_t uTriggerMinDigisIn,
Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn,
1688 Double_t fdTimeWinEndIn)
1692 fdTimeWinBegIn, fdTimeWinEndIn));
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! "
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 "
1714 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => "
1715 "Doing nothing, identical reference detector already in use";
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 "
1724 LOG(warning) <<
" => "
1725 "Please also remember to update the selection windows!";
1737 if (select.size()) {
1738 LOG(info) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => Detected Bmon station selection.";
1741 for (
auto t0 : select)
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.";
1755 LOG(fatal) <<
"CbmAlgoBuildRawEvents::AddDetector => Cannot "
1756 "add the reference detector as selection detector!"
1758 <<
"=> Maybe first change the reference detector with "
1759 "SetReferenceDetector?";
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! "
1771 fvDets.push_back(selDet);
1784 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1785 if ((*det) == selDet) {
1792 LOG(warning) <<
"CbmAlgoBuildRawEvents::RemoveDetector => Doing "
1793 "nothing, selection detector not in list! "
1811 if (
fRefDet.detId == selDet) {
1812 fRefDet.fuTriggerMinDigis = uVal;
1813 LOG(debug) <<
"Set Trigger min limit for " <<
fRefDet.sName <<
" to " << uVal;
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;
1825 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerMinNumber => "
1826 "Doing nothing, detector neither reference nor in selection list! "
1833 if (
fRefDet.detId == selDet) {
1834 fRefDet.fiTriggerMaxDigis = iVal;
1835 LOG(debug) <<
"Set Trigger min limit for " <<
fRefDet.sName <<
" to " << iVal;
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;
1847 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerMaxNumber => "
1848 "Doing nothing, detector neither reference nor in selection list! "
1855 if (
fRefDet.detId == selDet) {
1856 fRefDet.fuTriggerMinLayers = uVal;
1857 LOG(debug) <<
"Set Trigger min fired layers limit for " <<
fRefDet.sName <<
" to " << uVal;
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;
1869 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerMinLayersNumber => "
1870 "Doing nothing, detector neither reference nor in selection list! "
1877 if (dWinEnd <= dWinBeg) {
1878 LOG(fatal) <<
"CbmAlgoBuildRawEvents::SetTriggerWindow => "
1879 "Invalid time window: [ "
1880 << dWinBeg <<
", " << dWinEnd <<
" ]";
1885 if (
fRefDet.detId == selDet) {
1886 fRefDet.fdTimeWinBeg = dWinBeg;
1887 fRefDet.fdTimeWinEnd = dWinEnd;
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;
1900 if (kFALSE == bFound) {
1901 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerWindow => "
1902 "Doing nothing, detector neither reference nor in selection list! "
1915 if (
fRefDet.detId == selDet) {
1916 fRefDet.fdHistMaxDigiNb = dVal;
1917 LOG(debug) <<
"Set histogram max digi nb for " <<
fRefDet.sName <<
" to " << dVal;
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;
1929 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetHistogramMaxDigiNb => "
1930 "Doing nothing, detector neither reference nor in selection list! "
1947 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1959 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1967 LOG(warning) <<
"CbmAlgoBuildRawEvents::SwitchBmonStation: Bmon station id outside range. Skip.";
1970 LOG(info) <<
"CbmAlgoBuildRawEvents::SwitchBmonStation: Bmon" <<
id <<
" station switched " << (on ?
"ON" :
"OFF")
1982 LOG(warning) <<
"CbmAlgoBuildRawEvents::filterBmon: Bmon digi with wrong address [GetSmType() != 5]. Skip.";
1988 LOG(debug2) <<
"CbmAlgoBuildRawEvents::filterBmon : reject seed from Bmon" << mod;
ClassImp(CbmConverterManager)
ECbmDataType
Enumerator for CBM data types.
ECbmModuleId
Enumerator for module Identifiers.
@ kMvd
Micro-Vertex Detector.
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kTrd2d
TRD-FASP Detector (FIXME)
@ kMuch
Muon detection system.
@ kFsd
Forward spectator detector.
@ kRich
Ring-Imaging Cherenkov Detector.
static double dTsStartTime
Helper class to convert unique channel ID back and forth.
void UpdateWidestTimeWinRange()
Bool_t CheckTriggerConditions(CbmEvent *event, const RawEventBuilderDetector &det)
TDirectoryFile * outFolder
UInt_t fuCurEv
histogram with size of overlap between evt vs TS index, AllowOverlap only
const std::vector< CbmTrdDigi > * fTrdDigis
Double_t GetSeedTimeWinRange()
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)
void UpdateTimeWinBoundariesExtrema()
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)
Double_t fdWidestTimeWinRange
TH1 * fhSizeReductionPerTs
ratio of selected digi size in total event size vs TS in run
void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
Bool_t HasTrigger(CbmEvent *)
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.
Double_t fdSeedTimeWinEnd
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 fdSeedTimeWinBeg
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)
Double_t fdEarliestTimeWinBeg
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
Double_t fdLatestTimeWinEnd
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.
double GetTime() const
Time.
int32_t GetAddress() const
Address.
Class characterising one event by a collection of links (indices) to data objects,...
Data class for FSD digital information.
Data class for PSD digital information.
Data class for a single-channel message in the STS.
XPU_D uint16_t GetChannel() const
Channel number in module @value Channel number.
XPU_D int32_t GetAddress() const
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.
double GetSide() const
Channel Side.
int32_t GetAddress() const
Inherited from CbmDigi.
eCbmTrdAsicType GetType() const
Channel FEE SPADIC/FASP according to CbmTrdAsicType.
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.
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.