From 4a17e60349dc89abc3df3dbe564971621f4c6c58 Mon Sep 17 00:00:00 2001 From: pstahlhu Date: Thu, 26 Jun 2025 13:42:02 +0200 Subject: [PATCH 1/5] Use statusTpcOrTof or statusTpc for PID selection --- .../candidateSelectorXicToXiPiPi.cxx | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx index ae3256fcd48..ee6071992b7 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx @@ -47,7 +47,7 @@ struct HfCandidateSelectorXicToXiPiPi { Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // Enable PID Configurable usePid{"usePid", true, "Switch for PID selection at track level"}; - Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; + Configurable useTpcPidOnly{"useTpcPidOnly", false, "Switch to use TPC PID only instead of TPC OR TOF)"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; Configurable ptPidTpcMax{"ptPidTpcMax", 20., "Upper bound of track pT for TPC PID"}; @@ -194,24 +194,27 @@ struct HfCandidateSelectorXicToXiPiPi { } /// Apply PID selection - /// \param pidTrackPi0 PID status of trackPi0 (prong1 of Xic candidate) - /// \param pidTrackPi1 PID status of trackPi1 (prong2 of Xic candidate) - /// \param pidTrackPr PID status of trackPr (positive daughter of V0 candidate) - /// \param pidTrackPiLam PID status of trackPiLam (negative daughter of V0 candidate) - /// \param pidTrackPiXi PID status of trackPiXi (Bachelor of cascade candidate) - /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable + /// \param statusPidPi0 PID status of trackPi0 (prong1 of Xic candidate) + /// \param statusPidPi1 PID status of trackPi1 (prong2 of Xic candidate) + /// \param statusPidPiXi PID status of trackPiXi (Bachelor of cascade candidate) + /// \param statusPidPrLam PID status of trackPr (positive daughter of V0 candidate) + /// \param statusPidPiLam PID status of trackPiLam (negative daughter of V0 candidate) + /// \param usePidTpcOnly switch to check only TPC status /// \return true if prongs of Xic candidate pass all selections - bool selectionPid(TrackSelectorPID::Status const pidTrackPi0, - TrackSelectorPID::Status const pidTrackPi1, - TrackSelectorPID::Status const pidTrackPr, - TrackSelectorPID::Status const pidTrackPiLam, - TrackSelectorPID::Status const pidTrackPiXi, - bool const acceptPIDNotApplicable) + bool selectionPid(TrackSelectorPID::Status const statusPidPi0, + TrackSelectorPID::Status const statusPidPi1, + TrackSelectorPID::Status const statusPidPiXi, + TrackSelectorPID::Status const statusPidPrLam, + TrackSelectorPID::Status const statusPidPiLam, + bool const useTpcPidOnly) { - if (!acceptPIDNotApplicable && (pidTrackPi0 != TrackSelectorPID::Accepted || pidTrackPi1 != TrackSelectorPID::Accepted || pidTrackPr != TrackSelectorPID::Accepted || pidTrackPiLam != TrackSelectorPID::Accepted || pidTrackPiXi != TrackSelectorPID::Accepted)) { - return false; + if (useTpcPidOnly) { + if ((statusPidPi0 != TrackSelectorPID::Accepted && statusPidPi0 != TrackSelectorPID::NotApplicable) || (statusPidPi1 != TrackSelectorPID::Accepted && statusPidPi1 != TrackSelectorPID::NotApplicable) || (statusPidPiXi != TrackSelectorPID::Accepted && statusPidPiXi != TrackSelectorPID::NotApplicable) || (statusPidPrLam != TrackSelectorPID::Accepted && statusPidPrLam != TrackSelectorPID::NotApplicable) || (statusPidPiLam != TrackSelectorPID::Accepted && statusPidPiLam != TrackSelectorPID::NotApplicable)) { + return false; + } + return true; } - if (acceptPIDNotApplicable && (pidTrackPi0 == TrackSelectorPID::Rejected || pidTrackPi1 == TrackSelectorPID::Rejected || pidTrackPr == TrackSelectorPID::Rejected || pidTrackPiLam == TrackSelectorPID::Rejected || pidTrackPiXi == TrackSelectorPID::Rejected)) { + if (statusPidPi0 == TrackSelectorPID::Rejected || statusPidPi1 == TrackSelectorPID::Rejected || statusPidPiXi == TrackSelectorPID::Rejected || statusPidPrLam == TrackSelectorPID::Rejected || statusPidPiLam == TrackSelectorPID::Rejected) { return false; } return true; @@ -252,6 +255,12 @@ struct HfCandidateSelectorXicToXiPiPi { // track-level PID selection if (usePid) { + TrackSelectorPID::Status statusPidPi0 = TrackSelectorPID::NotApplicable; + TrackSelectorPID::Status statusPidPi1 = TrackSelectorPID::NotApplicable; + TrackSelectorPID::Status statusPidPiXi = TrackSelectorPID::NotApplicable; + TrackSelectorPID::Status statusPidPrLam = TrackSelectorPID::NotApplicable; + TrackSelectorPID::Status statusPidPiLam = TrackSelectorPID::NotApplicable; + auto trackPi0 = hfCandXic.pi0_as(); auto trackPi1 = hfCandXic.pi1_as(); auto trackV0PosDau = hfCandXic.posTrack_as(); @@ -264,14 +273,22 @@ struct HfCandidateSelectorXicToXiPiPi { trackPr = trackV0NegDau; trackPiFromLam = trackV0PosDau; } - // PID info - TrackSelectorPID::Status pidTrackPi0 = selectorPion.statusTpcAndTof(trackPi0); - TrackSelectorPID::Status pidTrackPi1 = selectorPion.statusTpcAndTof(trackPi1); - TrackSelectorPID::Status pidTrackPr = selectorProton.statusTpcAndTof(trackPr); - TrackSelectorPID::Status pidTrackPiLam = selectorPion.statusTpcAndTof(trackPiFromLam); - TrackSelectorPID::Status pidTrackPiXi = selectorPion.statusTpcAndTof(trackPiFromXi); - - if (!selectionPid(pidTrackPi0, pidTrackPi1, pidTrackPr, pidTrackPiLam, pidTrackPiXi, acceptPIDNotApplicable.value)) { + + if (useTpcPidOnly) { + TrackSelectorPID::Status statusPidPi0 = selectorPion.statusTpc(trackPi0); + TrackSelectorPID::Status statusPidPi1 = selectorPion.statusTpc(trackPi1); + TrackSelectorPID::Status statusPidPiXi = selectorPion.statusTpc(trackPiFromXi); + TrackSelectorPID::Status statusPidPrLam = selectorProton.statusTpc(trackPr); + TrackSelectorPID::Status statusPidPiLam = selectorPion.statusTpc(trackPiFromLam); + } else { + TrackSelectorPID::Status statusPidPi0 = selectorPion.statusTpcOrTof(trackPi0); + TrackSelectorPID::Status statusPidPi1 = selectorPion.statusTpcOrTof(trackPi1); + TrackSelectorPID::Status statusPidPiXi = selectorPion.statusTpcOrTof(trackPiFromXi); + TrackSelectorPID::Status statusPidPrLam = selectorProton.statusTpcOrTof(trackPr); + TrackSelectorPID::Status statusPidPiLam = selectorPion.statusTpcOrTof(trackPiFromLam); + } + + if (!selectionPid(statusPidPi0, statusPidPi1, statusPidPiXi, statusPidPrLam, statusPidPiLam, useTpcPidOnly.value)) { hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); if (applyMl) { hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); From fdd0590e697f6b2e0abbf7717c59d8aa0e683a4e Mon Sep 17 00:00:00 2001 From: pstahlhu Date: Thu, 26 Jun 2025 16:55:46 +0200 Subject: [PATCH 2/5] Update kin+topo selection and counter histogram --- PWGHF/Core/SelectorCuts.h | 43 +++-- .../candidateSelectorXicToXiPiPi.cxx | 164 ++++++++++-------- 2 files changed, 117 insertions(+), 90 deletions(-) diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index 7fbd324f8c3..7aa10523f3c 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -753,8 +753,8 @@ static const std::vector labelsCutVar = {"m", "pT p", "pT K", "pT P namespace hf_cuts_xic_to_xi_pi_pi { -static constexpr int NBinsPt = 10; -static constexpr int NCutVars = 12; +static constexpr int NBinsPt = 13; +static constexpr int NCutVars = 11; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array constexpr double BinsPt[NBinsPt + 1] = { @@ -765,23 +765,29 @@ constexpr double BinsPt[NBinsPt + 1] = { 4., 5., 6., + 7., 8., + 9., + 10., + 11., 12., - 24., - 36.}; + 20.}; auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; -// default values for the cuts m ptXi ptPi0 ptPi1 chi2PCA dL dLXY cosp cospXY impParXY Xi Pi0 Pi1 -constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 0 < pT < 1 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 1 < pT < 2 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 2 < pT < 3 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 3 < pT < 4 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 4 < pT < 5 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 5 < pT < 6 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 6 < pT < 8 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 8 < pT < 10 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 12 < pT < 24 */ - {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}}; /* 24 < pT < 36 */ +// default values for the cuts m Y Eta EtaDau ptPi0 ptPi1 chi2SV dL dLXY invMass Xi-Pi pairs +constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 0 < pT < 1 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 1 < pT < 2 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 2 < pT < 3 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 3 < pT < 4 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 4 < pT < 5 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 5 < pT < 6 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 6 < pT < 7 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 7 < pT < 8 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 8 < pT < 9 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 9 < pT < 10 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 10 < pT < 11 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 11 < pT < 12 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}}; /* 12 < pT < 20 */ // row labels static const std::vector labelsPt = { @@ -794,10 +800,13 @@ static const std::vector labelsPt = { "pT bin 6", "pT bin 7", "pT bin 8", - "pT bin 9"}; + "pT bin 9", + "pT bin 10", + "pT bin 11", + "pT bin 12"}; // column labels -static const std::vector labelsCutVar = {"m", "pT Xi", "pT Pi0", "pT Pi1", "chi2PCA", "max decay length", "max decay length XY", "cos pointing angle", "cos pointing angle XY", "max impParXY Xi", "max impParXY Pi0", "max impParXY Pi1"}; +static const std::vector labelsCutVar = {"m", "y", "eta", "eta Daughters", "pT Pi0", "pT Pi1", "chi2SV", "min decay length", "min decay length XY", "max inv mass Xi-Pi0", "max inv mass Xi-Pi1"}; } // namespace hf_cuts_xic_to_xi_pi_pi namespace hf_cuts_xicc_to_p_k_pi_pi diff --git a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx index ee6071992b7..f88f72d242f 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx @@ -23,6 +23,7 @@ #include "Common/Core/TrackSelectorPID.h" +#include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -38,13 +39,9 @@ struct HfCandidateSelectorXicToXiPiPi { Produces hfSelXicToXiPiPiCandidate; Produces hfMlXicToXiPiPiCandidate; - Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; - Configurable ptCandMax{"ptCandMax", 36., "Upper bound of candidate pT"}; - // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_xic_to_xi_pi_pi::vecBinsPt}, "pT bin limits"}; Configurable> cuts{"cuts", {hf_cuts_xic_to_xi_pi_pi::Cuts[0], hf_cuts_xic_to_xi_pi_pi::NBinsPt, hf_cuts_xic_to_xi_pi_pi::NCutVars, hf_cuts_xic_to_xi_pi_pi::labelsPt, hf_cuts_xic_to_xi_pi_pi::labelsCutVar}, "Xicplus candidate selection per pT bin"}; - // QA switch - Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; + Configurable fillHistogram{"fillHistogram", false, "Flag to filling of counter histogram"}; // Enable PID Configurable usePid{"usePid", true, "Switch for PID selection at track level"}; Configurable useTpcPidOnly{"useTpcPidOnly", false, "Switch to use TPC PID only instead of TPC OR TOF)"}; @@ -77,6 +74,18 @@ struct HfCandidateSelectorXicToXiPiPi { o2::ccdb::CcdbApi ccdbApi; TrackSelectorPi selectorPion; TrackSelectorPr selectorProton; + enum XicSelCriteria { All = 0, + Pt, + Mass, + Rapidity, + Eta, + EtaDaughters, + PtPionFromXicPlus, + Chi2SV, + MinDecayLength, + MaxInvMassXiPiPairs, + PidSelected, + BdtSelected }; using TracksPidWithSel = soa::Join; @@ -101,19 +110,20 @@ struct HfCandidateSelectorXicToXiPiPi { selectorProton.setRangeNSigmaTofCondTpc(-nSigmaTofCombinedMax, nSigmaTofCombinedMax); } - if (activateQA) { - constexpr int kNBinsSelections = 1 + SelectionStep::NSelectionSteps; - std::string labels[kNBinsSelections]; - labels[0] = "No selection"; - labels[1 + SelectionStep::RecoSkims] = "Skims selection"; - labels[1 + SelectionStep::RecoTopol] = "Skims & Topological selections"; - labels[1 + SelectionStep::RecoPID] = "Skims & Topological & PID selections"; - labels[1 + SelectionStep::RecoMl] = "Skims & Topological & PID & ML selections"; - static const AxisSpec axisSelections = {kNBinsSelections, 0.5, kNBinsSelections + 0.5, ""}; - registry.add("hSelections", "Selections;;#it{p}_{T} (GeV/#it{c})", {HistType::kTH2F, {axisSelections, {(std::vector)binsPt, "#it{p}_{T} (GeV/#it{c})"}}}); - for (int iBin = 0; iBin < kNBinsSelections; ++iBin) { - registry.get(HIST("hSelections"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); - } + if (fillHistogram) { + registry.add("hSelCandidates", ";;entries", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + All, "All"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Pt, "#it{p}_{T}"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Mass, "#Delta M"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Rapidity, "y"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Eta, "#eta"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + EtaDaughters, "#eta final state daughters"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + PtPionFromXicPlus, "#it{p}_{T} (#pi #leftarrow #Xi_{c}^{+})"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Chi2SV, "#chi^{2}_{SV}"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + MinDecayLength, "Decay length"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + MaxInvMassXiPiPairs, "M_{#Xi #pi}"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + PidSelected, "PID selection"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + BdtSelected, "BDT selection"); } if (applyMl) { @@ -133,62 +143,72 @@ struct HfCandidateSelectorXicToXiPiPi { /// \param candidate is candidate /// \return true if candidate passes all cuts template - bool selectionTopol(const T1& hfCandXic) + bool isSelectedXic(const T1& hfCandXic) { auto candpT = hfCandXic.pt(); int pTBin = findBin(binsPt, candpT); if (pTBin == -1) { return false; } - - // check that the candidate pT is within the analysis range - if (candpT < ptCandMin || candpT >= ptCandMax) { - return false; + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), Pt); } - // check candidate mass is within a defined mass window + // check whether candidate mass is within a defined mass window if (std::abs(hfCandXic.invMassXicPlus() - o2::constants::physics::MassXiCPlus) > cuts->get(pTBin, "m")) { return false; } - - // cosine of pointing angle - if (hfCandXic.cpa() <= cuts->get(pTBin, "cos pointing angle")) { - return false; + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), Mass); } - // cosine of pointing angle XY - if (hfCandXic.cpaXY() <= cuts->get(pTBin, "cos pointing angle XY")) { + // cut on candidate rapidity + if (std::abs(hfCandXic.y(o2::constants::physics::MassXiCPlus)) > cuts->get(pTBin, "y")) { return false; } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), Rapidity); + } - // candidate maximum decay length - if (hfCandXic.decayLength() > cuts->get(pTBin, "max decay length")) { + // cut on candidate pseudorapidity + if (std::abs(hfCandXic.eta()) > cuts->get(pTBin, "eta")) { return false; } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), Eta); + } - // candidate maximum decay length XY - if (hfCandXic.decayLengthXY() > cuts->get(pTBin, "max decay length XY")) { + // cut on pion pT + if (hfCandXic.ptProng1() < cuts->get(pTBin, "pT Pi0") || hfCandXic.ptProng2() < cuts->get(pTBin, "pT Pi1")) { return false; } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), PtPionFromXicPlus); + } - // candidate chi2PC - if (hfCandXic.chi2PCA() > cuts->get(pTBin, "chi2PCA")) { + // cut on chi2 of secondary vertex + if (hfCandXic.chi2PCA() > cuts->get(pTBin, "chi2SV")) { return false; } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), Chi2SV); + } - // maximum DCA of daughters - if ((std::abs(hfCandXic.impactParameter0()) > cuts->get(pTBin, "max impParXY Xi")) || - (std::abs(hfCandXic.impactParameter1()) > cuts->get(pTBin, "max impParXY Pi0")) || - (std::abs(hfCandXic.impactParameter2()) > cuts->get(pTBin, "max impParXY Pi1"))) { + // cut on candidate decay length + if (hfCandXic.decayLength() < cuts->get(pTBin, "min decay length") || hfCandXic.decayLengthXY() < cuts->get(pTBin, "min decay length XY")) { return false; } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), MinDecayLength); + } - // cut on daughter pT - if (hfCandXic.ptProng0() < cuts->get(pTBin, "pT Xi") || - hfCandXic.ptProng1() < cuts->get(pTBin, "pT Pi0") || - hfCandXic.ptProng2() < cuts->get(pTBin, "pT Pi1")) { + // cut on invariant mass of Xi-pion pairs + if (hfCandXic.invMassXiPi0() > cuts->get(pTBin, "max inv mass Xi-Pi0") || hfCandXic.invMassXiPi1() > cuts->get(pTBin, "max inv mass Xi-Pi1")) { return false; } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), MaxInvMassXiPiPairs); + } return true; } @@ -225,23 +245,18 @@ struct HfCandidateSelectorXicToXiPiPi { { for (const auto& hfCandXic : hfCandsXic) { int statusXicToXiPiPi = 0; - - outputMlXicToXiPiPi.clear(); - - auto ptCandXic = hfCandXic.pt(); - - if (activateQA) { - registry.fill(HIST("hSelections"), 1, ptCandXic); + if (applyMl) { + outputMlXicToXiPiPi.clear(); } + // get candidate pT + float ptCandXic = hfCandXic.pt(); + // No hfflag -> by default skim selected SETBIT(statusXicToXiPiPi, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusXicToXiPiPi = 1 - if (activateQA) { - registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoSkims, ptCandXic); - } - // topological cuts - if (!selectionTopol(hfCandXic)) { + // kinematic and topological selection + if (!isSelectedXic(hfCandXic)) { hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); if (applyMl) { hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); @@ -249,9 +264,6 @@ struct HfCandidateSelectorXicToXiPiPi { continue; } SETBIT(statusXicToXiPiPi, SelectionStep::RecoTopol); // RecoTopol = 1 --> statusXicToXiPiPi = 3 - if (activateQA) { - registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoTopol, ptCandXic); - } // track-level PID selection if (usePid) { @@ -275,17 +287,17 @@ struct HfCandidateSelectorXicToXiPiPi { } if (useTpcPidOnly) { - TrackSelectorPID::Status statusPidPi0 = selectorPion.statusTpc(trackPi0); - TrackSelectorPID::Status statusPidPi1 = selectorPion.statusTpc(trackPi1); - TrackSelectorPID::Status statusPidPiXi = selectorPion.statusTpc(trackPiFromXi); - TrackSelectorPID::Status statusPidPrLam = selectorProton.statusTpc(trackPr); - TrackSelectorPID::Status statusPidPiLam = selectorPion.statusTpc(trackPiFromLam); + statusPidPi0 = selectorPion.statusTpc(trackPi0); + statusPidPi1 = selectorPion.statusTpc(trackPi1); + statusPidPiXi = selectorPion.statusTpc(trackPiFromXi); + statusPidPrLam = selectorProton.statusTpc(trackPr); + statusPidPiLam = selectorPion.statusTpc(trackPiFromLam); } else { - TrackSelectorPID::Status statusPidPi0 = selectorPion.statusTpcOrTof(trackPi0); - TrackSelectorPID::Status statusPidPi1 = selectorPion.statusTpcOrTof(trackPi1); - TrackSelectorPID::Status statusPidPiXi = selectorPion.statusTpcOrTof(trackPiFromXi); - TrackSelectorPID::Status statusPidPrLam = selectorProton.statusTpcOrTof(trackPr); - TrackSelectorPID::Status statusPidPiLam = selectorPion.statusTpcOrTof(trackPiFromLam); + statusPidPi0 = selectorPion.statusTpcOrTof(trackPi0); + statusPidPi1 = selectorPion.statusTpcOrTof(trackPi1); + statusPidPiXi = selectorPion.statusTpcOrTof(trackPiFromXi); + statusPidPrLam = selectorProton.statusTpcOrTof(trackPr); + statusPidPiLam = selectorPion.statusTpcOrTof(trackPiFromLam); } if (!selectionPid(statusPidPi0, statusPidPi1, statusPidPiXi, statusPidPrLam, statusPidPiLam, useTpcPidOnly.value)) { @@ -296,10 +308,13 @@ struct HfCandidateSelectorXicToXiPiPi { continue; } SETBIT(statusXicToXiPiPi, SelectionStep::RecoPID); // RecoPID = 2 --> statusXicToXiPiPi = 7 - if (activateQA) { - registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoPID, ptCandXic); + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), PidSelected); } } + if (!usePid && fillHistogram) { + registry.fill(HIST("hSelCandidates"), PidSelected); + } // ML selection if (applyMl) { @@ -315,10 +330,13 @@ struct HfCandidateSelectorXicToXiPiPi { continue; } SETBIT(statusXicToXiPiPi, aod::SelectionStep::RecoMl); - if (activateQA) { - registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoMl, ptCandXic); + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), BdtSelected); } } + if (!applyMl && fillHistogram) { + registry.fill(HIST("hSelCandidates"), BdtSelected); + } hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); } From 8693c0dcf0e4e8c3e7ffb75a3216208d39201986 Mon Sep 17 00:00:00 2001 From: pstahlhu Date: Fri, 27 Jun 2025 10:39:13 +0200 Subject: [PATCH 3/5] Add track quality and daughter eta selection --- .../candidateSelectorXicToXiPiPi.cxx | 96 ++++++++++++++++--- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx index f88f72d242f..407c9ee8be0 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx @@ -19,7 +19,7 @@ #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/Utils/utilsAnalysis.h" // findBin function +#include "PWGHF/Utils/utilsAnalysis.h" #include "Common/Core/TrackSelectorPID.h" @@ -55,6 +55,15 @@ struct HfCandidateSelectorXicToXiPiPi { Configurable ptPidTofMax{"ptPidTofMax", 20., "Upper bound of track pT for TOF PID"}; Configurable nSigmaTofMax{"nSigmaTofMax", 5., "Nsigma cut on TOF only"}; Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; + // TrackQualitySelection + Configurable doTrackQualitySelection{"doTrackQualitySelection", true, "Switch to apply track quality selections on final state daughter particles"}; + Configurable nClustersTpcMin{"nClustersTpcMin", 70, "Minimum number of TPC clusters requirement"}; + Configurable nTpcCrossedRowsMin{"nTpcCrossedRowsMin", 70, "Minimum number of TPC crossed rows requirement"}; + Configurable tpcCrossedRowsOverFindableClustersRatioMin{"tpcCrossedRowsOverFindableClustersRatioMin", 0.8, "Minimum ratio TPC crossed rows over findable clusters requirement"}; + Configurable tpcChi2PerClusterMax{"tpcChi2PerClusterMax", 4, "Maximum value of chi2 fit over TPC clusters"}; + Configurable nClustersItsMin{"nClustersItsMin", 3, "Minimum number of ITS clusters requirement for pi <- charm baryon"}; + Configurable nClustersItsInnBarrMin{"nClustersItsInnBarrMin", 1, "Minimum number of ITS clusters in inner barrel requirement for pi <- charm baryon"}; + Configurable itsChi2PerClusterMax{"itsChi2PerClusterMax", 36, "Maximum value of chi2 fit over ITS clusters for pi <- charm baryon"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; @@ -84,10 +93,13 @@ struct HfCandidateSelectorXicToXiPiPi { Chi2SV, MinDecayLength, MaxInvMassXiPiPairs, + TpcTrackQualityXiDaughters, + TpcTrackQualityPiFromCharm, + ItsTrackQualityPiFromCharm, PidSelected, BdtSelected }; - using TracksPidWithSel = soa::Join; + using TracksExtraWPid = soa::Join; HistogramRegistry registry{"registry"}; @@ -111,7 +123,7 @@ struct HfCandidateSelectorXicToXiPiPi { } if (fillHistogram) { - registry.add("hSelCandidates", ";;entries", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + registry.add("hSelCandidates", ";;entries", {HistType::kTH1F, {{15, -0.5, 14.5}}}); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + All, "All"); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Pt, "#it{p}_{T}"); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Mass, "#Delta M"); @@ -122,6 +134,9 @@ struct HfCandidateSelectorXicToXiPiPi { registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + Chi2SV, "#chi^{2}_{SV}"); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + MinDecayLength, "Decay length"); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + MaxInvMassXiPiPairs, "M_{#Xi #pi}"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + TpcTrackQualityXiDaughters, "TPC track quality selection on #Xi daughters"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + TpcTrackQualityPiFromCharm, "TPC track quality selection on #pi #leftarrow #Xi_{c}^{+}"); + registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + ItsTrackQualityPiFromCharm, "ITS track quality selection on #pi #leftarrow #Xi_{c}^{+}"); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + PidSelected, "PID selection"); registry.get(HIST("hSelCandidates"))->GetXaxis()->SetBinLabel(1 + BdtSelected, "BDT selection"); } @@ -143,7 +158,12 @@ struct HfCandidateSelectorXicToXiPiPi { /// \param candidate is candidate /// \return true if candidate passes all cuts template - bool isSelectedXic(const T1& hfCandXic) + bool isSelectedXic(const T1& hfCandXic, + const float& etaPi0, + const float& etaPi1, + const float& etaPiFromXi, + const float& etaV0PosDau, + const float& etaV0NegDau) { auto candpT = hfCandXic.pt(); int pTBin = findBin(binsPt, candpT); @@ -178,6 +198,14 @@ struct HfCandidateSelectorXicToXiPiPi { registry.fill(HIST("hSelCandidates"), Eta); } + // cut on rapidity of final state daughters + if (std::abs(etaPi0) > cuts->get(pTBin, "eta Daughters") || std::abs(etaPi1) > cuts->get(pTBin, "eta Daughters") || std::abs(etaPiFromXi) > cuts->get(pTBin, "eta Daughters") || std::abs(etaV0PosDau) > cuts->get(pTBin, "eta Daughters") || std::abs(etaV0NegDau) > cuts->get(pTBin, "eta Daughters")) { + return false; + } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), EtaDaughters); + } + // cut on pion pT if (hfCandXic.ptProng1() < cuts->get(pTBin, "pT Pi0") || hfCandXic.ptProng2() < cuts->get(pTBin, "pT Pi1")) { return false; @@ -241,7 +269,7 @@ struct HfCandidateSelectorXicToXiPiPi { } void process(aod::HfCandXic const& hfCandsXic, - TracksPidWithSel const&) + TracksExtraWPid const&) { for (const auto& hfCandXic : hfCandsXic) { int statusXicToXiPiPi = 0; @@ -249,14 +277,18 @@ struct HfCandidateSelectorXicToXiPiPi { outputMlXicToXiPiPi.clear(); } - // get candidate pT float ptCandXic = hfCandXic.pt(); + auto trackPi0 = hfCandXic.pi0_as(); + auto trackPi1 = hfCandXic.pi1_as(); + auto trackPiFromXi = hfCandXic.bachelor_as(); + auto trackV0PosDau = hfCandXic.posTrack_as(); + auto trackV0NegDau = hfCandXic.negTrack_as(); // No hfflag -> by default skim selected SETBIT(statusXicToXiPiPi, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusXicToXiPiPi = 1 // kinematic and topological selection - if (!isSelectedXic(hfCandXic)) { + if (!isSelectedXic(hfCandXic, trackPi0.eta(), trackPi1.eta(), trackPiFromXi.eta(), trackV0PosDau.eta(), trackV0NegDau.eta())) { hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); if (applyMl) { hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); @@ -265,6 +297,51 @@ struct HfCandidateSelectorXicToXiPiPi { } SETBIT(statusXicToXiPiPi, SelectionStep::RecoTopol); // RecoTopol = 1 --> statusXicToXiPiPi = 3 + // track quality selection + if (doTrackQualitySelection) { + if (!isSelectedTrackTpcQuality(trackPiFromXi, nClustersTpcMin, nTpcCrossedRowsMin, tpcCrossedRowsOverFindableClustersRatioMin, tpcChi2PerClusterMax) || + !isSelectedTrackTpcQuality(trackV0PosDau, nClustersTpcMin, nTpcCrossedRowsMin, tpcCrossedRowsOverFindableClustersRatioMin, tpcChi2PerClusterMax) || + !isSelectedTrackTpcQuality(trackV0NegDau, nClustersTpcMin, nTpcCrossedRowsMin, tpcCrossedRowsOverFindableClustersRatioMin, tpcChi2PerClusterMax)) { + hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); + if (applyMl) { + hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); + } + continue; + } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), TpcTrackQualityXiDaughters); + } + + if (!isSelectedTrackTpcQuality(trackPi0, nClustersTpcMin, nTpcCrossedRowsMin, tpcCrossedRowsOverFindableClustersRatioMin, tpcChi2PerClusterMax) || + !isSelectedTrackTpcQuality(trackPi1, nClustersTpcMin, nTpcCrossedRowsMin, tpcCrossedRowsOverFindableClustersRatioMin, tpcChi2PerClusterMax)) { + hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); + if (applyMl) { + hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); + } + continue; + } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), TpcTrackQualityPiFromCharm); + } + + if ((!isSelectedTrackItsQuality(trackPi0, nClustersItsMin, itsChi2PerClusterMax) || trackPiFromCharm.itsNClsInnerBarrel() < nClustersItsInnBarrMin) || + (!isSelectedTrackItsQuality(trackPi0, nClustersItsMin, itsChi2PerClusterMax) || trackPiFromCharm.itsNClsInnerBarrel() < nClustersItsInnBarrMin)) { + hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); + if (applyMl) { + hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); + } + continue; + } + if (fillHistogram) { + registry.fill(HIST("hSelCandidates"), ItsTrackQualityPiFromCharm); + } + } + if (!doTrackQualitySelection && fillHistogram) { + registry.fill(HIST("hSelCandidates"), TpcTrackQualityXiDaughters); + registry.fill(HIST("hSelCandidates"), TpcTrackQualityPiFromCharm); + registry.fill(HIST("hSelCandidates"), ItsTrackQualityPiFromCharm); + } + // track-level PID selection if (usePid) { TrackSelectorPID::Status statusPidPi0 = TrackSelectorPID::NotApplicable; @@ -273,11 +350,6 @@ struct HfCandidateSelectorXicToXiPiPi { TrackSelectorPID::Status statusPidPrLam = TrackSelectorPID::NotApplicable; TrackSelectorPID::Status statusPidPiLam = TrackSelectorPID::NotApplicable; - auto trackPi0 = hfCandXic.pi0_as(); - auto trackPi1 = hfCandXic.pi1_as(); - auto trackV0PosDau = hfCandXic.posTrack_as(); - auto trackV0NegDau = hfCandXic.negTrack_as(); - auto trackPiFromXi = hfCandXic.bachelor_as(); // assign proton and pion hypothesis to V0 daughters auto trackPr = trackV0PosDau; auto trackPiFromLam = trackV0NegDau; From 95f0b122bf11ba3a40635065cf8f5f8720c7efa8 Mon Sep 17 00:00:00 2001 From: pstahlhu Date: Fri, 27 Jun 2025 17:00:58 +0200 Subject: [PATCH 4/5] Adapt selection flag structure to new cand selection --- PWGHF/DataModel/CandidateSelectionTables.h | 8 ++++++++ .../candidateSelectorXicToXiPiPi.cxx | 18 ++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index 0ac6ffa1a98..150419752f1 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -317,6 +317,14 @@ DECLARE_SOA_COLUMN(MlProbXicToPiKP, mlProbXicToPiKP, std::vector); //! // XicPlus to Xi Pi Pi DECLARE_SOA_COLUMN(IsSelXicToXiPiPi, isSelXicToXiPiPi, int); //! DECLARE_SOA_COLUMN(MlProbXicToXiPiPi, mlProbXicToXiPiPi, std::vector); //! +enum XicToXiPiPiSelectionStep { + RecoTotal = 0, + RecoKinTopol, + RecoTrackQuality, + RecoPID, + RecoMl, + NSelectionSteps +}; } // namespace hf_sel_candidate_xic DECLARE_SOA_TABLE(HfSelXicToPKPi, "AOD", "HFSELXIC", //! diff --git a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx index 407c9ee8be0..fc52551630d 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx @@ -198,7 +198,7 @@ struct HfCandidateSelectorXicToXiPiPi { registry.fill(HIST("hSelCandidates"), Eta); } - // cut on rapidity of final state daughters + // cut on pseudorapidity of final state daughters if (std::abs(etaPi0) > cuts->get(pTBin, "eta Daughters") || std::abs(etaPi1) > cuts->get(pTBin, "eta Daughters") || std::abs(etaPiFromXi) > cuts->get(pTBin, "eta Daughters") || std::abs(etaV0PosDau) > cuts->get(pTBin, "eta Daughters") || std::abs(etaV0NegDau) > cuts->get(pTBin, "eta Daughters")) { return false; } @@ -284,8 +284,8 @@ struct HfCandidateSelectorXicToXiPiPi { auto trackV0PosDau = hfCandXic.posTrack_as(); auto trackV0NegDau = hfCandXic.negTrack_as(); - // No hfflag -> by default skim selected - SETBIT(statusXicToXiPiPi, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusXicToXiPiPi = 1 + // Succesful reconstruction + SETBIT(statusXicToXiPiPi, hf_sel_candidate_xic::XicToXiPiPiSelectionStep::RecoTotal); // RecoTotal = 0 --> statusXicToXiPiPi += 1 // kinematic and topological selection if (!isSelectedXic(hfCandXic, trackPi0.eta(), trackPi1.eta(), trackPiFromXi.eta(), trackV0PosDau.eta(), trackV0NegDau.eta())) { @@ -295,7 +295,7 @@ struct HfCandidateSelectorXicToXiPiPi { } continue; } - SETBIT(statusXicToXiPiPi, SelectionStep::RecoTopol); // RecoTopol = 1 --> statusXicToXiPiPi = 3 + SETBIT(statusXicToXiPiPi, hf_sel_candidate_xic::XicToXiPiPiSelectionStep::RecoKinTopol); // RecoKinTopol = 1 --> statusXicToXiPiPi += 2 // track quality selection if (doTrackQualitySelection) { @@ -324,8 +324,8 @@ struct HfCandidateSelectorXicToXiPiPi { registry.fill(HIST("hSelCandidates"), TpcTrackQualityPiFromCharm); } - if ((!isSelectedTrackItsQuality(trackPi0, nClustersItsMin, itsChi2PerClusterMax) || trackPiFromCharm.itsNClsInnerBarrel() < nClustersItsInnBarrMin) || - (!isSelectedTrackItsQuality(trackPi0, nClustersItsMin, itsChi2PerClusterMax) || trackPiFromCharm.itsNClsInnerBarrel() < nClustersItsInnBarrMin)) { + if ((!isSelectedTrackItsQuality(trackPi0, nClustersItsMin, itsChi2PerClusterMax) || trackPi0.itsNClsInnerBarrel() < nClustersItsInnBarrMin) || + (!isSelectedTrackItsQuality(trackPi0, nClustersItsMin, itsChi2PerClusterMax) || trackPi1.itsNClsInnerBarrel() < nClustersItsInnBarrMin)) { hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); if (applyMl) { hfMlXicToXiPiPiCandidate(outputMlXicToXiPiPi); @@ -335,6 +335,8 @@ struct HfCandidateSelectorXicToXiPiPi { if (fillHistogram) { registry.fill(HIST("hSelCandidates"), ItsTrackQualityPiFromCharm); } + + SETBIT(statusXicToXiPiPi, hf_sel_candidate_xic::XicToXiPiPiSelectionStep::RecoTrackQuality); // RecoTrackQuality = 2 --> statusXicToXiPiPi += 4 } if (!doTrackQualitySelection && fillHistogram) { registry.fill(HIST("hSelCandidates"), TpcTrackQualityXiDaughters); @@ -379,7 +381,7 @@ struct HfCandidateSelectorXicToXiPiPi { } continue; } - SETBIT(statusXicToXiPiPi, SelectionStep::RecoPID); // RecoPID = 2 --> statusXicToXiPiPi = 7 + SETBIT(statusXicToXiPiPi, hf_sel_candidate_xic::XicToXiPiPiSelectionStep::RecoPID); // RecoPID = 3 --> statusXicToXiPiPi += 8 if (fillHistogram) { registry.fill(HIST("hSelCandidates"), PidSelected); } @@ -401,7 +403,7 @@ struct HfCandidateSelectorXicToXiPiPi { hfSelXicToXiPiPiCandidate(statusXicToXiPiPi); continue; } - SETBIT(statusXicToXiPiPi, aod::SelectionStep::RecoMl); + SETBIT(statusXicToXiPiPi, hf_sel_candidate_xic::XicToXiPiPiSelectionStep::RecoMl); // RecoPID = 4 --> statusXicToXiPiPi += 16 if (fillHistogram) { registry.fill(HIST("hSelCandidates"), BdtSelected); } From 028b818a79408a36ebe2da2d891f603ab8555143 Mon Sep 17 00:00:00 2001 From: pstahlhu Date: Fri, 27 Jun 2025 17:11:03 +0200 Subject: [PATCH 5/5] Change default cuts on minimum decay length --- PWGHF/Core/SelectorCuts.h | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index 7aa10523f3c..18aab0bad6f 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -775,19 +775,19 @@ constexpr double BinsPt[NBinsPt + 1] = { auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts m Y Eta EtaDau ptPi0 ptPi1 chi2SV dL dLXY invMass Xi-Pi pairs -constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 0 < pT < 1 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 1 < pT < 2 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 2 < pT < 3 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 3 < pT < 4 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 4 < pT < 5 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 5 < pT < 6 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 6 < pT < 7 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 7 < pT < 8 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 8 < pT < 9 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 9 < pT < 10 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 10 < pT < 11 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}, /* 11 < pT < 12 */ - {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.5, 0.5, 2.4, 2.4}}; /* 12 < pT < 20 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 0 < pT < 1 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 1 < pT < 2 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 2 < pT < 3 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 3 < pT < 4 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 4 < pT < 5 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 5 < pT < 6 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 6 < pT < 7 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 7 < pT < 8 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 8 < pT < 9 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 9 < pT < 10 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 10 < pT < 11 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}, /* 11 < pT < 12 */ + {0.4, 0.8, 0.8, 0.8, 0.4, 0.4, 100, 0.0, 0.0, 2.4, 2.4}}; /* 12 < pT < 20 */ // row labels static const std::vector labelsPt = {