Skip to content

Commit ea858cc

Browse files
authored
[PWGCF] FemtoUniverse: Add efficiency calculation with EfficiencyCorrection class to V0 task (#11814)
1 parent 910f192 commit ea858cc

File tree

2 files changed

+56
-40
lines changed

2 files changed

+56
-40
lines changed

PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@
1616
#ifndef PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_
1717
#define PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_
1818

19+
#include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h"
20+
1921
#include <CCDB/BasicCCDBManager.h>
2022
#include <Framework/Configurable.h>
2123
#include <Framework/ConfigurableKinds.h>
2224
#include <Framework/HistogramRegistry.h>
2325
#include <Framework/HistogramSpec.h>
24-
2526
#include <Framework/O2DatabasePDGPlugin.h>
27+
2628
#include <TH1.h>
2729
#include <TH2.h>
2830

29-
#include <vector>
30-
#include <string>
3131
#include <algorithm>
3232
#include <ranges>
33-
34-
#include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h"
33+
#include <string>
34+
#include <vector>
3535

3636
namespace o2::analysis::femto_universe::efficiency_correction
3737
{
@@ -115,7 +115,7 @@ class EfficiencyCorrection
115115
}
116116
}
117117

118-
template <uint8_t N>
118+
template <uint8_t N, typename CollisionType = aod::FdCollisions>
119119
requires IsOneOrTwo<N>
120120
void fillTruthHist(auto particle)
121121
{
@@ -126,10 +126,10 @@ class EfficiencyCorrection
126126
histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hMCTruth"),
127127
particle.pt(),
128128
particle.eta(),
129-
particle.fdCollision().multV0M());
129+
particle.template fdCollision_as<CollisionType>().multV0M());
130130
}
131131

132-
template <uint8_t N>
132+
template <uint8_t N, typename CollisionType = aod::FdCollisions>
133133
requires IsOneOrTwo<N>
134134
void fillRecoHist(auto particle, int particlePDG)
135135
{
@@ -149,7 +149,7 @@ class EfficiencyCorrection
149149
histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hPrimary"),
150150
mcParticle.pt(),
151151
mcParticle.eta(),
152-
particle.fdCollision().multV0M());
152+
particle.template fdCollision_as<CollisionType>().multV0M());
153153
break;
154154

155155
case (o2::aod::femtouniverse_mc_particle::kDaughter):
@@ -158,33 +158,34 @@ class EfficiencyCorrection
158158
histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hSecondary"),
159159
mcParticle.pt(),
160160
mcParticle.eta(),
161-
particle.fdCollision().multV0M());
161+
particle.template fdCollision_as<CollisionType>().multV0M());
162162
break;
163163

164164
case (o2::aod::femtouniverse_mc_particle::kMaterial):
165165
histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hMaterial"),
166166
mcParticle.pt(),
167167
mcParticle.eta(),
168-
particle.fdCollision().multV0M());
168+
particle.template fdCollision_as<CollisionType>().multV0M());
169169
break;
170170

171171
case (o2::aod::femtouniverse_mc_particle::kFake):
172172
histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hFake"),
173173
mcParticle.pt(),
174174
mcParticle.eta(),
175-
particle.fdCollision().multV0M());
175+
particle.template fdCollision_as<CollisionType>().multV0M());
176176
break;
177177

178178
default:
179179
histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hOther"),
180180
mcParticle.pt(),
181181
mcParticle.eta(),
182-
particle.fdCollision().multV0M());
182+
particle.template fdCollision_as<CollisionType>().multV0M());
183183
break;
184184
}
185185
}
186186
}
187187

