From 4ee97ea4c00b52f951fbaa865a29aab1f63bdf24 Mon Sep 17 00:00:00 2001 From: scannito Date: Wed, 15 Apr 2026 17:55:13 +0200 Subject: [PATCH 1/2] Optionally disable phi online efficiency + extended pt axes for MCGen --- .../Strangeness/phiStrangeCorrelator.cxx | 31 +++++++--- .../Strangeness/phiStrangeCorrelation.cxx | 61 +++++++++++-------- 2 files changed, 59 insertions(+), 33 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/phiStrangeCorrelator.cxx b/PWGLF/TableProducer/Strangeness/phiStrangeCorrelator.cxx index a05e958377f..c4fbe6822fe 100644 --- a/PWGLF/TableProducer/Strangeness/phiStrangeCorrelator.cxx +++ b/PWGLF/TableProducer/Strangeness/phiStrangeCorrelator.cxx @@ -550,8 +550,11 @@ struct PionTrackProducer { // Configurable forceTOF{"forceTOF", false, "force the TOF signal for the PID"}; Configurable tofPIDThreshold{"tofPIDThreshold", 0.5, "minimum pT after which TOF PID is applicable"}; Configurable> trkPIDspecies{"trkPIDspecies", std::vector{o2::track::PID::Kaon, o2::track::PID::Proton}, "Trk sel: Particles species for PID rejection, kaon, proton"}; - Configurable> pidTPCMax{"pidTPCMax", std::vector{2.0f, 2.0f}, "maximum nSigma TPC"}; - Configurable> pidTOFMax{"pidTOFMax", std::vector{2.0f, 2.0f}, "maximum nSigma TOF"}; + Configurable> pidRangeTPCEl{"pidRangeTPCEl", {-3.0f, 5.0f}, "nSigma TPC range for electrons"}; + Configurable pidTPCMaxHadrons{"pidTPCMaxHadrons", 3.0f, "maximum nSigma TPC for hadrons"}; + Configurable pidTOFMaxHadrons{"pidTOFMaxHadrons", 3.0f, "maximum nSigma TOF for hadrons"}; + Configurable> pidTPCMax{"pidTPCMax", std::vector{3.0f, 3.0f}, "maximum nSigma TPC"}; + Configurable> pidTOFMax{"pidTOFMax", std::vector{3.0f, 3.0f}, "maximum nSigma TOF"}; Configurable cfgYAcceptance{"cfgYAcceptance", 0.5f, "Rapidity acceptance"}; } trackConfigs; @@ -636,20 +639,32 @@ struct PionTrackProducer { // Electron rejection auto nSigmaTPCEl = aod::pidutils::tpcNSigma(o2::track::PID::Electron, track); - if (nSigmaTPCEl > -3.0f && nSigmaTPCEl < 5.0f) { + if (nSigmaTPCEl > trackConfigs.pidRangeTPCEl->first && nSigmaTPCEl < trackConfigs.pidRangeTPCEl->second) { auto nSigmaTPCPi = aod::pidutils::tpcNSigma(o2::track::PID::Pion, track); auto nSigmaTPCKa = aod::pidutils::tpcNSigma(o2::track::PID::Kaon, track); auto nSigmaTPCPr = aod::pidutils::tpcNSigma(o2::track::PID::Proton, track); - if (std::abs(nSigmaTPCPi) > 3.0f && - std::abs(nSigmaTPCKa) > 3.0f && - std::abs(nSigmaTPCPr) > 3.0f) { + if (std::abs(nSigmaTPCPi) > trackConfigs.pidTPCMaxHadrons && + std::abs(nSigmaTPCKa) > trackConfigs.pidTPCMaxHadrons && + std::abs(nSigmaTPCPr) > trackConfigs.pidTPCMaxHadrons) { return false; } } // Other hadron species rejection - for (size_t speciesIndex = 0; speciesIndex < trackConfigs.trkPIDspecies->size(); ++speciesIndex) { + for (auto pid : {o2::track::PID::Kaon, o2::track::PID::Proton}) { + auto nSigmaTPC = aod::pidutils::tpcNSigma(pid, track); + + if (std::abs(nSigmaTPC) < trackConfigs.pidTPCMaxHadrons) { + // Reject if only TPC is within threshold and TOF is unavailable or if both TPC and TOF are within thresholds + if (!track.hasTOF() || std::abs(aod::pidutils::tofNSigma(pid, track)) < trackConfigs.pidTOFMaxHadrons) { + return false; + } + } + } + + // Other hadron species rejection + /*for (size_t speciesIndex = 0; speciesIndex < trackConfigs.trkPIDspecies->size(); ++speciesIndex) { auto const& pid = trackConfigs.trkPIDspecies->at(speciesIndex); auto nSigmaTPC = aod::pidutils::tpcNSigma(pid, track); @@ -663,7 +678,7 @@ struct PionTrackProducer { return false; // Reject if only TPC is within threshold and TOF is unavailable } } - } + }*/ return true; } diff --git a/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx index 94c45348c36..6d770bd9337 100644 --- a/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx @@ -241,19 +241,22 @@ struct PhiStrangenessCorrelation { // Configurables for Pions selection struct : ConfigurableGroup { Configurable selectPionInSigRegion{"selectPionInSigRegion", true, "Select Pion candidates in signal region"}; - Configurable pidTPCMax{"pidTPCMax", 2.0f, "Maximum nSigma TPC"}; - Configurable pidTOFMax{"pidTOFMax", 2.0f, "Maximum nSigma TOF"}; + Configurable pidTPCMax{"pidTPCMax", 3.0f, "Maximum nSigma TPC"}; + Configurable pidTOFMax{"pidTOFMax", 3.0f, "Maximum nSigma TOF"}; // Configurable tofPIDThreshold{"tofPIDThreshold", 0.5f, "Minimum pT after which TOF PID is applicable"}; } pionConfigs; // Configurables on phi pT bins Configurable> binspTPhi{"binspTPhi", {0.4, 0.8, 1.4, 2.0, 2.8, 4.0, 6.0, 10.0}, "pT bin limits for Phi"}; + Configurable> binspTPhiExt{"binspTPhiExt", {0.0, 0.4, 0.8, 1.4, 2.0, 2.8, 4.0, 6.0, 10.0}, "pT bin limits for Phi extended for MC Gen"}; // Configurable on K0S pT bins Configurable> binspTK0S{"binspTK0S", {0.1, 0.5, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; + Configurable> binspTK0SExt{"binspTK0SExt", {0.0, 0.1, 0.5, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S extended for MC Gen"}; // Configurable on pion pT bins - Configurable> binspTPi{"binspTPi", {0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0}, "pT bin limits for pions"}; + Configurable> binspTPi{"binspTPi", {0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0}, "pT bin limits for Pions"}; + Configurable> binspTPiExt{"binspTPiExt", {0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0}, "pT bin limits for Pions extended for MC Gen"}; struct : ConfigurableGroup { Configurable doK0SCorrelation{"doK0SCorrelation", true, "Enable Phi-K0S correlation"}; @@ -270,8 +273,11 @@ struct PhiStrangenessCorrelation { } yConfigs; // Configurables to apply efficiency online and how to - Configurable applyEfficiency{"applyEfficiency", false, "Use efficiency for filling histograms"}; - Configurable useEffInterpolation{"useEffInterpolation", false, "If true, interpolates efficiency map, else uses bin center"}; + struct : ConfigurableGroup { + Configurable applyEfficiency{"applyEfficiency", false, "Use efficiency for filling histograms"}; + Configurable useEffInterpolation{"useEffInterpolation", false, "If true, interpolates efficiency map, else uses bin center"}; + Configurable applyPhiEfficiency{"applyPhiEfficiency", true, "Apply efficiency for Phi candidates"}; + } efficiencyConfigs; // Configurable for event mixing Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; @@ -285,6 +291,7 @@ struct PhiStrangenessCorrelation { Configurable minPhiPt{"minPhiPt", 0.4f, "Minimum pT for Phi candidates"}; Configurable v0SettingMinPt{"v0SettingMinPt", 0.1f, "V0 min pt"}; Configurable cMinPionPtcut{"cMinPionPtcut", 0.2f, "Track minimum pt cut"}; + Configurable bypassPtCut{"bypassPtCut", false, "Bypass the minimum pt cut at MCGen level"}; } minPtMcGenConfigs; // Filter on phi selected collisions @@ -362,12 +369,15 @@ struct PhiStrangenessCorrelation { AxisSpec massPhiAxis = {200, 0.9f, 1.2f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec pTPhiAxis = {120, 0.0f, 12.0f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec binnedpTPhiAxis{(std::vector)binspTPhi, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec binnedpTPhiAxisExt{(std::vector)binspTPhiExt, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec massK0SAxis = {200, 0.45f, 0.55f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec pTK0SAxis = {100, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec binnedpTK0SAxis{(std::vector)binspTK0S, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec binnedpTK0SAxisExt{(std::vector)binspTK0SExt, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec nSigmaPiAxis = {100, -10.0f, 10.0f, "N#sigma #pi"}; AxisSpec pTPiAxis = {50, 0.0f, 5.0f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec binnedpTPiAxis{(std::vector)binspTPi, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec binnedpTPiAxisExt{(std::vector)binspTPiExt, "#it{p}_{T} (GeV/#it{c})"}; histos.add("phi/h3PhiData", "Invariant mass of Phi in Data", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); @@ -406,16 +416,16 @@ struct PhiStrangenessCorrelation { histos.add("pi/h3PiMCGen", "Pion in MC Gen", kTH3F, {binnedmultAxis, binnedpTPiAxis, yAxis}); histos.add("pi/h4PiMCGenAssocReco", "Pion in MC Gen Assoc Reco", kTHnSparseF, {vertexZAxis, binnedmultAxis, binnedpTPiAxis, yAxis}); - histos.add("phi/h3PhiMCClosureGen", "Phi in MC Gen for MC Closure Test", kTH3F, {binnedmultAxis, binnedpTPhiAxis, yAxis}); + histos.add("phi/h3PhiMCClosureGen", "Phi in MC Gen for MC Closure Test", kTH3F, {binnedmultAxis, binnedpTPhiAxisExt, yAxis}); - histos.add("phiK0S/h5PhiK0SClosureMCGen", "Deltay vs deltaphi for Phi and K0Short in MCGen", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxis, binnedpTK0SAxis, deltayAxis, deltaphiAxis}); - histos.add("phiPi/h5PhiPiClosureMCGen", "Deltay vs deltaphi for Phi and Pion in MCGen", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxis, binnedpTPiAxis, deltayAxis, deltaphiAxis}); + histos.add("phiK0S/h5PhiK0SClosureMCGen", "Deltay vs deltaphi for Phi and K0Short in MCGen", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxisExt, binnedpTK0SAxisExt, deltayAxis, deltaphiAxis}); + histos.add("phiPi/h5PhiPiClosureMCGen", "Deltay vs deltaphi for Phi and Pion in MCGen", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxisExt, binnedpTPiAxisExt, deltayAxis, deltaphiAxis}); - histos.add("phiK0S/h5PhiK0SClosureMCGenME", "Deltay vs deltaphi for Phi and K0Short in MCGen ME", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxis, binnedpTK0SAxis, deltayAxis, deltaphiAxis}); - histos.add("phiPi/h5PhiPiClosureMCGenME", "Deltay vs deltaphi for Phi and Pion in MCGen ME", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxis, binnedpTPiAxis, deltayAxis, deltaphiAxis}); + histos.add("phiK0S/h5PhiK0SClosureMCGenME", "Deltay vs deltaphi for Phi and K0Short in MCGen ME", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxisExt, binnedpTK0SAxisExt, deltayAxis, deltaphiAxis}); + histos.add("phiPi/h5PhiPiClosureMCGenME", "Deltay vs deltaphi for Phi and Pion in MCGen ME", kTHnSparseF, {binnedmultAxis, binnedpTPhiAxisExt, binnedpTPiAxisExt, deltayAxis, deltaphiAxis}); // Load efficiency maps from CCDB - if (applyEfficiency) { + if (efficiencyConfigs.applyEfficiency) { ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -451,8 +461,9 @@ struct PhiStrangenessCorrelation { void loadEfficiencyMaps() { - // Always load the Trigger (Phi) map - fetchSingleEfficiencyMapFromCCDB(effMapPhi, "Phi"); + // Load the Trigger (Phi) map if requested by analysis method + if (efficiencyConfigs.applyPhiEfficiency) + fetchSingleEfficiencyMapFromCCDB(effMapPhi, "Phi"); // Map the user configurations for the associated particles bool doAssocCorrelations[kAssocPartSize] = {activeCorrelationConfigs.doK0SCorrelation, activeCorrelationConfigs.doXiCorrelation, activeCorrelationConfigs.doPionCorrelation}; @@ -476,10 +487,10 @@ struct PhiStrangenessCorrelation { template float computeWeight(const BoundEffMaps&... boundEffMaps) { - if (!applyEfficiency) + if (!efficiencyConfigs.applyEfficiency) return 1.0f; - float totalEfficiency = ((useEffInterpolation ? boundEffMaps.interpolateEfficiency() : boundEffMaps.getBinEfficiency()) * ...); + float totalEfficiency = ((efficiencyConfigs.useEffInterpolation ? boundEffMaps.interpolateEfficiency() : boundEffMaps.getBinEfficiency()) * ...); return totalEfficiency <= 0.0f ? 1.0f : 1.0f / totalEfficiency; } @@ -512,7 +523,7 @@ struct PhiStrangenessCorrelation { const bool applyK0sMassCut = (analysisMode == kDeltaYvsDeltaPhi) && k0sConfigs.selectK0sInSigRegion; const auto& [minMassK0s, maxMassK0s] = k0sConfigs.rangeMK0sSignal.value; auto isK0sValid = [&](const auto& k0s) { - return (!applyEfficiency || k0s.pt() < binspTK0S->back()) && (!applyK0sMassCut || k0s.inMassRegion(minMassK0s, maxMassK0s)); + return (!efficiencyConfigs.applyEfficiency || k0s.pt() < binspTK0S->back()) && (!applyK0sMassCut || k0s.inMassRegion(minMassK0s, maxMassK0s)); }; const bool applyPionNSigmaCut = (analysisMode == kDeltaYvsDeltaPhi) && pionConfigs.selectPionInSigRegion; @@ -521,11 +532,11 @@ struct PhiStrangenessCorrelation { // const float& tofPIDThreshold = pionConfigs.tofPIDThreshold; auto isPionValid = [&](const auto& pion) { - return (!applyEfficiency || pion.pt() < binspTPi->back()) && (!applyPionNSigmaCut || pion.inNSigmaRegion(pidTPCMax, pidTOFMax)); + return (!efficiencyConfigs.applyEfficiency || pion.pt() < binspTPi->back()) && (!applyPionNSigmaCut || pion.inNSigmaRegion(pidTPCMax, pidTOFMax)); }; for (const auto& phiCand : phiCandidates) { - if (applyEfficiency && phiCand.pt() >= binspTPhi->back()) + if (efficiencyConfigs.applyEfficiency && phiCand.pt() >= binspTPhi->back()) continue; float weightPhi = computeWeight(BoundEfficiencyMap(effMapPhi, multiplicity, phiCand.pt(), phiCand.y())); @@ -652,7 +663,7 @@ struct PhiStrangenessCorrelation { const auto& [minMassK0s, maxMassK0s] = k0sConfigs.rangeMK0sSignal.value; auto isK0sValid = [&](const auto& k0s) { - return (!applyEfficiency || k0s.pt() < binspTK0S->back()) && (!applyK0sMassCut || k0s.inMassRegion(minMassK0s, maxMassK0s)); + return (!efficiencyConfigs.applyEfficiency || k0s.pt() < binspTK0S->back()) && (!applyK0sMassCut || k0s.inMassRegion(minMassK0s, maxMassK0s)); }; auto tuplePhiK0S = std::make_tuple(phiCandidates, k0sReduced); @@ -663,7 +674,7 @@ struct PhiStrangenessCorrelation { float multiplicity = c1.centFT0M(); for (const auto& [phiCand, k0s] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(phiCands, k0sRed))) { - if (applyEfficiency && phiCand.pt() >= binspTPhi->back()) + if (efficiencyConfigs.applyEfficiency && phiCand.pt() >= binspTPhi->back()) continue; if (!isK0sValid(k0s)) continue; @@ -747,7 +758,7 @@ struct PhiStrangenessCorrelation { // const float& tofPIDThreshold = pionConfigs.tofPIDThreshold; auto isPionValid = [&](const auto& pion) { - return (!applyEfficiency || pion.pt() < binspTPi->back()) && (!applyPionNSigmaCut || pion.inNSigmaRegion(pidTPCMax, pidTOFMax)); + return (!efficiencyConfigs.applyEfficiency || pion.pt() < binspTPi->back()) && (!applyPionNSigmaCut || pion.inNSigmaRegion(pidTPCMax, pidTOFMax)); }; auto tuplePhiPion = std::make_tuple(phiCandidates, pionTracks); @@ -758,7 +769,7 @@ struct PhiStrangenessCorrelation { float multiplicity = c1.centFT0M(); for (const auto& [phiCand, piTrack] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(phiCands, piTracks))) { - if (applyEfficiency && phiCand.pt() >= binspTPhi->back()) + if (efficiencyConfigs.applyEfficiency && phiCand.pt() >= binspTPhi->back()) continue; if (!isPionValid(piTrack)) continue; @@ -1098,15 +1109,15 @@ struct PhiStrangenessCorrelation { switch (std::abs(mcParticle.pdgCode())) { case o2::constants::physics::Pdg::kPhi: - if (eventSelectionType == 0 && mcParticle.pt() >= minPtMcGenConfigs.minPhiPt) + if (eventSelectionType == 0 && (minPtMcGenConfigs.bypassPtCut || mcParticle.pt() >= minPtMcGenConfigs.minPhiPt)) phiParticles.emplace_back(mcParticle.pt(), mcParticle.y(), mcParticle.phi()); break; case PDG_t::kK0Short: - if (mcParticle.isPhysicalPrimary() && mcParticle.pt() >= minPtMcGenConfigs.v0SettingMinPt) + if (mcParticle.isPhysicalPrimary() && (minPtMcGenConfigs.bypassPtCut || mcParticle.pt() >= minPtMcGenConfigs.v0SettingMinPt)) k0sParticles.emplace_back(mcParticle.pt(), mcParticle.y(), mcParticle.phi()); break; case PDG_t::kPiPlus: - if (mcParticle.isPhysicalPrimary() && mcParticle.pt() >= minPtMcGenConfigs.cMinPionPtcut) + if (mcParticle.isPhysicalPrimary() && (minPtMcGenConfigs.bypassPtCut || mcParticle.pt() >= minPtMcGenConfigs.cMinPionPtcut)) pionParticles.emplace_back(mcParticle.pt(), mcParticle.y(), mcParticle.phi()); break; default: From 00f2f20cbbb4cf61e7268ad272630d32cac31626 Mon Sep 17 00:00:00 2001 From: scannito Date: Wed, 15 Apr 2026 18:34:09 +0200 Subject: [PATCH 2/2] Fix efficiency logic --- PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx index 6d770bd9337..94c68dc21da 100644 --- a/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/phiStrangeCorrelation.cxx @@ -536,7 +536,7 @@ struct PhiStrangenessCorrelation { }; for (const auto& phiCand : phiCandidates) { - if (efficiencyConfigs.applyEfficiency && phiCand.pt() >= binspTPhi->back()) + if (efficiencyConfigs.applyEfficiency && efficiencyConfigs.applyPhiEfficiency && phiCand.pt() >= binspTPhi->back()) continue; float weightPhi = computeWeight(BoundEfficiencyMap(effMapPhi, multiplicity, phiCand.pt(), phiCand.y())); @@ -674,7 +674,7 @@ struct PhiStrangenessCorrelation { float multiplicity = c1.centFT0M(); for (const auto& [phiCand, k0s] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(phiCands, k0sRed))) { - if (efficiencyConfigs.applyEfficiency && phiCand.pt() >= binspTPhi->back()) + if (efficiencyConfigs.applyEfficiency && efficiencyConfigs.applyPhiEfficiency && phiCand.pt() >= binspTPhi->back()) continue; if (!isK0sValid(k0s)) continue; @@ -769,7 +769,7 @@ struct PhiStrangenessCorrelation { float multiplicity = c1.centFT0M(); for (const auto& [phiCand, piTrack] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(phiCands, piTracks))) { - if (efficiencyConfigs.applyEfficiency && phiCand.pt() >= binspTPhi->back()) + if (efficiencyConfigs.applyEfficiency && efficiencyConfigs.applyPhiEfficiency && phiCand.pt() >= binspTPhi->back()) continue; if (!isPionValid(piTrack)) continue;