@@ -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