188+
template <typename CollisionType = aod::FdCollisions>
188189
auto getWeight(ParticleNo partNo, auto particle) -> float
189190
{
190191
auto weight = 1.0f;
@@ -203,9 +204,9 @@ class EfficiencyCorrection
203204
} else if (config->confEffCorVariables.value == "pt,eta") {
204205
bin = hWeights->FindBin(particle.pt(), particle.eta());
205206
} else if (config->confEffCorVariables.value == "pt,mult") {
206-
bin = hWeights->FindBin(particle.pt(), particle.fdCollision().multV0M());
207+
bin = hWeights->FindBin(particle.pt(), particle.template fdCollision_as<CollisionType>().multV0M());
207208
} else if (config->confEffCorVariables.value == "pt,eta,mult") {
208-
bin = hWeights->FindBin(particle.pt(), particle.eta(), particle.fdCollision().multV0M());
209+
bin = hWeights->FindBin(particle.pt(), particle.eta(), particle.template fdCollision_as<CollisionType>().multV0M());
209210
} else {
210211
LOGF(fatal, notify("Unknown configuration for efficiency variables"));
211212
return weight;

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,35 @@
1515
/// \author Zuzanna Chochulska, WUT Warsaw & CTU Prague, zchochul@cern.ch
1616
/// \author Shirajum Monira, WUT Warsaw, shirajum.monira.dokt@pw.edu.pl
1717

18-
#include <vector>
19-
#include <string>
20-
#include <memory>
21-
#include "Framework/AnalysisTask.h"
22-
#include "Framework/runDataProcessing.h"
23-
#include "Framework/HistogramRegistry.h"
24-
#include "Framework/ASoAHelpers.h"
25-
#include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h"
26-
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h"
27-
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h"
28-
#include "PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h"
2918
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h"
3019
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h"
20+
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h"
21+
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h"
22+
#include "PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h"
23+
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h"
24+
25+
#include "Framework/ASoAHelpers.h"
26+
#include "Framework/AnalysisTask.h"
27+
#include "Framework/HistogramRegistry.h"
3128
#include "Framework/O2DatabasePDGPlugin.h"
29+
#include "Framework/runDataProcessing.h"
30+
3231
#include <TFile.h>
3332
#include <TH1.h>
3433
#include <TPDGCode.h>
3534

35+
#include <memory>
36+
#include <string>
37+
#include <vector>
38+
3639
using namespace o2;
3740
using namespace o2::soa;
3841
using namespace o2::framework;
3942
using namespace o2::framework::expressions;
4043
using namespace o2::analysis::femto_universe;
4144
using namespace o2::aod::pidutils;
4245
using namespace o2::track;
46+
using namespace o2::analysis::femto_universe::efficiency_correction;
4347

4448
struct FemtoUniversePairTaskTrackV0Extended {
4549

@@ -140,6 +144,9 @@ struct FemtoUniversePairTaskTrackV0Extended {
140144
// Efficiency
141145
Configurable<std::string> confLocalEfficiency{"confLocalEfficiency", "", "Local path to efficiency .root file"};
142146

147+
EffCorConfigurableGroup effCorConfGroup;
148+
EfficiencyCorrection effCorrection{&effCorConfGroup};
149+
143150
static constexpr unsigned int V0ChildTable[][2] = {{0, 1}, {1, 0}, {1, 1}}; // Table to select the V0 children
144151

145152
FemtoUniverseContainer<femto_universe_container::EventType::same, femto_universe_container::Observable::kstar> sameEventCont;
@@ -154,8 +161,6 @@ struct FemtoUniversePairTaskTrackV0Extended {
154161
HistogramRegistry registryMCtruth{"MCtruthHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
155162
HistogramRegistry registryMCreco{"MCrecoHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
156163

157-
HistogramRegistry mixQaRegistry{"mixQaRegistry", {}, OutputObjHandlingPolicy::AnalysisObject};
158-
159164
std::unique_ptr<TFile> plocalEffFile;
160165
std::unique_ptr<TH1> plocalEffp1;
161166
std::unique_ptr<TH1> plocalEffp2;
@@ -228,7 +233,7 @@ struct FemtoUniversePairTaskTrackV0Extended {
228233
posChildV0Type2.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true, "posChildV0Type2");
229234
negChildV0Type2.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true, "negChildV0Type2");
230235

231-
mixQaRegistry.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}});
236+
qaRegistry.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}});
232237

233238
// MC truth
234239
registryMCtruth.add("plus/MCtruthLambda", "MC truth Lambdas;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}});
@@ -300,6 +305,8 @@ struct FemtoUniversePairTaskTrackV0Extended {
300305
LOGF(info, "Loaded efficiency histograms for V0-V0.");
301306
}
302307
}
308+
309+
effCorrection.init(&qaRegistry, {static_cast<framework::AxisSpec>(confV0TempFitVarpTBins), {confEtaBins, -2, 2}, confMultBins});
303310
}
304311
/// This function processes the same event for track - V0
305312
template <typename PartType, typename PartitionType, typename MCParticles = std::nullptr_t>
@@ -379,7 +386,7 @@ struct FemtoUniversePairTaskTrackV0Extended {
379386
}
380387

