Skip to content

Commit 7695fe9

Browse files
committed
Add centrality dependence to D0–hadron correlator and correlation task
- Introduced centrality-dependent analysis in correlator and correlation task - Relaxed ML selection: changed '||' to '&&' in D0/D0bar BDT condition to improve efficiency
1 parent f2f04dd commit 7695fe9

File tree

3 files changed

+70
-35
lines changed

3 files changed

+70
-35
lines changed

PWGHF/HFC/DataModel/CorrelationTables.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float); //! D
7272
DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float); //! DCA z of the track
7373
DECLARE_SOA_COLUMN(TrackTPCNClsCrossedRows, trackTPCNClsCrossedRows, int); //! Number of crossed TPC Rows
7474
DECLARE_SOA_COLUMN(IsAutoCorrelated, isAutoCorrelated, bool); //! Correlation Status
75+
DECLARE_SOA_COLUMN(Cent, cent, float); //! Centrality of Collision
7576
DECLARE_SOA_COLUMN(TrackOrigin, trackOrigin, int); //! Check track origin
7677
DECLARE_SOA_COLUMN(IsPrompt, isPrompt, bool); //! Used in MC-Rec, D0 Prompt or Non-Prompt
7778
DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); //! Used in MC-Rec, primary associated particles
@@ -102,7 +103,8 @@ DECLARE_SOA_TABLE(D0HadronPair, "AOD", "D0HPAIR", //! D0-Hadrons pairs Informati
102103
aod::hf_correlation_d0_hadron::PtD,
103104
aod::hf_correlation_d0_hadron::PtHadron,
104105
aod::hf_correlation_d0_hadron::PoolBin,
105-
aod::hf_correlation_d0_hadron::IsAutoCorrelated);
106+
aod::hf_correlation_d0_hadron::IsAutoCorrelated,
107+
aod::hf_correlation_d0_hadron::Cent);
106108

