diff --git a/PWGHF/Core/HfHelper.h b/PWGHF/Core/HfHelper.h index e91bfa85ca8..c128598522d 100644 --- a/PWGHF/Core/HfHelper.h +++ b/PWGHF/Core/HfHelper.h @@ -271,6 +271,30 @@ struct HfHelper { return RecoDecay::m(std::array{candidate.pVectorProng1(), candidate.pVectorProng2()}, std::array{o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}); } + template + static auto massKFirstPiPairDsToKKPi(const T& candidate) + { + return RecoDecay::m(std::array{candidate.pVectorProng0(), candidate.pVectorProng2()}, std::array{o2::constants::physics::MassKPlus, o2::constants::physics::MassPiPlus}); + } + + template + static auto massKFirstPiPairDsToPiKK(const T& candidate) + { + return RecoDecay::m(std::array{candidate.pVectorProng0(), candidate.pVectorProng2()}, std::array{o2::constants::physics::MassPiPlus, o2::constants::physics::MassKPlus}); + } + + template + static auto massKSecondPiPairDsToKKPi(const T& candidate) + { + return RecoDecay::m(std::array{candidate.pVectorProng1(), candidate.pVectorProng2()}, std::array{o2::constants::physics::MassKPlus, o2::constants::physics::MassPiPlus}); + } + + template + static auto massKSecondPiPairDsToPiKK(const T& candidate) + { + return RecoDecay::m(std::array{candidate.pVectorProng0(), candidate.pVectorProng1()}, std::array{o2::constants::physics::MassPiPlus, o2::constants::physics::MassKPlus}); + } + template static auto deltaMassPhiDsToKKPi(const T& candidate) { diff --git a/PWGHF/D2H/Tasks/taskDs.cxx b/PWGHF/D2H/Tasks/taskDs.cxx index 0f163718eda..d8d1362a5d3 100644 --- a/PWGHF/D2H/Tasks/taskDs.cxx +++ b/PWGHF/D2H/Tasks/taskDs.cxx @@ -98,7 +98,10 @@ namespace o2::aod namespace hf_cand_ds_mini { DECLARE_SOA_COLUMN(Pt, pt, float); //! Transverse momentum of D-meson candidate (GeV/c) -DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of D-meson candidates (GeV/c) +DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of D-meson candidates (GeV/c2) +DECLARE_SOA_COLUMN(MassKaKa, massKaKa, float); //! Invariant mass of kaon pairs (GeV/c2) +DECLARE_SOA_COLUMN(MassKaFirstPi, massKaFirstPi, float); //! Invariant mass of kaon(first) pion (GeV/c2) +DECLARE_SOA_COLUMN(MassKaSecondPi, massKaSecondPi, float); //! Invariant mass of kaon(second) pion (GeV/c2) DECLARE_SOA_COLUMN(Centrality, centrality, float); //! Centrality of collision DECLARE_SOA_COLUMN(ImpactParameter, impactParameter, float); //! Impact parameter of D-meson candidate DECLARE_SOA_COLUMN(ImpactParameterMc, impactParameterMc, float); //! Generated impact parameter of D-meson candidate @@ -114,6 +117,11 @@ DECLARE_SOA_TABLE(HfCandDsMinis, "AOD", "HFDSMINI", //! Table with few Ds proper hf_cand_ds_mini::Pt, hf_cand_ds_mini::Centrality); +DECLARE_SOA_TABLE(HfCandDsMassMinis, "AOD", "HFDSMASSMINI", //! Table with Ds 2-prong masses + hf_cand_ds_mini::MassKaKa, + hf_cand_ds_mini::MassKaFirstPi, + hf_cand_ds_mini::MassKaSecondPi); + DECLARE_SOA_TABLE(HfCandDsDlMinis, "AOD", "HFDSDLMINI", //! Table with decay length Ds properties hf_cand_ds_mini::DecayLength, hf_cand_ds_mini::DecayLengthXY, @@ -142,6 +150,7 @@ concept HasDsMlInfo = requires(T candidate) { /// Ds± analysis task struct HfTaskDs { Produces hfCandDsMinis; + Produces hfCandDsMassMinis; Produces hfCandDsDlMinis; Produces hfCandDsD0Minis; Produces hfCandDsMcMinis; @@ -592,10 +601,22 @@ struct HfTaskDs { template void fillMiniTrees(const Cand& candidate, FinalState finalState) { - auto mass = finalState == FinalState::KKPi ? HfHelper::invMassDsToKKPi(candidate) : HfHelper::invMassDsToPiKK(candidate); + float mass{-1.f}, massKaKa{-1.f}, massKaFirstPi{-1.f}, massKaSecondPi{-1.f}; + if (finalState == FinalState::KKPi) { + mass = HfHelper::invMassDsToKKPi(candidate); + massKaKa = HfHelper::massKKPairDsToKKPi(candidate); + massKaFirstPi = HfHelper::massKFirstPiPairDsToKKPi(candidate); + massKaSecondPi = HfHelper::massKSecondPiPairDsToKKPi(candidate); + } else { + mass = HfHelper::invMassDsToPiKK(candidate); + massKaKa = HfHelper::massKKPairDsToPiKK(candidate); + massKaFirstPi = HfHelper::massKFirstPiPairDsToPiKK(candidate); + massKaSecondPi = HfHelper::massKSecondPiPairDsToPiKK(candidate); + } auto pt = candidate.pt(); hfCandDsMinis(mass, pt, evaluateCentralityCand(candidate)); + hfCandDsMassMinis(massKaKa, massKaFirstPi, massKaSecondPi); if (miniTrees.extendWithDecayLength) { hfCandDsDlMinis(candidate.decayLength(), candidate.decayLengthXY(), candidate.decayLengthNormalised(), candidate.decayLengthXYNormalised()); } @@ -607,10 +628,22 @@ struct HfTaskDs { template void fillMiniTreesMc(const Cand& candidate, DataType dataType, FinalState finalState, const CandDsMcGen& mcParticles, int indexMother) { - auto mass = finalState == FinalState::KKPi ? HfHelper::invMassDsToKKPi(candidate) : HfHelper::invMassDsToPiKK(candidate); + float mass{-1.f}, massKaKa{-1.f}, massKaFirstPi{-1.f}, massKaSecondPi{-1.f}; + if (finalState == FinalState::KKPi) { + mass = HfHelper::invMassDsToKKPi(candidate); + massKaKa = HfHelper::massKKPairDsToKKPi(candidate); + massKaFirstPi = HfHelper::massKFirstPiPairDsToKKPi(candidate); + massKaSecondPi = HfHelper::massKSecondPiPairDsToKKPi(candidate); + } else { + mass = HfHelper::invMassDsToPiKK(candidate); + massKaKa = HfHelper::massKKPairDsToPiKK(candidate); + massKaFirstPi = HfHelper::massKFirstPiPairDsToPiKK(candidate); + massKaSecondPi = HfHelper::massKSecondPiPairDsToPiKK(candidate); + } auto pt = candidate.pt(); hfCandDsMinis(mass, pt, evaluateCentralityCand(candidate)); + hfCandDsMassMinis(massKaKa, massKaFirstPi, massKaSecondPi); if (miniTrees.extendWithDecayLength) { hfCandDsDlMinis(candidate.decayLength(), candidate.decayLengthXY(), candidate.decayLengthNormalised(), candidate.decayLengthXYNormalised()); }