From b6de1a36f36da06264d68468482d12469c684ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Fri, 24 Jul 2026 14:47:52 +0200 Subject: [PATCH 1/4] Refactor mixed event handling for track selection Updated mixed event handling to use selected partition for track 1 based on PDG code. This change applies to multiple decay channels and ensures correct partitioning for mixed events. --- .../Tasks/taskCharmHadronsTrackFemtoDream.cxx | 160 +++++++++++------- 1 file changed, 100 insertions(+), 60 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx index e7f10007cfa..631faa12c98 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx @@ -920,15 +920,19 @@ struct HfTaskCharmHadronsTrackFemtoDream { } } if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionTrk1Ka; + } switch (mixSetting.mixingBinPolicy) { case femtodreamcollision::kMult: - doMixedEvent(cols, partitionCharmHadron3Prong, partitionTrk1, parts, colBinningMult); + doMixedEvent(cols, partitionCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMult); break; case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionCharmHadron3Prong, partitionTrk1, parts, colBinningMultPercentile); + doMixedEvent(cols, partitionCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultPercentile); break; case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionCharmHadron3Prong, partitionTrk1, parts, colBinningMultMultPercentile); + doMixedEvent(cols, partitionCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultMultPercentile); break; default: LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; @@ -962,15 +966,19 @@ struct HfTaskCharmHadronsTrackFemtoDream { } } if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionTrk1Ka; + } switch (mixSetting.mixingBinPolicy) { case femtodreamcollision::kMult: - doMixedEvent(cols, partitionCharmHadron3Prong, partitionTrk1, parts, colBinningMult); + doMixedEvent(cols, partitionCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMult); break; case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionCharmHadron3Prong, partitionTrk1, parts, colBinningMultPercentile); + doMixedEvent(cols, partitionCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultPercentile); break; case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionCharmHadron3Prong, partitionTrk1, parts, colBinningMultMultPercentile); + doMixedEvent(cols, partitionCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultMultPercentile); break; default: LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; @@ -1003,15 +1011,19 @@ struct HfTaskCharmHadronsTrackFemtoDream { } } if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionTrk1Ka; + } switch (mixSetting.mixingBinPolicy) { case femtodreamcollision::kMult: - doMixedEvent(cols, partitionCharmHadron2Prong, partitionTrk1, parts, colBinningMult); + doMixedEvent(cols, partitionCharmHadron2Prong, *partitionTrk1Selected, parts, colBinningMult); break; case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionCharmHadron2Prong, partitionTrk1, parts, colBinningMultPercentile); + doMixedEvent(cols, partitionCharmHadron2Prong, *partitionTrk1Selected, parts, colBinningMultPercentile); break; case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionCharmHadron2Prong, partitionTrk1, parts, colBinningMultMultPercentile); + doMixedEvent(cols, partitionCharmHadron2Prong, *partitionTrk1Selected, parts, colBinningMultMultPercentile); break; default: LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; @@ -1044,15 +1056,19 @@ struct HfTaskCharmHadronsTrackFemtoDream { } } if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionTrk1Ka; + } switch (mixSetting.mixingBinPolicy) { case femtodreamcollision::kMult: - doMixedEvent(cols, partitionCharmHadronDstar, partitionTrk1, parts, colBinningMult); + doMixedEvent(cols, partitionCharmHadronDstar, *partitionTrk1Selected, parts, colBinningMult); break; case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionCharmHadronDstar, partitionTrk1, parts, colBinningMultPercentile); + doMixedEvent(cols, partitionCharmHadronDstar, *partitionTrk1Selected, parts, colBinningMultPercentile); break; case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionCharmHadronDstar, partitionTrk1, parts, colBinningMultMultPercentile); + doMixedEvent(cols, partitionCharmHadronDstar, *partitionTrk1Selected, parts, colBinningMultMultPercentile); break; default: LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; @@ -1123,18 +1139,24 @@ struct HfTaskCharmHadronsTrackFemtoDream { } doSameEvent(sliceMcCharmHad, sliceMcTrk1, parts, col); } - switch (mixSetting.mixingBinPolicy) { - case femtodreamcollision::kMult: - doMixedEvent(cols, partitionMcCharmHadron3Prong, partitionMcTrk1, parts, colBinningMult); - break; - case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionMcCharmHadron3Prong, partitionMcTrk1, parts, colBinningMultPercentile); - break; - case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionMcCharmHadron3Prong, partitionMcTrk1, parts, colBinningMultMultPercentile); - break; - default: - LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionMcTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionMcTrk1Ka; + } + switch (mixSetting.mixingBinPolicy) { + case femtodreamcollision::kMult: + doMixedEvent(cols, partitionMcCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMult); + break; + case femtodreamcollision::kMultPercentile: + doMixedEvent(cols, partitionMcCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultPercentile); + break; + case femtodreamcollision::kMultMultPercentile: + doMixedEvent(cols, partitionMcCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultMultPercentile); + break; + default: + LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + } } } PROCESS_SWITCH(HfTaskCharmHadronsTrackFemtoDream, processMcLcTrk, "Enable processing LcToPKPi and Tracks correlation for Monte Carlo", false); @@ -1158,18 +1180,24 @@ struct HfTaskCharmHadronsTrackFemtoDream { } doSameEvent(sliceMcCharmHad, sliceMcTrk1, parts, col); } - switch (mixSetting.mixingBinPolicy) { - case femtodreamcollision::kMult: - doMixedEvent(cols, partitionMcCharmHadron3Prong, partitionMcTrk1, parts, colBinningMult); - break; - case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionMcCharmHadron3Prong, partitionMcTrk1, parts, colBinningMultPercentile); - break; - case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionMcCharmHadron3Prong, partitionMcTrk1, parts, colBinningMultMultPercentile); - break; - default: - LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionMcTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionMcTrk1Ka; + } + switch (mixSetting.mixingBinPolicy) { + case femtodreamcollision::kMult: + doMixedEvent(cols, partitionMcCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMult); + break; + case femtodreamcollision::kMultPercentile: + doMixedEvent(cols, partitionMcCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultPercentile); + break; + case femtodreamcollision::kMultMultPercentile: + doMixedEvent(cols, partitionMcCharmHadron3Prong, *partitionTrk1Selected, parts, colBinningMultMultPercentile); + break; + default: + LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + } } } PROCESS_SWITCH(HfTaskCharmHadronsTrackFemtoDream, processMcDplusTrk, "Enable processing DplusToPiKPi and Tracks correlation for Monte Carlo", false); @@ -1193,18 +1221,24 @@ struct HfTaskCharmHadronsTrackFemtoDream { } doSameEvent(sliceMcCharmHad, sliceMcTrk1, parts, col); } - switch (mixSetting.mixingBinPolicy) { - case femtodreamcollision::kMult: - doMixedEvent(cols, partitionMcCharmHadron2Prong, partitionMcTrk1, parts, colBinningMult); - break; - case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionMcCharmHadron2Prong, partitionMcTrk1, parts, colBinningMultPercentile); - break; - case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionMcCharmHadron2Prong, partitionMcTrk1, parts, colBinningMultMultPercentile); - break; - default: - LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionMcTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionMcTrk1Ka; + } + switch (mixSetting.mixingBinPolicy) { + case femtodreamcollision::kMult: + doMixedEvent(cols, partitionMcCharmHadron2Prong, *partitionTrk1Selected, parts, colBinningMult); + break; + case femtodreamcollision::kMultPercentile: + doMixedEvent(cols, partitionMcCharmHadron2Prong, *partitionTrk1Selected, parts, colBinningMultPercentile); + break; + case femtodreamcollision::kMultMultPercentile: + doMixedEvent(cols, partitionMcCharmHadron2Prong, *partitionTrk1Selected, parts, colBinningMultMultPercentile); + break; + default: + LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + } } } PROCESS_SWITCH(HfTaskCharmHadronsTrackFemtoDream, processMcD0Trk, "Enable processing D0ToPiK and Tracks correlation for Monte Carlo", false); @@ -1228,18 +1262,24 @@ struct HfTaskCharmHadronsTrackFemtoDream { } doSameEvent(sliceMcCharmHad, sliceMcTrk1, parts, col); } - switch (mixSetting.mixingBinPolicy) { - case femtodreamcollision::kMult: - doMixedEvent(cols, partitionMcCharmHadronDstar, partitionMcTrk1, parts, colBinningMult); - break; - case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, partitionMcCharmHadronDstar, partitionMcTrk1, parts, colBinningMultPercentile); - break; - case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, partitionMcCharmHadronDstar, partitionMcTrk1, parts, colBinningMultMultPercentile); - break; - default: - LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + if (mixSetting.doMixEvent) { + auto* partitionTrk1Selected = &partitionMcTrk1; + if (trackSel.pdgCodeTrack1.value == kKPlus) { + partitionTrk1Selected = &partitionMcTrk1Ka; + } + switch (mixSetting.mixingBinPolicy) { + case femtodreamcollision::kMult: + doMixedEvent(cols, partitionMcCharmHadronDstar, *partitionTrk1Selected, parts, colBinningMult); + break; + case femtodreamcollision::kMultPercentile: + doMixedEvent(cols, partitionMcCharmHadronDstar, *partitionTrk1Selected, parts, colBinningMultPercentile); + break; + case femtodreamcollision::kMultMultPercentile: + doMixedEvent(cols, partitionMcCharmHadronDstar, *partitionTrk1Selected, parts, colBinningMultMultPercentile); + break; + default: + LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; + } } } PROCESS_SWITCH(HfTaskCharmHadronsTrackFemtoDream, processMcDstarTrk, "Enable processing DstarToD0Pi and Tracks correlation for Monte Carlo", false); From 55c4702c0255347917e9db5df91cb3cf74e165bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Fri, 24 Jul 2026 19:51:40 +0200 Subject: [PATCH 2/4] Fix the errors --- .../Tasks/taskCharmHadronsTrackFemtoDream.cxx | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx index 631faa12c98..f02386d5894 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsTrackFemtoDream.cxx @@ -382,10 +382,9 @@ struct HfTaskCharmHadronsTrackFemtoDream { if (cand.candidateSelFlag() == 1) { invMass = cand.m(std::array{MassPiPlus, MassKPlus}); return invMass; - } else { - invMass = cand.m(std::array{MassKPlus, MassPiPlus}); - return invMass; } + invMass = cand.m(std::array{MassKPlus, MassPiPlus}); + return invMass; } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { // D* → D0π (PDG: 413) float mDstar = 0.f; float mD0 = 0.f; @@ -398,9 +397,8 @@ struct HfTaskCharmHadronsTrackFemtoDream { } if (ReturnDaughMass) { return mD0; - } else { - return mDstar - mD0; } + return mDstar - mD0; } else if constexpr (Channel == DecayChannel::XicToXiPiPi) { invMass = cand.m(std::array{MassXiMinus, MassPiPlus, MassPiPlus}); return invMass; @@ -621,7 +619,7 @@ struct HfTaskCharmHadronsTrackFemtoDream { } template - void doMixedEvent(CollisionType const& cols, PartitionType1& charms, PartitionType2& trks, TableTracks const& parts, BinningType policy) + void doMixedEvent(CollisionType const& cols, PartitionType1& charms, PartitionType2& trks, TableTracks const& parts, BinningType const& policy) { processType = 2; // for mixed event // Mixed events that contain the pair of interest @@ -912,9 +910,8 @@ struct HfTaskCharmHadronsTrackFemtoDream { auto sliceCharmHad = partitionCharmHadron3Prong->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); if (fillTableWithCharm.value && sliceCharmHad.size() == 0) { continue; - } else { - fillTables(col, sliceTrk1, sliceCharmHad); } + fillTables(col, sliceTrk1, sliceCharmHad); if (sliceCharmHad.size() > 0 && sliceTrk1.size() > 0) { doSameEvent(sliceCharmHad, sliceTrk1, parts, col); } @@ -958,9 +955,8 @@ struct HfTaskCharmHadronsTrackFemtoDream { if (fillTableWithCharm.value && sliceCharmHad.size() == 0) { continue; - } else { - fillTables(col, sliceTrk1, sliceCharmHad); } + fillTables(col, sliceTrk1, sliceCharmHad); if (sliceCharmHad.size() > 0 && sliceTrk1.size() > 0) { doSameEvent(sliceCharmHad, sliceTrk1, parts, col); } @@ -1003,9 +999,8 @@ struct HfTaskCharmHadronsTrackFemtoDream { auto sliceCharmHad = partitionCharmHadron2Prong->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); if (fillTableWithCharm.value && sliceCharmHad.size() == 0) { continue; - } else { - fillTables(col, sliceTrk1, sliceCharmHad); } + fillTables(col, sliceTrk1, sliceCharmHad); if (sliceCharmHad.size() > 0 && sliceTrk1.size() > 0) { doSameEvent(sliceCharmHad, sliceTrk1, parts, col); } @@ -1048,9 +1043,8 @@ struct HfTaskCharmHadronsTrackFemtoDream { auto sliceCharmHad = partitionCharmHadronDstar->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); if (fillTableWithCharm.value && sliceCharmHad.size() == 0) { continue; - } else { - fillTables(col, sliceTrk1, sliceCharmHad); } + fillTables(col, sliceTrk1, sliceCharmHad); if (sliceCharmHad.size() > 0 && sliceTrk1.size() > 0) { doSameEvent(sliceCharmHad, sliceTrk1, parts, col); } @@ -1091,9 +1085,8 @@ struct HfTaskCharmHadronsTrackFemtoDream { auto sliceCharmHad = partitionCharmHadron3ProngXic->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); if (fillTableWithCharm.value && sliceCharmHad.size() == 0) { continue; - } else { - fillTables(col, sliceTrk1, sliceCharmHad); } + fillTables(col, sliceTrk1, sliceCharmHad); if (sliceCharmHad.size() > 0 && sliceTrk1.size() > 0) { doSameEvent(sliceCharmHad, sliceTrk1, parts, col); } From e2da3b0121e7a3217cf781dffd84dce2469b64de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Sat, 22 Aug 2026 22:31:45 +0200 Subject: [PATCH 3/4] Add TofBetaDe column for deuteron candidates --- PWGHF/D2H/Tasks/taskCd.cxx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskCd.cxx b/PWGHF/D2H/Tasks/taskCd.cxx index 4c71e62d6ee..d2460d06b11 100644 --- a/PWGHF/D2H/Tasks/taskCd.cxx +++ b/PWGHF/D2H/Tasks/taskCd.cxx @@ -100,6 +100,7 @@ DECLARE_SOA_COLUMN(NSigmaTpcKa, nSigmaTpcKa, float); //! TPC nσ DECLARE_SOA_COLUMN(NSigmaTpcPi, nSigmaTpcPi, float); //! TPC nσ for pion hypothesis DECLARE_SOA_COLUMN(NSigmaItsDe, nSigmaItsDe, float); //! ITS nσ for deuteron hypothesis DECLARE_SOA_COLUMN(NSigmaTofDe, nSigmaTofDe, float); //! TOF nσ for deuteron hypothesis +DECLARE_SOA_COLUMN(TofBetaDe, tofBetaDe, float); //! TOF beta for deuteron candidate DECLARE_SOA_COLUMN(NSigmaTofKa, nSigmaTofKa, float); //! TOF nσ for kaon hypothesis DECLARE_SOA_COLUMN(NSigmaTofPi, nSigmaTofPi, float); //! TOF nσ for pion hypothesis DECLARE_SOA_COLUMN(NItsClusters, nItsClusters, float); //! Number of ITS clusters used in the track fit @@ -145,6 +146,7 @@ DECLARE_SOA_TABLE(HfCandCdLite, "AOD", "HFCANDCDLITE", full::NSigmaTpcPr, full::NSigmaItsDe, full::NSigmaTofDe, + full::TofBetaDe, full::CtRec, full::CandidateSelFlag, full::CandidateSign, @@ -175,6 +177,7 @@ DECLARE_SOA_TABLE(HfCandCdFull, "AOD", "HFCANDCDFULL", full::NSigmaTpcPr, full::NSigmaItsDe, full::NSigmaTofDe, + full::TofBetaDe, full::NSigmaTpcPi, full::NSigmaTofPi, full::NSigmaTpcKa, @@ -235,8 +238,8 @@ struct HfTaskCd { using CdCandidates = soa::Filtered>; using CdCandidatesMc = soa::Filtered>; using McParticles3ProngMatched = soa::Join; - using HFTracks = soa::Join; - using HFTracksMc = soa::Join; + using HFTracks = soa::Join; + using HFTracksMc = soa::Join; Filter filterSelectCandidates = aod::hf_sel_candidate_cd::isSelCdToDeKPi >= selectionFlagCd || aod::hf_sel_candidate_cd::isSelCdToPiKDe >= selectionFlagCd; Preslice candCdPerCollision = aod::hf_cand::collisionId; @@ -518,13 +521,16 @@ struct HfTaskCd { float nSigmaTpcDe = 0.f, nSigmaTpcKa = 0.f, nSigmaTpcPi = 0.f, nSigmaTpcPr = 0.f; float nSigmaItsDe = 0.f; float nSigmaTofDe = 0.f, nSigmaTofKa = 0.f, nSigmaTofPi = 0.f; + float tofBetaDe = -999.f; float dcaDeuteron = 0.f, dcaKaon = 0.f, dcaPion = 0.f; const bool selDeKPi = (candidate.isSelCdToDeKPi() >= selectionFlagCd); const bool selPiKDe = (candidate.isSelCdToPiKDe() >= selectionFlagCd); + auto prong0 = candidate.template prong0_as(); auto prong1 = candidate.template prong1_as(); + auto prong2 = candidate.template prong2_as(); auto prong0Its = tracksWithItsPid.iteratorAt(candidate.prong0Id() - tracksWithItsPid.offset()); auto prong2Its = tracksWithItsPid.iteratorAt(candidate.prong2Id() - tracksWithItsPid.offset()); @@ -540,6 +546,7 @@ struct HfTaskCd { nSigmaTpcDe = candidate.nSigTpcDe0(); nSigmaTpcPr = candidate.nSigTpcPr0(); nSigmaTofDe = candidate.nSigTofDe0(); + tofBetaDe = (prong0.hasTOF() && prong0.beta() > 0.f) ? prong0.beta() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi2(); nSigmaTofPi = candidate.nSigTofPi2(); nSigmaItsDe = prong0Its.itsNSigmaDe(); @@ -553,6 +560,7 @@ struct HfTaskCd { nSigmaTpcDe = candidate.nSigTpcDe2(); nSigmaTpcPr = candidate.nSigTpcPr2(); nSigmaTofDe = candidate.nSigTofDe2(); + tofBetaDe = (prong2.hasTOF() && prong2.beta() > 0.f) ? prong2.beta() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi0(); nSigmaTofPi = candidate.nSigTofPi0(); nSigmaItsDe = prong2Its.itsNSigmaDe(); @@ -591,6 +599,7 @@ struct HfTaskCd { nSigmaTpcPr, nSigmaItsDe, nSigmaTofDe, + tofBetaDe, candidate.ct(o2::constants::physics::MassCDeuteron) * cmToMum, candFlag, candSign, @@ -622,6 +631,7 @@ struct HfTaskCd { nSigmaTpcPr, nSigmaItsDe, nSigmaTofDe, + tofBetaDe, nSigmaTpcPi, nSigmaTofPi, nSigmaTpcKa, @@ -833,6 +843,7 @@ struct HfTaskCd { float nSigmaTpcDe = 0.f, nSigmaTpcKa = 0.f, nSigmaTpcPi = 0.f, nSigmaTpcPr = 0.f; float nSigmaItsDe = 0.f; float nSigmaTofDe = 0.f, nSigmaTofKa = 0.f, nSigmaTofPi = 0.f; + float tofBetaDe = -999.f; float dcaDeuteron = 0.f, dcaKaon = 0.f, dcaPion = 0.f; // int itsNClusterSizeDe = 0; @@ -870,6 +881,7 @@ struct HfTaskCd { nSigmaTpcDe = candidate.nSigTpcDe0(); nSigmaTpcPr = candidate.nSigTpcPr0(); nSigmaTofDe = candidate.nSigTofDe0(); + tofBetaDe = (prong0.hasTOF() && prong0.beta() > 0.f) ? prong0.beta() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi2(); nSigmaTofPi = candidate.nSigTofPi2(); nSigmaItsDe = prong0Its.itsNSigmaDe(); @@ -888,6 +900,7 @@ struct HfTaskCd { nSigmaTpcDe = candidate.nSigTpcDe2(); nSigmaTpcPr = candidate.nSigTpcPr2(); nSigmaTofDe = candidate.nSigTofDe2(); + tofBetaDe = (prong2.hasTOF() && prong2.beta() > 0.f) ? prong2.beta() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi0(); nSigmaTofPi = candidate.nSigTofPi0(); nSigmaItsDe = prong2Its.itsNSigmaDe(); @@ -945,6 +958,7 @@ struct HfTaskCd { nSigmaTpcPr, nSigmaItsDe, nSigmaTofDe, + tofBetaDe, candidate.ct(o2::constants::physics::MassCDeuteron), candFlag, candSign, @@ -977,6 +991,7 @@ struct HfTaskCd { nSigmaTpcPr, nSigmaItsDe, nSigmaTofDe, + tofBetaDe, nSigmaTpcPi, nSigmaTofPi, nSigmaTpcKa, From d8f1b7649ce1a7d770a3aed608076f641d61f163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Sat, 22 Aug 2026 22:59:33 +0200 Subject: [PATCH 4/4] Add TPC inner-wall momentum and expected momentum for deuteron --- PWGHF/D2H/Tasks/taskCd.cxx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/PWGHF/D2H/Tasks/taskCd.cxx b/PWGHF/D2H/Tasks/taskCd.cxx index d2460d06b11..cea20fb44ae 100644 --- a/PWGHF/D2H/Tasks/taskCd.cxx +++ b/PWGHF/D2H/Tasks/taskCd.cxx @@ -101,6 +101,8 @@ DECLARE_SOA_COLUMN(NSigmaTpcPi, nSigmaTpcPi, float); //! TPC nσ DECLARE_SOA_COLUMN(NSigmaItsDe, nSigmaItsDe, float); //! ITS nσ for deuteron hypothesis DECLARE_SOA_COLUMN(NSigmaTofDe, nSigmaTofDe, float); //! TOF nσ for deuteron hypothesis DECLARE_SOA_COLUMN(TofBetaDe, tofBetaDe, float); //! TOF beta for deuteron candidate +DECLARE_SOA_COLUMN(TpcInnerParamDe, tpcInnerParamDe, float); //! TPC inner-wall momentum for deuteron candidate (GeV/c) +DECLARE_SOA_COLUMN(TofExpMomDe, tofExpMomDe, float); //! TOF expected momentum for deuteron candidate (GeV/c) DECLARE_SOA_COLUMN(NSigmaTofKa, nSigmaTofKa, float); //! TOF nσ for kaon hypothesis DECLARE_SOA_COLUMN(NSigmaTofPi, nSigmaTofPi, float); //! TOF nσ for pion hypothesis DECLARE_SOA_COLUMN(NItsClusters, nItsClusters, float); //! Number of ITS clusters used in the track fit @@ -147,6 +149,8 @@ DECLARE_SOA_TABLE(HfCandCdLite, "AOD", "HFCANDCDLITE", full::NSigmaItsDe, full::NSigmaTofDe, full::TofBetaDe, + full::TpcInnerParamDe, + full::TofExpMomDe, full::CtRec, full::CandidateSelFlag, full::CandidateSign, @@ -178,6 +182,8 @@ DECLARE_SOA_TABLE(HfCandCdFull, "AOD", "HFCANDCDFULL", full::NSigmaItsDe, full::NSigmaTofDe, full::TofBetaDe, + full::TpcInnerParamDe, + full::TofExpMomDe, full::NSigmaTpcPi, full::NSigmaTofPi, full::NSigmaTpcKa, @@ -522,6 +528,8 @@ struct HfTaskCd { float nSigmaItsDe = 0.f; float nSigmaTofDe = 0.f, nSigmaTofKa = 0.f, nSigmaTofPi = 0.f; float tofBetaDe = -999.f; + float tpcInnerParamDe = -999.f; + float tofExpMomDe = -999.f; float dcaDeuteron = 0.f, dcaKaon = 0.f, dcaPion = 0.f; @@ -547,6 +555,8 @@ struct HfTaskCd { nSigmaTpcPr = candidate.nSigTpcPr0(); nSigmaTofDe = candidate.nSigTofDe0(); tofBetaDe = (prong0.hasTOF() && prong0.beta() > 0.f) ? prong0.beta() : -999.f; + tpcInnerParamDe = prong0.tpcInnerParam(); + tofExpMomDe = prong0.hasTOF() ? prong0.tofExpMom() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi2(); nSigmaTofPi = candidate.nSigTofPi2(); nSigmaItsDe = prong0Its.itsNSigmaDe(); @@ -561,6 +571,8 @@ struct HfTaskCd { nSigmaTpcPr = candidate.nSigTpcPr2(); nSigmaTofDe = candidate.nSigTofDe2(); tofBetaDe = (prong2.hasTOF() && prong2.beta() > 0.f) ? prong2.beta() : -999.f; + tpcInnerParamDe = prong2.tpcInnerParam(); + tofExpMomDe = prong2.hasTOF() ? prong2.tofExpMom() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi0(); nSigmaTofPi = candidate.nSigTofPi0(); nSigmaItsDe = prong2Its.itsNSigmaDe(); @@ -600,6 +612,8 @@ struct HfTaskCd { nSigmaItsDe, nSigmaTofDe, tofBetaDe, + tpcInnerParamDe, + tofExpMomDe, candidate.ct(o2::constants::physics::MassCDeuteron) * cmToMum, candFlag, candSign, @@ -632,6 +646,8 @@ struct HfTaskCd { nSigmaItsDe, nSigmaTofDe, tofBetaDe, + tpcInnerParamDe, + tofExpMomDe, nSigmaTpcPi, nSigmaTofPi, nSigmaTpcKa, @@ -844,6 +860,8 @@ struct HfTaskCd { float nSigmaItsDe = 0.f; float nSigmaTofDe = 0.f, nSigmaTofKa = 0.f, nSigmaTofPi = 0.f; float tofBetaDe = -999.f; + float tpcInnerParamDe = -999.f; + float tofExpMomDe = -999.f; float dcaDeuteron = 0.f, dcaKaon = 0.f, dcaPion = 0.f; // int itsNClusterSizeDe = 0; @@ -882,6 +900,8 @@ struct HfTaskCd { nSigmaTpcPr = candidate.nSigTpcPr0(); nSigmaTofDe = candidate.nSigTofDe0(); tofBetaDe = (prong0.hasTOF() && prong0.beta() > 0.f) ? prong0.beta() : -999.f; + tpcInnerParamDe = prong0.tpcInnerParam(); + tofExpMomDe = prong0.hasTOF() ? prong0.tofExpMom() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi2(); nSigmaTofPi = candidate.nSigTofPi2(); nSigmaItsDe = prong0Its.itsNSigmaDe(); @@ -901,6 +921,8 @@ struct HfTaskCd { nSigmaTpcPr = candidate.nSigTpcPr2(); nSigmaTofDe = candidate.nSigTofDe2(); tofBetaDe = (prong2.hasTOF() && prong2.beta() > 0.f) ? prong2.beta() : -999.f; + tpcInnerParamDe = prong2.tpcInnerParam(); + tofExpMomDe = prong2.hasTOF() ? prong2.tofExpMom() : -999.f; nSigmaTpcPi = candidate.nSigTpcPi0(); nSigmaTofPi = candidate.nSigTofPi0(); nSigmaItsDe = prong2Its.itsNSigmaDe(); @@ -959,6 +981,8 @@ struct HfTaskCd { nSigmaItsDe, nSigmaTofDe, tofBetaDe, + tpcInnerParamDe, + tofExpMomDe, candidate.ct(o2::constants::physics::MassCDeuteron), candFlag, candSign, @@ -992,6 +1016,8 @@ struct HfTaskCd { nSigmaItsDe, nSigmaTofDe, tofBetaDe, + tpcInnerParamDe, + tofExpMomDe, nSigmaTpcPi, nSigmaTofPi, nSigmaTpcKa,