22#include <FairRootManager.h>
23#include <FairRunOnline.h>
28#include <TClonesArray.h>
29#include <TDirectoryFile.h>
32#include <THttpServer.h>
34#include <TStopwatch.h>
46 LOG(info) <<
"CbmAlgoBuildRawEvents::InitAlgo => Starting sequence";
57 LOG(fatal) <<
"No reference detector set and no seed times supplied, stopping there!";
62 LOG(fatal) <<
"Cannot have explicit seed times and reference detector, stopping there!";
65 LOG(fatal) <<
"Reference detector set but no digi input found, stopping there!";
70 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
72 LOG(fatal) <<
"No digi input for one of selection detector, stopping there!";
79 LOG(fatal) <<
"No TS metadata input found"
80 <<
" => Please check in the unpacking macro if the following line was "
83 <<
"source->SetWriteOutputFlag(kTRUE); // For writing TS metadata";
91 Double_t rtime =
fTimer->RealTime();
92 Double_t ctime =
fTimer->CpuTime();
93 LOG(info) <<
"CbmAlgoBuildRawEvents::Init(): Real time " << rtime <<
" s, CPU time " << ctime <<
" s";
96 LOG(info) <<
"CbmAlgoBuildRawEvents::InitAlgo => Done";
110 LOG(fatal) <<
"Trying to print timings but timer not set";
113 Double_t rtime =
fTimer->RealTime();
114 Double_t ctime =
fTimer->CpuTime();
115 LOG(info) <<
"CbmAlgoBuildRawEvents: Real time " << rtime <<
" s, CPU time " << ctime <<
" s";
124 LOG(debug) <<
"Event " <<
counter <<
" has " <<
event->GetNofData() <<
" digis";
133 LOG_IF(info,
fuNrTs % 1000 == 0) <<
"Begin of TS " <<
fuNrTs;
167 LOG(debug) <<
"Found " <<
fEventVector.size() <<
" triggered events";
195 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
196 (*det).fuStartIndex = 0;
197 (*det).fuEndIndex = 0;
210 if (
nullptr == pTsMetaData)
211 LOG(fatal) << Form(
"CbmAlgoBuildRawEvents::LoopOnSeeds => "
212 "No TS metadata found for TS %6u.",
221 LOG(warning) <<
"CbmAlgoBuildRawEvents::LoopOnSeeds => "
222 << Form(
"Event window not fitting in TS overlap, risk of "
223 "incomplete events: %f %f %f %f",
286 LOG(fatal) <<
"CbmAlgoBuildRawEvents::BuildEvents => "
287 <<
"Trying to search event seeds with unsupported det: " <<
fRefDet.
sName;
299 for (UInt_t uSeed = 0; uSeed < uNbSeeds; ++uSeed) {
300 LOG(debug) << Form(
"Checking seed %6u / %6u", uSeed, uNbSeeds);
305 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: reject for time %f < %f\n", dTime,
fdSeedWindowBeg);
316 LOG(fatal) <<
"Trying to read explicit seeds while reference detector is set.";
320template<
class DigiSeed>
325 for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
326 LOG(debug) << Form(
"Checking seed %6u / %6u", uDigi, uNbRefDigis);
331 const Double_t dTime = pDigi->GetTime();
336 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: reject for time %f < %f\n", dTime,
fdSeedWindowBeg);
362 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: CheckSeed(%f, %d)\n", dSeedTime, uSeedDigiIdx);
370 LOG(debug1) <<
"Reject seed due to overlap";
381 LOG(debug1) <<
"Reject seed because part of cluster of previous one";
434 bool bAllTriggersOk =
true;
435 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
440 bAllTriggersOk =
false;
444 if (bAllTriggersOk) {
455 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
456 (*det).fuStartIndex = (*det).fuEndIndex;
463 LOG(debug1) <<
"Reject seed due to Trigger requirements";
470 LOG(debug1) <<
"Reject seed due to Trigger requirements";
476 for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
477 SearchMatches(dSeedTime, *det);
480 CheckTriggerCondition(dSeedTime);
490 return &((*fStsDigis)[uDigi]);
495 return &((*fMuchBeamTimeDigis)[uDigi]);
500 return &((*fMuchDigis)[uDigi]);
505 return &((*fTrdDigis)[uDigi]);
510 return &((*fTofDigis)[uDigi]);
515 return &((*fRichDigis)[uDigi]);
520 return &((*fPsdDigis)[uDigi]);
525 return &((*fFsdDigis)[uDigi]);
530 return &((*fBmonDigis)[uDigi]);
538 switch (detMatch.
detId) {
578 LOG(fatal) <<
"CbmAlgoBuildRawEvents::LoopOnSeeds => "
579 <<
"Trying to search matches with unsupported det: " << detMatch.
sName << std::endl
580 <<
"You may want to add support for it in the method.";
586template<
class DigiCheck>
592 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: SearchMatches(%f, %s)\n", dSeedTime, detMatch.
sName.data());
596 for (UInt_t uDigi = detMatch.
fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
598 const Double_t dTime = pDigi->GetTime();
599 const Double_t dTimeDiff = dTime - dSeedTime;
600 LOG(debug4) << detMatch.
sName << Form(
" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
635 uLocalIndexEnd = uDigi;
657 if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
662 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: SearchMatches(%d, %d)\n", uLocalIndexStart, uLocalIndexEnd);
667 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: :: AddDigiToEvent(%s)\n", det.
sName.data());
673 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: :: CheckTriggerCondition(%f)\n", dSeedTime);
686 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
687 (*det).fuStartIndex = (*det).fuEndIndex;
692 LOG(debug1) <<
"Reject seed due to Trigger requirements";
707 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
717 double eventTime(0.);
720 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: SetBmonEventTime(%p, %d)\n", (
void*) event, iNbDigis);
721 for (
int idigi = 0; idigi < iNbDigis; ++idigi) {
724 if (
nullptr == pDigi)
continue;
732 eventTime = std::min(pDigi->
GetTime(), eventTime);
736 event->SetStartTime(eventTime);
739 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetBmonEventTime : failed";
746 LOG(debug4) << Form(
"CbmAlgoBuildRawEvents :: :: CheckTriggerConditions(%p, %s)\n", (
void*) event, det.
sName.data());
754 LOG(debug2) <<
"Event does not have digis storage for " << det.
sName
755 <<
" while the following trigger min/max are defined: " << det.
fuTriggerMinDigis <<
" "
761 int32_t iNbDigis =
event->GetNofData(det.
dataType);
766 && ((-1 == iNbFilteredDigis) || (
static_cast<UInt_t
>(iNbFilteredDigis) < det.
fuTriggerMinDigis))) {
767 LOG(debug2) <<
"Event does not have enough digis: " << iNbFilteredDigis <<
" vs " << det.
fuTriggerMinDigis
768 <<
" for " << det.
sName;
774 LOG(debug2) <<
"Event Has too many digis: " << iNbFilteredDigis <<
" vs " << det.
fiTriggerMaxDigis <<
" for "
785 std::set<uint32_t> setStations;
786 std::map<uint32_t, int> mModules;
788 for (
int idigi = 0; idigi < iNbDigis; ++idigi) {
789 uint idx =
event->GetIndex(det.
dataType, idigi);
791 if (
nullptr == pDigi)
continue;
800 std::map<uint32_t, int>::iterator itModule = mModules.find(iModuleAddr);
801 if (itModule == mModules.end()) {
804 mModules[iModuleAddr] =
static_cast<int32_t
>(pDigi->
GetChannel() / 1024);
810 if (
static_cast<int32_t
>(pDigi->
GetChannel() / 1024) == (1 - itModule->second)) {
812 auto itStation = setStations.find(iStationAddr);
813 if (itStation == setStations.end()) {
815 setStations.insert(iStationAddr);
822 LOG(debug2) <<
"Event does not have enough layers fired: " << setStations.size() <<
" vs "
829 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
836 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
844 std::set<uint32_t> setRpcs;
845 std::map<uint32_t, int> mStrips;
847 for (
int idigi = 0; idigi < iNbDigis; ++idigi) {
848 uint idx =
event->GetIndex(det.
dataType, idigi);
850 if (
nullptr == pDigi)
continue;
856 std::map<uint32_t, int>::iterator itStrip = mStrips.find(iStripAddr);
857 if (itStrip == mStrips.end()) {
859 mStrips[iStripAddr] = (int) pDigi->
GetSide();
863 if ((
int) pDigi->
GetSide() == (1 - itStrip->second)) {
865 auto itRpc = setRpcs.find(iRpcAddr);
866 if (itRpc == setRpcs.end()) {
868 setRpcs.insert(iRpcAddr);
875 LOG(debug2) <<
"Event does not have enough RPCs fired: " << setRpcs.size() <<
" vs " << det.
fuTriggerMinLayers
876 <<
" for " << det.
sName;
882 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
888 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
894 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
900 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
906 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckTriggerConditions => Fired layers check not implemented yet for "
923 LOG(info) <<
"No " << det.
sName <<
" digi input found.";
963 LOG(fatal) <<
"CbmAlgoBuildRawEvents::CheckDataAvailable => "
964 <<
"Unsupported detector.";
1004 LOG(fatal) <<
"CbmAlgoBuildRawEvents::GetNofDigis => "
1005 <<
"Trying to get digi number with unsupported detector.";
1044 LOG(fatal) <<
"CbmAlgoBuildRawEvents::GetSizeFromDigisNb => "
1045 <<
"Trying to get digi number with unsupported detector.";
1054 outFolder =
new TDirectoryFile(
"AlgoBuildRawEventsHist",
" AlgoBuildRawEvents Histos");
1057 fhEventTime =
new TH1F(
"hEventTime",
"seed time of the events; Seed time within TS [s]; Events", 100000, 0, 0.2);
1061 new TH1F(
"fhEventDt",
"interval in seed time of consecutive events; Seed time dt [ns]; Events", 10000, 0, 100000);
1065 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1066 dHistMaxTotDigis += (*det).fdHistMaxDigiNb;
1068 fhEventSize =
new TH1F(
"hEventSize",
"nb of all digis in the event; Nb Digis []; Events []", dHistMaxTotDigis, 0,
1073 "nb of all digis per event vs seed time of the events; Seed time "
1074 "[s]; Nb Digis []; Events []",
1075 1000, 0, 0.2, dHistMaxTotDigis, 0, dHistMaxTotDigis);
1078 fhCpuTimePerTs =
new TH1D(
"hCpuTimePerTs",
"CPU Processing time of TS vs TS; Ts; CPU time [ms]", 6000, 0, 6000);
1079 fhRealTimePerTs =
new TH1D(
"hRealTimePerTs",
"Real Processing time of TS vs TS; Ts; Real time [ms]", 6000, 0, 6000);
1082 new TH1D(
"hCpuTimePerTsHist",
"CPU Histo filling time of TS vs TS; Ts; CPU time [ms]", 6000, 0, 6000);
1084 new TH1D(
"hRealTimePerTsHist",
"Real Histo filling time of TS vs TS; Ts; Real time [ms]", 6000, 0, 6000);
1104 fhOverEventShare =
new TH1I(
"fhOverEventShare",
"Share of overlap evt; Overlap? []; Events", 2, -0.5, 1.5);
1106 "fhOverEventShareTs",
"Share of overlap evt per TS; TS index []; Overlap Events prop. []", 2500, 0, 2500);
1108 new TH2I(
"fhOverEventSizeTs",
"Size of overlap of evt per TS; TS index []; Size of overlap between events [ns]",
1109 2500, 0, 2500, 200, 0, 1000);
1119 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1121 if (
"Invalid" == (*det).sName) {
1126 TH2I* hNbDigiPerEvtTimeDet =
new TH2I(Form(
"hNbDigiPerEvtTime%s", (*det).sName.data()),
1127 Form(
"nb of %s digis per event vs seed time of the events; Seed time in TS "
1128 "[s]; Nb Digis []; Events []",
1129 (*det).sName.data()),
1130 1000, 0, 0.2, (*det).fdHistMaxDigiNb, 0, (*det).fdHistMaxDigiNb);
1134 TH1* hNbDigiPerEvtDet =
new TH1I(Form(
"hNbDigiPerEvt%s", (*det).sName.data()),
1135 Form(
"nb of %s digis per event; Nb Digis []", (*det).sName.data()),
1136 (*det).fdHistMaxDigiNb, 0, (*det).fdHistMaxDigiNb);
1140 new TH1I(Form(
"hTDiff%s", (*det).sName.data()),
1141 Form(
"#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []", (*det).sName.data()), 200,
1142 (*det).fdTimeWinBeg, (*det).fdTimeWinEnd);
1146 TH1* hSelRatioPerTsNb =
new TH1D(Form(
"hSelRatioPerTsNb%s", (*det).sName.data()),
1147 Form(
"ratio of sel digis per TS vs TS for %s; TS; Sel Digis Ratio []",
1148 (*det).sName.data()),
1150 TH1* hInpRatioPerTsSz =
new TH1D(Form(
"hInpRatioPerTsSz%s", (*det).sName.data()),
1151 Form(
"ratio of input digi size in total input size vs TS for %s; TS; Size Ratio []",
1152 (*det).sName.data()),
1154 TH1* hOutRatioPerTsSz =
new TH1D(Form(
"hOutRatioPerTsSz%s", (*det).sName.data()),
1155 Form(
"ratio of selected digi size in event size vs TS for %s; TS; Size Ratio []",
1156 (*det).sName.data()),
1175 TH2I* hNbDigiPerEvtTimeDet =
new TH2I(Form(
"hNbDigiPerEvtTime%s",
fRefDet.
sName.data()),
1176 Form(
"nb of %s digis per event vs seed time of the events; Seed time in TS "
1177 "[s]; Nb Digis []; Events []",
1182 TH1I* hNbDigiPerEvtDet =
new TH1I(Form(
"hNbDigiPerEvt%s",
fRefDet.
sName.data()),
1183 Form(
"nb of %s digis per event; Nb Digis []",
fRefDet.
sName.data()),
1189 Form(
"#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []",
fRefDet.
sName.data()), 200,
1194 TH1* hSelRatioPerTsNb =
new TH1D(Form(
"hSelRatioPerTsNb%s",
fRefDet.
sName.data()),
1195 Form(
"ratio of sel digis per TS vs TS for %s; TS; Sel Digis Ratio []",
1198 TH1* hInpRatioPerTsSz =
new TH1D(Form(
"hInpRatioPerTsSz%s",
fRefDet.
sName.data()),
1199 Form(
"ratio of input digi size in total input size vs TS for %s; TS; Size Ratio []",
1202 TH1* hOutRatioPerTsSz =
new TH1D(Form(
"hOutRatioPerTsSz%s",
fRefDet.
sName.data()),
1203 Form(
"ratio of selected digi size in event size vs TS for %s; TS; Size Ratio []",
1222 new TH1D(
"hSizeReductionPerTs",
"ratio of tot. sel. digi size to tot. input digi size vs TS; TS; Size Ratio []",
1229 if (
nullptr != (*itHist)) {
1236 if (
nullptr != (*itHist)) {
1241 for (std::vector<TH1*>::iterator itHist =
fvhTDiff.begin(); itHist !=
fvhTDiff.end(); ++itHist) {
1242 if (
nullptr != (*itHist)) {
1251 TCanvas* fcSummary =
new TCanvas(
"cEvBSummary",
"EvB monitoring plots");
1252 fcSummary->Divide(2, 2);
1282 TCanvas* fcNbDigi =
new TCanvas(
"cEvBNbDigi",
"EvB NbDigi evolution ");
1284 fcNbDigi->Divide(2, 3);
1287 fcNbDigi->Divide(3, 3);
1291 if (
nullptr != (*itHist)) {
1292 fcNbDigi->cd(iPad++);
1302 TCanvas* fcTdif =
new TCanvas(
"cEvBTdif",
"EvB Time Difference plots");
1304 fcTdif->Divide(2, 3);
1307 fcTdif->Divide(3, 3);
1310 for (std::vector<TH1*>::iterator itHist =
fvhTDiff.begin(); itHist !=
fvhTDiff.end(); ++itHist) {
1311 if (
nullptr != (*itHist)) {
1325 uint32_t uRefDetIdx =
fvDets.size();
1326 uint64_t ulTotalInputSize = 0;
1327 uint64_t ulTotalOutputSize = 0;
1328 std::vector<uint64_t> vulTotalInputSizeDet(
fvDets.size() + 1, 0);
1329 std::vector<uint64_t> vulTotalOutputSizeDet(
fvDets.size() + 1, 0);
1332 Double_t dPreEvtTime = -1.0;
1335 if (0.0 <= dPreEvtTime) {
1336 fhEventDt->Fill((evt->GetStartTime() - dPreEvtTime) * 1e-9);
1360 uint32_t uNbDataTrd1d = 0;
1361 uint32_t uNbDataTrd2d = 0;
1362 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1365 for (
size_t idigi = 0; idigi < evt->GetNofData(
fvDets[uDetIdx].dataType); ++idigi) {
1366 double dTimeDiff = 1.E30;
1367 uint idx = evt->GetIndex(
fvDets[uDetIdx].dataType, idigi);
1368 switch (
fvDets[uDetIdx].dataType) {
1371 if (
nullptr == pDigi)
continue;
1372 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1377 if (
nullptr == pDigi)
continue;
1378 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1384 if (
nullptr == pDigi)
continue;
1385 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1389 if (
nullptr == pDigi)
continue;
1390 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1396 if (
nullptr == pDigi)
continue;
1397 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1402 if (
nullptr == pDigi)
continue;
1403 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1405 if (
fvDets[uDetIdx].sName ==
"Trd2D")
continue;
1409 if (
fvDets[uDetIdx].sName ==
"Trd1D")
continue;
1416 if (
nullptr == pDigi)
continue;
1417 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1422 if (
nullptr == pDigi)
continue;
1423 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1428 if (
nullptr == pDigi)
continue;
1429 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1432 default: LOG(error) <<
"Unkown dataType " <<
fvDets[uDetIdx].dataType;
1435 if (dTimeDiff < 1.E30)
fvhTDiff[uDetIdx]->Fill(dTimeDiff);
1442 for (
size_t idigi = 0; idigi < evt->GetNofData(
fRefDet.
dataType); ++idigi) {
1443 double dTimeDiff = 1.E30;
1448 if (
nullptr == pDigi)
continue;
1449 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1454 if (
nullptr == pDigi)
continue;
1455 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1461 if (
nullptr == pDigi)
continue;
1462 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1466 if (
nullptr == pDigi)
continue;
1467 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1473 if (
nullptr == pDigi)
continue;
1474 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1479 if (
nullptr == pDigi)
continue;
1480 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1493 if (
nullptr == pDigi)
continue;
1494 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1499 if (
nullptr == pDigi)
continue;
1500 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1505 if (
nullptr == pDigi)
continue;
1506 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
1512 if (dTimeDiff < 1.E30)
fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
1518 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1521 if (
fvDets[uDetIdx].sName ==
"Trd1D") {
1529 ulTotalOutputSize += ulDigiSizeOut;
1530 vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
1533 else if (
fvDets[uDetIdx].sName ==
"Trd2D") {
1545 ulTotalOutputSize += ulDigiSizeOut;
1546 vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
1561 ulTotalOutputSize += ulDigiSizeOut;
1562 vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
1577 ulTotalOutputSize += ulDigiSizeOut;
1578 vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
1583 dPreEvtTime = evt->GetStartTime();
1587 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1588 if (
fvDets[uDetIdx].sName ==
"Trd2D") {
1594 ulTotalInputSize += ulDigiSizeIn;
1595 vulTotalInputSizeDet[uDetIdx] += ulDigiSizeIn;
1599 ulTotalInputSize += ulDigiSizeIn;
1600 vulTotalInputSizeDet[uRefDetIdx] += ulDigiSizeIn;
1604 for (UInt_t uDetIdx = 0; uDetIdx <
fvDets.size(); ++uDetIdx) {
1605 if (0 != vulTotalInputSizeDet[uDetIdx]) {
1608 if (0 != ulTotalInputSize) {
1611 if (0 != ulTotalOutputSize) {
1617 if (0 != vulTotalInputSizeDet[uRefDetIdx]) {
1619 vulTotalOutputSizeDet[uRefDetIdx] * 1.0 / vulTotalInputSizeDet[uRefDetIdx]);
1621 if (0 != ulTotalInputSize) {
1624 if (0 != ulTotalOutputSize) {
1629 if (0 != ulTotalInputSize) {
1632 LOG(debug) <<
"I/O Size ratio: " << (ulTotalOutputSize * 1.0 / ulTotalInputSize);
1652 for (std::vector<TH1*>::iterator itHist =
fvhTDiff.begin(); itHist !=
fvhTDiff.end(); ++itHist) {
1666 UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn,
1667 Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn)
1671 fdTimeWinBegIn, fdTimeWinEndIn));
1674 UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn,
1675 Double_t fdTimeWinEndIn)
1679 fdTimeWinBegIn, fdTimeWinEndIn));
1685 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1686 if ((*det) == refDetIn) {
1687 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => "
1688 "Reference detector already in selection detector list! "
1690 LOG(warning) <<
" => "
1691 "It will be automatically removed from selection detector list!";
1692 LOG(warning) <<
" => "
1693 "Please also remember to update the selection windows to store "
1701 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => "
1702 "Doing nothing, identical reference detector already in use";
1705 LOG(info) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => "
1706 <<
"Replacing " <<
fRefDet.
sName <<
" with " << refDetIn.
sName <<
" as reference detector";
1707 LOG(warning) <<
" => "
1708 "You may want to use AddDetector after this command to add in "
1711 LOG(warning) <<
" => "
1712 "Please also remember to update the selection windows!";
1724 if (select.size()) {
1725 LOG(info) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => Detected Bmon station selection.";
1728 for (
auto t0 : select)
1734 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetReferenceDetector => Detected use of selector\nfor a reference "
1735 "detector which does not support this option. Skip selection for the moment.";
1742 LOG(fatal) <<
"CbmAlgoBuildRawEvents::AddDetector => Cannot "
1743 "add the reference detector as selection detector!"
1745 <<
"=> Maybe first change the reference detector with "
1746 "SetReferenceDetector?";
1750 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1751 if ((*det) == selDet) {
1752 LOG(warning) <<
"CbmAlgoBuildRawEvents::AddDetector => "
1753 "Doing nothing, selection detector already in list! "
1758 fvDets.push_back(selDet);
1771 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1772 if ((*det) == selDet) {
1779 LOG(warning) <<
"CbmAlgoBuildRawEvents::RemoveDetector => Doing "
1780 "nothing, selection detector not in list! "
1800 LOG(debug) <<
"Set Trigger min limit for " <<
fRefDet.
sName <<
" to " << uVal;
1805 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1806 if ((*det).detId == selDet) {
1807 (*det).fuTriggerMinDigis = uVal;
1808 LOG(debug) <<
"Set Trigger min limit for " << (*det).sName <<
" to " << uVal;
1812 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerMinNumber => "
1813 "Doing nothing, detector neither reference nor in selection list! "
1822 LOG(debug) <<
"Set Trigger min limit for " <<
fRefDet.
sName <<
" to " << iVal;
1827 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1828 if ((*det).detId == selDet) {
1829 (*det).fiTriggerMaxDigis = iVal;
1830 LOG(debug) <<
"Set Trigger min limit for " << (*det).sName <<
" to " << iVal;
1834 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerMaxNumber => "
1835 "Doing nothing, detector neither reference nor in selection list! "
1844 LOG(debug) <<
"Set Trigger min fired layers limit for " <<
fRefDet.
sName <<
" to " << uVal;
1849 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1850 if ((*det).detId == selDet) {
1851 (*det).fuTriggerMinLayers = uVal;
1852 LOG(debug) <<
"Set Trigger min fired layers limit for " << (*det).sName <<
" to " << uVal;
1856 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerMinLayersNumber => "
1857 "Doing nothing, detector neither reference nor in selection list! "
1864 if (dWinEnd <= dWinBeg) {
1865 LOG(fatal) <<
"CbmAlgoBuildRawEvents::SetTriggerWindow => "
1866 "Invalid time window: [ "
1867 << dWinBeg <<
", " << dWinEnd <<
" ]";
1870 Bool_t bFound = kFALSE;
1879 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1880 if ((*det).detId == selDet) {
1881 (*det).fdTimeWinBeg = dWinBeg;
1882 (*det).fdTimeWinEnd = dWinEnd;
1887 if (kFALSE == bFound) {
1888 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetTriggerWindow => "
1889 "Doing nothing, detector neither reference nor in selection list! "
1904 LOG(debug) <<
"Set histogram max digi nb for " <<
fRefDet.
sName <<
" to " << dVal;
1909 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1910 if ((*det).detId == selDet) {
1911 (*det).fdHistMaxDigiNb = dVal;
1912 LOG(debug) <<
"Set histogram max digi nb " << (*det).sName <<
" to " << dVal;
1916 LOG(warning) <<
"CbmAlgoBuildRawEvents::SetHistogramMaxDigiNb => "
1917 "Doing nothing, detector neither reference nor in selection list! "
1934 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1946 for (std::vector<RawEventBuilderDetector>::iterator det =
fvDets.begin(); det !=
fvDets.end(); ++det) {
1954 LOG(warning) <<
"CbmAlgoBuildRawEvents::SwitchBmonStation: Bmon station id outside range. Skip.";
1957 LOG(info) <<
"CbmAlgoBuildRawEvents::SwitchBmonStation: Bmon" <<
id <<
" station switched " << (on ?
"ON" :
"OFF")
1969 LOG(warning) <<
"CbmAlgoBuildRawEvents::filterBmon: Bmon digi with wrong address [GetSmType() != 5]. Skip.";
1975 LOG(debug2) <<
"CbmAlgoBuildRawEvents::filterBmon : reject seed from Bmon" << mod;
ClassImp(CbmConverterManager)
@ 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,...
void AddData(ECbmDataType type, uint32_t index)
void SetEndTime(double endTime)
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...
Double_t GetTimeWinRange()
Double_t fdHistMaxDigiNb
Histo configuration.
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.