Skip to content

Commit 03767e2

Browse files
committed
[MCH] add rate and efficiency plots per DualSAMPA
The new histograms are 1D lightweight versions of the 2D maps in electronics coordinates, that are more suitable for saving moving windows plots in async productions. The 1D versions provide the quantities averaged over each DualSAMPA bard, while the 2D versions contain values on a channel-by-channel basis. By default the 1D histograms are enabled and the 2D are disabled.
1 parent ad97a66 commit 03767e2

File tree

4 files changed

+113
-21
lines changed

4 files changed

+113
-21
lines changed

Modules/MUON/MCH/include/MCH/DigitsTask.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "MCHBase/Digit.h"
2525
#endif
2626
#include "MCHDigitFiltering/DigitFilter.h"
27+
#include "Common/TH1Ratio.h"
2728
#include "Common/TH2Ratio.h"
2829

2930
class TH1F;
@@ -67,6 +68,9 @@ class DigitsTask /*final*/ : public TaskInterface // todo add back the "final" w
6768
template <typename T>
6869
void publishObject(T* histo, std::string drawOption, bool statBox, bool isExpert);
6970

71+
bool mEnable1DRateMaps{ true }; // whether to publish 1D maps of channel rates
72+
bool mEnable2DRateMaps{ false }; // whether to publish 2D maps of channel rates
73+
7074
bool mFullHistos{ false }; // publish extra diagnostics plots
7175

7276
o2::mch::DigitFilter mIsSignalDigit;
@@ -77,6 +81,10 @@ class DigitsTask /*final*/ : public TaskInterface // todo add back the "final" w
7781
std::unique_ptr<TH2FRatio> mHistogramOccupancyElec; // Occupancy histogram (Elec view)
7882
std::unique_ptr<TH2FRatio> mHistogramSignalOccupancyElec; // Occupancy histogram (Elec view) for signal-like digits
7983

84+
// 1D rate histograms using Elec view, where each x bin corresponds to the unique ID of a DualSAMPA board
85+
std::unique_ptr<TH1DRatio> mHistogramRatePerDualSampa;
86+
std::unique_ptr<TH1DRatio> mHistogramRateSignalPerDualSampa;
87+
8088
std::unique_ptr<TH2F> mHistogramDigitsOrbitElec;
8189
std::unique_ptr<TH2F> mHistogramDigitsSignalOrbitElec;
8290

Modules/MUON/MCH/include/MCH/PreclustersTask.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,16 @@ class PreclustersTask /*final*/ : public o2::quality_control::core::TaskInterfac
6464

6565
void plotPrecluster(const o2::mch::PreCluster& preCluster, gsl::span<const o2::mch::Digit> digits);
6666

67+
bool mEnable1DPseudoeffMaps{ true }; // whether to publish 1D maps of channel pseudo-efficiencies
68+
bool mEnable2DPseudoeffMaps{ false }; // whether to publish 2D maps of channel pseudo-efficiencies
69+
6770
o2::mch::DigitFilter mIsSignalDigit;
6871

6972
std::unique_ptr<TH2FRatio> mHistogramPseudoeffElec; // Mergeable object, Occupancy histogram (Elec view)
7073

74+
// 1D pseudo-efficiency histogram using Elec view, where each x bin corresponds to the unique ID of a DualSAMPA board
75+
std::unique_ptr<TH1DRatio> mHistogramPseudoeffPerDualSampa;
76+
7177
std::unique_ptr<TH1DRatio> mHistogramPreclustersPerDE; // number of pre-clusters per DE and per TF
7278
std::unique_ptr<TH1DRatio> mHistogramPreclustersSignalPerDE; // number of pre-clusters with signal per DE and per TF
7379

Modules/MUON/MCH/src/DigitsTask.cxx

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ void DigitsTask::initialize(o2::framework::InitContext& /*ctx*/)
6262

6363
mIsSignalDigit = o2::mch::createDigitFilter(20, true, true);
6464

65+
// flags to enable the publication of either 1D and 2D maps of channel rates
66+
mEnable1DRateMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable1DRateMaps", mEnable1DRateMaps);
67+
mEnable2DRateMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable2DRateMaps", mEnable2DRateMaps);
68+
6569
// flag to enable extra disagnostics plots; it also enables on-cycle plots
6670
mFullHistos = getConfigurationParameter<bool>(mCustomParameters, "FullHistos", mFullHistos);
6771

