Skip to content

Commit 405dc9a

Browse files
[PWGHF] This PR adds D0-specific derived tables for offline event mixing in the D0-hadron correlator (#16063)
1 parent 8d0b2c1 commit 405dc9a

2 files changed

Lines changed: 112 additions & 4 deletions

File tree

PWGHF/HFC/DataModel/CorrelationTables.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,57 @@ DECLARE_SOA_TABLE(DDbarRecoInfo, "AOD", "DDBARRECOINFO",
5151
aod::hf_correlation_d_dbar::MDbar,
5252
aod::hf_correlation_d_dbar::SignalStatus);
5353

54+
// Table to store event by event D meson selection information for event mixing in D-hadron correlation analysis
55+
namespace hf_d0_meson
56+
{
57+
DECLARE_SOA_COLUMN(Phi, phi, float);
58+
DECLARE_SOA_COLUMN(Eta, eta, float);
59+
DECLARE_SOA_COLUMN(PtD, ptD, float);
60+
DECLARE_SOA_COLUMN(MD, mD, float);
61+
DECLARE_SOA_COLUMN(PoolBin, poolBin, int);
62+
DECLARE_SOA_COLUMN(GIndexCol, gIndexCol, int);
63+
DECLARE_SOA_COLUMN(TimeStamp, timeStamp, int64_t);
64+
DECLARE_SOA_COLUMN(SignalStatus, signalStatus, int);
65+
} // namespace hf_d0_meson
66+
67+
DECLARE_SOA_TABLE(D0, "AOD", "D0",
68+
aod::hf_d0_meson::Phi,
69+
aod::hf_d0_meson::Eta,
70+
aod::hf_d0_meson::PtD,
71+
aod::hf_d0_meson::MD,
72+
aod::hf_d0_meson::PoolBin,
73+
aod::hf_d0_meson::GIndexCol,
74+
aod::hf_d0_meson::TimeStamp,
75+
aod::hf_d0_meson::SignalStatus);
76+
77+
// Table to store event-by-event associated tracks for offline D0-hadron event mixing
78+
namespace hf_d0_assoc_tracks
79+
{
80+
DECLARE_SOA_COLUMN(Phi, phi, float); //! Phi of hadron
81+
DECLARE_SOA_COLUMN(Eta, eta, float); //! Eta of hadron
82+
DECLARE_SOA_COLUMN(PtH, ptH, float); //! Transverse momentum of hadron
83+
DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin of event defined using zvtx and multiplicity
84+
DECLARE_SOA_COLUMN(GIndexCol, gIndexCol, int); //! Global index for the collision
85+
DECLARE_SOA_COLUMN(TimeStamp, timeStamp, int64_t); //! Timestamp for the collision
86+
DECLARE_SOA_COLUMN(SoftPiStatus, softPiStatus, int); //! Soft-pion status for D0 offline mixing
87+
88+
enum SoftPionStatus {
89+
NotSoftPi = 0,
90+
SoftPiD0 = 1,
91+
SoftPiD0bar = 2,
92+
SoftPiD0D0bar = 3
93+
};
94+
} // namespace hf_d0_assoc_tracks
95+
96+
DECLARE_SOA_TABLE(D0Hadron, "AOD", "D0HADRON",
97+
aod::hf_d0_assoc_tracks::Phi,
98+
aod::hf_d0_assoc_tracks::Eta,
99+
aod::hf_d0_assoc_tracks::PtH,
100+
aod::hf_d0_assoc_tracks::PoolBin,
101+
aod::hf_d0_assoc_tracks::GIndexCol,
102+
aod::hf_d0_assoc_tracks::TimeStamp,
103+
aod::hf_d0_assoc_tracks::SoftPiStatus);
104+
54105
// definition of columns and tables for D0-Hadron correlation pairs
55106
namespace hf_correlation_d0_hadron
56107
{

PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ struct HfCorrelatorD0Hadrons {
214214
Produces<aod::D0CandRecoInfo> entryD0CandRecoInfo;
215215
Produces<aod::D0CandGenInfo> entryD0CandGenInfo;
216216
Produces<aod::D0TrackRecoInfo> entryTrackRecoInfo;
217+
Produces<aod::D0> entryD0;
218+
Produces<aod::D0Hadron> entryD0Hadron;
217219

218220
Configurable<int> selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"};
219221
Configurable<int> selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"};
@@ -283,9 +285,9 @@ struct HfCorrelatorD0Hadrons {
283285
AxisSpec const axisSignalStatus = {200, 0., 200., "Signal status"};
284286
AxisSpec axisEvtCount = {1, -0.5, 0.5};
285287
AxisSpec const axisTrkCount = {5, 0., 5.};
286-
AxisSpec axisBdtScoreBkg = {100, 0., 1., "Bdt score background"};
287-
AxisSpec axisBdtScorePrompt = {100, 0., 1., "Bdt score prompt"};
288-
AxisSpec axisBdtScoreNonPrompt = {100, 0., 1., "Bdt score Nonprompt"};
288+
AxisSpec axisBdtScoreBkg = {500, 0., 1., "Bdt score background"};
289+
AxisSpec axisBdtScorePrompt = {200, 0., 1., "Bdt score prompt"};
290+
AxisSpec axisBdtScoreNonPrompt = {200, 0., 1., "Bdt score Nonprompt"};
289291
AxisSpec axisOrigin = {10, 0., 10., "Candidate origin"};
290292
AxisSpec axisCent = {binsCentFt0m, "Centrality"};
291293

@@ -306,6 +308,9 @@ struct HfCorrelatorD0Hadrons {
306308
registry.add("hMassD0bar1D", "D0bar candidates mass", {HistType::kTH1F, {axisMassD}});
307309
registry.add("hMassD0VsPtVsCent", "D0 candidates;inv. mass (p K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCent}}});
308310
registry.add("hMLScoresVsMassVsPtVsEtaVsOriginVsCent", "D0, D0bar candidates BkgVspromptVsNonPromptVsMassVsPtVsEtaVsOrigin", {HistType::kTHnSparseD, {{axisBdtScoreBkg}, {axisBdtScorePrompt}, {axisBdtScoreNonPrompt}, {axisMassD}, {axisPtD}, {axisEta}, {axisOrigin}, {axisCent}}});
311+
registry.add("hTracksBeforeSoftMix", "Tracks before soft pion reject offline mixing", {HistType::kTH1F, {axisPtHadron}});
312+
registry.add("hTracksAfterSoftMix", "Tracks after soft pion reject offline mixing", {HistType::kTH1F, {axisPtHadron}});
313+
309314
// Histograms for MC Reco
310315
registry.add("hPtCandRec", "D0, D0bar candidates - MC reco", {HistType::kTH1F, {axisPtD}});
311316
registry.add("hPtProng0Rec", "D0, D0bar candidates prong 0 - MC reco", {HistType::kTH1F, {axisPtD}});
@@ -359,9 +364,15 @@ struct HfCorrelatorD0Hadrons {
359364
/// D0-h correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth)
360365
void processData(SelectedCollisions::iterator const& collision,
361366
SelectedTracks const& tracks,
362-
SelectedCandidatesDataMl const& candidates)
367+
SelectedCandidatesDataMl const& candidates,
368+
aod::BCsWithTimestamps const&)
363369
{
364370
BinningType const corrBinning{{zPoolBins, multPoolBins}, true};
371+
372+
auto bc = collision.bc_as<aod::BCsWithTimestamps>();
373+
int gCollisionId = collision.globalIndex();
374+
int64_t timeStamp = bc.timestamp();
375+
365376
// find leading particle
366377
if (correlateD0WithLeadingParticle) {
367378
leadingIndex = findLeadingParticle(tracks, etaTrackMax.value);
@@ -397,6 +408,30 @@ struct HfCorrelatorD0Hadrons {
397408
std::vector<float> outputMlD0 = {-1., -1., -1.};
398409
std::vector<float> outputMlD0bar = {-1., -1., -1.};
399410

411+
std::vector<int64_t> softPionTrackIdsForOfflineMixing;
412+
std::vector<int> softPionStatusesForOfflineMixing;
413+
bool hasAcceptedD0ForOfflineMixing = false;
414+
415+
auto addSoftPionTrackForOfflineMixing = [&softPionTrackIdsForOfflineMixing, &softPionStatusesForOfflineMixing](int64_t trackId, int softPiStatus) {
416+
for (auto iTrack = 0u; iTrack < softPionTrackIdsForOfflineMixing.size(); ++iTrack) {
417+
if (softPionTrackIdsForOfflineMixing[iTrack] == trackId) {
418+
softPionStatusesForOfflineMixing[iTrack] |= softPiStatus;
419+
return;
420+
}
421+
}
422+
softPionTrackIdsForOfflineMixing.push_back(trackId);
423+
softPionStatusesForOfflineMixing.push_back(softPiStatus);
424+
};
425+
426+
auto getSoftPionStatusForOfflineMixing = [&softPionTrackIdsForOfflineMixing, &softPionStatusesForOfflineMixing](int64_t trackId) {
427+
for (auto iTrack = 0u; iTrack < softPionTrackIdsForOfflineMixing.size(); ++iTrack) {
428+
if (softPionTrackIdsForOfflineMixing[iTrack] == trackId) {
429+
return softPionStatusesForOfflineMixing[iTrack];
430+
}
431+
}
432+
return static_cast<int>(aod::hf_d0_assoc_tracks::NotSoftPi);
433+
};
434+
400435
for (const auto& candidate : candidates) {
401436
if (std::abs(HfHelper::yD0(candidate)) >= yCandMax || candidate.pt() <= ptCandMin || candidate.pt() >= ptTrackMax) {
402437
continue;
@@ -420,6 +455,10 @@ struct HfCorrelatorD0Hadrons {
420455
const auto invMassD0 = HfHelper::invMassD0ToPiK(candidate);
421456
const auto invMassD0bar = HfHelper::invMassD0barToKPi(candidate);
422457

458+
if (candidate.isSelD0() >= selectionFlagD0 || candidate.isSelD0bar() >= selectionFlagD0bar) {
459+
hasAcceptedD0ForOfflineMixing = true;
460+
}
461+
423462
// ========================== Fill mass histo ================================
424463
if (candidate.isSelD0() >= selectionFlagD0) {
425464
registry.fill(HIST("hMass"), invMassD0, candidate.pt(), efficiencyWeight);
@@ -430,6 +469,7 @@ struct HfCorrelatorD0Hadrons {
430469
outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)];
431470
}
432471
registry.fill(HIST("hMLScoresVsMassVsPtVsEtaVsOriginVsCent"), outputMlD0[0], outputMlD0[1], outputMlD0[2], invMassD0, candidate.pt(), candidate.eta(), (candidate.isSelD0bar() != 0) ? o2::aod::hf_correlation_d0_hadron::D0D0barBoth : o2::aod::hf_correlation_d0_hadron::D0Only, cent, efficiencyWeight);
472+
entryD0(candidate.phi(), candidate.eta(), candidate.pt(), invMassD0, poolBin, gCollisionId, timeStamp, (candidate.isSelD0bar() != 0) ? o2::aod::hf_correlation_d0_hadron::D0D0barBoth : o2::aod::hf_correlation_d0_hadron::D0Only);
433473
}
434474
if (candidate.isSelD0bar() >= selectionFlagD0bar) {
435475
registry.fill(HIST("hMass"), invMassD0bar, candidate.pt(), efficiencyWeight);
@@ -440,6 +480,7 @@ struct HfCorrelatorD0Hadrons {
440480
outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)];
441481
}
442482
registry.fill(HIST("hMLScoresVsMassVsPtVsEtaVsOriginVsCent"), outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2], invMassD0bar, candidate.pt(), candidate.eta(), (candidate.isSelD0() != 0) ? o2::aod::hf_correlation_d0_hadron::D0D0barBoth : o2::aod::hf_correlation_d0_hadron::D0barOnly, cent, efficiencyWeight);
483+
entryD0(candidate.phi(), candidate.eta(), candidate.pt(), invMassD0bar, poolBin, gCollisionId, timeStamp, (candidate.isSelD0() != 0) ? o2::aod::hf_correlation_d0_hadron::D0D0barBoth : o2::aod::hf_correlation_d0_hadron::D0barOnly);
443484
}
444485
entryD0CandRecoInfo(invMassD0, invMassD0bar, candidate.pt(), outputMlD0[0], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[2]);
445486

@@ -477,12 +518,14 @@ struct HfCorrelatorD0Hadrons {
477518

478519
if (candidate.isSelD0() >= selectionFlagD0) {
479520
if ((std::abs(invMassDstar1 - invMassD0) - softPiMass) < ptSoftPionMax) {
521+
addSoftPionTrackForOfflineMixing(track.globalIndex(), aod::hf_d0_assoc_tracks::SoftPiD0);
480522
continue;
481523
}
482524
}
483525

484526
if (candidate.isSelD0bar() >= selectionFlagD0bar) {
485527
if ((std::abs(invMassDstar2 - invMassD0bar) - softPiMass) < ptSoftPionMax) {
528+
addSoftPionTrackForOfflineMixing(track.globalIndex(), aod::hf_d0_assoc_tracks::SoftPiD0bar);
486529
continue;
487530
}
488531
}
@@ -518,6 +561,20 @@ struct HfCorrelatorD0Hadrons {
518561
} // end inner loop (tracks)
519562

520563
} // end outer loop
564+
565+
// loop to save tables for offline event mixing
566+
if (hasAcceptedD0ForOfflineMixing) {
567+
for (const auto& track : tracks) {
568+
const auto softPiStatus = getSoftPionStatusForOfflineMixing(track.globalIndex());
569+
570+
registry.fill(HIST("hTracksBeforeSoftMix"), track.pt());
571+
if (softPiStatus == aod::hf_d0_assoc_tracks::NotSoftPi) {
572+
registry.fill(HIST("hTracksAfterSoftMix"), track.pt());
573+
}
574+
575+
entryD0Hadron(track.phi(), track.eta(), track.pt(), poolBin, gCollisionId, timeStamp, softPiStatus);
576+
}
577+
}
521578
}
522579
PROCESS_SWITCH(HfCorrelatorD0Hadrons, processData, "Process data", false);
523580

0 commit comments

Comments
 (0)