Skip to content

Commit e8c5fc8

Browse files
authored
[Common,DPG] Add check for RCT CCDB object validity (#13081)
1 parent bbda1aa commit e8c5fc8

File tree

2 files changed

+78
-45
lines changed

2 files changed

+78
-45
lines changed

Common/CCDB/RCTSelectionFlags.h

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,15 @@ enum RCTSelectionFlags {
7575
kTPCLimAccMCRepr,
7676
kTRDBad,
7777
kZDCBad,
78-
kNRCTSelectionFlags
78+
kNRCTSelectionFlags,
79+
kDummy24,
80+
kDummy25,
81+
kDummy26,
82+
kDummy27,
83+
kDummy28,
84+
kDummy29,
85+
kDummy30,
86+
kCcdbObjectLoaded
7987
};
8088

8189
template <typename T>
@@ -104,9 +112,14 @@ class RCTFlagsChecker : public o2::utils::EnumFlags<RCTSelectionFlags>
104112
// The checkZDC boolean flag controls whether to iclude the ZDC quality in all the pre-defined selections (for Pb-Pb data)
105113
// The treatLimitedAcceptanceAsBad boolean flag controls whether "LimitedAcceptanceMCReproducible" flags should be
106114
// treated as Bad and the corresponding events excluded
107-
explicit RCTFlagsChecker(const std::string& label, bool checkZDC = false, bool treatLimitedAcceptanceAsBad = false)
115+
// The checkTableValidity boolean flag controls whether events without a corresponding valid RCT CCDB object should be
116+
// treated as Bad and excluded
117+
explicit RCTFlagsChecker(const std::string& label,
118+
bool checkZDC = false,
119+
bool treatLimitedAcceptanceAsBad = false,
120+
bool checkTableValidity = false)
108121
{
109-
init(label, checkZDC, treatLimitedAcceptanceAsBad);
122+
init(label, checkZDC, treatLimitedAcceptanceAsBad, checkTableValidity);
110123
}
111124

112125
// Initialize the object from an initializer list of RCTSelectionFlags values
@@ -121,13 +134,18 @@ class RCTFlagsChecker : public o2::utils::EnumFlags<RCTSelectionFlags>
121134
// - "CBT"
122135
// - "CBT_hadronPID"
123136
// - "CBT_electronPID"
124-
// - "CBT_calo"
137+
// - "CCBT_calo"
125138
// - "CBT_muon"
126139
// - "CBT_muon_glo"
127140
// The checkZDC boolean flag controls whether to iclude the ZDC quality in all the pre-defined selections (for Pb-Pb data)
128141
// The treatLimitedAcceptanceAsBad boolean flag controls whether "LimitedAcceptanceMCReproducible" flags should be
129142
// treated as Bad and the corresponding events excluded
130-
void init(const std::string& label, bool checkZDC = false, bool treatLimitedAcceptanceAsBad = false)
143+
// The checkTableValidity boolean flag controls whether events without a corresponding valid RCT CCDB object should be
144+
// treated as Bad and excluded
145+
void init(const std::string& label,
146+
bool checkZDC = false,
147+
bool treatLimitedAcceptanceAsBad = false,
148+
bool checkTableValidity = false)
131149
{
132150
auto setFlags = [this](std::initializer_list<RCTSelectionFlags> flags) {
133151
std::for_each(flags.begin(),
@@ -182,14 +200,19 @@ class RCTFlagsChecker : public o2::utils::EnumFlags<RCTSelectionFlags>
182200
if (checkZDC) {
183201
set(kZDCBad);
184202
}
203+
204+
if (checkTableValidity) {
205+
set(kCcdbObjectLoaded);
206+
}
185207
}
186208

187209
// Check the RCT column of a given event selection table.
188210
// The function returns true if none of the checked flags is set in the RCT column.
189211
bool checkTable(const HasRCTFlags auto& table)
190212
{
213+
// throw an exception if none of the bits in the checker mask is set
191214
if (!any()) {
192-
throw std::out_of_range("RCTFlagsCheckerAlt with empty RCTSelectionFlags bits mask");
215+
throw std::out_of_range("RCTFlagsChecker has empty RCTSelectionFlags bits mask");
193216
}
194217

195218
// bitmask of the current table
@@ -201,6 +224,13 @@ class RCTFlagsChecker : public o2::utils::EnumFlags<RCTSelectionFlags>
201224
return ((tableBits & flagsBits) == 0);
202225
}
203226

227+
// Check the validity of the RCT column of a given event selection table.
228+
// The function returns true if the RCT CCDB object was correctly fetched (bit31 == 0).
229+
bool isTableValid(const HasRCTFlags auto& table)
230+
{
231+
return (table.rct_bit(kCcdbObjectLoaded) == 0);
232+
}
233+
204234
bool operator()(const HasRCTFlags auto& table)
205235
{
206236
return checkTable(table);

DPG/Tasks/AOTEvent/timeDependentQa.cxx

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -305,39 +305,40 @@ struct TimeDependentQaTask {
305305

306306
// ### QA RCT flags
307307
int nRctFlagsTotal = enNumRctFlagsTotal;
308-
histos.add("hSecondsRCTflags", "", kTH2F, {axisSecondsWideBins, {nRctFlagsTotal + 1, -0.5, nRctFlagsTotal + 1 - 0.5, "Monitoring of RCT flags"}});
308+
histos.add("hSecondsRCTflags", "", kTH2F, {axisSecondsWideBins, {nRctFlagsTotal + 2, -0.5, nRctFlagsTotal + 2 - 0.5, "Monitoring of RCT flags"}});
309309
axRctFlags = reinterpret_cast<TAxis*>(histos.get<TH2>(HIST("hSecondsRCTflags"))->GetYaxis());
310310
axRctFlags->SetBinLabel(1, "NcollisionsSel8");
311-
axRctFlags->SetBinLabel(2 + kCPVBad, "CPVBad");
312-
axRctFlags->SetBinLabel(2 + kEMCBad, "EMCBad");
313-
axRctFlags->SetBinLabel(2 + kEMCLimAccMCRepr, "EMCLimAccMCRepr");
314-
axRctFlags->SetBinLabel(2 + kFDDBad, "FDDBad");
315-
axRctFlags->SetBinLabel(2 + kFT0Bad, "FT0Bad");
316-
axRctFlags->SetBinLabel(2 + kFV0Bad, "FV0Bad");
317-
axRctFlags->SetBinLabel(2 + kHMPBad, "HMPBad");
318-
axRctFlags->SetBinLabel(2 + kITSBad, "ITSBad");
319-
axRctFlags->SetBinLabel(2 + kITSLimAccMCRepr, "ITSLimAccMCRepr");
320-
axRctFlags->SetBinLabel(2 + kMCHBad, "MCHBad");
321-
axRctFlags->SetBinLabel(2 + kMCHLimAccMCRepr, "MCHLimAccMCRepr");
322-
axRctFlags->SetBinLabel(2 + kMFTBad, "MFTBad");
323-
axRctFlags->SetBinLabel(2 + kMFTLimAccMCRepr, "MFTLimAccMCRepr");
324-
axRctFlags->SetBinLabel(2 + kMIDBad, "MIDBad");
325-
axRctFlags->SetBinLabel(2 + kMIDLimAccMCRepr, "MIDLimAccMCRepr");
326-
axRctFlags->SetBinLabel(2 + kPHSBad, "PHSBad");
327-
axRctFlags->SetBinLabel(2 + kTOFBad, "TOFBad");
328-
axRctFlags->SetBinLabel(2 + kTOFLimAccMCRepr, "TOFLimAccMCRepr");
329-
axRctFlags->SetBinLabel(2 + kTPCBadTracking, "TPCBadTracking");
330-
axRctFlags->SetBinLabel(2 + kTPCBadPID, "TPCBadPID");
331-
axRctFlags->SetBinLabel(2 + kTPCLimAccMCRepr, "TPCLimAccMCRepr");
332-
axRctFlags->SetBinLabel(2 + kTRDBad, "TRDBad");
333-
axRctFlags->SetBinLabel(2 + kZDCBad, "ZDCBad");
311+
axRctFlags->SetBinLabel(2, "CcdbNotFound");
312+
axRctFlags->SetBinLabel(3 + kCPVBad, "CPVBad");
313+
axRctFlags->SetBinLabel(3 + kEMCBad, "EMCBad");
314+
axRctFlags->SetBinLabel(3 + kEMCLimAccMCRepr, "EMCLimAccMCRepr");
315+
axRctFlags->SetBinLabel(3 + kFDDBad, "FDDBad");
316+
axRctFlags->SetBinLabel(3 + kFT0Bad, "FT0Bad");
317+
axRctFlags->SetBinLabel(3 + kFV0Bad, "FV0Bad");
318+
axRctFlags->SetBinLabel(3 + kHMPBad, "HMPBad");
319+
axRctFlags->SetBinLabel(3 + kITSBad, "ITSBad");
320+
axRctFlags->SetBinLabel(3 + kITSLimAccMCRepr, "ITSLimAccMCRepr");
321+
axRctFlags->SetBinLabel(3 + kMCHBad, "MCHBad");
322+
axRctFlags->SetBinLabel(3 + kMCHLimAccMCRepr, "MCHLimAccMCRepr");
323+
axRctFlags->SetBinLabel(3 + kMFTBad, "MFTBad");
324+
axRctFlags->SetBinLabel(3 + kMFTLimAccMCRepr, "MFTLimAccMCRepr");
325+
axRctFlags->SetBinLabel(3 + kMIDBad, "MIDBad");
326+
axRctFlags->SetBinLabel(3 + kMIDLimAccMCRepr, "MIDLimAccMCRepr");
327+
axRctFlags->SetBinLabel(3 + kPHSBad, "PHSBad");
328+
axRctFlags->SetBinLabel(3 + kTOFBad, "TOFBad");
329+
axRctFlags->SetBinLabel(3 + kTOFLimAccMCRepr, "TOFLimAccMCRepr");
330+
axRctFlags->SetBinLabel(3 + kTPCBadTracking, "TPCBadTracking");
331+
axRctFlags->SetBinLabel(3 + kTPCBadPID, "TPCBadPID");
332+
axRctFlags->SetBinLabel(3 + kTPCLimAccMCRepr, "TPCLimAccMCRepr");
333+
axRctFlags->SetBinLabel(3 + kTRDBad, "TRDBad");
334+
axRctFlags->SetBinLabel(3 + kZDCBad, "ZDCBad");
334335
// combined flags
335-
axRctFlags->SetBinLabel(2 + enCBT, "CBT");
336-
axRctFlags->SetBinLabel(2 + enCBT_hadronPID, "CBT_hadronPID");
337-
axRctFlags->SetBinLabel(2 + enCBT_electronPID, "CBT_electronPID");
338-
axRctFlags->SetBinLabel(2 + enCBT_calo, "CBT_calo");
339-
axRctFlags->SetBinLabel(2 + enCBT_muon, "CBT_muon");
340-
axRctFlags->SetBinLabel(2 + enCBT_muon_glo, "CBT_muon_glo");
336+
axRctFlags->SetBinLabel(3 + enCBT, "CBT");
337+
axRctFlags->SetBinLabel(3 + enCBT_hadronPID, "CBT_hadronPID");
338+
axRctFlags->SetBinLabel(3 + enCBT_electronPID, "CBT_electronPID");
339+
axRctFlags->SetBinLabel(3 + enCBT_calo, "CBT_calo");
340+
axRctFlags->SetBinLabel(3 + enCBT_muon, "CBT_muon");
341+
axRctFlags->SetBinLabel(3 + enCBT_muon_glo, "CBT_muon_glo");
341342

342343
// QA for all tracks
343344
// const AxisSpec axisChi2ITS{40, 0., 20., "chi2/ndof"};
@@ -568,18 +569,20 @@ struct TimeDependentQaTask {
568569

569570
// check RCT flags
570571
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 0); // n collisions sel8
572+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1, col.rct_bit(kCcdbObjectLoaded)); // CCDB object not loaded
573+
LOGP(debug, "i = 1, bitValue = {}, binLabel={}, binCenter={}", col.rct_bit(kCcdbObjectLoaded), axRctFlags->GetBinLabel(2), axRctFlags->GetBinCenter(2));
571574
for (int iFlag = 0; iFlag < kNRCTSelectionFlags; iFlag++) {
572-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + iFlag, col.rct_bit(iFlag));
573-
LOGP(debug, "i = {}, bitValue = {}, binLabel={}, binCenter={}", iFlag, col.rct_bit(iFlag), axRctFlags->GetBinLabel(2 + iFlag), axRctFlags->GetBinCenter(2 + iFlag));
575+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + iFlag, col.rct_bit(iFlag));
576+
LOGP(debug, "i = {}, bitValue = {}, binLabel={}, binCenter={}", iFlag, col.rct_bit(iFlag), axRctFlags->GetBinLabel(3 + iFlag), axRctFlags->GetBinCenter(3 + iFlag));
574577
}
575578
LOGP(debug, "CBT_hadronPID = {}, kFT0Bad = {}, kITSBad = {}, kTPCBadTracking = {}, kTPCBadPID = {}, kTOFBad = {}, 1 + enCBT_hadronPID = {}, binLabel={}, binCenter={}", rctCheckerCBT_hadronPID(col),
576-
col.rct_bit(kFT0Bad), col.rct_bit(kITSBad), col.rct_bit(kTPCBadTracking), col.rct_bit(kTPCBadPID), col.rct_bit(kTOFBad), 1 + enCBT_hadronPID, axRctFlags->GetBinLabel(2 + enCBT_hadronPID), axRctFlags->GetBinCenter(2 + enCBT_hadronPID));
577-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT, rctCheckerCBT(col));
578-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_hadronPID, rctCheckerCBT_hadronPID(col));
579-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_electronPID, rctCheckerCBT_electronPID(col));
580-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_calo, rctCheckerCBT_calo(col));
581-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_muon, rctCheckerCBT_muon(col));
582-
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_muon_glo, rctCheckerCBT_muon_glo(col));
579+
col.rct_bit(kFT0Bad), col.rct_bit(kITSBad), col.rct_bit(kTPCBadTracking), col.rct_bit(kTPCBadPID), col.rct_bit(kTOFBad), 2 + enCBT_hadronPID, axRctFlags->GetBinLabel(3 + enCBT_hadronPID), axRctFlags->GetBinCenter(3 + enCBT_hadronPID));
580+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + enCBT, rctCheckerCBT(col));
581+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + enCBT_hadronPID, rctCheckerCBT_hadronPID(col));
582+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + enCBT_electronPID, rctCheckerCBT_electronPID(col));
583+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + enCBT_calo, rctCheckerCBT_calo(col));
584+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + enCBT_muon, rctCheckerCBT_muon(col));
585+
histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 2 + enCBT_muon_glo, rctCheckerCBT_muon_glo(col));
583586

584587
// check hadronic rate
585588
double hadronicRate = mRateFetcher.fetch(ccdb.service, ts, runNumber, "ZNC hadronic") * 1.e-3; // kHz

0 commit comments

Comments
 (0)