Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion PWGHF/HFC/DataModel/CorrelationTables.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float); //! D
DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float); //! DCA z of the track
DECLARE_SOA_COLUMN(TrackTPCNClsCrossedRows, trackTPCNClsCrossedRows, int); //! Number of crossed TPC Rows
DECLARE_SOA_COLUMN(IsAutoCorrelated, isAutoCorrelated, bool); //! Correlation Status
DECLARE_SOA_COLUMN(Cent, cent, float); //! Centrality of Collision
DECLARE_SOA_COLUMN(TrackOrigin, trackOrigin, int); //! Check track origin
DECLARE_SOA_COLUMN(IsPrompt, isPrompt, bool); //! Used in MC-Rec, D0 Prompt or Non-Prompt
DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); //! Used in MC-Rec, primary associated particles
Expand Down Expand Up @@ -102,7 +103,8 @@ DECLARE_SOA_TABLE(D0HadronPair, "AOD", "D0HPAIR", //! D0-Hadrons pairs Informati
aod::hf_correlation_d0_hadron::PtD,
aod::hf_correlation_d0_hadron::PtHadron,
aod::hf_correlation_d0_hadron::PoolBin,
aod::hf_correlation_d0_hadron::IsAutoCorrelated);
aod::hf_correlation_d0_hadron::IsAutoCorrelated,
aod::hf_correlation_d0_hadron::Cent);

DECLARE_SOA_TABLE(D0HadronRecoInfo, "AOD", "D0HRECOINFO", //! D0-Hadrons pairs Reconstructed Informations
aod::hf_correlation_d0_hadron::MD,
Expand Down
49 changes: 39 additions & 10 deletions PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

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

SliceCache cache;

using SelCollisions = soa::Join<aod::Collisions, aod::EvSels>;
using SelCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Ms>;

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

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

Expand All @@ -130,13 +135,18 @@ struct HfCorrelatorD0HadronsSelection {
break;
}
}
float cent = 0.;
if (useCentrality) {
cent = collision.centFT0M();
}
if (useSel8) {
isSel8 = collision.sel8();
}
if (selNoSameBunchPileUpColl) {
isNosameBunchPileUp = collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup);
}
isSelColl = isD0Found && isSel8 && isNosameBunchPileUp;
isCentInRange = (cent >= centMin && cent <= centMax);
isSelColl = isD0Found && isSel8 && isNosameBunchPileUp && isCentInRange;
collisionsWithSelD0(isSelColl);
}
PROCESS_SWITCH(HfCorrelatorD0HadronsSelection, processD0SelectionData, "Process D0 Selection Data", false);
Expand Down Expand Up @@ -226,6 +236,7 @@ struct HfCorrelatorD0Hadrons {
Configurable<bool> correlateD0WithLeadingParticle{"correlateD0WithLeadingParticle", false, "Switch for correlation of D0 mesons with leading particle only"};
Configurable<bool> storeAutoCorrelationFlag{"storeAutoCorrelationFlag", false, "Store flag that indicates if the track is paired to its D-meson mother instead of skipping it"};
Configurable<int> numberEventsMixed{"numberEventsMixed", 5, "Number of events mixed in ME process"};
Configurable<bool> useCentrality{"useCentrality", false, "Flag for centrality dependent analyses"};

int leadingIndex = 0;
double massD0{0.};
Expand Down Expand Up @@ -255,6 +266,7 @@ struct HfCorrelatorD0Hadrons {
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {10000, 0., 10000.}, "Multiplicity as FT0M signal amplitude"};
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"};
ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"};
ConfigurableAxis binsCentFt0m{"binsCentFt0m", {100, 0., 100.}, "Centrality percentile (FT0M)"};

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

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

// Histograms for Data
registry.add("hPtCand", "D0, D0bar candidates", {HistType::kTH1F, {axisPtD}});
Expand All @@ -292,12 +305,14 @@ struct HfCorrelatorD0Hadrons {
registry.add("hEta", "D0,D0bar candidates", {HistType::kTH1F, {axisEta}});
registry.add("hPhi", "D0,D0bar candidates", {HistType::kTH1F, {axisPhi}});
registry.add("hY", "D0,D0bar candidates", {HistType::kTH1F, {axisRapidity}});
registry.add("hCentFT0M", "Centrality FT0M;centrality;entries", {HistType::kTH1F, {{100, 0., 100.}}});
registry.add("hMultiplicityPreSelection", "multiplicity prior to selection;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}});
registry.add("hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}});
registry.add("hMass", "D0, D0bar candidates massVsPt", {HistType::kTH2F, {{axisMassD}, {axisPtD}}});
registry.add("hMass1D", "D0, D0bar candidates mass", {HistType::kTH1F, {axisMassD}});
registry.add("hMassD01D", "D0 candidates mass", {HistType::kTH1F, {axisMassD}});
registry.add("hMassD0bar1D", "D0bar candidates mass", {HistType::kTH1F, {axisMassD}});
registry.add("hMassD0VsPtVsCent", "D0 candidates;inv. mass (p K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCent}}});
registry.add("hMLScoresVsMassVsPtVsOrigin", "D0, D0bar candidates massVsPt", {HistType::kTHnSparseD, {{axisBdtScoreBkg}, {axisBdtScorePrompt}, {axisMassD}, {axisPtD}, {axisOrigin}}});
// Histograms for MC Reco
registry.add("hPtCandRec", "D0, D0bar candidates - MC reco", {HistType::kTH1F, {axisPtD}});
Expand Down Expand Up @@ -354,6 +369,10 @@ struct HfCorrelatorD0Hadrons {
if (correlateD0WithLeadingParticle) {
leadingIndex = findLeadingParticle(tracks, etaTrackMax.value);
}
float cent = 0.;
if (useCentrality) {
cent = collision.centFT0M();
}

int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M()));
registry.fill(HIST("hCollisionPoolBin"), poolBin);
Expand Down Expand Up @@ -404,6 +423,7 @@ struct HfCorrelatorD0Hadrons {
registry.fill(HIST("hMass"), HfHelper::invMassD0ToPiK(candidate), candidate.pt(), efficiencyWeight);
registry.fill(HIST("hMass1D"), HfHelper::invMassD0ToPiK(candidate), efficiencyWeight);
registry.fill(HIST("hMassD01D"), HfHelper::invMassD0ToPiK(candidate), efficiencyWeight);
registry.fill(HIST("hMassD0VsPtVsCent"), HfHelper::invMassD0ToPiK(candidate), candidate.pt(), cent, efficiencyWeight);
for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) {
outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)];
}
Expand All @@ -413,6 +433,7 @@ struct HfCorrelatorD0Hadrons {
registry.fill(HIST("hMass"), HfHelper::invMassD0barToKPi(candidate), candidate.pt(), efficiencyWeight);
registry.fill(HIST("hMass1D"), HfHelper::invMassD0barToKPi(candidate), efficiencyWeight);
registry.fill(HIST("hMassD0bar1D"), HfHelper::invMassD0barToKPi(candidate), efficiencyWeight);
registry.fill(HIST("hMassD0VsPtVsCent"), HfHelper::invMassD0barToKPi(candidate), candidate.pt(), cent, efficiencyWeight);
for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) {
outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)];
}
Expand Down Expand Up @@ -484,11 +505,13 @@ struct HfCorrelatorD0Hadrons {
candidate.pt(),
track.pt(),
poolBin,
correlationStatus);
correlationStatus,
cent);
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
entryD0HadronGenInfo(false, false, 0);
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows());
registry.fill(HIST("hCentFT0M"), cent);

} // end inner loop (tracks)

Expand Down Expand Up @@ -614,7 +637,7 @@ struct HfCorrelatorD0Hadrons {

flagD0 = candidate.flagMcMatchRec() == o2::hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; // flagD0Signal 'true' if candidate matched to D0 (particle)
flagD0bar = candidate.flagMcMatchRec() == -o2::hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; // flagD0Reflection 'true' if candidate, selected as D0 (particle), is matched to D0bar (antiparticle)

float cent = 100.0; // Centrality Placeholder: will be updated later
// ========== track loop starts here ========================

for (const auto& track : tracks) {
Expand Down Expand Up @@ -688,7 +711,8 @@ struct HfCorrelatorD0Hadrons {
candidate.pt(),
track.pt(),
poolBin,
correlationStatus);
correlationStatus,
cent);
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
if (track.has_mcParticle()) {
Expand Down Expand Up @@ -729,6 +753,7 @@ struct HfCorrelatorD0Hadrons {
bool isD0Prompt = false;
bool isD0NonPrompt = false;
int trackOrigin = -1;
float cent = 100.; // Centrality Placeholder: will be updated later

for (const auto& particleTrigg : mcParticles) {
if (std::abs(particleTrigg.pdgCode()) != Pdg::kD0) {
Expand Down Expand Up @@ -803,7 +828,8 @@ struct HfCorrelatorD0Hadrons {
particleTrigg.pt(),
particleAssoc.pt(),
poolBin,
correlationStatus);
correlationStatus,
cent);
entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info
entryD0HadronGenInfo(isD0Prompt, particleAssoc.isPhysicalPrimary(), trackOrigin);
} // end inner loop (Tracks)
Expand Down Expand Up @@ -853,6 +879,7 @@ struct HfCorrelatorD0Hadrons {
invMassDstar2 = std::sqrt((eKPi + ePion) * (eKPi + ePion) - pSum2);
std::vector<float> outputMlD0 = {-1., -1., -1.};
std::vector<float> outputMlD0bar = {-1., -1., -1.};
float cent = 100.; // Centrality Placeholder: will be updated later

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

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

Expand Down Expand Up @@ -1019,7 +1047,7 @@ struct HfCorrelatorD0Hadrons {
} // background case D0bar
registry.fill(HIST("hSignalStatusMERec"), signalStatus);
bool correlationStatus = false;
entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus);
entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus, cent);
entryD0HadronRecoInfo(HfHelper::invMassD0ToPiK(candidate), HfHelper::invMassD0barToKPi(candidate), signalStatus);
entryD0HadronGenInfo(isD0Prompt, isPhysicalPrimary, trackOrigin);
entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]);
Expand Down Expand Up @@ -1064,10 +1092,11 @@ struct HfCorrelatorD0Hadrons {
if (std::abs(particleAssoc.pdgCode()) == kPiPlus && indexMotherPi >= 0 && indexMotherD0 >= 0 && indexMotherPi == indexMotherD0) {
continue;
}
float cent = 100.; // Centrality Placeholder: will be updated later
bool correlationStatus = false;
int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true);
bool isD0Prompt = particleTrigg.originMcGen() == RecoDecay::OriginType::Prompt;
entryD0HadronPair(getDeltaPhi(particleAssoc.phi(), particleTrigg.phi()), particleAssoc.eta() - particleTrigg.eta(), particleTrigg.pt(), particleAssoc.pt(), poolBin, correlationStatus);
entryD0HadronPair(getDeltaPhi(particleAssoc.phi(), particleTrigg.phi()), particleAssoc.eta() - particleTrigg.eta(), particleTrigg.pt(), particleAssoc.pt(), poolBin, correlationStatus, cent);
entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info
entryD0HadronGenInfo(isD0Prompt, particleAssoc.isPhysicalPrimary(), trackOrigin);
}
Expand Down
Loading
Loading