Skip to content
Snippets Groups Projects
Commit 8a791048 authored by Pierre-Alain Loizeau's avatar Pierre-Alain Loizeau
Browse files

[Evt Builder] in AlgoBuildRawEvent, add performance plots (time and data red.)

- Cpu/Real time for processing and histogram filling
- Selection ratio, input share and output share per TS for each system
- Global Selection ratio (in size) per TS
parent 4432ad74
No related branches found
No related tags found
1 merge request!874Changes from mCBM 2022 prod to digi event builder algo and task
......@@ -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*/)
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment