Skip to content

Commit 06e94ad

Browse files
authored
[PWGCF/FemtoUniverse] Make EfficiencyCalculator generic and allow histograms of higher dimensions (#9931)
1 parent 39b014d commit 06e94ad

File tree

4 files changed

+83
-70
lines changed

4 files changed

+83
-70
lines changed

PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,31 @@ enum ParticleNo : size_t {
3535
template <size_t T>
3636
concept isOneOrTwo = T == ParticleNo::ONE || T == ParticleNo::TWO;
3737

38+
template <typename T>
39+
consteval auto getHistDim() -> int
40+
{
41+
if (std::is_same_v<T, TH1>)
42+
return 1;
43+
else if (std::is_same_v<T, TH2>)
44+
return 2;
45+
else if (std::is_same_v<T, TH3>)
46+
return 3;
47+
else
48+
return -1;
49+
}
50+
3851
struct EfficiencyConfigurableGroup : ConfigurableGroup {
39-
Configurable<bool> confEfficiencyDoMCTruth{"confEfficiencyDoMCTruth", false, "Should fill MC Truth histogram"};
4052
Configurable<bool> confEfficiencyApplyCorrections{"confEfficiencyApplyCorrections", false, "Should apply corrections from efficiency"};
41-
Configurable<std::vector<std::string>> confEfficiencyCCDBLabels{"confEfficiencyCCDBLabels", {}, "Custom labels for efficiency objects in CCDB"};
42-
Configurable<int> confCCDBTrainNumber{"confCCDBTrainNumber", -1, "Train number for which to query CCDB objects (set to -1 to ignore)"};
43-
Configurable<std::vector<std::string>> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {"-1", "-1"}, "Timestamps in CCDB, to query for specific objects (default: -1 for both, the latest valid object)"};
53+
Configurable<int> confEfficiencyCCDBTrainNumber{"confEfficiencyCCDBTrainNumber", -1, "Train number for which to query CCDB objects (set to -1 to ignore)"};
54+
Configurable<std::vector<std::string>> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {}, "Timestamps of efficiency histograms in CCDB, to query for specific objects (default: ['-1', '-1'], gets the latest valid objects for both)"};
4455

4556
// NOTE: in the future we might move the below configurables to a separate struct, eg. CCDBConfigurableGroup
4657
Configurable<std::string> confCCDBUrl{"confCCDBUrl", "http://alice-ccdb.cern.ch", "CCDB URL to be used"};
4758
Configurable<std::string> confCCDBPath{"confCCDBPath", "", "CCDB base path to where to upload objects"};
4859
};
4960