@@ -70,13 +74,25 @@ void DigitsTask::initialize(o2::framework::InitContext& /*ctx*/)
7074
const uint32_t nElecXbins = NumberOfDualSampas;
7175

7276
// Histograms in electronics coordinates
73-
mHistogramOccupancyElec = std::make_unique<TH2FRatio>("Occupancy_Elec", "Occupancy", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
74-
mHistogramOccupancyElec->Sumw2(kFALSE);
75-
publishObject(mHistogramOccupancyElec.get(), "colz", false, false);
77+
if (mEnable1DRateMaps) {
78+
mHistogramRatePerDualSampa = std::make_unique<TH1DRatio>("RatePerDualSampa", "Average rate per dual sampa;DS index;rate (kHz)", o2::mch::NumberOfDualSampas, 0, o2::mch::NumberOfDualSampas, false);
79+
mHistogramRatePerDualSampa->Sumw2(kFALSE);
80+
publishObject(mHistogramRatePerDualSampa.get(), "hist", false, false);
81+
82+
mHistogramRateSignalPerDualSampa = std::make_unique<TH1DRatio>("RateSignalPerDualSampa", "Average rate per dual sampa (signal);DS index;rate (kHz)", o2::mch::NumberOfDualSampas, 0, o2::mch::NumberOfDualSampas, false);
83+
mHistogramRateSignalPerDualSampa->Sumw2(kFALSE);
84+
publishObject(mHistogramRateSignalPerDualSampa.get(), "hist", false, false);
85+
}
7686

77-
mHistogramSignalOccupancyElec = std::make_unique<TH2FRatio>("OccupancySignal_Elec", "Occupancy (signal)", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
78-
mHistogramSignalOccupancyElec->Sumw2(kFALSE);
79-
publishObject(mHistogramSignalOccupancyElec.get(), "colz", false, false);
87+
if (mEnable2DRateMaps) {
88+
mHistogramOccupancyElec = std::make_unique<TH2FRatio>("Occupancy_Elec", "Occupancy", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
89+
mHistogramOccupancyElec->Sumw2(kFALSE);
90+
publishObject(mHistogramOccupancyElec.get(), "colz", false, false);
91+
92+
mHistogramSignalOccupancyElec = std::make_unique<TH2FRatio>("OccupancySignal_Elec", "Occupancy (signal)", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
93+
mHistogramSignalOccupancyElec->Sumw2(kFALSE);
94+
publishObject(mHistogramSignalOccupancyElec.get(), "colz", false, false);
95+
}
8096

8197
mHistogramDigitsOrbitElec = std::make_unique<TH2F>("DigitOrbit_Elec", "Digit orbits vs DS Id", nElecXbins, 0, nElecXbins, 130, -1, 129);
8298
publishObject(mHistogramDigitsOrbitElec.get(), "colz", true, false);
@@ -159,9 +175,17 @@ void DigitsTask::plotDigit(const o2::mch::Digit& digit)
159175
// fecId and channel uniquely identify each physical pad
160176
int fecId = getDsIndex(DsDetId{ deId, dsId });
161177

162-
mHistogramOccupancyElec->getNum()->Fill(fecId, channel);
163-
if (isSignal) {
164-
mHistogramSignalOccupancyElec->getNum()->Fill(fecId, channel);
178+
if (mEnable1DRateMaps) {
179+
mHistogramRatePerDualSampa->getNum()->Fill(fecId);
180+
if (isSignal) {
181+
mHistogramRateSignalPerDualSampa->getNum()->Fill(fecId);
182+
}
183+
}
184+
if (mEnable2DRateMaps) {
185+
mHistogramOccupancyElec->getNum()->Fill(fecId, channel);
186+
if (isSignal) {
187+
mHistogramSignalOccupancyElec->getNum()->Fill(fecId, channel);
188+
}
165189
}
166190

167191
//--------------------------------------------------------------------------
@@ -201,8 +225,17 @@ void DigitsTask::updateOrbits()
201225
static constexpr double sOrbitLengthInMicroseconds = sOrbitLengthInNanoseconds / 1000;
202226
static constexpr double sOrbitLengthInMilliseconds = sOrbitLengthInMicroseconds / 1000;
203227

204-
mHistogramOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
205-
mHistogramSignalOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
228+
if (mEnable1DRateMaps) {
229+
for (int dsIndex = 0; dsIndex <= NumberOfDualSampas; dsIndex++) {
230+
mHistogramRatePerDualSampa->getDen()->SetBinContent(dsIndex + 1, mNOrbits * sOrbitLengthInMilliseconds * numberOfDualSampaChannels(dsIndex));
231+
mHistogramRateSignalPerDualSampa->getDen()->SetBinContent(dsIndex + 1, mNOrbits * sOrbitLengthInMilliseconds * numberOfDualSampaChannels(dsIndex));
232+
}
233+
}
234+
235+
if (mEnable2DRateMaps) {
236+
mHistogramOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
237+
mHistogramSignalOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
238+
}
206239
}
207240

208241
void DigitsTask::resetOrbits()
@@ -217,8 +250,14 @@ void DigitsTask::endOfCycle()
217250
updateOrbits();
218251

219252
// update mergeable ratios
220-
mHistogramOccupancyElec->update();
221-
mHistogramSignalOccupancyElec->update();
253+
if (mEnable1DRateMaps) {
254+
mHistogramRatePerDualSampa->update();
255+
mHistogramRateSignalPerDualSampa->update();
256+
}
257+
if (mEnable2DRateMaps) {
258+
mHistogramOccupancyElec->update();
259+
mHistogramSignalOccupancyElec->update();
260+
}
222261
}
223262

224263
void DigitsTask::endOfActivity(const Activity& /*activity*/)

Modules/MUON/MCH/src/PreclustersTask.cxx

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
///
1717

1818
#include "MCH/PreclustersTask.h"
19+
#include "MUONCommon/Helpers.h"
1920
#include "MCH/Helpers.h"
2021
#ifdef MCH_HAS_MAPPING_FACTORY
2122
#include "MCHMappingFactory/CreateSegmentation.h"
@@ -30,6 +31,7 @@ using namespace std;
3031
using namespace o2::mch;
3132
using namespace o2::mch::raw;
3233
using namespace o2::quality_control::core;
34+
using namespace o2::quality_control_modules::muon;
3335

3436
namespace o2
3537
{
@@ -54,6 +56,10 @@ void PreclustersTask::initialize(o2::framework::InitContext& /*ctx*/)
5456
{
5557
ILOG(Info, Devel) << "initialize PreclustersTask" << AliceO2::InfoLogger::InfoLogger::endm;
5658

59+
// flags to enable the publication of either 1D and 2D maps of channel pseudo-efficiencies
60+
mEnable1DPseudoeffMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable1DPseudoeffMaps", mEnable1DPseudoeffMaps);
61+
mEnable2DPseudoeffMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable2DPseudoeffMaps", mEnable2DPseudoeffMaps);
62+
5763
mIsSignalDigit = o2::mch::createDigitFilter(20, true, true);
5864

5965
mHistogramPreclustersPerDE = std::make_unique<TH1DRatio>("PreclustersPerDE", "Number of pre-clusters for each DE", getNumDE(), 0, getNumDE());
@@ -64,9 +70,17 @@ void PreclustersTask::initialize(o2::framework::InitContext& /*ctx*/)
6470
const uint32_t nElecXbins = NumberOfDualSampas;
6571

6672
// Histograms in electronics coordinates
67-
mHistogramPseudoeffElec = std::make_unique<TH2FRatio>("Pseudoeff_Elec", "Pseudoeff", nElecXbins, 0, nElecXbins, 64, 0, 64);
68-
mHistogramPseudoeffElec->Sumw2(kFALSE);
69-
publishObject(mHistogramPseudoeffElec.get(), "colz", false);
73+
if (mEnable1DPseudoeffMaps) {
74+
mHistogramPseudoeffPerDualSampa = std::make_unique<TH1DRatio>("PseudoeffPerDualSampa", "Average pseudo-efficiency per dual sampa;DS index;efficiency", o2::mch::NumberOfDualSampas, 0, o2::mch::NumberOfDualSampas, false);
75+
mHistogramPseudoeffPerDualSampa->Sumw2(kFALSE);
76+
publishObject(mHistogramPseudoeffPerDualSampa.get(), "hist", false);
77+
}
78+
79+
if (mEnable2DPseudoeffMaps) {
80+
mHistogramPseudoeffElec = std::make_unique<TH2FRatio>("Pseudoeff_Elec", "Pseudoeff", nElecXbins, 0, nElecXbins, 64, 0, 64);
81+
mHistogramPseudoeffElec->Sumw2(kFALSE);
82+
publishObject(mHistogramPseudoeffElec.get(), "colz", false);
83+
}
7084

7185
//----------------------------------
7286
// Charge distribution histograms
@@ -337,23 +351,43 @@ void PreclustersTask::plotPrecluster(const o2::mch::PreCluster& preCluster, gsl:
337351
if (isGoodDen[0]) {
338352
// good cluster on non-bending side, check if there is data from the bending side as well
339353
if (fecIdB >= 0 && channelB >= 0) {
340-
mHistogramPseudoeffElec->getDen()->Fill(fecIdB, channelB);
354+
if (mEnable1DPseudoeffMaps) {
355+
mHistogramPseudoeffPerDualSampa->getDen()->Fill(fecIdB);
356+
}
357+
if (mEnable2DPseudoeffMaps) {
358+
mHistogramPseudoeffElec->getDen()->Fill(fecIdB, channelB);
359+
}
341360
}
342361
if (isGoodNum[0]) { // Check if associated to something on Bending
343362
if (fecIdB >= 0 && channelB >= 0) {
344-
mHistogramPseudoeffElec->getNum()->Fill(fecIdB, channelB);
363+
if (mEnable1DPseudoeffMaps) {
364+
mHistogramPseudoeffPerDualSampa->getNum()->Fill(fecIdB);
365+
}
366+
if (mEnable2DPseudoeffMaps) {
367+
mHistogramPseudoeffElec->getNum()->Fill(fecIdB, channelB);
368+
}
345369
}
346370
}
347371
}
348372

349373
if (isGoodDen[1]) {
350374
// good cluster on bending side, check if there is data from the non-bending side as well
351375
if (fecIdNB >= 0 && channelNB >= 0) {
352-
mHistogramPseudoeffElec->getDen()->Fill(fecIdNB, channelNB);
376+
if (mEnable1DPseudoeffMaps) {
377+
mHistogramPseudoeffPerDualSampa->getDen()->Fill(fecIdNB);
378+
}
379+
if (mEnable2DPseudoeffMaps) {
380+
mHistogramPseudoeffElec->getDen()->Fill(fecIdNB, channelNB);
381+
}
353382
}
354383
if (isGoodNum[1]) { // Check if associated to something on Non-Bending
355384
if (fecIdNB >= 0 && channelNB >= 0) {
356-
mHistogramPseudoeffElec->getNum()->Fill(fecIdNB, channelNB);
385+
if (mEnable1DPseudoeffMaps) {
386+
mHistogramPseudoeffPerDualSampa->getNum()->Fill(fecIdNB);
387+
}
388+
if (mEnable2DPseudoeffMaps) {
389+
mHistogramPseudoeffElec->getNum()->Fill(fecIdNB, channelNB);
390+
}
357391
}
358392
}
359393
}
@@ -398,7 +432,12 @@ void PreclustersTask::endOfCycle()
398432
ILOG(Info, Devel) << "endOfCycle" << AliceO2::InfoLogger::InfoLogger::endm;
399433

400434
// update mergeable ratios
401-
mHistogramPseudoeffElec->update();
435+
if (mEnable1DPseudoeffMaps) {
436+
mHistogramPseudoeffPerDualSampa->update();
437+
}
438+
if (mEnable2DPseudoeffMaps) {
439+
mHistogramPseudoeffElec->update();
440+
}
402441
mHistogramPreclustersPerDE->update();
403442
mHistogramPreclustersSignalPerDE->update();
404443
}

0 commit comments

Comments
 (0)