From 151669d64af5a82d6a59cbc03be07ae843e6f18d Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 19 Dec 2025 08:30:07 +0000 Subject: [PATCH 1/4] Add protection for V0/casc. MC matching in HF PID task. --- PWGHF/Tasks/taskPidStudies.cxx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index 75878f4f9a6..b8f860698f1 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -305,13 +305,18 @@ struct HfTaskPidStudies { } template - int isMatched(const T1& cand) + int isMatched(const T1& cand, int mcCoresSize) { if constexpr (std::is_same::value) { if (!cand.has_v0MCCore()) { return Particle::NotMatched; } auto v0MC = cand.template v0MCCore_as(); + int v0MCId = cand.template v0MCCoreId(); + if (v0MCId >= mcCoresSize) { + // LOG(warn) << "v0MCId (" << v0MCId << ") >= MCCores size (" << mcCoresSize << "). Some issue in the data model?"; + return Particle::NotMatched; + } if (v0MC.pdgCode() == kK0Short && v0MC.pdgCodeNegative() == -kPiPlus && v0MC.pdgCodePositive() == kPiPlus) { return Particle::K0s; } @@ -509,7 +514,7 @@ struct HfTaskPidStudies { void processV0Mc(CollisionsMc const& /*mcCollisions*/, V0sMcRec const& v0s, - aod::V0MCCores const&, + aod::V0MCCores const& v0MCCores, aod::McParticles const& /*particlesMc*/, PidTracks const& /*tracks*/, aod::BCsWithTimestamps const&) @@ -522,7 +527,8 @@ struct HfTaskPidStudies { continue; } if (isSelectedV0AsK0s(v0) || isSelectedV0AsLambda(v0)) { - int const matched = isMatched(v0); + int const v0MCCoresSize = v0MCCores.size(); + int const matched = isMatched(v0, v0MCCoresSize); if (matched != Particle::NotMatched) { fillTree(v0, matched); } @@ -552,7 +558,7 @@ struct HfTaskPidStudies { void processCascMc(CollisionsMc const& /*mcCollisions*/, CascsMcRec const& cascades, - aod::CascMCCores const&, + aod::CascMCCores const& cascMCCores, aod::McParticles const& /*particlesMc*/, PidTracks const&, aod::BCsWithTimestamps const&) @@ -565,7 +571,8 @@ struct HfTaskPidStudies { continue; } if (isSelectedCascAsOmega(casc)) { - int const matched = isMatched(casc); + int const cascMCCoresSize = cascMCCores.size(); + int const matched = isMatched(casc, cascMCCoresSize); if (matched != Particle::NotMatched) { fillTree(casc, matched); } From fec5a9d37b98ab82a7cf8725ce3fd3d8c88b5819 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 19 Dec 2025 10:24:33 +0000 Subject: [PATCH 2/4] Fix template keyword. --- PWGHF/Tasks/taskPidStudies.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index b8f860698f1..31522554a21 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -312,7 +312,7 @@ struct HfTaskPidStudies { return Particle::NotMatched; } auto v0MC = cand.template v0MCCore_as(); - int v0MCId = cand.template v0MCCoreId(); + int v0MCId = cand.v0MCCoreId(); if (v0MCId >= mcCoresSize) { // LOG(warn) << "v0MCId (" << v0MCId << ") >= MCCores size (" << mcCoresSize << "). Some issue in the data model?"; return Particle::NotMatched; From ac2e662189dff48572fd00b32514c63aae84faf1 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 19 Dec 2025 11:38:52 +0000 Subject: [PATCH 3/4] Major fix: use robust Join between V0Cores and V0CoresMc. --- PWGHF/Tasks/taskPidStudies.cxx | 51 ++++++++++++---------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index 31522554a21..d9d6d544bc2 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -204,8 +204,8 @@ struct HfTaskPidStudies { aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>; using CollSels = soa::Join; using CollisionsMc = soa::Join; - using V0sMcRec = soa::Join; - using CascsMcRec = soa::Join; + using V0sMcRec = soa::Join; + using CascsMcRec = soa::Join; ctpRateFetcher rateFetcher; HfEventSelection hfEvSel; @@ -305,45 +305,32 @@ struct HfTaskPidStudies { } template - int isMatched(const T1& cand, int mcCoresSize) + int isMatched(const T1& cand) { if constexpr (std::is_same::value) { - if (!cand.has_v0MCCore()) { - return Particle::NotMatched; - } - auto v0MC = cand.template v0MCCore_as(); - int v0MCId = cand.v0MCCoreId(); - if (v0MCId >= mcCoresSize) { - // LOG(warn) << "v0MCId (" << v0MCId << ") >= MCCores size (" << mcCoresSize << "). Some issue in the data model?"; - return Particle::NotMatched; - } - if (v0MC.pdgCode() == kK0Short && v0MC.pdgCodeNegative() == -kPiPlus && v0MC.pdgCodePositive() == kPiPlus) { + if (cand.pdgCode() == kK0Short && cand.pdgCodeNegative() == -kPiPlus && cand.pdgCodePositive() == kPiPlus) { return Particle::K0s; } - if (v0MC.pdgCode() == kLambda0 && v0MC.pdgCodeNegative() == -kPiPlus && v0MC.pdgCodePositive() == kProton) { + if (cand.pdgCode() == kLambda0 && cand.pdgCodeNegative() == -kPiPlus && cand.pdgCodePositive() == kProton) { return Particle::Lambda; } - if (v0MC.pdgCode() == -kLambda0 && v0MC.pdgCodeNegative() == -kProton && v0MC.pdgCodePositive() == kPiPlus) { + if (cand.pdgCode() == -kLambda0 && cand.pdgCodeNegative() == -kProton && cand.pdgCodePositive() == kPiPlus) { return -Particle::Lambda; } } if constexpr (std::is_same::value) { - if (!cand.has_cascMCCore()) { - return Particle::NotMatched; - } - auto cascMC = cand.template cascMCCore_as(); - if (cascMC.pdgCode() == kOmegaMinus && - cascMC.pdgCodeBachelor() == -kKPlus && - cascMC.pdgCodeV0() == kLambda0 && - cascMC.pdgCodePositive() == kProton && - cascMC.pdgCodeNegative() == -kPiPlus) { + if (cand.pdgCode() == kOmegaMinus && + cand.pdgCodeBachelor() == -kKPlus && + cand.pdgCodeV0() == kLambda0 && + cand.pdgCodePositive() == kProton && + cand.pdgCodeNegative() == -kPiPlus) { return Particle::Omega; } - if (cascMC.pdgCode() == -kOmegaMinus && - cascMC.pdgCodeBachelor() == kKPlus && - cascMC.pdgCodeV0() == -kLambda0 && - cascMC.pdgCodePositive() == kPiPlus && - cascMC.pdgCodeNegative() == -kProton) { + if (cand.pdgCode() == -kOmegaMinus && + cand.pdgCodeBachelor() == kKPlus && + cand.pdgCodeV0() == -kLambda0 && + cand.pdgCodePositive() == kPiPlus && + cand.pdgCodeNegative() == -kProton) { return -Particle::Omega; } } @@ -527,8 +514,7 @@ struct HfTaskPidStudies { continue; } if (isSelectedV0AsK0s(v0) || isSelectedV0AsLambda(v0)) { - int const v0MCCoresSize = v0MCCores.size(); - int const matched = isMatched(v0, v0MCCoresSize); + int const matched = isMatched(v0); if (matched != Particle::NotMatched) { fillTree(v0, matched); } @@ -571,8 +557,7 @@ struct HfTaskPidStudies { continue; } if (isSelectedCascAsOmega(casc)) { - int const cascMCCoresSize = cascMCCores.size(); - int const matched = isMatched(casc, cascMCCoresSize); + int const matched = isMatched(casc); if (matched != Particle::NotMatched) { fillTree(casc, matched); } From de92dba37bfcb6d4b0464cf426c3cd0f42f3658e Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 19 Dec 2025 11:40:39 +0000 Subject: [PATCH 4/4] Remove useless names. --- PWGHF/Tasks/taskPidStudies.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index d9d6d544bc2..00ec4140f63 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -501,7 +501,7 @@ struct HfTaskPidStudies { void processV0Mc(CollisionsMc const& /*mcCollisions*/, V0sMcRec const& v0s, - aod::V0MCCores const& v0MCCores, + aod::V0MCCores const&, aod::McParticles const& /*particlesMc*/, PidTracks const& /*tracks*/, aod::BCsWithTimestamps const&) @@ -544,7 +544,7 @@ struct HfTaskPidStudies { void processCascMc(CollisionsMc const& /*mcCollisions*/, CascsMcRec const& cascades, - aod::CascMCCores const& cascMCCores, + aod::CascMCCores const&, aod::McParticles const& /*particlesMc*/, PidTracks const&, aod::BCsWithTimestamps const&)