Skip to content

Commit 45b016a

Browse files
authored
[PWGCF/FemtoUniverse] Fix EfficiencyCalculator not saving efficiency to the analysis output (#9463)
1 parent ddbcbba commit 45b016a

File tree

3 files changed

+62
-59
lines changed

3 files changed

+62
-59
lines changed

PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include <string>
2323

2424
#include "Framework/Configurable.h"
25-
#include "Framework/AnalysisHelpers.h"
2625
#include "Framework/CallbackService.h"
2726
#include "Framework/InitContext.h"
2827
#include "CCDB/BasicCCDBManager.h"
@@ -37,20 +36,13 @@ concept isOneOrTwo = T == 1 || T == 2;
3736
struct EfficiencyConfigurableGroup : ConfigurableGroup {
3837
Configurable<bool> confEfficiencyCalculate{"confEfficiencyCalculate", false, "Should calculate efficiency"};
3938
Configurable<bool> confEfficiencyApplyCorrections{"confEfficiencyApplyCorrections", false, "Should apply corrections from efficiency"};
39+
Configurable<std::vector<std::string>> confEfficiencyCCDBLabels{"confEfficiencyCCDBLabels", {}, "Labels for efficiency objects in CCDB"};
40+
ConfigurableAxis confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {-1, -1}, "Timestamps from which to query CCDB objects (default: -1 for both)"};
4041

41-
Configurable<std::vector<std::string>> confCCDBLabels{"confCCDBLabels", std::vector<std::string>{"label1", "label2"}, "Labels for efficiency objects in CCDB"};
42-
43-
OutputObj<TH1F> hEfficiency1{"Efficiency part1"};
44-
OutputObj<TH1F> hEfficiency2{"Efficiency part2"};
45-
46-
// TODO: move to separate struct?
42+
// NOTE: in the future we might move the below configurables to a separate struct, eg. CCDBConfigurableGroup
4743
Configurable<std::string> confCCDBUrl{"confCCDBUrl", "http://alice-ccdb.cern.ch", "CCDB URL to be used"};
4844
Configurable<std::string> confCCDBPath{"confCCDBPath", "", "CCDB base path to where to upload objects"};
49-
Configurable<int64_t> confCCDBTimestamp{"confCCDBTimestamp", -1, "Timestamp from which to query CCDB objects"};
50-
51-
// TODO: declare this in task directly?
52-
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 1> hMCTruth1;
53-
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 2> hMCTruth2;
45+
Configurable<int64_t> confCCDBLifetime{"confCCDBLifetime", 365LL * 24 * 60 * 60 * 1000, "Lifetime of uploaded objects (default: 1 year)"};
5446
};
5547

5648
class EfficiencyCalculator
@@ -69,33 +61,31 @@ class EfficiencyCalculator
6961
ccdb.setLocalObjectValidityChecking();
7062
ccdb.setFatalWhenNull(false);
7163

64+
int64_t now = duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
65+
ccdb.setCreatedNotAfter(now);
66+
7267
shouldCalculate = config->confEfficiencyCalculate;
7368
shouldApplyCorrections = config->confEfficiencyApplyCorrections;
7469

7570
ccdbFullPath = fmt::format("{}/{}", config->confCCDBPath.value, folderName);
7671

77-
if (config->confEfficiencyCalculate) {
78-
hOutput = {config->hEfficiency1.object, config->hEfficiency2.object};
79-
}
80-
8172
if (config->confEfficiencyApplyCorrections) {
73+
if (config->confEfficiencyCCDBTimestamps->size() != 2) {
74+
LOGF(fatal, notify("CCDB timestamps configurable should be exactly of size 2"));
75+
}
8276
hLoaded = {
83-
loadEfficiencyFromCCDB<1>(config->confCCDBTimestamp),
84-
loadEfficiencyFromCCDB<2>(config->confCCDBTimestamp) //
77+
loadEfficiencyFromCCDB<1>(config->confEfficiencyCCDBTimestamps.value[0]),
78+
loadEfficiencyFromCCDB<2>(config->confEfficiencyCCDBTimestamps.value[1]) //
8579
};
8680
}
8781
}
8882

8983
template <uint8_t N>
9084
requires isOneOrTwo<N>
91-
auto doMCTruth(auto particles) const -> void
85+
auto doMCTruth(FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, N>& hMCTruth, const auto& particles) const -> void
9286
{
9387
for (const auto& particle : particles) {
94-
if constexpr (N == 1) {
95-
config->hMCTruth1.fillQA<false, false>(particle);
96-
} else if constexpr (N == 2) {
97-
config->hMCTruth2.fillQA<false, false>(particle);
98-
}
88+
hMCTruth.template fillQA<false, false>(particle);
9989
}
10090
}
10191