107109
DECLARE_SOA_TABLE(D0HadronRecoInfo, "AOD", "D0HRECOINFO", //! D0-Hadrons pairs Reconstructed Informations
108110
aod::hf_correlation_d0_hadron::MD,

PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "Common/CCDB/EventSelectionParams.h"
3030
#include "Common/Core/RecoDecay.h"
31+
#include "Common/DataModel/Centrality.h"
3132
#include "Common/DataModel/EventSelection.h"
3233
#include "Common/DataModel/Multiplicity.h"
3334
#include "Common/DataModel/TrackSelectionTables.h"
@@ -76,7 +77,7 @@ double getDeltaPhi(double phiHadron, double phiD)
7677
// Types
7778
using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFT0M<aod::mult::MultFT0A, aod::mult::MultFT0C>>;
7879
using BinningTypeMcGen = ColumnBinningPolicy<aod::mccollision::PosZ, o2::aod::mult::MultMCFT0A>;
79-
using SelectedCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::Mults, aod::EvSels, aod::DmesonSelection>>;
80+
using SelectedCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::Mults, aod::EvSels, aod::DmesonSelection, aod::CentFT0Ms>>;
8081
using SelectedTracks = soa::Filtered<soa::Join<aod::TracksWDca, aod::TrackSelection, aod::TracksExtra>>;
8182
using SelectedCandidatesData = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0>>;
8283
using SelectedCandidatesDataMl = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0, aod::HfMlD0>>;
@@ -96,10 +97,13 @@ struct HfCorrelatorD0HadronsSelection {
9697
Configurable<int> selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"};
9798
Configurable<float> yCandMax{"yCandMax", 4.0, "max. cand. rapidity"};
9899
Configurable<float> ptCandMin{"ptCandMin", -1., "min. cand. pT"};
100+
Configurable<float> centMin{"centMin", 0., "Minimum Centrality"};
101+
Configurable<float> centMax{"centMax", 100., "Maximum Centrality"};
102+
Configurable<bool> useCentrality{"useCentality", false, "Flag for centrality dependent analyses"};
99103

100104
SliceCache cache;
101105

102-
using SelCollisions = soa::Join<aod::Collisions, aod::EvSels>;
106+
using SelCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Ms>;
103107

104108
Preslice<aod::HfCand2Prong> perCol = aod::hf_cand::collisionId;
105109

@@ -113,6 +117,7 @@ struct HfCorrelatorD0HadronsSelection {
113117
bool isD0Found = true;
114118
bool isSel8 = true;
115119
bool isNosameBunchPileUp = true;
120+
bool isCentInRange = false;
116121
if (selectedD0Candidates.size() > 0) {
117122
auto selectedD0CandidatesGrouped = selectedD0Candidates->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache);
118123

@@ -130,13 +135,18 @@ struct HfCorrelatorD0HadronsSelection {
130135
break;
131136
}
132137
}
138+
float cent = 0.;
139+
if (useCentrality) {
140+
cent = collision.centFT0M();
141+
}
133142
if (useSel8) {
134143
isSel8 = collision.sel8();
135144
}
136145
if (selNoSameBunchPileUpColl) {
137146
isNosameBunchPileUp = collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup);
138147
}
139-
isSelColl = isD0Found && isSel8 && isNosameBunchPileUp;
148+
isCentInRange = (cent >= centMin && cent <=centMax);
149+
isSelColl = isD0Found && isSel8 && isNosameBunchPileUp && isCentInRange;
140150
collisionsWithSelD0(isSelColl);
141151
}
142152
PROCESS_SWITCH(HfCorrelatorD0HadronsSelection, processD0SelectionData, "Process D0 Selection Data", false);
@@ -226,6 +236,7 @@ struct HfCorrelatorD0Hadrons {
226236
Configurable<bool> correlateD0WithLeadingParticle{"correlateD0WithLeadingParticle", false, "Switch for correlation of D0 mesons with leading particle only"};
227237
Configurable<bool> storeAutoCorrelationFlag{"storeAutoCorrelationFlag", false, "Store flag that indicates if the track is paired to its D-meson mother instead of skipping it"};
228238
Configurable<int> numberEventsMixed{"numberEventsMixed", 5, "Number of events mixed in ME process"};
239+
Configurable<bool> useCentrality{"useCentrality", false, "Flag for centrality dependent analyses"};
229240

230241
int leadingIndex = 0;
231242
double massD0{0.};
@@ -255,6 +266,7 @@ struct HfCorrelatorD0Hadrons {
255266
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {10000, 0., 10000.}, "Multiplicity as FT0M signal amplitude"};
256267
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"};
257268
ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"};
269+
ConfigurableAxis binsCentFt0m{"binsCentFT0m", {100, 0., 100.}, "centrality percentile (FT0M)"};
258270

259271
BinningType corrBinning{{zPoolBins, multPoolBins}, true};
260272

@@ -283,6 +295,7 @@ struct HfCorrelatorD0Hadrons {
283295
AxisSpec axisBdtScoreBkg = {100, 0., 1., "Bdt score background"};
284296
AxisSpec axisBdtScorePrompt = {100, 0., 1., "Bdt score prompt"};
285297
AxisSpec axisOrigin = {10, 0., 10., "Candidate origin"};
298+
AxisSpec axisCent = {binsCentFt0m,"Centrality"};
286299

287300
// Histograms for Data
288301
registry.add("hPtCand", "D0, D0bar candidates", {HistType::kTH1F, {axisPtD}});
@@ -292,12 +305,14 @@ struct HfCorrelatorD0Hadrons {
292305
registry.add("hEta", "D0,D0bar candidates", {HistType::kTH1F, {axisEta}});
293306
registry.add("hPhi", "D0,D0bar candidates", {HistType::kTH1F, {axisPhi}});
294307
registry.add("hY", "D0,D0bar candidates", {HistType::kTH1F, {axisRapidity}});
308+
registry.add("hCentFT0M","Centrality FT0M;centrality;entries", {HistType::kTH1F,{{100, 0., 100.}}});
295309
registry.add("hMultiplicityPreSelection", "multiplicity prior to selection;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}});
296-
registry.add("hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}});
310+
registry.add("hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}});
297311
registry.add("hMass", "D0, D0bar candidates massVsPt", {HistType::kTH2F, {{axisMassD}, {axisPtD}}});
298312
registry.add("hMass1D", "D0, D0bar candidates mass", {HistType::kTH1F, {axisMassD}});
299313
registry.add("hMassD01D", "D0 candidates mass", {HistType::kTH1F, {axisMassD}});
300314
registry.add("hMassD0bar1D", "D0bar candidates mass", {HistType::kTH1F, {axisMassD}});
315+
registry.add("hMassD0VsPtVsCent", "D0 candidates;inv. mass (p K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCent}}});
301316
registry.add("hMLScoresVsMassVsPtVsOrigin", "D0, D0bar candidates massVsPt", {HistType::kTHnSparseD, {{axisBdtScoreBkg}, {axisBdtScorePrompt}, {axisMassD}, {axisPtD}, {axisOrigin}}});
302317
// Histograms for MC Reco
303318
registry.add("hPtCandRec", "D0, D0bar candidates - MC reco", {HistType::kTH1F, {axisPtD}});
@@ -354,6 +369,10 @@ struct HfCorrelatorD0Hadrons {
354369
if (correlateD0WithLeadingParticle) {
355370
leadingIndex = findLeadingParticle(tracks, etaTrackMax.value);
356371
}
372+
float cent = 0.;
373+
if (useCentrality){
374+
cent = collision.centFT0M();
375+
}
357376

358377
int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M()));
359378
registry.fill(HIST("hCollisionPoolBin"), poolBin);
@@ -404,6 +423,7 @@ struct HfCorrelatorD0Hadrons {
404423
registry.fill(HIST("hMass"), HfHelper::invMassD0ToPiK(candidate), candidate.pt(), efficiencyWeight);
405424
registry.fill(HIST("hMass1D"), HfHelper::invMassD0ToPiK(candidate), efficiencyWeight);
406425
registry.fill(HIST("hMassD01D"), HfHelper::invMassD0ToPiK(candidate), efficiencyWeight);
426+
registry.fill(HIST("hMassD0VsPtVsCent"), HfHelper::invMassD0ToPiK(candidate), candidate.pt(), cent, efficiencyWeight);
407427
for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) {
408428
outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)];
409429
}
@@ -413,6 +433,7 @@ struct HfCorrelatorD0Hadrons {
413433
registry.fill(HIST("hMass"), HfHelper::invMassD0barToKPi(candidate), candidate.pt(), efficiencyWeight);
414434
registry.fill(HIST("hMass1D"), HfHelper::invMassD0barToKPi(candidate), efficiencyWeight);
415435
registry.fill(HIST("hMassD0bar1D"), HfHelper::invMassD0barToKPi(candidate), efficiencyWeight);
436+
registry.fill(HIST("hMassD0VsPtVsCent"), HfHelper::invMassD0barToKPi(candidate), candidate.pt(), cent, efficiencyWeight);
416437
for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) {
417438
outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)];
418439
}
@@ -484,11 +505,13 @@ struct HfCorrelatorD0Hadrons {
484505
candidate.pt(),
485506
track.pt(),
486507
poolBin,
487-
correlationStatus);
508+
correlationStatus,
509+
cent);
488510
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
489511
entryD0HadronGenInfo(false, false, 0);
490512
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
491513
entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows());
514+
registry.fill(HIST("hCentFT0M"),cent );
492515

