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
7778using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFT0M<aod::mult::MultFT0A, aod::mult::MultFT0C>>;
7879using 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 >>;
8081using SelectedTracks = soa::Filtered<soa::Join<aod::TracksWDca, aod::TrackSelection, aod::TracksExtra>>;
8182using SelectedCandidatesData = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0>>;
8283using 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{" useCentrality" , 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}});
296310 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