@@ -120,9 +110,8 @@ class EfficiencyCalculator
120110
LOGF(debug, notify("Found histogram %d: %s"), i + 1, output->GetTitle());
121111

122112
int64_t now = duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
123-
int64_t oneYear = 365LL * 24 * 60 * 60 * 1000;
124113

125-
if (ccdbApi.storeAsTFileAny(output.get(), ccdbFullPath, createMetadata(i), now, now + oneYear) == 0) {
114+
if (ccdbApi.storeAsTFileAny(output.get(), ccdbFullPath, createMetadata(i), now, now + config->confCCDBLifetime) == 0) {
126115
LOGF(info, notify("Histogram %d saved successfully"), i + 1);
127116
} else {
128117
LOGF(fatal, notify("Histogram %d save failed"), i + 1);
@@ -136,7 +125,7 @@ class EfficiencyCalculator
136125

137126
template <uint8_t N>
138127
requires isOneOrTwo<N>
139-
auto getWeight(auto const& particle) const -> float
128+
auto getWeight(const auto& particle) const -> float
140129
{
141130
auto weight = 1.0f;
142131
auto hEff = hLoaded[N - 1];
@@ -152,27 +141,28 @@ class EfficiencyCalculator
152141

153142
template <uint8_t N>
154143
requires isOneOrTwo<N>
155-
auto calculate(std::shared_ptr<TH1> truth, std::shared_ptr<TH1> reco) const
144+
auto calculate(std::shared_ptr<TH1> hEff, std::shared_ptr<TH1> hTruth, std::shared_ptr<TH1> hReco)
156145
{
157146
if (!shouldCalculate) {
158147
return;
159148
}
160149

161-
if (!truth || !reco) {
150+
if (!hTruth || !hReco) {
162151
LOGF(error, notify("MC Truth & MC Reco histograms cannot be null"));
163152
return;
164153
}
165154

166-
auto hEff = hOutput[N - 1];
167155
if (!hEff) {
168-
LOGF(error, notify("No OutputObj specified for particle %d histogram"), N);
156+
LOGF(error, notify("No target histogram to fill specified for particle %d"), N);
169157
return;
170158
}
171159

172160
for (auto bin = 0; bin < hEff->GetNbinsX(); bin++) {
173-
auto denom = truth->GetBinContent(bin);
174-
hEff->SetBinContent(bin, denom == 0 ? 0 : reco->GetBinContent(bin) / denom);
161+
auto denom = hTruth->GetBinContent(bin);
162+
hEff->SetBinContent(bin, denom == 0 ? 0 : hReco->GetBinContent(bin) / denom);
175163
}
164+
165+
hOutput[N - 1] = hEff;
176166
}
177167

178168
private:
@@ -197,19 +187,19 @@ class EfficiencyCalculator
197187
return true;
198188
}
199189

200-
auto createMetadata(uint8_t partNo) const -> std::map<std::string, std::string>
190+
auto createMetadata(const uint8_t partNo) const -> std::map<std::string, std::string>
201191
{
202-
if (config->confCCDBLabels->size() != 2) {
192+
if (config->confEfficiencyCCDBLabels->size() != 2) {
203193
LOGF(fatal, notify("CCDB labels configurable should be exactly of size 2"));
204194
}
205195
return std::map<std::string, std::string>{
206-
{"label", config->confCCDBLabels.value[partNo]} //
196+
{"label", config->confEfficiencyCCDBLabels.value[partNo]} //
207197
};
208198
}
209199

210200
template <uint8_t N>
211201
requires isOneOrTwo<N>
212-
auto loadEfficiencyFromCCDB(int64_t timestamp) const -> TH1*
202+
auto loadEfficiencyFromCCDB(const int64_t timestamp) const -> TH1*
213203
{
214204
auto hEff = ccdb.getSpecific<TH1>(ccdbFullPath, timestamp, createMetadata(N - 1));
215205
if (!hEff || hEff->IsZombie()) {

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,11 @@ struct FemtoUniversePairTaskTrackPhi {
168168

169169
/// Histogramming for particle 1
170170
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kTrack, 2> trackHistoPartTrack;
171+
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 1> hMCTruth1;
171172

172173
/// Histogramming for particle 2
173174
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kPhi, 0> trackHistoPartPhi;
175+
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 2> hMCTruth2;
174176

175177
/// Histogramming for Event
176178
FemtoUniverseEventHisto eventHisto;
@@ -402,11 +404,11 @@ struct FemtoUniversePairTaskTrackPhi {
402404

403405
void init(InitContext& ic)
404406
{
405-
effConfGroup.hEfficiency1.setObject(new TH1F("Efficiency_part1", "Efficiency origin/generated part1; p_{T} (GeV/c); Efficiency", 100, 0, 4));
406-
effConfGroup.hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false);
407+
hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false);
408+
qaRegistry.add("Efficiency/part1", "Efficiency origin/generated part1; p_{T} (GeV/c); Efficiency", kTH1F, {{100, 0, 4}});
407409

408-
effConfGroup.hEfficiency2.setObject(new TH1F("Efficiency_part2", "Efficiency origin/generated part2; p_{T} (GeV/c); Efficiency", 100, 0, 4));
409-
effConfGroup.hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false);
410+
hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false);
411+
qaRegistry.add("Efficiency/part2", "Efficiency origin/generated part2; p_{T} (GeV/c); Efficiency", kTH1F, {{100, 0, 4}});
410412

411413
efficiencyCalculator.init();
412414
efficiencyCalculator.uploadOnStop(ic);
@@ -673,10 +675,10 @@ struct FemtoUniversePairTaskTrackPhi {
673675
fillCollision(col);
674676

675677
auto groupMCTruthTrack = partsTrackMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
676-
efficiencyCalculator.doMCTruth<1>(groupMCTruthTrack);
678+
efficiencyCalculator.doMCTruth<1>(hMCTruth1, groupMCTruthTrack);
677679

678680
auto groupMCTruthPhi = partsPhiMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
679-
efficiencyCalculator.doMCTruth<2>(groupMCTruthPhi);
681+
efficiencyCalculator.doMCTruth<2>(hMCTruth2, groupMCTruthPhi);
680682

681683
auto groupMCRecoTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
682684
auto groupMCRecoPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
@@ -688,11 +690,13 @@ struct FemtoUniversePairTaskTrackPhi {
688690

689691
auto truthTrack = qaRegistry.get<TH1>(HIST("MCTruthTracks_one/hPt"));
690692
auto recoTrack = qaRegistry.get<TH1>(HIST("Tracks_one_MC/hPt"));
691-
efficiencyCalculator.calculate<1>(truthTrack, recoTrack);
693+
auto effTrack = qaRegistry.get<TH1>(HIST("Efficiency/part1"));
694+
efficiencyCalculator.calculate<1>(effTrack, truthTrack, recoTrack);
692695

693696
auto truthPhi = qaRegistry.get<TH1>(HIST("MCTruthTracks_two/hPt"));
694697
auto recoPhi = qaRegistry.get<TH1>(HIST("Tracks_two_MC/hPt"));
695-
efficiencyCalculator.calculate<2>(truthPhi, recoPhi);
698+
auto effPhi = qaRegistry.get<TH1>(HIST("Efficiency/part2"));
699+
efficiencyCalculator.calculate<2>(effPhi, truthPhi, recoPhi);
696700
}
697701
PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEventMC, "Enable processing same event for Monte Carlo", false);
698702

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ struct FemtoUniversePairTaskTrackTrackExtended {
103103

104104
/// Histogramming for particle 1
105105
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kTrack, 1> trackHistoPartOne;
106+
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 1> hMCTruth1;
106107

107108
/// Particle 2
108109
Configurable<bool> confIsSame{"confIsSame", false, "Pairs of the same particle"};
@@ -127,6 +128,7 @@ struct FemtoUniversePairTaskTrackTrackExtended {
127128

128129
/// Histogramming for particle 2
129130
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kTrack, 2> trackHistoPartTwo;
131+
FemtoUniverseParticleHisto<aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 2> hMCTruth2;
130132

131133
/// Histogramming for Event
132134
FemtoUniverseEventHisto eventHisto;
@@ -313,11 +315,11 @@ struct FemtoUniversePairTaskTrackTrackExtended {
313315

314316
void init(InitContext& ic)
315317
{
316-
effConfGroup.hEfficiency1.setObject(new TH1F("Efficiency_part1", "Efficiency origin/generated part1; p_{T} (GeV/c); Efficiency", 100, 0, 4));
317-
effConfGroup.hMCTruth1.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, trackonefilter.confPDGCodePartOne, false);
318+
qaRegistry.add("Efficiency/part1", "Efficiency origin/generated part1; p_{T} (GeV/c); Efficiency", kTH1F, {{100, 0, 4}});
319+
hMCTruth1.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, trackonefilter.confPDGCodePartOne, false);
318320
if (!confIsSame) {
319-
effConfGroup.hEfficiency2.setObject(new TH1F("Efficiency_part2", "Efficiency origin/generated part2; p_{T} (GeV/c); Efficiency", 100, 0, 4));
320-
effConfGroup.hMCTruth2.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, tracktwofilter.confPDGCodePartTwo, false);
321+
qaRegistry.add("Efficiency/part2", "Efficiency origin/generated part2; p_{T} (GeV/c); Efficiency", kTH1F, {{100, 0, 4}});
322+
hMCTruth2.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, tracktwofilter.confPDGCodePartTwo, false);
321323
}
322324

323325
efficiencyCalculator.init();
@@ -564,11 +566,11 @@ struct FemtoUniversePairTaskTrackTrackExtended {
564566
fillCollision(col);
565567

566568
auto groupMCTruth1 = partsOneMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
567-
efficiencyCalculator.doMCTruth<1>(groupMCTruth1);
569+
efficiencyCalculator.doMCTruth<1>(hMCTruth1, groupMCTruth1);
568570

569571
if (!confIsSame) {
570572
auto groupMCTruth2 = partsTwoMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
571-
efficiencyCalculator.doMCTruth<2>(groupMCTruth2);
573+
efficiencyCalculator.doMCTruth<2>(hMCTruth2, groupMCTruth2);
572574
}
573575

574576
auto groupMCReco1 = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
@@ -577,14 +579,16 @@ struct FemtoUniversePairTaskTrackTrackExtended {
577579
doSameEvent<true>(groupMCReco1, groupMCReco2, parts, col.magField(), col.multNtr());
578580
}
579581

580-
auto truth = qaRegistry.get<TH1>(HIST("MCTruthTracks_one/hPt"));
581-
auto reco = qaRegistry.get<TH1>(HIST("Tracks_one_MC/hPt"));
582-
efficiencyCalculator.calculate<1>(truth, reco);
582+
auto hTruth1 = qaRegistry.get<TH1>(HIST("MCTruthTracks_one/hPt"));
583+
auto hReco1 = qaRegistry.get<TH1>(HIST("Tracks_one_MC/hPt"));
584+
auto hEff1 = qaRegistry.get<TH1>(HIST("Efficiency/part1"));
585+
efficiencyCalculator.calculate<1>(hEff1, hTruth1, hReco1);
583586

584587
if (!confIsSame) {
585-
auto truth = qaRegistry.get<TH1>(HIST("MCTruthTracks_two/hPt"));
586-
auto reco = qaRegistry.get<TH1>(HIST("Tracks_two_MC/hPt"));
587-
efficiencyCalculator.calculate<2>(truth, reco);
588+
auto hTruth2 = qaRegistry.get<TH1>(HIST("MCTruthTracks_two/hPt"));
589+
auto hReco2 = qaRegistry.get<TH1>(HIST("Tracks_two_MC/hPt"));
590+
auto hEff2 = qaRegistry.get<TH1>(HIST("Efficiency/part2"));
591+
efficiencyCalculator.calculate<2>(hEff2, hTruth2, hReco2);
588592
}
589593
}
590594
PROCESS_SWITCH(FemtoUniversePairTaskTrackTrackExtended, processSameEventMC, "Enable processing same event for Monte Carlo", false);
@@ -647,10 +651,15 @@ struct FemtoUniversePairTaskTrackTrackExtended {
647651
}
648652
}
649653

654+
float weight = efficiencyCalculator.getWeight<1>(p1);
655+
if (!confIsSame) {
656+
weight *= efficiencyCalculator.getWeight<2>(p2);
657+
}
658+
650659
if (swpart)
651-
mixedEventCont.setPair<isMC>(p1, p2, multCol, twotracksconfigs.confUse3D);
660+
mixedEventCont.setPair<isMC>(p1, p2, multCol, twotracksconfigs.confUse3D, weight);
652661
else
653-
mixedEventCont.setPair<isMC>(p2, p1, multCol, twotracksconfigs.confUse3D);
662+
mixedEventCont.setPair<isMC>(p2, p1, multCol, twotracksconfigs.confUse3D, weight);
654663

655664
swpart = !swpart;
656665
}

0 commit comments

Comments
 (0)