493516
} // end inner loop (tracks)
494517

@@ -614,7 +637,7 @@ struct HfCorrelatorD0Hadrons {
614637

615638
flagD0 = candidate.flagMcMatchRec() == o2::hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; // flagD0Signal 'true' if candidate matched to D0 (particle)
616639
flagD0bar = candidate.flagMcMatchRec() == -o2::hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; // flagD0Reflection 'true' if candidate, selected as D0 (particle), is matched to D0bar (antiparticle)
617-
640+
float cent = 100.0; //Centrality Placeholder: will be updated later
618641
// ========== track loop starts here ========================
619642

620643
for (const auto& track : tracks) {
@@ -688,7 +711,8 @@ struct HfCorrelatorD0Hadrons {
688711
candidate.pt(),
689712
track.pt(),
690713
poolBin,
691-
correlationStatus);
714+
correlationStatus,
715+
cent);
692716
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
693717
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
694718
if (track.has_mcParticle()) {
@@ -729,6 +753,7 @@ struct HfCorrelatorD0Hadrons {
729753
bool isD0Prompt = false;
730754
bool isD0NonPrompt = false;
731755
int trackOrigin = -1;
756+
float cent = 100.; //Centrality Placeholder: will be updated later
732757

733758
for (const auto& particleTrigg : mcParticles) {
734759
if (std::abs(particleTrigg.pdgCode()) != Pdg::kD0) {
@@ -803,7 +828,8 @@ struct HfCorrelatorD0Hadrons {
803828
particleTrigg.pt(),
804829
particleAssoc.pt(),
805830
poolBin,
806-
correlationStatus);
831+
correlationStatus,
832+
cent);
807833
entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info
808834
entryD0HadronGenInfo(isD0Prompt, particleAssoc.isPhysicalPrimary(), trackOrigin);
809835
} // end inner loop (Tracks)
@@ -853,6 +879,7 @@ struct HfCorrelatorD0Hadrons {
853879
invMassDstar2 = std::sqrt((eKPi + ePion) * (eKPi + ePion) - pSum2);
854880
std::vector<float> outputMlD0 = {-1., -1., -1.};
855881
std::vector<float> outputMlD0bar = {-1., -1., -1.};
882+
float cent = 100.; //Centrality Placeholder: will be updated later
856883

857884
if (candidate.isSelD0() >= selectionFlagD0) {
858885
if ((std::abs(invMassDstar1 - HfHelper::invMassD0ToPiK(candidate)) - softPiMass) < ptSoftPionMax) {
@@ -887,7 +914,7 @@ struct HfCorrelatorD0Hadrons {
887914
}
888915
}
889916
bool correlationStatus = false;
890-
entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus);
917+
entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus, cent);
891918
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
892919
entryD0HadronGenInfo(false, false, 0);
893920
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
@@ -918,6 +945,7 @@ struct HfCorrelatorD0Hadrons {
918945
registry.fill(HIST("hD0PoolBin"), poolBinD0);
919946
registry.fill(HIST("hMultFT0M"), c1.multFT0M());
920947
registry.fill(HIST("hZvtx"), c1.posZ());
948+
float cent = 100.; //Centrality Placeholder: will be updated later
921949

922950
for (const auto& [candidate, particleAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) {
923951

@@ -1019,7 +1047,7 @@ struct HfCorrelatorD0Hadrons {
10191047
} // background case D0bar
10201048
registry.fill(HIST("hSignalStatusMERec"), signalStatus);
10211049
bool correlationStatus = false;
1022-
entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus);
1050+
entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus, cent);
10231051
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
10241052
entryD0HadronGenInfo(isD0Prompt, isPhysicalPrimary, trackOrigin);
10251053
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
@@ -1064,10 +1092,11 @@ struct HfCorrelatorD0Hadrons {
10641092
if (std::abs(particleAssoc.pdgCode()) == kPiPlus && indexMotherPi >= 0 && indexMotherD0 >= 0 && indexMotherPi == indexMotherD0) {
10651093
continue;
10661094
}
1095+
float cent = 100.; //Centrality Placeholder: will be updated later
10671096
bool correlationStatus = false;
10681097
int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true);
10691098
bool isD0Prompt = particleTrigg.originMcGen() == RecoDecay::OriginType::Prompt;
1070-
entryD0HadronPair(getDeltaPhi(particleAssoc.phi(), particleTrigg.phi()), particleAssoc.eta() - particleTrigg.eta(), particleTrigg.pt(), particleAssoc.pt(), poolBin, correlationStatus);
1099+
entryD0HadronPair(getDeltaPhi(particleAssoc.phi(), particleTrigg.phi()), particleAssoc.eta() - particleTrigg.eta(), particleTrigg.pt(), particleAssoc.pt(), poolBin, correlationStatus, cent);
10711100
entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info
10721101
entryD0HadronGenInfo(isD0Prompt, particleAssoc.isPhysicalPrimary(), trackOrigin);
10731102
}

0 commit comments

Comments
 (0)