381388
/// This function processes the same event for V0 - V0
382-
template <typename PartType, typename PartitionType, typename MCParticles = std::nullptr_t>
389+
template <bool isMC, typename PartType, typename PartitionType, typename MCParticles = std::nullptr_t>
383390
void doSameEventV0(FilteredFDCollision const& col, PartType const& parts, PartitionType& groupPartsTwo, [[maybe_unused]] MCParticles mcParts = nullptr)
384391
{
385392
const auto& magFieldTesla = col.magField();
@@ -402,6 +409,9 @@ struct FemtoUniversePairTaskTrackV0Extended {
402409
negChildV0Type1.fillQABase<false, true>(negChild, HIST("negChildV0Type1"));
403410
qaRegistry.fill(HIST("V0Type1/hInvMassLambdaVsCent"), multCol, part.mLambda());
404411
qaRegistry.fill(HIST("V0Type1/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda());
412+
if constexpr (isMC) {
413+
effCorrection.fillRecoHist<ParticleNo::ONE, FilteredFDCollisions>(part, kLambda0);
414+
}
405415
}
406416
/// Check daughters of second V0 particle
407417
if (isParticleTPC(posChild, V0ChildTable[confV0Type2][0]) && isParticleTPC(negChild, V0ChildTable[confV0Type2][1])) {
@@ -410,6 +420,9 @@ struct FemtoUniversePairTaskTrackV0Extended {
410420
negChildV0Type2.fillQABase<false, true>(negChild, HIST("negChildV0Type2"));
411421
qaRegistry.fill(HIST("V0Type2/hInvMassLambdaVsCent"), multCol, part.mLambda());
412422
qaRegistry.fill(HIST("V0Type2/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda());
423+
if constexpr (isMC) {
424+
effCorrection.fillRecoHist<ParticleNo::TWO, FilteredFDCollisions>(part, kLambda0Bar);
425+
}
413426
}
414427
}
415428

@@ -481,14 +494,14 @@ struct FemtoUniversePairTaskTrackV0Extended {
481494
void processSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts)
482495
{
483496
auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
484-
doSameEventV0(col, parts, groupPartsTwo);
497+
doSameEventV0<false>(col, parts, groupPartsTwo);
485498
}
486499
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventV0, "Enable processing same event for V0 - V0", false);
487500

488501
void processSameEventV0MCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
489502
{
490503
auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
491-
doSameEventV0(col, parts, groupPartsTwo, mcparts);
504+
doSameEventV0<true>(col, parts, groupPartsTwo, mcparts);
492505
}
493506
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventV0MCReco, "Enable processing same event for V0 - V0 MC Reco", false);
494507

@@ -565,13 +578,15 @@ struct FemtoUniversePairTaskTrackV0Extended {
565578
negChildV0Type1.fillQABase<false, true>(negChild, HIST("negChildV0Type1"));
566579
qaRegistry.fill(HIST("V0Type1/hInvMassLambdaVsCent"), multCol, part.mLambda());
567580
qaRegistry.fill(HIST("V0Type1/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda());
581+
effCorrection.fillTruthHist<ParticleNo::ONE, FilteredFDCollisions>(part);
568582
}
569583
if ((confV0Type2 == 0 && pdgCode == kLambda0) || (confV0Type2 == 1 && pdgCode == kLambda0Bar)) {
570584
trackHistoV0Type2.fillQABase<false, true>(part, HIST("V0Type2"));
571585
posChildV0Type2.fillQABase<false, true>(posChild, HIST("posChildV0Type2"));
572586
negChildV0Type2.fillQABase<false, true>(negChild, HIST("negChildV0Type2"));
573587
qaRegistry.fill(HIST("V0Type2/hInvMassLambdaVsCent"), multCol, part.mLambda());
574588
qaRegistry.fill(HIST("V0Type2/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda());
589+
effCorrection.fillTruthHist<ParticleNo::TWO, FilteredFDCollisions>(part);
575590
}
576591
}
577592

@@ -657,12 +672,12 @@ struct FemtoUniversePairTaskTrackV0Extended {
657672
if (confUseCent) {
658673
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) {
659674
mixedCollProcessFunc(collision1, collision2);
660-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
675+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
661676
}
662677
} else {
663678
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningMult, confNEventsMix, -1, cols, cols)) {
664679
mixedCollProcessFunc(collision1, collision2);
665-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
680+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
666681
}
667682
}
668683
}
@@ -729,12 +744,12 @@ struct FemtoUniversePairTaskTrackV0Extended {
729744
if (confUseCent) {
730745
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) {
731746
mixedCollProcessFunc(collision1, collision2);
732-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
747+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
733748
}
734749
} else {
735750
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningMult, confNEventsMix, -1, cols, cols)) {
736751
mixedCollProcessFunc(collision1, collision2);
737-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
752+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
738753
}
739754
}
740755
}
@@ -799,12 +814,12 @@ struct FemtoUniversePairTaskTrackV0Extended {
799814
if (confUseCent) {
800815
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) {
801816
mixedCollProcessFunc(collision1, collision2);
802-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
817+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
803818
}
804819
} else {
805820
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningMult, confNEventsMix, -1, cols, cols)) {
806821
mixedCollProcessFunc(collision1, collision2);
807-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
822+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
808823
}
809824
}
810825
}
@@ -837,12 +852,12 @@ struct FemtoUniversePairTaskTrackV0Extended {
837852
if (confUseCent) {
838853
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) {
839854
mixedCollProcessFunc(collision1, collision2);
840-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
855+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningCent.getBin({collision1.posZ(), collision1.multV0M()}));
841856
}
842857
} else {
843858
for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningMult, confNEventsMix, -1, cols, cols)) {
844859
mixedCollProcessFunc(collision1, collision2);
845-
mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
860+
qaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), collision1.multNtr()}));
846861
}
847862
}
848863
}

0 commit comments

Comments
 (0)