From d908d242144d1a62626360ee1d5413b3636b3969 Mon Sep 17 00:00:00 2001 From: skundu692 Date: Tue, 21 Jul 2026 22:41:44 +0200 Subject: [PATCH] Add new process function to analyze pair table and modify PID and track selection --- .../Resonances/doublephitable.cxx | 25 +++--- PWGLF/Tasks/Resonances/doublephimeson.cxx | 83 ++++++++++++++++++- 2 files changed, 94 insertions(+), 14 deletions(-) diff --git a/PWGLF/TableProducer/Resonances/doublephitable.cxx b/PWGLF/TableProducer/Resonances/doublephitable.cxx index 63909b72b11..57744ddf693 100644 --- a/PWGLF/TableProducer/Resonances/doublephitable.cxx +++ b/PWGLF/TableProducer/Resonances/doublephitable.cxx @@ -202,7 +202,8 @@ struct doublephitable { template bool selectionTrack(const T& candidate) { - if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster)) { + // if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster)) { + if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster)) { return false; } return true; @@ -272,7 +273,7 @@ struct doublephitable { if (!selectionPID(track1)) { continue; } - if (!(itsResponse.nSigmaITS(track1) > -2.0 && itsResponse.nSigmaITS(track1) < 3.0)) { + if (!(itsResponse.nSigmaITS(track1) > -3.0 && itsResponse.nSigmaITS(track1) < 3.0)) { continue; } Npostrack = Npostrack + 1; @@ -294,7 +295,7 @@ struct doublephitable { if (!selectionPID(track2)) { continue; } - if (!(itsResponse.nSigmaITS(track2) > -2.0 && itsResponse.nSigmaITS(track2) < 3.0)) { + if (!(itsResponse.nSigmaITS(track2) > -3.0 && itsResponse.nSigmaITS(track2) < 3.0)) { continue; } if (Npostrack == 1) { @@ -442,7 +443,7 @@ struct doublephitable { bool selectionITSKaon(const T& candidate, float& nSigmaITS) { nSigmaITS = o2::aod::ITSResponse::nSigmaITS(candidate); - if (!(nSigmaITS > -2.0f && nSigmaITS < 3.0f)) { + if (!(nSigmaITS > -3.0f && nSigmaITS < 3.0f)) { return false; } @@ -642,12 +643,6 @@ struct doublephitable { } } - const int nPosTrack = static_cast(selectedPos.size()); - const int nNegTrack = static_cast(selectedNeg.size()); - if (nPosTrack < 2 || nNegTrack < 2) { - return; - } - std::vector phiCandidates; phiCandidates.reserve(selectedPos.size() * selectedNeg.size()); for (size_t iPos = 0; iPos < selectedPos.size(); ++iPos) { @@ -657,7 +652,7 @@ struct doublephitable { ROOT::Math::PxPyPzMVector kaonPlus(trackPlus.px(), trackPlus.py(), trackPlus.pz(), massKa); ROOT::Math::PxPyPzMVector kaonMinus(trackMinus.px(), trackMinus.py(), trackMinus.pz(), massKa); const auto phi = kaonPlus + kaonMinus; - if (phi.M() <= minPhiMass || phi.M() >= maxPhiMass) { + if (phi.M() < minPhiMass || phi.M() > maxPhiMass) { continue; } @@ -669,7 +664,11 @@ struct doublephitable { if (phiCandidates.size() < 2) { return; } - + const int nPosTrack = static_cast(selectedPos.size()); + const int nNegTrack = static_cast(selectedNeg.size()); + if (nPosTrack < 2 || nNegTrack < 2) { + return; + } const auto primaryVertex = getPrimaryVertex(collision); const auto covPV = primaryVertex.getCov(); std::vector acceptedPairs; @@ -682,6 +681,7 @@ struct doublephitable { const int64_t id3 = phi2.kPlus.globalIndex(); const int64_t id4 = phi2.kMinus.globalIndex(); if (id1 == id2 || id1 == id3 || id1 == id4 || id2 == id3 || id2 == id4 || id3 == id4) { + // LOGF(info, "same track: %d %d %d %d", id1, id2, id3, id4); continue; } auto trackPar1 = getTrackParCov(phi1.kPlus); @@ -700,6 +700,7 @@ struct doublephitable { } if (nFitCandidates == 0) { + // LOG(info) << "Four-kaon DCAFitterN failed with an unknown exception"; continue; } diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 13e7ce8d83d..043d798ab62 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -146,7 +146,7 @@ struct doublephimeson { // THnsparse bining ConfigurableAxis configThnAxisPtCorr{"configThnAxisPtCorr", {1000, 0.0, 100}, "#it{M} (GeV/#it{c}^{2})"}; - ConfigurableAxis configThnAxisInvMass{"configThnAxisInvMass", {300, 2.4, 3.0}, "#it{M} (GeV/#it{c}^{2})"}; + ConfigurableAxis configThnAxisInvMass{"configThnAxisInvMass", {400, 2.5, 2.9}, "#it{M} (GeV/#it{c}^{2})"}; ConfigurableAxis configThnAxisInvMassPhi{"configThnAxisInvMassPhi", {20, 1.01, 1.03}, "#it{M} (GeV/#it{c}^{2})"}; ConfigurableAxis configThnAxisInvMassDeltaPhi{"configThnAxisInvMassDeltaPhi", {80, 0.0, 0.08}, "#it{M} (GeV/#it{c}^{2})"}; ConfigurableAxis configThnAxisInvMassDeltaPhiSigma{"configThnAxisInvMassDeltaPhiSigma", {100, 0.0, 10}, "#it{M} (GeV/#it{c}^{2}) sigma"}; @@ -163,7 +163,10 @@ struct doublephimeson { ConfigurableAxis configThnAxisDeltaRPhi{"configThnAxisDeltaRPhi", {120, 0.0, 6.0}, "ΔR(φ,φ)"}; ConfigurableAxis configThnAxisZ{"configThnAxisZ", {100, 0.0, 1.0}, "z"}; ConfigurableAxis configThnAxisA{"configThnAxisA", {100, 0.0, 1.0}, "A"}; - + ConfigurableAxis configThnAxisPhiPtVertex{"configThnAxisPhiPtVertex", {100, 0.0, 100.0}, "phi pT (GeV/c)"}; + ConfigurableAxis configThnAxisDecayLength{"configThnAxisDecayLength", {200, 0.0, 1.0}, "3D decay length (cm)"}; + ConfigurableAxis configThnAxisFitChi2Ndf{"configThnAxisFitChi2Ndf", {200, 0.0, 100.0}, "four-kaon fit chi2/NDF"}; + ConfigurableAxis configThnAxisRmsDcaSig{"configThnAxisRmsDcaSig", {300, 0.0, 15.0}, "RMS DCA significance"}; // Initialize the ananlysis task void init(o2::framework::InitContext&) { @@ -198,6 +201,11 @@ struct doublephimeson { const AxisSpec thnAxisDeltaRPhi{configThnAxisDeltaRPhi, "#Delta R(#phi,#phi)"}; const AxisSpec thnAxisZ{configThnAxisZ, "z = p_{T1}/(p_{T1}+p_{T2})"}; const AxisSpec thnAxisA{configThnAxisA, "A = |p_{T1}-p_{T2}|/(p_{T1}+p_{T2})"}; + + const AxisSpec thnAxisDecayLength{configThnAxisDecayLength, "#it{L}_{3D} (cm)"}; + const AxisSpec thnAxisFitChi2Ndf{configThnAxisFitChi2Ndf, "#chi^{2}/NDF"}; + const AxisSpec thnAxisRmsDcaSig{configThnAxisRmsDcaSig, "RMS DCA significance"}; + histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisDeltaR, thnAxisPt, thnAxisDeltaR, thnAxisInvMassDeltaPhi, thnAxisPtCorr}); // histos.add("SEMassLike", "SEMassLike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisDeltaR, thnAxisPt, thnAxisDeltaR, thnAxisInvMassDeltaPhi, thnAxisPtCorr}); @@ -226,6 +234,8 @@ struct doublephimeson { thnAxisInvMassDeltaPhi, // DeltaM_phi thnAxisPtCorr, thnAxisNumPhi}); // pT correlation variable + + histos.add("SEMassUnlike_VertexVars", "SEMassUnlike_VertexVars", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisInvMassDeltaPhi, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisDecayLength, thnAxisFitChi2Ndf, thnAxisRmsDcaSig}); } // get kstar @@ -343,6 +353,23 @@ struct doublephimeson { } } + if (PIDStrategy == 1004) { + if (ptcand < 0.5 && TOFHit != 1 && nsigmaTPC > -3.0 && nsigmaTPC < 3.0) { + return true; + } + if (ptcand < 0.5 && TOFHit == 1 && std::sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.5) { + return true; + } + if (ptcand >= 0.5) { + if (TOFHit != 1 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { + return true; + } + if (TOFHit == 1 && std::sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.5) { + return true; + } + } + } + if (PIDStrategy == 1008) { if (ptcand < 0.5 && TOFHit != 1 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { return true; @@ -1798,6 +1825,58 @@ struct doublephimeson { } PROCESS_SWITCH(doublephimeson, processopti5, "Process Optimized same event with all variables", true); + void processPairOpti6(aod::PhiPhiPairs const& pairs) + { + constexpr double mPhiPDG = o2::constants::physics::MassPhi; + constexpr double mKPDG = o2::constants::physics::MassKPlus; + + for (auto const& pair : pairs) { + if (pair.k1Index() == pair.k2Index() || pair.k1Index() == pair.k3Index() || pair.k1Index() == pair.k4Index() || pair.k2Index() == pair.k3Index() || pair.k2Index() == pair.k4Index() || pair.k3Index() == pair.k4Index()) { + continue; + } + if (std::abs(pair.k1DcaXY()) >= 0.02f || std::abs(pair.k1DcaZ()) >= 0.02f || std::abs(pair.k2DcaXY()) >= 0.02f || std::abs(pair.k2DcaZ()) >= 0.02f || std::abs(pair.k3DcaXY()) >= 0.02f || std::abs(pair.k3DcaZ()) >= 0.02f || std::abs(pair.k4DcaXY()) >= 0.02f || std::abs(pair.k4DcaZ()) >= 0.02f) { + continue; + } + const double pairPt = std::hypot(pair.pairPx(), pair.pairPy()); + if (pairPt <= minExoticPt || pair.pairMass() < minExoticMass || pair.pairMass() > maxExoticMass) { + continue; + } + + const double pt1 = std::hypot(pair.phi1Px(), pair.phi1Py()); + const double pt2 = std::hypot(pair.phi2Px(), pair.phi2Py()); + if (pt1 < minPhiPt || pt1 > maxPhiPt || pt2 < minPhiPt || pt2 > maxPhiPt) { + continue; + } + + const ROOT::Math::PxPyPzMVector k1(pair.k1Px(), pair.k1Py(), pair.k1Pz(), mKPDG); + const ROOT::Math::PxPyPzMVector k2(pair.k2Px(), pair.k2Py(), pair.k2Pz(), mKPDG); + const ROOT::Math::PxPyPzMVector k3(pair.k3Px(), pair.k3Py(), pair.k3Pz(), mKPDG); + const ROOT::Math::PxPyPzMVector k4(pair.k4Px(), pair.k4Py(), pair.k4Pz(), mKPDG); + + const double mCross14 = (k1 + k4).M(); + const double mCross32 = (k3 + k2).M(); + if ((mCross14 > cfgCrossPhiLow && mCross14 < cfgCrossPhiHigh) || (mCross32 > cfgCrossPhiLow && mCross32 < cfgCrossPhiHigh)) { + continue; + } + + double deltaM = std::hypot(pair.phi1Mass() - mPhiPDG, pair.phi2Mass() - mPhiPDG); + if (useParametrized) { + deltaM = getDeltaMPhi(pair.phi1Mass(), pt1, pair.phi2Mass(), pt2); + } + + const double decayLength = pair.vertexL3DSig(); + const double fitChi2Ndf = pair.fitChi2Ndf(); + const double rmsDcaSig = pair.rmsDcaSig(); + + if (!std::isfinite(pair.pairMass()) || !std::isfinite(deltaM) || !std::isfinite(pt1) || !std::isfinite(pt2) || !std::isfinite(decayLength) || !std::isfinite(fitChi2Ndf) || !std::isfinite(rmsDcaSig)) { + continue; + } + + histos.fill(HIST("SEMassUnlike_VertexVars"), pair.pairMass(), pairPt, deltaM, pair.phi1Mass(), pair.phi2Mass(), decayLength, fitChi2Ndf, rmsDcaSig); + } + } + PROCESS_SWITCH(doublephimeson, processPairOpti6, "Process fitted phi-phi pairs with vertex variables", false); + SliceCache cache; using BinningTypeVertexContributor = ColumnBinningPolicy;