From 931e615de9dcf39ebc06d2b85bf2de08daf7ce11 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Tue, 6 Jan 2026 11:46:36 +0100 Subject: [PATCH 01/10] add proton PID --- PWGUD/Tasks/upcRhoAnalysis.cxx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 70535203937..42d6aa4ac94 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -153,7 +153,7 @@ struct UpcRhoAnalysis { Configurable znTimeCut{"znTimeCut", 2.0, "ZN time cut"}; Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; - Configurable rejectLowerProbPairs{"rejectLowerProbPairs", false, "reject track pairs with lower El or Ka PID radii"}; + Configurable rejectLowerProbPairs{"rejectLowerProbPairs", true, "reject track pairs with lower El or Ka PID radii"}; Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; Configurable tracksMinItsNClsCut{"tracksMinItsNClsCut", 4, "min ITS clusters cut"}; Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; @@ -219,6 +219,7 @@ struct UpcRhoAnalysis { rQC.add("QC/tracks/all/hTpcNSigmaPi", ";TPC #it{n#sigma}(#pi);counts", kTH1D, {nSigmaAxis}); rQC.add("QC/tracks/all/hTpcNSigmaEl", ";TPC #it{n#sigma}(e);counts", kTH1D, {nSigmaAxis}); rQC.add("QC/tracks/all/hTpcNSigmaKa", ";TPC #it{n#sigma}(K);counts", kTH1D, {nSigmaAxis}); + rQC.add("QC/tracks/all/hTpcNSigmaPr", ";TPC #it{n#sigma}(p);counts", kTH1D, {nSigmaAxis}); rQC.add("QC/tracks/all/hDcaXYZ", ";track #it{DCA}_{z} (cm);track #it{DCA}_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {400, -2.0, 2.0}}); rQC.add("QC/tracks/all/hItsNCls", ";ITS #it{N}_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); rQC.add("QC/tracks/all/hItsChi2NCl", ";ITS #it{#chi}^{2}/#it{N}_{cls};counts", kTH1D, {{200, 0.0, 20.0}}); @@ -587,17 +588,19 @@ struct UpcRhoAnalysis { template bool tracksPassPID(const T& cutTracks) // n-dimensional pion PID cut { - float radiusPi = 0.0, radiusEl = 0.0, radiusKa = 0.0; + float radiusPi = 0.0, radiusEl = 0.0, radiusKa = 0.0, radiusPr = 0.0; for (const auto& track : cutTracks) { radiusEl += std::pow(track.tpcNSigmaEl(), 2); radiusKa += std::pow(track.tpcNSigmaKa(), 2); radiusPi += std::pow(track.tpcNSigmaPi(), 2); + radiusPr += std::pow(track.tpcNSigmaPr(), 2); } rQC.fill(HIST("QC/tracks/hPiPIDRadius"), std::sqrt(radiusPi)); rQC.fill(HIST("QC/tracks/hElPIDRadius"), std::sqrt(radiusEl)); rQC.fill(HIST("QC/tracks/hKaPIDRadius"), std::sqrt(radiusKa)); + rQC.fill(HIST("QC/tracks/hPrPIDRadius"), std::sqrt(radiusPr)); if (rejectLowerProbPairs) - return ((radiusPi < std::pow(tracksTpcNSigmaPiCut, 2)) && (radiusPi < radiusEl) && (radiusPi < radiusKa)); + return ((radiusPi < std::pow(tracksTpcNSigmaPiCut, 2)) && (radiusPi < radiusEl) && (radiusPi < radiusKa) && (radiusPi < radiusPr)); else return radiusPi < std::pow(tracksTpcNSigmaPiCut, 2); } From cdeb35110510e27ab8a6401cbc036d99741af98b Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 7 Jan 2026 10:25:50 +0100 Subject: [PATCH 02/10] rewrite derived data table definitions to avoid storing arrays --- PWGUD/Tasks/upcRhoAnalysis.cxx | 135 +++++++++++++++++++++++---------- 1 file changed, 96 insertions(+), 39 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 42d6aa4ac94..ee6ca004b39 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -74,23 +74,43 @@ DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); // pion tracks DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); -DECLARE_SOA_COLUMN(TrackSign, trackSign, int[2]); -DECLARE_SOA_COLUMN(TrackPt, trackPt, float[2]); -DECLARE_SOA_COLUMN(TrackEta, trackEta, float[2]); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, float[2]); -DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, float[2]); -DECLARE_SOA_COLUMN(TrackElPID, trackElPID, float[2]); -DECLARE_SOA_COLUMN(TrackKaPID, trackKaPID, float[2]); -DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float[2]); -DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float[2]); -DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, float[2]); +DECLARE_SOA_COLUMN(PosTrackSign, posTrackSign, int); +DECLARE_SOA_COLUMN(NegTrackSign, negTrackSign, int); +DECLARE_SOA_COLUMN(PosTrackPt, posTrackPt, float); +DECLARE_SOA_COLUMN(NegTrackPt, negTrackPt, float); +DECLARE_SOA_COLUMN(PosTrackEta, posTrackEta, float); +DECLARE_SOA_COLUMN(NegTrackEta, negTrackEta, float); +DECLARE_SOA_COLUMN(PosTrackPhi, posTrackPhi, float); +DECLARE_SOA_COLUMN(NegTrackPhi, negTrackPhi, float); +DECLARE_SOA_COLUMN(PosTrackPiPID, posTrackPiPID, float); +DECLARE_SOA_COLUMN(NegTrackPiPID, negTrackPiPID, float); +DECLARE_SOA_COLUMN(PosTrackElPID, posTrackElPID, float); +DECLARE_SOA_COLUMN(NegTrackElPID, negTrackElPID, float); +DECLARE_SOA_COLUMN(PosTrackKaPID, posTrackKaPID, float); +DECLARE_SOA_COLUMN(NegTrackKaPID, negTrackKaPID, float); +DECLARE_SOA_COLUMN(PosTrackDcaXY, posTrackDcaXY, float); +DECLARE_SOA_COLUMN(NegTrackDcaXY, negTrackDcaXY, float); +DECLARE_SOA_COLUMN(PosTrackDcaZ, posTrackDcaZ, float); +DECLARE_SOA_COLUMN(NegTrackDcaZ, negTrackDcaZ, float); +DECLARE_SOA_COLUMN(PosTrackTpcSignal, posTrackTpcSignal, float); +DECLARE_SOA_COLUMN(NegTrackTpcSignal, negTrackTpcSignal, float); } // namespace reco_tree DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", reco_tree::RecoSetting, reco_tree::RunNumber, reco_tree::LocalBC, reco_tree::NumContrib, reco_tree::PosX, reco_tree::PosY, reco_tree::PosZ, reco_tree::TotalFT0AmplitudeA, reco_tree::TotalFT0AmplitudeC, reco_tree::TotalFV0AmplitudeA, reco_tree::TotalFDDAmplitudeA, reco_tree::TotalFDDAmplitudeC, reco_tree::TimeFT0A, reco_tree::TimeFT0C, reco_tree::TimeFV0A, reco_tree::TimeFDDA, reco_tree::TimeFDDC, reco_tree::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, reco_tree::NeutronClass, - reco_tree::PhiRandom, reco_tree::PhiCharge, reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackKaPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); + reco_tree::PhiRandom, reco_tree::PhiCharge, + reco_tree::PosTrackSign, reco_tree::NegTrackSign, + reco_tree::PosTrackPt, reco_tree::NegTrackPt, + reco_tree::PosTrackEta, reco_tree::NegTrackEta, + reco_tree::PosTrackPhi, reco_tree::NegTrackPhi, + reco_tree::PosTrackPiPID, reco_tree::NegTrackPiPID, + reco_tree::PosTrackElPID, reco_tree::NegTrackElPID, + reco_tree::PosTrackKaPID, reco_tree::NegTrackKaPID, + reco_tree::PosTrackDcaXY, reco_tree::NegTrackDcaXY, + reco_tree::PosTrackDcaZ, reco_tree::NegTrackDcaZ, + reco_tree::PosTrackTpcSignal, reco_tree::NegTrackTpcSignal); namespace mc_tree { @@ -104,15 +124,23 @@ DECLARE_SOA_COLUMN(PosZ, posZ, float); // pion tracks DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); -DECLARE_SOA_COLUMN(TrackSign, trackSign, int[2]); -DECLARE_SOA_COLUMN(TrackPt, trackPt, float[2]); -DECLARE_SOA_COLUMN(TrackEta, trackEta, float[2]); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, float[2]); +DECLARE_SOA_COLUMN(PosTrackSign, posTrackSign, int); +DECLARE_SOA_COLUMN(NegTrackSign, negTrackSign, int); +DECLARE_SOA_COLUMN(PosTrackPt, posTrackPt, float); +DECLARE_SOA_COLUMN(NegTrackPt, negTrackPt, float); +DECLARE_SOA_COLUMN(PosTrackEta, posTrackEta, float); +DECLARE_SOA_COLUMN(NegTrackEta, negTrackEta, float); +DECLARE_SOA_COLUMN(PosTrackPhi, posTrackPhi, float); +DECLARE_SOA_COLUMN(NegTrackPhi, negTrackPhi, float); } // namespace mc_tree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", mc_tree::LocalBc, mc_tree::RunNumber, mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, - mc_tree::PhiRandom, mc_tree::PhiCharge, mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi); + mc_tree::PhiRandom, mc_tree::PhiCharge, + mc_tree::PosTrackSign, mc_tree::NegTrackSign, + mc_tree::PosTrackPt, mc_tree::NegTrackPt, + mc_tree::PosTrackEta, mc_tree::NegTrackEta, + mc_tree::PosTrackPhi, mc_tree::NegTrackPhi); } // namespace o2::aod struct UpcRhoAnalysis { @@ -262,6 +290,7 @@ struct UpcRhoAnalysis { rQC.add("QC/tracks/hPiPIDRadius", ";#it{n#sigma}(#pi) radius;counts", kTH1D, {{1000, 0.0, 10.0}}); rQC.add("QC/tracks/hElPIDRadius", ";#it{n#sigma}(e) radius;counts", kTH1D, {{1000, 0.0, 10.0}}); rQC.add("QC/tracks/hKaPIDRadius", ";#it{n#sigma}(K) radius;counts", kTH1D, {{1000, 0.0, 10.0}}); + rQC.add("QC/tracks/hPrPIDRadius", ";#it{n#sigma}(p) radius;counts", kTH1D, {{1000, 0.0, 10.0}}); // TRACKS (2D) rTracks.add("tracks/trackSelections/unlike-sign/hPt", ";#it{p}_{T leading} (GeV/#it{c});#it{p}_{T subleading} (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); @@ -764,8 +793,8 @@ struct UpcRhoAnalysis { auto leadingMomentumTrack = momentum(cutTracks[0].px(), cutTracks[0].py(), cutTracks[0].pz()) > momentum(cutTracks[1].px(), cutTracks[1].py(), cutTracks[1].pz()) ? cutTracks[0] : cutTracks[1]; auto subleadingMomentumTrack = (leadingMomentumTrack == cutTracks[0]) ? cutTracks[1] : cutTracks[0]; - auto positiveTrack = cutTracks[0].sign() > 0 ? cutTracks[0] : cutTracks[1]; - auto negativeTrack = cutTracks[0].sign() > 0 ? cutTracks[1] : cutTracks[0]; + auto positiveTrack = cutTracks[0].sign() == 1 ? cutTracks[0] : cutTracks[1]; + auto negativeTrack = cutTracks[0].sign() == -1 ? cutTracks[0] : cutTracks[1]; float leadingPt = leadingMomentumTrack.pt(); float subleadingPt = subleadingMomentumTrack.pt(); @@ -778,21 +807,41 @@ struct UpcRhoAnalysis { // fill recoTree int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; - int trackSigns[2] = {positiveTrack.sign(), negativeTrack.sign()}; - float trackPts[2] = {positiveTrack.pt(), negativeTrack.pt()}; - float trackEtas[2] = {eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()), eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz())}; - float trackPhis[2] = {phi(positiveTrack.px(), positiveTrack.py()), phi(negativeTrack.px(), negativeTrack.py())}; - float trackPiPIDs[2] = {positiveTrack.tpcNSigmaPi(), negativeTrack.tpcNSigmaPi()}; - float trackElPIDs[2] = {positiveTrack.tpcNSigmaEl(), negativeTrack.tpcNSigmaEl()}; - float trackKaPIDs[2] = {positiveTrack.tpcNSigmaKa(), negativeTrack.tpcNSigmaKa()}; - float trackDcaXYs[2] = {positiveTrack.dcaXY(), negativeTrack.dcaXY()}; - float trackDcaZs[2] = {positiveTrack.dcaZ(), negativeTrack.dcaZ()}; - float trackTpcSignals[2] = {positiveTrack.tpcSignal(), negativeTrack.tpcSignal()}; + int trackSignPos = positiveTrack.sign(); + int trackSignNeg = negativeTrack.sign(); + float trackPtPos = positiveTrack.pt(); + float trackPtNeg = negativeTrack.pt(); + float trackEtaPos = eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()); + float trackEtaNeg = eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz()); + float trackPhiPos = phi(positiveTrack.px(), positiveTrack.py()); + float trackPhiNeg = phi(negativeTrack.px(), negativeTrack.py()); + float trackPiPIDPos = positiveTrack.tpcNSigmaPi(); + float trackPiPIDNeg = negativeTrack.tpcNSigmaPi(); + float trackElPIDPos = positiveTrack.tpcNSigmaEl(); + float trackElPIDNeg = negativeTrack.tpcNSigmaEl(); + float trackKaPIDPos = positiveTrack.tpcNSigmaKa(); + float trackKaPIDNeg = negativeTrack.tpcNSigmaKa(); + float trackDcaXYPos = positiveTrack.dcaXY(); + float trackDcaXYNeg = negativeTrack.dcaXY(); + float trackDcaZPos = positiveTrack.dcaZ(); + float trackDcaZNeg = negativeTrack.dcaZ(); + float trackTpcSignalPos = positiveTrack.tpcSignal(); + float trackTpcSignalNeg = negativeTrack.tpcSignal(); recoTree(collision.flags(), collision.runNumber(), localBc, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), - energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, - phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackKaPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, + phiRandom, phiCharge, + trackSignPos, trackSignNeg, + trackPtPos, trackPtNeg, + trackEtaPos, trackEtaNeg, + trackPhiPos, trackPhiNeg, + trackPiPIDPos, trackPiPIDNeg, + trackElPIDPos, trackElPIDNeg, + trackKaPIDPos, trackKaPIDNeg, + trackDcaXYPos, trackDcaXYNeg, + trackDcaZPos, trackDcaZNeg, + trackTpcSignalPos, trackTpcSignalNeg); if (!tracksPassPID(cutTracks)) // apply PID cut return; @@ -984,13 +1033,21 @@ struct UpcRhoAnalysis { auto positivePion = cutMcParticles[0].pdgCode() > 0 ? cutMcParticles[0] : cutMcParticles[1]; auto negativePion = cutMcParticles[0].pdgCode() > 0 ? cutMcParticles[1] : cutMcParticles[0]; int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; - int trackSigns[2] = {positivePion.pdgCode() / std::abs(positivePion.pdgCode()), negativePion.pdgCode() / std::abs(negativePion.pdgCode())}; - float trackPts[2] = {pt(positivePion.px(), positivePion.py()), pt(negativePion.px(), negativePion.py())}; - float trackEtas[2] = {eta(positivePion.px(), positivePion.py(), positivePion.pz()), eta(negativePion.px(), negativePion.py(), negativePion.pz())}; - float trackPhis[2] = {phi(positivePion.px(), positivePion.py()), phi(negativePion.px(), negativePion.py())}; - mcTree(localBc, runNumber, - mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), - phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis); + int trackSignPos = positivePion.pdgCode() / std::abs(positivePion.pdgCode()); + int trackSignNeg = negativePion.pdgCode() / std::abs(negativePion.pdgCode()); + float trackPtPos = pt(positivePion.px(), positivePion.py()); + float trackPtNeg = pt(negativePion.px(), negativePion.py()); + float trackEtaPos = eta(positivePion.px(), positivePion.py(), positivePion.pz()); + float trackEtaNeg = eta(negativePion.px(), negativePion.py(), negativePion.pz()); + float trackPhiPos = phi(positivePion.px(), positivePion.py()); + float trackPhiNeg = phi(negativePion.px(), negativePion.py()); + mcTree(localBc, runNumber, + mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), + phiRandom, phiCharge, + trackSignPos, trackSignNeg, + trackPtPos, trackPtNeg, + trackEtaPos, trackEtaNeg, + trackPhiPos, trackPhiNeg); } template From e0a94a9c2288ff6ccff5f99f15679613e0ffec46 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 7 Jan 2026 10:26:29 +0100 Subject: [PATCH 03/10] bugfix in deltaPhi normalisation --- PWGUD/Tasks/upcRhoAnalysis.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index ee6ca004b39..e7fa8829238 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -674,7 +674,10 @@ struct UpcRhoAnalysis { double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) { double dPhi = p1.Phi() - p2.Phi(); - dPhi = std::fmod(dPhi + o2::constants::math::PI, o2::constants::math::TwoPI) - o2::constants::math::PI; // normalize to (-pi, pi) + while (dPhi > o2::constants::math::PI) + dPhi -= o2::constants::math::TwoPI; + while (dPhi < -o2::constants::math::PI) + dPhi += o2::constants::math::TwoPI; return dPhi; } From 6f0d1c86234004f4d836ea21d34a0b51fb63b475 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 7 Jan 2026 10:28:32 +0100 Subject: [PATCH 04/10] bugfix bugfix --- PWGUD/Tasks/upcRhoAnalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index e7fa8829238..fff6038bb9e 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -674,7 +674,7 @@ struct UpcRhoAnalysis { double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) { double dPhi = p1.Phi() - p2.Phi(); - while (dPhi > o2::constants::math::PI) + while (dPhi >= o2::constants::math::PI) dPhi -= o2::constants::math::TwoPI; while (dPhi < -o2::constants::math::PI) dPhi += o2::constants::math::TwoPI; From ce31ae398e93fab54d236aa1492ceb4e548e9d88 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 8 Jan 2026 11:47:13 +0100 Subject: [PATCH 05/10] avoid single-use variables for table filling --- PWGUD/Tasks/upcRhoAnalysis.cxx | 66 ++++++++++------------------------ 1 file changed, 18 insertions(+), 48 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index fff6038bb9e..6abb95f5355 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -809,42 +809,21 @@ struct UpcRhoAnalysis { float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); // fill recoTree - int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; - int trackSignPos = positiveTrack.sign(); - int trackSignNeg = negativeTrack.sign(); - float trackPtPos = positiveTrack.pt(); - float trackPtNeg = negativeTrack.pt(); - float trackEtaPos = eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()); - float trackEtaNeg = eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz()); - float trackPhiPos = phi(positiveTrack.px(), positiveTrack.py()); - float trackPhiNeg = phi(negativeTrack.px(), negativeTrack.py()); - float trackPiPIDPos = positiveTrack.tpcNSigmaPi(); - float trackPiPIDNeg = negativeTrack.tpcNSigmaPi(); - float trackElPIDPos = positiveTrack.tpcNSigmaEl(); - float trackElPIDNeg = negativeTrack.tpcNSigmaEl(); - float trackKaPIDPos = positiveTrack.tpcNSigmaKa(); - float trackKaPIDNeg = negativeTrack.tpcNSigmaKa(); - float trackDcaXYPos = positiveTrack.dcaXY(); - float trackDcaXYNeg = negativeTrack.dcaXY(); - float trackDcaZPos = positiveTrack.dcaZ(); - float trackDcaZNeg = negativeTrack.dcaZ(); - float trackTpcSignalPos = positiveTrack.tpcSignal(); - float trackTpcSignalNeg = negativeTrack.tpcSignal(); - recoTree(collision.flags(), collision.runNumber(), localBc, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), + recoTree(collision.flags(), collision.runNumber(), collision.globalBC() % o2::constants::lhc::LHCMaxBunches, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, phiRandom, phiCharge, - trackSignPos, trackSignNeg, - trackPtPos, trackPtNeg, - trackEtaPos, trackEtaNeg, - trackPhiPos, trackPhiNeg, - trackPiPIDPos, trackPiPIDNeg, - trackElPIDPos, trackElPIDNeg, - trackKaPIDPos, trackKaPIDNeg, - trackDcaXYPos, trackDcaXYNeg, - trackDcaZPos, trackDcaZNeg, - trackTpcSignalPos, trackTpcSignalNeg); + positiveTrack.sign(), negativeTrack.sign(), + positiveTrack.pt(), negativeTrack.pt(), + eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()), eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz()), + phi(positiveTrack.px(), positiveTrack.py()), phi(negativeTrack.px(), negativeTrack.py()), + positiveTrack.tpcNSigmaPi(), negativeTrack.tpcNSigmaPi(), + positiveTrack.tpcNSigmaEl(), negativeTrack.tpcNSigmaEl(), + positiveTrack.tpcNSigmaKa(), negativeTrack.tpcNSigmaKa(), + positiveTrack.dcaXY(), negativeTrack.dcaXY(), + positiveTrack.dcaZ(), negativeTrack.dcaZ(), + positiveTrack.tpcSignal(), negativeTrack.tpcSignal()); if (!tracksPassPID(cutTracks)) // apply PID cut return; @@ -1035,22 +1014,13 @@ struct UpcRhoAnalysis { // fill mcTree auto positivePion = cutMcParticles[0].pdgCode() > 0 ? cutMcParticles[0] : cutMcParticles[1]; auto negativePion = cutMcParticles[0].pdgCode() > 0 ? cutMcParticles[1] : cutMcParticles[0]; - int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; - int trackSignPos = positivePion.pdgCode() / std::abs(positivePion.pdgCode()); - int trackSignNeg = negativePion.pdgCode() / std::abs(negativePion.pdgCode()); - float trackPtPos = pt(positivePion.px(), positivePion.py()); - float trackPtNeg = pt(negativePion.px(), negativePion.py()); - float trackEtaPos = eta(positivePion.px(), positivePion.py(), positivePion.pz()); - float trackEtaNeg = eta(negativePion.px(), negativePion.py(), negativePion.pz()); - float trackPhiPos = phi(positivePion.px(), positivePion.py()); - float trackPhiNeg = phi(negativePion.px(), negativePion.py()); - mcTree(localBc, runNumber, - mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), - phiRandom, phiCharge, - trackSignPos, trackSignNeg, - trackPtPos, trackPtNeg, - trackEtaPos, trackEtaNeg, - trackPhiPos, trackPhiNeg); + mcTree(mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches, runNumber, + mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), + phiRandom, phiCharge, + positivePion.pdgCode() / std::abs(positivePion.pdgCode()), negativePion.pdgCode() / std::abs(negativePion.pdgCode()), + pt(positivePion.px(), positivePion.py()), pt(negativePion.px(), negativePion.py()), + eta(positivePion.px(), positivePion.py(), positivePion.pz()), eta(negativePion.px(), negativePion.py(), negativePion.pz()), + phi(positivePion.px(), positivePion.py()), phi(negativePion.px(), negativePion.py())); } template From c76e5bc8e3b46685be2561ec0fca6b488786bc0e Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 8 Jan 2026 11:00:57 +0000 Subject: [PATCH 06/10] Please consider the following formatting changes --- PWGUD/Tasks/upcRhoAnalysis.cxx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 6abb95f5355..151f6027925 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -810,20 +810,20 @@ struct UpcRhoAnalysis { // fill recoTree recoTree(collision.flags(), collision.runNumber(), collision.globalBC() % o2::constants::lhc::LHCMaxBunches, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), - energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, - phiRandom, phiCharge, - positiveTrack.sign(), negativeTrack.sign(), - positiveTrack.pt(), negativeTrack.pt(), - eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()), eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz()), - phi(positiveTrack.px(), positiveTrack.py()), phi(negativeTrack.px(), negativeTrack.py()), - positiveTrack.tpcNSigmaPi(), negativeTrack.tpcNSigmaPi(), - positiveTrack.tpcNSigmaEl(), negativeTrack.tpcNSigmaEl(), - positiveTrack.tpcNSigmaKa(), negativeTrack.tpcNSigmaKa(), - positiveTrack.dcaXY(), negativeTrack.dcaXY(), - positiveTrack.dcaZ(), negativeTrack.dcaZ(), - positiveTrack.tpcSignal(), negativeTrack.tpcSignal()); + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, + phiRandom, phiCharge, + positiveTrack.sign(), negativeTrack.sign(), + positiveTrack.pt(), negativeTrack.pt(), + eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()), eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz()), + phi(positiveTrack.px(), positiveTrack.py()), phi(negativeTrack.px(), negativeTrack.py()), + positiveTrack.tpcNSigmaPi(), negativeTrack.tpcNSigmaPi(), + positiveTrack.tpcNSigmaEl(), negativeTrack.tpcNSigmaEl(), + positiveTrack.tpcNSigmaKa(), negativeTrack.tpcNSigmaKa(), + positiveTrack.dcaXY(), negativeTrack.dcaXY(), + positiveTrack.dcaZ(), negativeTrack.dcaZ(), + positiveTrack.tpcSignal(), negativeTrack.tpcSignal()); if (!tracksPassPID(cutTracks)) // apply PID cut return; From ec6be89f46689a8729c112ea37d23cd3b5f7668a Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 8 Jan 2026 14:06:51 +0100 Subject: [PATCH 07/10] add 2D proton nsigma plot --- PWGUD/Tasks/upcRhoAnalysis.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 151f6027925..245209e274c 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -267,6 +267,7 @@ struct UpcRhoAnalysis { rQC.add("QC/tracks/trackSelections/hTpcNSigmaPi2D", ";TPC #it{n#sigma}(#pi)_{leading};TPC #it{n#sigma}(#pi)_{subleading};counts", kTH2D, {nSigmaAxis, nSigmaAxis}); rQC.add("QC/tracks/trackSelections/hTpcNSigmaEl2D", ";TPC #it{n#sigma}(e)_{leading};TPC #it{n#sigma}(e)_{subleading};counts", kTH2D, {nSigmaAxis, nSigmaAxis}); rQC.add("QC/tracks/trackSelections/hTpcNSigmaKa2D", ";TPC #it{n#sigma}(K)_{leading};TPC #it{n#sigma}(K)_{subleading};counts", kTH2D, {nSigmaAxis, nSigmaAxis}); + rQC.add("QC/tracks/trackSelections/hTpcNSigmaPr2D", ";TPC #it{n#sigma}(p)_{leading};TPC #it{n#sigma}(p)_{subleading};counts", kTH2D, {nSigmaAxis, nSigmaAxis}); // selection counter std::vector trackSelectionCounterLabels = {"all tracks", "PV contributor", "ITS hit", "ITS #it{N}_{cls}", "itsClusterMap check", "ITS #it{#chi}^{2}/#it{N}_{cls}", "TPC hit", "found TPC #it{N}_{cls}", "TPC #it{#chi}^{2}/#it{N}_{cls}", "TPC crossed rows", "TPC crossed rows/#it{N}_{cls}", @@ -785,6 +786,7 @@ struct UpcRhoAnalysis { rQC.fill(HIST("QC/tracks/trackSelections/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); rQC.fill(HIST("QC/tracks/trackSelections/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); rQC.fill(HIST("QC/tracks/trackSelections/hTpcNSigmaKa2D"), cutTracks[0].tpcNSigmaKa(), cutTracks[1].tpcNSigmaKa()); + rQC.fill(HIST("QC/tracks/trackSelections/hTpcNSigmaPr2D"), cutTracks[0].tpcNSigmaPr(), cutTracks[1].tpcNSigmaPr()); // create a vector of 4-vectors for selected tracks std::vector cutTracksLVs; From c6e268e9656e2281793ec725ac93447a4a206b4d Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 8 Jan 2026 14:25:42 +0100 Subject: [PATCH 08/10] change track ordering in tables --- PWGUD/Tasks/upcRhoAnalysis.cxx | 158 ++++++++++++++++----------------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 245209e274c..c62703eeddc 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -74,26 +74,27 @@ DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); // pion tracks DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); -DECLARE_SOA_COLUMN(PosTrackSign, posTrackSign, int); -DECLARE_SOA_COLUMN(NegTrackSign, negTrackSign, int); -DECLARE_SOA_COLUMN(PosTrackPt, posTrackPt, float); -DECLARE_SOA_COLUMN(NegTrackPt, negTrackPt, float); -DECLARE_SOA_COLUMN(PosTrackEta, posTrackEta, float); -DECLARE_SOA_COLUMN(NegTrackEta, negTrackEta, float); -DECLARE_SOA_COLUMN(PosTrackPhi, posTrackPhi, float); -DECLARE_SOA_COLUMN(NegTrackPhi, negTrackPhi, float); -DECLARE_SOA_COLUMN(PosTrackPiPID, posTrackPiPID, float); -DECLARE_SOA_COLUMN(NegTrackPiPID, negTrackPiPID, float); -DECLARE_SOA_COLUMN(PosTrackElPID, posTrackElPID, float); -DECLARE_SOA_COLUMN(NegTrackElPID, negTrackElPID, float); -DECLARE_SOA_COLUMN(PosTrackKaPID, posTrackKaPID, float); -DECLARE_SOA_COLUMN(NegTrackKaPID, negTrackKaPID, float); -DECLARE_SOA_COLUMN(PosTrackDcaXY, posTrackDcaXY, float); -DECLARE_SOA_COLUMN(NegTrackDcaXY, negTrackDcaXY, float); -DECLARE_SOA_COLUMN(PosTrackDcaZ, posTrackDcaZ, float); -DECLARE_SOA_COLUMN(NegTrackDcaZ, negTrackDcaZ, float); -DECLARE_SOA_COLUMN(PosTrackTpcSignal, posTrackTpcSignal, float); -DECLARE_SOA_COLUMN(NegTrackTpcSignal, negTrackTpcSignal, float); +DECLARE_SOA_COLUMN(LeadingTrackSign, leadingTrackSign, int); +DECLARE_SOA_COLUMN(SubleadingTrackSign, subleadingTrackSign, int); +DECLARE_SOA_COLUMN(LeadingTrackPt, leadingTrackPt, float); +DECLARE_SOA_COLUMN(SubleadingTrackPt, subleadingTrackPt, float); +DECLARE_SOA_COLUMN(LeadingTrackEta, leadingTrackEta, float); +DECLARE_SOA_COLUMN(SubleadingTrackEta, subleadingTrackEta, float); +DECLARE_SOA_COLUMN(LeadingTrackPhi, leadingTrackPhi, float); +DECLARE_SOA_COLUMN(SubleadingTrackPhi, subleadingTrackPhi, float); +DECLARE_SOA_COLUMN(SubleadingTrackPiPID, subleadingTrackPiPID, float); +DECLARE_SOA_COLUMN(LeadingTrackElPID, leadingTrackElPID, float); +DECLARE_SOA_COLUMN(SubleadingTrackElPID, subleadingTrackElPID, float); +DECLARE_SOA_COLUMN(LeadingTrackKaPID, leadingTrackKaPID, float); +DECLARE_SOA_COLUMN(SubleadingTrackKaPID, subleadingTrackKaPID, float); +DECLARE_SOA_COLUMN(LeadingTrackPrPID, leadingTrackPrPID, float); +DECLARE_SOA_COLUMN(SubleadingTrackPrPID, subleadingTrackPrPID, float); +DECLARE_SOA_COLUMN(LeadingTrackDcaXY, leadingTrackDcaXY, float); +DECLARE_SOA_COLUMN(SubleadingTrackDcaXY, subleadingTrackDcaXY, float); +DECLARE_SOA_COLUMN(LeadingTrackDcaZ, leadingTrackDcaZ, float); +DECLARE_SOA_COLUMN(SubleadingTrackDcaZ, subleadingTrackDcaZ, float); +DECLARE_SOA_COLUMN(LeadingTrackTpcSignal, leadingTrackTpcSignal, float); +DECLARE_SOA_COLUMN(SubleadingTrackTpcSignal, subleadingTrackTpcSignal, float); } // namespace reco_tree DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", reco_tree::RecoSetting, reco_tree::RunNumber, reco_tree::LocalBC, reco_tree::NumContrib, reco_tree::PosX, reco_tree::PosY, reco_tree::PosZ, @@ -101,16 +102,17 @@ DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", reco_tree::TimeFT0A, reco_tree::TimeFT0C, reco_tree::TimeFV0A, reco_tree::TimeFDDA, reco_tree::TimeFDDC, reco_tree::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, reco_tree::NeutronClass, reco_tree::PhiRandom, reco_tree::PhiCharge, - reco_tree::PosTrackSign, reco_tree::NegTrackSign, - reco_tree::PosTrackPt, reco_tree::NegTrackPt, - reco_tree::PosTrackEta, reco_tree::NegTrackEta, - reco_tree::PosTrackPhi, reco_tree::NegTrackPhi, - reco_tree::PosTrackPiPID, reco_tree::NegTrackPiPID, - reco_tree::PosTrackElPID, reco_tree::NegTrackElPID, - reco_tree::PosTrackKaPID, reco_tree::NegTrackKaPID, - reco_tree::PosTrackDcaXY, reco_tree::NegTrackDcaXY, - reco_tree::PosTrackDcaZ, reco_tree::NegTrackDcaZ, - reco_tree::PosTrackTpcSignal, reco_tree::NegTrackTpcSignal); + reco_tree::LeadingTrackSign, reco_tree::SubleadingTrackSign, + reco_tree::LeadingTrackPt, reco_tree::SubleadingTrackPt, + reco_tree::LeadingTrackEta, reco_tree::SubleadingTrackEta, + reco_tree::LeadingTrackPhi, reco_tree::SubleadingTrackPhi, + reco_tree::LeadingTrackPiPID, reco_tree::SubleadingTrackPiPID, + reco_tree::LeadingTrackElPID, reco_tree::SubleadingTrackElPID, + reco_tree::LeadingTrackKaPID, reco_tree::SubleadingTrackKaPID, + reco_tree::LeadingTrackPrPID, reco_tree::SubleadingTrackPrPID, + reco_tree::LeadingTrackDcaXY, reco_tree::SubleadingTrackDcaXY, + reco_tree::LeadingTrackDcaZ, reco_tree::SubleadingTrackDcaZ, + reco_tree::LeadingTrackTpcSignal, reco_tree::SubleadingTrackTpcSignal); namespace mc_tree { @@ -124,23 +126,23 @@ DECLARE_SOA_COLUMN(PosZ, posZ, float); // pion tracks DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); -DECLARE_SOA_COLUMN(PosTrackSign, posTrackSign, int); -DECLARE_SOA_COLUMN(NegTrackSign, negTrackSign, int); -DECLARE_SOA_COLUMN(PosTrackPt, posTrackPt, float); -DECLARE_SOA_COLUMN(NegTrackPt, negTrackPt, float); -DECLARE_SOA_COLUMN(PosTrackEta, posTrackEta, float); -DECLARE_SOA_COLUMN(NegTrackEta, negTrackEta, float); -DECLARE_SOA_COLUMN(PosTrackPhi, posTrackPhi, float); -DECLARE_SOA_COLUMN(NegTrackPhi, negTrackPhi, float); +DECLARE_SOA_COLUMN(LeadingTrackSign, leadingTrackSign, int); +DECLARE_SOA_COLUMN(SubleadingTrackSign, subleadingTrackSign, int); +DECLARE_SOA_COLUMN(LeadingTrackPt, leadingTrackPt, float); +DECLARE_SOA_COLUMN(SubleadingTrackPt, subleadingTrackPt, float); +DECLARE_SOA_COLUMN(LeadingTrackEta, leadingTrackEta, float); +DECLARE_SOA_COLUMN(SubleadingTrackEta, subleadingTrackEta, float); +DECLARE_SOA_COLUMN(LeadingTrackPhi, leadingTrackPhi, float); +DECLARE_SOA_COLUMN(SubleadingTrackPhi, subleadingTrackPhi, float); } // namespace mc_tree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", mc_tree::LocalBc, mc_tree::RunNumber, mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, mc_tree::PhiRandom, mc_tree::PhiCharge, - mc_tree::PosTrackSign, mc_tree::NegTrackSign, - mc_tree::PosTrackPt, mc_tree::NegTrackPt, - mc_tree::PosTrackEta, mc_tree::NegTrackEta, - mc_tree::PosTrackPhi, mc_tree::NegTrackPhi); + mc_tree::LeadingTrackSign, mc_tree::SubleadingTrackSign, + mc_tree::LeadingTrackPt, mc_tree::SubleadingTrackPt, + mc_tree::LeadingTrackEta, mc_tree::SubleadingTrackEta, + mc_tree::LeadingTrackPhi, mc_tree::SubleadingTrackPhi); } // namespace o2::aod struct UpcRhoAnalysis { @@ -795,37 +797,35 @@ struct UpcRhoAnalysis { } // differentiate leading- and subleading-momentum tracks - auto leadingMomentumTrack = momentum(cutTracks[0].px(), cutTracks[0].py(), cutTracks[0].pz()) > momentum(cutTracks[1].px(), cutTracks[1].py(), cutTracks[1].pz()) ? cutTracks[0] : cutTracks[1]; - auto subleadingMomentumTrack = (leadingMomentumTrack == cutTracks[0]) ? cutTracks[1] : cutTracks[0]; - - auto positiveTrack = cutTracks[0].sign() == 1 ? cutTracks[0] : cutTracks[1]; - auto negativeTrack = cutTracks[0].sign() == -1 ? cutTracks[0] : cutTracks[1]; - - float leadingPt = leadingMomentumTrack.pt(); - float subleadingPt = subleadingMomentumTrack.pt(); - float leadingEta = eta(leadingMomentumTrack.px(), leadingMomentumTrack.py(), leadingMomentumTrack.pz()); - float subleadingEta = eta(subleadingMomentumTrack.px(), subleadingMomentumTrack.py(), subleadingMomentumTrack.pz()); - float leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); - float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); + auto leadingTrack = momentum(cutTracks[0].px(), cutTracks[0].py(), cutTracks[0].pz()) > momentum(cutTracks[1].px(), cutTracks[1].py(), cutTracks[1].pz()) ? cutTracks[0] : cutTracks[1]; + auto subleadingTrack = (leadingTrack == cutTracks[0]) ? cutTracks[1] : cutTracks[0]; + + float leadingPt = leadingTrack.pt(); + float subleadingPt = subleadingTrack.pt(); + float leadingEta = eta(leadingTrack.px(), leadingTrack.py(), leadingTrack.pz()); + float subleadingEta = eta(subleadingTrack.px(), subleadingTrack.py(), subleadingTrack.pz()); + float leadingPhi = phi(leadingTrack.px(), leadingTrack.py()); + float subleadingPhi = phi(subleadingTrack.px(), subleadingTrack.py()); float phiRandom = getPhiRandom(cutTracksLVs); float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); // fill recoTree recoTree(collision.flags(), collision.runNumber(), collision.globalBC() % o2::constants::lhc::LHCMaxBunches, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), - energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, - phiRandom, phiCharge, - positiveTrack.sign(), negativeTrack.sign(), - positiveTrack.pt(), negativeTrack.pt(), - eta(positiveTrack.px(), positiveTrack.py(), positiveTrack.pz()), eta(negativeTrack.px(), negativeTrack.py(), negativeTrack.pz()), - phi(positiveTrack.px(), positiveTrack.py()), phi(negativeTrack.px(), negativeTrack.py()), - positiveTrack.tpcNSigmaPi(), negativeTrack.tpcNSigmaPi(), - positiveTrack.tpcNSigmaEl(), negativeTrack.tpcNSigmaEl(), - positiveTrack.tpcNSigmaKa(), negativeTrack.tpcNSigmaKa(), - positiveTrack.dcaXY(), negativeTrack.dcaXY(), - positiveTrack.dcaZ(), negativeTrack.dcaZ(), - positiveTrack.tpcSignal(), negativeTrack.tpcSignal()); + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, + phiRandom, phiCharge, + leadingTrack.sign(), subleadingTrack.sign(), + leadingPt, subleadingPt, + leadingEta, subleadingEta, + leadingPhi, subleadingPhi, + leadingTrack.tpcNSigmaPi(), subleadingTrack.tpcNSigmaPi(), + leadingTrack.tpcNSigmaEl(), subleadingTrack.tpcNSigmaEl(), + leadingTrack.tpcNSigmaKa(), subleadingTrack.tpcNSigmaKa(), + leadingTrack.tpcNSigmaPr(), subleadingTrack.tpcNSigmaPr(), + leadingTrack.dcaXY(), subleadingTrack.dcaXY(), + leadingTrack.dcaZ(), subleadingTrack.dcaZ(), + leadingTrack.tpcSignal(), subleadingTrack.tpcSignal()); if (!tracksPassPID(cutTracks)) // apply PID cut return; @@ -835,7 +835,7 @@ struct UpcRhoAnalysis { rQC.fill(HIST("QC/tracks/hSelectionCounterPerRun"), 16, runIndex); fillTrackQcHistos<1>(cutTrack); // fill QC histograms after cuts } - rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); + rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingTrack.hasTOF(), subleadingTrack.hasTOF()); fillCollisionQcHistos<1>(collision); // fill QC histograms after track selections ROOT::Math::PxPyPzMVector system = reconstructSystem(cutTracksLVs); @@ -983,11 +983,11 @@ struct UpcRhoAnalysis { float phiRandom = getPhiRandom(mcParticlesLVs); float phiCharge = getPhiChargeMC(cutMcParticles, mcParticlesLVs); - auto leadingMomentumPion = momentum(cutMcParticles[0].px(), cutMcParticles[0].py(), cutMcParticles[0].pz()) > momentum(cutMcParticles[1].px(), cutMcParticles[1].py(), cutMcParticles[1].pz()) ? cutMcParticles[0] : cutMcParticles[1]; - auto subleadingMomentumPion = (leadingMomentumPion == cutMcParticles[0]) ? cutMcParticles[1] : cutMcParticles[0]; - rMC.fill(HIST("MC/tracks/hPt"), pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - rMC.fill(HIST("MC/tracks/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); - rMC.fill(HIST("MC/tracks/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); + auto leadingPion = momentum(cutMcParticles[0].px(), cutMcParticles[0].py(), cutMcParticles[0].pz()) > momentum(cutMcParticles[1].px(), cutMcParticles[1].py(), cutMcParticles[1].pz()) ? cutMcParticles[0] : cutMcParticles[1]; + auto subleadingPion = (leadingPion == cutMcParticles[0]) ? cutMcParticles[1] : cutMcParticles[0]; + rMC.fill(HIST("MC/tracks/hPt"), pt(leadingPion.px(), leadingPion.py()), pt(subleadingPion.px(), subleadingPion.py())); + rMC.fill(HIST("MC/tracks/hEta"), eta(leadingPion.px(), leadingPion.py(), leadingPion.pz()), eta(subleadingPion.px(), subleadingPion.py(), subleadingPion.pz())); + rMC.fill(HIST("MC/tracks/hPhi"), phi(leadingPion.px(), leadingPion.py()), phi(subleadingPion.px(), subleadingPion.py())); rMC.fill(HIST("MC/system/hM"), mass); rMC.fill(HIST("MC/system/hPt"), pT); @@ -1014,15 +1014,13 @@ struct UpcRhoAnalysis { } // fill mcTree - auto positivePion = cutMcParticles[0].pdgCode() > 0 ? cutMcParticles[0] : cutMcParticles[1]; - auto negativePion = cutMcParticles[0].pdgCode() > 0 ? cutMcParticles[1] : cutMcParticles[0]; mcTree(mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches, runNumber, mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), phiRandom, phiCharge, - positivePion.pdgCode() / std::abs(positivePion.pdgCode()), negativePion.pdgCode() / std::abs(negativePion.pdgCode()), - pt(positivePion.px(), positivePion.py()), pt(negativePion.px(), negativePion.py()), - eta(positivePion.px(), positivePion.py(), positivePion.pz()), eta(negativePion.px(), negativePion.py(), negativePion.pz()), - phi(positivePion.px(), positivePion.py()), phi(negativePion.px(), negativePion.py())); + leadingPion.pdgCode() / std::abs(leadingPion.pdgCode()), subleadingPion.pdgCode() / std::abs(subleadingPion.pdgCode()), + pt(leadingPion.px(), leadingPion.py()), pt(subleadingPion.px(), subleadingPion.py()), + eta(leadingPion.px(), leadingPion.py(), leadingPion.pz()), eta(subleadingPion.px(), subleadingPion.py(), subleadingPion.pz()), + phi(leadingPion.px(), leadingPion.py()), phi(subleadingPion.px(), subleadingPion.py())); } template From 7e6c1e6c17349b210d074fd9efe4c0f5bc69a221 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 8 Jan 2026 14:49:57 +0100 Subject: [PATCH 09/10] reduce number of stored values --- PWGUD/Tasks/upcRhoAnalysis.cxx | 62 +++++----------------------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index c62703eeddc..37ec3c41be0 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -49,31 +49,14 @@ namespace reco_tree // event info DECLARE_SOA_COLUMN(RecoSetting, recoSetting, uint16_t); DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -DECLARE_SOA_COLUMN(LocalBC, localBC, int); -DECLARE_SOA_COLUMN(NumContrib, numContrib, int); -DECLARE_SOA_COLUMN(PosX, posX, float); -DECLARE_SOA_COLUMN(PosY, posY, float); DECLARE_SOA_COLUMN(PosZ, posZ, float); -// FIT info -DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); -DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFDDAmplitudeA, totalFDDAmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFDDAmplitudeC, totalFDDAmplitudeC, float); -DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); -DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); -DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); -DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); -DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); // ZDC info DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); -// pion tracks -DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); -DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); +// tracks DECLARE_SOA_COLUMN(LeadingTrackSign, leadingTrackSign, int); DECLARE_SOA_COLUMN(SubleadingTrackSign, subleadingTrackSign, int); DECLARE_SOA_COLUMN(LeadingTrackPt, leadingTrackPt, float); @@ -82,6 +65,7 @@ DECLARE_SOA_COLUMN(LeadingTrackEta, leadingTrackEta, float); DECLARE_SOA_COLUMN(SubleadingTrackEta, subleadingTrackEta, float); DECLARE_SOA_COLUMN(LeadingTrackPhi, leadingTrackPhi, float); DECLARE_SOA_COLUMN(SubleadingTrackPhi, subleadingTrackPhi, float); +DECLARE_SOA_COLUMN(LeadingTrackPiPID, leadingTrackPiPID, float); DECLARE_SOA_COLUMN(SubleadingTrackPiPID, subleadingTrackPiPID, float); DECLARE_SOA_COLUMN(LeadingTrackElPID, leadingTrackElPID, float); DECLARE_SOA_COLUMN(SubleadingTrackElPID, subleadingTrackElPID, float); @@ -89,19 +73,10 @@ DECLARE_SOA_COLUMN(LeadingTrackKaPID, leadingTrackKaPID, float); DECLARE_SOA_COLUMN(SubleadingTrackKaPID, subleadingTrackKaPID, float); DECLARE_SOA_COLUMN(LeadingTrackPrPID, leadingTrackPrPID, float); DECLARE_SOA_COLUMN(SubleadingTrackPrPID, subleadingTrackPrPID, float); -DECLARE_SOA_COLUMN(LeadingTrackDcaXY, leadingTrackDcaXY, float); -DECLARE_SOA_COLUMN(SubleadingTrackDcaXY, subleadingTrackDcaXY, float); -DECLARE_SOA_COLUMN(LeadingTrackDcaZ, leadingTrackDcaZ, float); -DECLARE_SOA_COLUMN(SubleadingTrackDcaZ, subleadingTrackDcaZ, float); -DECLARE_SOA_COLUMN(LeadingTrackTpcSignal, leadingTrackTpcSignal, float); -DECLARE_SOA_COLUMN(SubleadingTrackTpcSignal, subleadingTrackTpcSignal, float); } // namespace reco_tree DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", - reco_tree::RecoSetting, reco_tree::RunNumber, reco_tree::LocalBC, reco_tree::NumContrib, reco_tree::PosX, reco_tree::PosY, reco_tree::PosZ, - reco_tree::TotalFT0AmplitudeA, reco_tree::TotalFT0AmplitudeC, reco_tree::TotalFV0AmplitudeA, reco_tree::TotalFDDAmplitudeA, reco_tree::TotalFDDAmplitudeC, - reco_tree::TimeFT0A, reco_tree::TimeFT0C, reco_tree::TimeFV0A, reco_tree::TimeFDDA, reco_tree::TimeFDDC, + reco_tree::RecoSetting, reco_tree::RunNumber, reco_tree::PosZ, reco_tree::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, reco_tree::NeutronClass, - reco_tree::PhiRandom, reco_tree::PhiCharge, reco_tree::LeadingTrackSign, reco_tree::SubleadingTrackSign, reco_tree::LeadingTrackPt, reco_tree::SubleadingTrackPt, reco_tree::LeadingTrackEta, reco_tree::SubleadingTrackEta, @@ -109,23 +84,14 @@ DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", reco_tree::LeadingTrackPiPID, reco_tree::SubleadingTrackPiPID, reco_tree::LeadingTrackElPID, reco_tree::SubleadingTrackElPID, reco_tree::LeadingTrackKaPID, reco_tree::SubleadingTrackKaPID, - reco_tree::LeadingTrackPrPID, reco_tree::SubleadingTrackPrPID, - reco_tree::LeadingTrackDcaXY, reco_tree::SubleadingTrackDcaXY, - reco_tree::LeadingTrackDcaZ, reco_tree::SubleadingTrackDcaZ, - reco_tree::LeadingTrackTpcSignal, reco_tree::SubleadingTrackTpcSignal); + reco_tree::LeadingTrackPrPID, reco_tree::SubleadingTrackPrPID); namespace mc_tree { // misc event info -DECLARE_SOA_COLUMN(LocalBc, localBc, int); DECLARE_SOA_COLUMN(RunNumber, runNumber, int); -// event vertex -DECLARE_SOA_COLUMN(PosX, posX, float); -DECLARE_SOA_COLUMN(PosY, posY, float); DECLARE_SOA_COLUMN(PosZ, posZ, float); -// pion tracks -DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); -DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); +// tracks DECLARE_SOA_COLUMN(LeadingTrackSign, leadingTrackSign, int); DECLARE_SOA_COLUMN(SubleadingTrackSign, subleadingTrackSign, int); DECLARE_SOA_COLUMN(LeadingTrackPt, leadingTrackPt, float); @@ -136,9 +102,7 @@ DECLARE_SOA_COLUMN(LeadingTrackPhi, leadingTrackPhi, float); DECLARE_SOA_COLUMN(SubleadingTrackPhi, subleadingTrackPhi, float); } // namespace mc_tree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", - mc_tree::LocalBc, mc_tree::RunNumber, - mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, - mc_tree::PhiRandom, mc_tree::PhiCharge, + mc_tree::RunNumber, mc_tree::PosZ, mc_tree::LeadingTrackSign, mc_tree::SubleadingTrackSign, mc_tree::LeadingTrackPt, mc_tree::SubleadingTrackPt, mc_tree::LeadingTrackEta, mc_tree::SubleadingTrackEta, @@ -810,11 +774,8 @@ struct UpcRhoAnalysis { float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); // fill recoTree - recoTree(collision.flags(), collision.runNumber(), collision.globalBC() % o2::constants::lhc::LHCMaxBunches, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + recoTree(collision.flags(), collision.runNumber(), collision.posZ(), energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, - phiRandom, phiCharge, leadingTrack.sign(), subleadingTrack.sign(), leadingPt, subleadingPt, leadingEta, subleadingEta, @@ -822,10 +783,7 @@ struct UpcRhoAnalysis { leadingTrack.tpcNSigmaPi(), subleadingTrack.tpcNSigmaPi(), leadingTrack.tpcNSigmaEl(), subleadingTrack.tpcNSigmaEl(), leadingTrack.tpcNSigmaKa(), subleadingTrack.tpcNSigmaKa(), - leadingTrack.tpcNSigmaPr(), subleadingTrack.tpcNSigmaPr(), - leadingTrack.dcaXY(), subleadingTrack.dcaXY(), - leadingTrack.dcaZ(), subleadingTrack.dcaZ(), - leadingTrack.tpcSignal(), subleadingTrack.tpcSignal()); + leadingTrack.tpcNSigmaPr(), subleadingTrack.tpcNSigmaPr()); if (!tracksPassPID(cutTracks)) // apply PID cut return; @@ -1014,9 +972,7 @@ struct UpcRhoAnalysis { } // fill mcTree - mcTree(mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches, runNumber, - mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), - phiRandom, phiCharge, + mcTree(runNumber, mcCollision.posZ(), leadingPion.pdgCode() / std::abs(leadingPion.pdgCode()), subleadingPion.pdgCode() / std::abs(subleadingPion.pdgCode()), pt(leadingPion.px(), leadingPion.py()), pt(subleadingPion.px(), subleadingPion.py()), eta(leadingPion.px(), leadingPion.py(), leadingPion.pz()), eta(subleadingPion.px(), subleadingPion.py(), subleadingPion.pz()), From c36a73a8f592a14195b0e52f1edd44d752cce19f Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 8 Jan 2026 15:11:12 +0100 Subject: [PATCH 10/10] resolve conflict --- PWGUD/Tasks/upcRhoAnalysis.cxx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 37ec3c41be0..6aa5c7ad47a 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -775,15 +775,15 @@ struct UpcRhoAnalysis { // fill recoTree recoTree(collision.flags(), collision.runNumber(), collision.posZ(), - energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, - leadingTrack.sign(), subleadingTrack.sign(), - leadingPt, subleadingPt, - leadingEta, subleadingEta, - leadingPhi, subleadingPhi, - leadingTrack.tpcNSigmaPi(), subleadingTrack.tpcNSigmaPi(), - leadingTrack.tpcNSigmaEl(), subleadingTrack.tpcNSigmaEl(), - leadingTrack.tpcNSigmaKa(), subleadingTrack.tpcNSigmaKa(), - leadingTrack.tpcNSigmaPr(), subleadingTrack.tpcNSigmaPr()); + energyCommonZNA, energyCommonZNC, timeZNA, timeZNC, neutronClass, + leadingTrack.sign(), subleadingTrack.sign(), + leadingPt, subleadingPt, + leadingEta, subleadingEta, + leadingPhi, subleadingPhi, + leadingTrack.tpcNSigmaPi(), subleadingTrack.tpcNSigmaPi(), + leadingTrack.tpcNSigmaEl(), subleadingTrack.tpcNSigmaEl(), + leadingTrack.tpcNSigmaKa(), subleadingTrack.tpcNSigmaKa(), + leadingTrack.tpcNSigmaPr(), subleadingTrack.tpcNSigmaPr()); if (!tracksPassPID(cutTracks)) // apply PID cut return;