61+
template <typename HistType>
62+
requires std::is_base_of_v<TH1, HistType>
5063
class EfficiencyCalculator
5164
{
5265
public:
@@ -63,39 +76,31 @@ class EfficiencyCalculator
6376
int64_t now = duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
6477
ccdb.setCreatedNotAfter(now);
6578

66-
shouldDoTruth = config->confEfficiencyDoMCTruth;
6779
shouldApplyCorrections = config->confEfficiencyApplyCorrections;
6880

69-
if (config->confEfficiencyApplyCorrections) {
70-
hLoaded = {
71-
loadEfficiencyFromCCDB(ParticleNo::ONE),
72-
loadEfficiencyFromCCDB(ParticleNo::TWO), //
73-
};
74-
}
75-
}
76-
77-
template <size_t N>
78-
requires isOneOrTwo<N>
79-
auto doMCTruth(
80-
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, N>& hMCTruth,
81-
const auto& particles) const -> void
82-
{
83-
if (shouldDoTruth) {
84-
for (const auto& particle : particles) {
85-
hMCTruth.template fillQA<false, false>(particle);
81+
if (config->confEfficiencyApplyCorrections && !config->confEfficiencyCCDBTimestamps.value.empty()) {
82+
for (const auto& timestamp : config->confEfficiencyCCDBTimestamps.value) {
83+
hLoaded.push_back(loadEfficiencyFromCCDB(std::stol(timestamp)));
8684
}
85+
86+
LOGF(info, notify("Successfully loaded %d efficiency histogram(s)"), hLoaded.size());
8787
}
8888
}
8989

90-
auto getWeight(const size_t partNo, const auto& particle) const -> float
90+
template <typename... BinVars>
91+
requires(sizeof...(BinVars) == getHistDim<HistType>())
92+
auto getWeight(ParticleNo partNo, const BinVars&... binVars) const -> float
9193
{
9294
auto weight = 1.0f;
93-
auto hEff = hLoaded[partNo - 1];
9495

95-
if (shouldApplyCorrections && hEff) {
96-
auto bin = hEff->FindBin(particle.pt());
97-
auto eff = hEff->GetBinContent(bin);
98-
weight /= eff > 0 ? eff : 1.0f;
96+
if (partNo - 1 < config->confEfficiencyCCDBTimestamps.value.size()) {
97+
auto hEff = hLoaded[partNo - 1];
98+
99+
if (shouldApplyCorrections && hEff) {
100+
auto bin = hEff->FindBin(binVars...);
101+
auto eff = hEff->GetBinContent(bin);
102+
weight /= eff > 0 ? eff : 1.0f;
103+
}
99104
}
100105

101106
return weight;
@@ -107,38 +112,46 @@ class EfficiencyCalculator
107112
return fmt::format("[EFFICIENCY] {}", msg);
108113
}
109114

110-
auto loadEfficiencyFromCCDB(const size_t partNo) const -> TH1*
115+
static auto isHistEmpty(HistType* hist) -> bool
111116
{
112-
std::map<std::string, std::string> metadata{};
113-
114-
if (partNo - 1 < config->confEfficiencyCCDBLabels->size()) {
115-
metadata["label"] = config->confEfficiencyCCDBLabels.value[partNo - 1];
117+
if (!hist) {
118+
return true;
116119
}
117-
if (config->confCCDBTrainNumber > 0) {
118-
metadata["trainNumber"] = std::to_string(config->confCCDBTrainNumber);
120+
for (auto idx = 0; idx <= hist->GetNbinsX() + 1; idx++) {
121+
if (hist->GetBinContent(idx) > 0) {
122+
return false;
123+
}
119124
}
125+
return true;
126+
}
120127

121-
auto timestamp = partNo - 1 < config->confEfficiencyCCDBTimestamps->size()
122-
? std::stoll(config->confEfficiencyCCDBTimestamps.value[partNo - 1])
123-
: -1;
128+
auto loadEfficiencyFromCCDB(const int64_t timestamp) const -> HistType*
129+
{
130+
std::map<std::string, std::string> metadata{};
124131

125-
auto hEff = ccdb.getSpecific<TH1>(config->confCCDBPath, timestamp, metadata);
132+
if (config->confEfficiencyCCDBTrainNumber > 0) {
133+
metadata["trainNumber"] = std::to_string(config->confEfficiencyCCDBTrainNumber);
134+
}
135+
136+
auto hEff = ccdb.getSpecific<HistType>(config->confCCDBPath, timestamp, metadata);
126137
if (!hEff || hEff->IsZombie()) {
127-
LOGF(error, notify("Could not load histogram from %s for particle %d"), config->confCCDBPath.value, partNo);
138+
LOGF(error, notify("Could not load histogram \"%s/%ld\""), config->confCCDBPath.value, timestamp);
128139
return nullptr;
129140
}
130141

131-
LOGF(info, notify("Histogram for particle %d loaded from \"%s\""), partNo, config->confCCDBPath.value);
142+
if (isHistEmpty(hEff)) {
143+
LOGF(warn, notify("Histogram \"%s/%ld\" has been loaded, but it is empty"), config->confCCDBPath.value, timestamp);
144+
}
145+
132146
return hEff;
133147
}
134148

135149
EfficiencyConfigurableGroup* config{};
136150

137-
bool shouldDoTruth = false;
138151
bool shouldApplyCorrections = false;
139152

140153
o2::ccdb::BasicCCDBManager& ccdb{o2::ccdb::BasicCCDBManager::instance()};
141-
std::array<TH1*, 2> hLoaded{};
154+
std::vector<HistType*> hLoaded{};
142155
};
143156

144157
} // namespace o2::analysis::femto_universe::efficiency

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ struct FemtoUniversePairTaskTrackD0 {
239239

240240
// Efficiency
241241
EfficiencyConfigurableGroup effConfGroup;
242-
EfficiencyCalculator efficiencyCalculator{&effConfGroup};
242+
EfficiencyCalculator<TH1> efficiencyCalculator{&effConfGroup};
243243
float weight = 1.0;
244244

245245
HistogramRegistry registry{"registry",
@@ -365,11 +365,11 @@ struct FemtoUniversePairTaskTrackD0 {
365365

366366
void init(InitContext&)
367367
{
368-
if (effConfGroup.confEfficiencyDoMCTruth) {
369-
// WORK IN PROGRESS
370-
// hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false);
371-
// hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false);
372-
}
368+
// if (effConfGroup.confEfficiencyDoMCTruth) {
369+
// WORK IN PROGRESS
370+
// hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false);
371+
// hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false);
372+
// }
373373
efficiencyCalculator.init();
374374

375375
eventHisto.init(&qaRegistry);
@@ -763,7 +763,7 @@ struct FemtoUniversePairTaskTrackD0 {
763763
// Efficiency
764764
weight = 1.0f;
765765
if (ConfEff.doEfficiencyCorr) {
766-
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate);
766+
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt());
767767
}
768768
sameEventAngularCont.setPair<isMC>(track, d0candidate, multCol, ConfBothTracks.confUse3D);
769769
}
@@ -861,7 +861,7 @@ struct FemtoUniversePairTaskTrackD0 {
861861
// Efficiency
862862
weight = 1.0f;
863863
if (ConfEff.doEfficiencyCorr) {
864-
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate);
864+
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt());
865865
}
866866

867867
mixedEventAngularCont.setPair<isMC>(track, d0candidate, multCol, ConfBothTracks.confUse3D);

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ struct FemtoUniversePairTaskTrackPhi {
168168
HistogramRegistry registryDCA{"registryDCA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
169169

170170
EfficiencyConfigurableGroup effConfGroup;
171-
EfficiencyCalculator efficiencyCalculator{&effConfGroup};
171+
EfficiencyCalculator<TH1> efficiencyCalculator{&effConfGroup};
172172

173173
/// @brief Counter for particle swapping
174174
int fNeventsProcessed = 0;
@@ -357,11 +357,9 @@ struct FemtoUniversePairTaskTrackPhi {
357357

358358
void init(InitContext&)
359359
{
360-
if (effConfGroup.confEfficiencyDoMCTruth) {
360+
if (ConfIsMC) {
361361
hMCTruth1.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, ConfTrackPDGCode, false);
362362
hMCTruth2.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, 333, false);
363-
}
364-
if (ConfIsMC) {
365363
hTrackDCA.init(&registryDCA, ConfBinsTempFitVarpT, ConfBinsTempFitVarDCA, true, ConfTrackPDGCode, true);
366364
}
367365
efficiencyCalculator.init();
@@ -553,7 +551,7 @@ struct FemtoUniversePairTaskTrackPhi {
553551
continue;
554552
}
555553

556-
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track);
554+
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt());
557555

558556
if (swpart)
559557
sameEventCont.setPair<isMC>(track, phicandidate, multCol, ConfUse3D, weight);
@@ -643,7 +641,7 @@ struct FemtoUniversePairTaskTrackPhi {
643641
}
644642
}
645643

646-
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track);
644+
weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt());
647645

648646
if (swpart)
649647
mixedEventCont.setPair<isMC>(track, phicandidate, multCol, ConfUse3D, weight);
@@ -754,9 +752,7 @@ struct FemtoUniversePairTaskTrackPhi {
754752
registryMCreco.fill(HIST("MCrecoPpos"), mcpart.pt(), mcpart.eta());
755753
registryMCreco.fill(HIST("MCrecoPposPt"), mcpart.pt());
756754
}
757-
}
758-
759-
else if (part.sign() < 0) {
755+
} else if (part.sign() < 0) {
760756
registryMCreco.fill(HIST("MCrecoAllNegativePt"), mcpart.pt());
761757
if (mcpart.pdgMCTruth() == -2212 && isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) {
762758
registryMCreco.fill(HIST("MCrecoPneg"), mcpart.pt(), mcpart.eta());

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ struct FemtoUniversePairTaskTrackTrackExtended {
177177
HistogramRegistry mixQaRegistry{"mixQaRegistry", {}, OutputObjHandlingPolicy::AnalysisObject};
178178

179179
EfficiencyConfigurableGroup effConfGroup;
180-
EfficiencyCalculator efficiencyCalculator{&effConfGroup};
180+
EfficiencyCalculator<TH1> efficiencyCalculator{&effConfGroup};
181181

182182
/// @brief Counter for particle swapping
183183
int fNeventsProcessed = 0;
@@ -315,7 +315,7 @@ struct FemtoUniversePairTaskTrackTrackExtended {
315315

316316
void init(InitContext&)
317317
{
318-
if (effConfGroup.confEfficiencyDoMCTruth) {
318+
if (twotracksconfigs.confIsMC) {
319319
hMCTruth1.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, trackonefilter.confPDGCodePartOne, false);
320320
if (!confIsSame) {
321321
hMCTruth2.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, tracktwofilter.confPDGCodePartTwo, false);
@@ -466,9 +466,9 @@ struct FemtoUniversePairTaskTrackTrackExtended {
466466
continue;
467467
}
468468

469-
float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1);
469+
float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt());
470470
if (!confIsSame) {
471-
weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2);
471+
weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt());
472472
}
473473

474474
if (swpart)
@@ -527,9 +527,9 @@ struct FemtoUniversePairTaskTrackTrackExtended {
527527
continue;
528528
}
529529

530-
float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1);
530+
float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt());
531531
if (!confIsSame) {
532-
weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2);
532+
weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt());
533533
}
534534

535535
sameEventCont.setPair<isMC>(p1, p2, multCol, twotracksconfigs.confUse3D, weight);
@@ -563,11 +563,15 @@ struct FemtoUniversePairTaskTrackTrackExtended {
563563
fillCollision(col);
564564

565565
auto groupMCTruth1 = partsOneMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
566-
efficiencyCalculator.doMCTruth<1>(hMCTruth1, groupMCTruth1);
566+
for (const auto& particle : groupMCTruth1) {
567+
hMCTruth1.fillQA<false, false>(particle);
568+
}
567569

568570
if (!confIsSame) {
569571
auto groupMCTruth2 = partsTwoMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
570-
efficiencyCalculator.doMCTruth<2>(hMCTruth2, groupMCTruth2);
572+
for (const auto& particle : groupMCTruth1) {
573+
hMCTruth2.fillQA<false, false>(particle);
574+
}
571575
}
572576

573577
auto groupMCReco1 = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
@@ -635,9 +639,9 @@ struct FemtoUniversePairTaskTrackTrackExtended {
635639
}
636640
}
637641

638-
float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1);
642+
float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt());
639643
if (!confIsSame) {
640-
weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2);
644+
weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt());
641645
}
642646

643647
if (swpart)

0 commit comments

Comments
 (0)