diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx index 1e5a36a90e1bd766430e600e903838277a06b711..5d99e3a836cb428fa38f3b87e99cffa3ccf99de0 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx @@ -129,6 +129,9 @@ void CbmAlgoBuildRawEvents::ClearEventVector() void CbmAlgoBuildRawEvents::ProcessTs() { LOG_IF(info, fuNrTs % 1000 == 0) << "Begin of TS " << fuNrTs; + TStopwatch timerTs; + timerTs.Start(); + if (fTimer != nullptr) { fTimer->Start(kFALSE); } InitTs(); InitSeedWindow(); @@ -146,10 +149,23 @@ void CbmAlgoBuildRawEvents::ProcessTs() fCurrentEvent = nullptr; } + if (fbFillHistos) { + timerTs.Stop(); + fhCpuTimePerTs->Fill(fuNrTs, timerTs.CpuTime() * 1000.); + fhRealTimePerTs->Fill(fuNrTs, timerTs.RealTime() * 1000.); + timerTs.Start(); + } + LOG(debug) << "Found " << fEventVector.size() << " triggered events"; if (fbFillHistos) { FillHistos(); } if (fTimer != nullptr) { fTimer->Stop(); } + if (fbFillHistos) { + timerTs.Stop(); + fhCpuTimePerTsHist->Fill(fuNrTs, timerTs.CpuTime() * 1000.); + fhRealTimePerTsHist->Fill(fuNrTs, timerTs.RealTime() * 1000.); + } + fuNrTs++; } @@ -991,6 +1007,41 @@ UInt_t CbmAlgoBuildRawEvents::GetNofDigis(ECbmModuleId detId) } } } +uint64_t CbmAlgoBuildRawEvents::GetSizeFromDigisNb(ECbmModuleId detId, uint64_t ulNbDigis) +{ + switch (detId) { + case ECbmModuleId::kSts: { + return ulNbDigis * sizeof(CbmStsDigi); + } + case ECbmModuleId::kMuch: { + if (fbUseMuchBeamtimeDigi) { return ulNbDigis * sizeof(CbmMuchBeamTimeDigi); } + else { + return ulNbDigis * sizeof(CbmMuchDigi); + } + } + case ECbmModuleId::kTrd2d: // Same data storage as trd 1d + case ECbmModuleId::kTrd: { + return ulNbDigis * sizeof(CbmTrdDigi); + } + case ECbmModuleId::kTof: { + return ulNbDigis * sizeof(CbmTofDigi); + } + case ECbmModuleId::kRich: { + return ulNbDigis * sizeof(CbmRichDigi); + } + case ECbmModuleId::kPsd: { + return ulNbDigis * sizeof(CbmPsdDigi); + } + case ECbmModuleId::kT0: { + return ulNbDigis * sizeof(CbmTofDigi); + } + default: { + LOG(fatal) << "CbmAlgoBuildRawEvents::GetSizeFromDigisNb => " + << "Trying to get digi number with unsupported detector."; + return -1; + } + } +} //---------------------------------------------------------------------- void CbmAlgoBuildRawEvents::CreateHistograms() @@ -1014,14 +1065,30 @@ void CbmAlgoBuildRawEvents::CreateHistograms() 1000, 0, 0.2, 5000, 0, 5000); // fhNbDigiPerEvtTime->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged! + fhCpuTimePerTs = new TH1D("hCpuTimePerTs", "CPU Processing time of TS vs TS; Ts; CPU time [ms]", 6000, 0, 6000); + fhRealTimePerTs = new TH1D("hRealTimePerTs", "Real Processing time of TS vs TS; Ts; Real time [ms]", 6000, 0, 6000); + + fhCpuTimePerTsHist = + new TH1D("hCpuTimePerTsHist", "CPU Histo filling time of TS vs TS; Ts; CPU time [ms]", 6000, 0, 6000); + fhRealTimePerTsHist = + new TH1D("hRealTimePerTsHist", "Real Histo filling time of TS vs TS; Ts; Real time [ms]", 6000, 0, 6000); + AddHistoToVector(fhEventTime, "evtbuild"); AddHistoToVector(fhEventDt, "evtbuild"); AddHistoToVector(fhEventSize, "evtbuild"); AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild"); + AddHistoToVector(fhCpuTimePerTs, "evtbuild-eff"); + AddHistoToVector(fhRealTimePerTs, "evtbuild-eff"); + AddHistoToVector(fhCpuTimePerTsHist, "evtbuild-eff"); + AddHistoToVector(fhRealTimePerTsHist, "evtbuild-eff"); outFolder->Add(fhEventTime); outFolder->Add(fhEventDt); outFolder->Add(fhEventSize); outFolder->Add(fhNbDigiPerEvtTime); + outFolder->Add(fhCpuTimePerTs); + outFolder->Add(fhRealTimePerTs); + outFolder->Add(fhCpuTimePerTsHist); + outFolder->Add(fhRealTimePerTsHist); /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { @@ -1039,16 +1106,43 @@ void CbmAlgoBuildRawEvents::CreateHistograms() // hNbDigiPerEvtTimeDet->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged! fvhNbDigiPerEvtTimeDet.push_back(hNbDigiPerEvtTimeDet); - TH1I* hNbDigiPerEvtDet = + TH1* hNbDigiPerEvtDet = new TH1I(Form("hNbDigiPerEvt%s", (*det).sName.data()), Form("nb of %s digis per event; Nb Digis []", (*det).sName.data()), 10000, 0, 10000); fvhNbDigiPerEvtDet.push_back(hNbDigiPerEvtDet); - TH1I* hTDiff = + TH1* hTDiff = new TH1I(Form("hTDiff%s", (*det).sName.data()), Form("#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []", (*det).sName.data()), 200, (*det).fdTimeWinBeg, (*det).fdTimeWinEnd); fvhTDiff.push_back(hTDiff); + + // clang-format off + TH1* hSelRatioPerTsNb = new TH1D(Form("hSelRatioPerTsNb%s", (*det).sName.data()), + Form("ratio of sel digis per TS vs TS for %s; TS; Sel Digis Ratio []", + (*det).sName.data()), + 6000, 0, 6000); + TH1* hInpRatioPerTsSz = new TH1D(Form("hInpRatioPerTsSz%s", (*det).sName.data()), + Form("ratio of input digi size in total input size vs TS for %s; TS; Size Ratio []", + (*det).sName.data()), + 6000, 0, 6000); + TH1* hOutRatioPerTsSz = new TH1D(Form("hOutRatioPerTsSz%s", (*det).sName.data()), + Form("ratio of selected digi size in event size vs TS for %s; TS; Size Ratio []", + (*det).sName.data()), + 6000, 0, 6000); + // clang-format on + + fvhSelRatioPerTsNb.push_back(hSelRatioPerTsNb); + fvhInpRatioPerTsSz.push_back(hInpRatioPerTsSz); + fvhOutRatioPerTsSz.push_back(hOutRatioPerTsSz); + + AddHistoToVector(hSelRatioPerTsNb, "evtbuild-eff"); + AddHistoToVector(hInpRatioPerTsSz, "evtbuild-eff"); + AddHistoToVector(hOutRatioPerTsSz, "evtbuild-eff"); + + outFolder->Add(hSelRatioPerTsNb); + outFolder->Add(hInpRatioPerTsSz); + outFolder->Add(hOutRatioPerTsSz); } /// Same plots for the reference detector @@ -1070,6 +1164,39 @@ void CbmAlgoBuildRawEvents::CreateHistograms() fRefDet.fdTimeWinBeg, fRefDet.fdTimeWinEnd); // FIXME, adjust to configured window fvhTDiff.push_back(hTDiff); + // clang-format off + TH1* hSelRatioPerTsNb = new TH1D(Form("hSelRatioPerTsNb%s", fRefDet.sName.data()), + Form("ratio of sel digis per TS vs TS for %s; TS; Sel Digis Ratio []", + fRefDet.sName.data()), + 6000, 0, 6000); + TH1* hInpRatioPerTsSz = new TH1D(Form("hInpRatioPerTsSz%s", fRefDet.sName.data()), + Form("ratio of input digi size in total input size vs TS for %s; TS; Size Ratio []", + fRefDet.sName.data()), + 6000, 0, 6000); + TH1* hOutRatioPerTsSz = new TH1D(Form("hOutRatioPerTsSz%s", fRefDet.sName.data()), + Form("ratio of selected digi size in event size vs TS for %s; TS; Size Ratio []", + fRefDet.sName.data()), + 6000, 0, 6000); + // clang-format on + + fvhSelRatioPerTsNb.push_back(hSelRatioPerTsNb); + fvhInpRatioPerTsSz.push_back(hInpRatioPerTsSz); + fvhOutRatioPerTsSz.push_back(hOutRatioPerTsSz); + + AddHistoToVector(hSelRatioPerTsNb, "evtbuild-eff"); + AddHistoToVector(hInpRatioPerTsSz, "evtbuild-eff"); + AddHistoToVector(hOutRatioPerTsSz, "evtbuild-eff"); + + outFolder->Add(hSelRatioPerTsNb); + outFolder->Add(hInpRatioPerTsSz); + outFolder->Add(hOutRatioPerTsSz); + + fhSizeReductionPerTs = + new TH1D("hSizeReductionPerTs", "ratio of tot. sel. digi size to tot. input digi size vs TS; TS; Size Ratio []", + 6000, 0, 6000); + AddHistoToVector(fhSizeReductionPerTs, "evtbuild-eff"); + outFolder->Add(fhSizeReductionPerTs); + for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist) { if (nullptr != (*itHist)) { @@ -1169,6 +1296,14 @@ void CbmAlgoBuildRawEvents::CreateHistograms() void CbmAlgoBuildRawEvents::FillHistos() { + /// I/O monitoring + uint32_t uRefDetIdx = fvDets.size(); + uint64_t ulTotalInputSize = 0; + uint64_t ulTotalOutputSize = 0; + std::vector<uint64_t> vulTotalInputSizeDet(fvDets.size() + 1, 0); + std::vector<uint64_t> vulTotalOutputSizeDet(fvDets.size() + 1, 0); + + /// Output monitoring Double_t dPreEvtTime = -1.0; for (CbmEvent* evt : fEventVector) { fhEventTime->Fill(evt->GetStartTime() * 1e-9); @@ -1427,10 +1562,26 @@ void CbmAlgoBuildRawEvents::FillHistos() // filter T0 digis from Tof (remove this block if T0 properly implemented) fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTof); fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTof); + + if (0 < GetNofDigis(fvDets[uDetIdx].detId)) { + /// Selection ratio + uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fvDets[uDetIdx].detId, uNbDataT0 + uNbDataTof); + + ulTotalOutputSize += ulDigiSizeOut; + vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut; + } } else if (fvDets[uDetIdx].sName == "Trd1D") { fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTrd1d); fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d); + + if (0 < GetNofDigis(fvDets[uDetIdx].detId)) { + /// Selection ratio + uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fvDets[uDetIdx].detId, uNbDataTrd1d + uNbDataTrd2d); + + ulTotalOutputSize += ulDigiSizeOut; + vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut; + } } else if (fvDets[uDetIdx].sName == "Trd2D") { fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTrd2d); @@ -1440,6 +1591,15 @@ void CbmAlgoBuildRawEvents::FillHistos() fvhNbDigiPerEvtDet[uDetIdx]->Fill(TMath::Max(0, evt->GetNofData(fvDets[uDetIdx].dataType))); fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, TMath::Max(0, evt->GetNofData(fvDets[uDetIdx].dataType))); + + if (0 < GetNofDigis(fvDets[uDetIdx].detId)) { + /// Selection ratio + uint64_t ulDigiSizeOut = + GetSizeFromDigisNb(fvDets[uDetIdx].detId, TMath::Max(0, evt->GetNofData(fvDets[uDetIdx].dataType))); + + ulTotalOutputSize += ulDigiSizeOut; + vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut; + } } } /// Same for the reference detector @@ -1452,10 +1612,26 @@ void CbmAlgoBuildRawEvents::FillHistos() // filter T0 digis from Tof (remove this block if T0 properly implemented) fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTof); fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTof); + + if (0 < GetNofDigis(fRefDet.detId)) { + /// Selection ratio + uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fRefDet.detId, uNbDataT0 + uNbDataTof); + + ulTotalOutputSize += ulDigiSizeOut; + vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut; + } } else if (fRefDet.sName == "Trd1D") { fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTrd1d); fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d); + + if (0 < GetNofDigis(fRefDet.detId)) { + /// Selection ratio + uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fRefDet.detId, uNbDataTrd1d + uNbDataTrd2d); + + ulTotalOutputSize += ulDigiSizeOut; + vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut; + } } else if (fRefDet.sName == "Trd2D") { fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTrd2d); @@ -1465,10 +1641,54 @@ void CbmAlgoBuildRawEvents::FillHistos() fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(TMath::Max(0, evt->GetNofData(fRefDet.dataType))); fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, TMath::Max(0, evt->GetNofData(fRefDet.dataType))); + + if (0 < GetNofDigis(fRefDet.detId)) { + /// Selection ratio + uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fRefDet.detId, TMath::Max(0, evt->GetNofData(fRefDet.dataType))); + + ulTotalOutputSize += ulDigiSizeOut; + vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut; + } } dPreEvtTime = evt->GetStartTime(); } + + /// Loop on selection detectors to count input data + for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) { + uint64_t ulDigiSizeIn = GetSizeFromDigisNb(fvDets[uDetIdx].detId, GetNofDigis(fvDets[uDetIdx].detId)); + ulTotalInputSize += ulDigiSizeIn; + vulTotalInputSizeDet[uDetIdx] += ulDigiSizeIn; + } + uint64_t ulDigiSizeIn = GetSizeFromDigisNb(fRefDet.detId, GetNofDigis(fRefDet.detId)); + ulTotalInputSize += ulDigiSizeIn; + vulTotalInputSizeDet[uRefDetIdx] += ulDigiSizeIn; + + /// Re-Loop on selection detectors to fill global TS ratios + for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) { + if (0 != vulTotalInputSizeDet[uDetIdx]) { // + fvhSelRatioPerTsNb[uDetIdx]->Fill(fuNrTs, vulTotalOutputSizeDet[uDetIdx] * 1.0 / vulTotalInputSizeDet[uDetIdx]); + } + if (0 != ulTotalInputSize) { // + fvhInpRatioPerTsSz[uDetIdx]->Fill(fuNrTs, vulTotalInputSizeDet[uDetIdx] * 1.0 / ulTotalInputSize); + } + if (0 != ulTotalOutputSize) { // + fvhOutRatioPerTsSz[uDetIdx]->Fill(fuNrTs, vulTotalOutputSizeDet[uDetIdx] * 1.0 / ulTotalOutputSize); + } + } + /// Same for the reference detector + if (0 != vulTotalInputSizeDet[uRefDetIdx]) { // + fvhSelRatioPerTsNb[uRefDetIdx]->Fill(fuNrTs, + vulTotalOutputSizeDet[uRefDetIdx] * 1.0 / vulTotalInputSizeDet[uRefDetIdx]); + } + if (0 != ulTotalInputSize) { // + fvhInpRatioPerTsSz[uRefDetIdx]->Fill(fuNrTs, vulTotalInputSizeDet[uRefDetIdx] * 1.0 / ulTotalInputSize); + fhSizeReductionPerTs->Fill(fuNrTs, ulTotalOutputSize * 1.0 / ulTotalInputSize); + } + if (0 != ulTotalOutputSize) { // + fvhOutRatioPerTsSz[uRefDetIdx]->Fill(fuNrTs, vulTotalOutputSizeDet[uRefDetIdx] * 1.0 / ulTotalOutputSize); + } + LOG(debug) << "I/O Size ratio: " << (ulTotalOutputSize * 1.0 / ulTotalInputSize); } void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/) diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h index a0c3d56614f4662115cec518f502e180ea135e8a..3c0b3722cab7c283f3acb9147b919496353064a1 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h @@ -305,6 +305,7 @@ private: UInt_t GetNofDigis(ECbmModuleId detId); template<class Digi> const Digi* GetDigi(UInt_t uDigi); + uint64_t GetSizeFromDigisNb(ECbmModuleId detId, uint64_t ulNbDigis); Double_t GetSeedTimeWinRange(); @@ -332,11 +333,22 @@ private: TH1* fhEventDt = nullptr; //! histogram with the interval in seed time of consecutive events TH1* fhEventSize = nullptr; //! histogram with the nb of all digis in the event TH2* fhNbDigiPerEvtTime = nullptr; //! histogram with the nb of all digis per event vs seed time of the events + TH1* fhCpuTimePerTs = nullptr; /// Processing time per TS + TH1* fhRealTimePerTs = nullptr; /// Processing time per TS + + TH1* fhCpuTimePerTsHist = nullptr; /// Plotting time per TS + TH1* fhRealTimePerTsHist = nullptr; /// Plotting time per TS + std::vector<TH2*> fvhNbDigiPerEvtTimeDet = {}; //! histograms with the nb of digis in each detector per event vs seed time of the events std::vector<TH1*> fvhNbDigiPerEvtDet = {}; //! histograms with the nb of digis in each detector per event std::vector<TH1*> fvhTDiff = {}; // digi time difference to seed + std::vector<TH1*> fvhSelRatioPerTsNb = {}; /// ratio of selected/input digi vs TS in run + std::vector<TH1*> fvhInpRatioPerTsSz = {}; /// ratio of input digi size in total input size vs TS in run + std::vector<TH1*> fvhOutRatioPerTsSz = {}; /// ratio of selected digi size in total event size vs TS in run + TH1* fhSizeReductionPerTs = nullptr; /// ratio of total selected size to input size selected vs TS in run + /// Internal state variables UInt_t fuCurEv = 0; //! Event Counter UInt_t fuNrTs = 0; //! Timeslice Counter