From 2fd946ff3ad002fbd462926c8a33a57cd19fa829 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Sun, 22 Dec 2024 18:36:25 +0100 Subject: [PATCH 01/14] changed filling global BC in table to local BC --- PWGUD/Tasks/upcRhoAnalysis.cxx | 143 +++++++++++++++++---------------- 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 597f4945a3f..336bb144d8b 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -43,12 +43,12 @@ namespace tree { // misc event info DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -DECLARE_SOA_COLUMN(GlobalBC, globalBC, uint64_t); +DECLARE_SOA_COLUMN(LocalBC, localBC, int); DECLARE_SOA_COLUMN(NumContrib, numContrib, int); // event vertex -DECLARE_SOA_COLUMN(PosX, posX, double); -DECLARE_SOA_COLUMN(PosY, posY, double); -DECLARE_SOA_COLUMN(PosZ, posZ, double); +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); @@ -69,29 +69,29 @@ DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); // Rhos DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); // store things for reconstruction of lorentz vectors -DECLARE_SOA_COLUMN(RhoPt, rhoPt, double); -DECLARE_SOA_COLUMN(RhoEta, rhoEta, double); -DECLARE_SOA_COLUMN(RhoPhi, rhoPhi, double); -DECLARE_SOA_COLUMN(RhoM, rhoM, double); +DECLARE_SOA_COLUMN(RhoPt, rhoPt, float); +DECLARE_SOA_COLUMN(RhoEta, rhoEta, float); +DECLARE_SOA_COLUMN(RhoPhi, rhoPhi, float); +DECLARE_SOA_COLUMN(RhoM, rhoM, float); // other stuff -DECLARE_SOA_COLUMN(RhoPhiRandom, rhoPhiRandom, double); -DECLARE_SOA_COLUMN(RhoPhiCharge, rhoPhiCharge, double); +DECLARE_SOA_COLUMN(RhoPhiRandom, rhoPhiRandom, float); +DECLARE_SOA_COLUMN(RhoPhiCharge, rhoPhiCharge, float); // Pion tracks DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); // for lorentz vector reconstruction -DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); -DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); // other stuff -DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, std::vector); -DECLARE_SOA_COLUMN(TrackElPID, trackElPID, std::vector); -DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, std::vector); -DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, std::vector); -DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, std::vector); +DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, std::vector); +DECLARE_SOA_COLUMN(TrackElPID, trackElPID, std::vector); +DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, std::vector); +DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, std::vector); +DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, std::vector); } // namespace tree DECLARE_SOA_TABLE(Tree, "AOD", "TREE", - tree::RunNumber, tree::GlobalBC, tree::NumContrib, + tree::RunNumber, tree::LocalBC, tree::NumContrib, tree::PosX, tree::PosY, tree::PosZ, tree::TotalFT0AmplitudeA, tree::TotalFT0AmplitudeC, tree::TotalFV0AmplitudeA, tree::TotalFDDAmplitudeA, tree::TotalFDDAmplitudeC, tree::TimeFT0A, tree::TimeFT0C, tree::TimeFV0A, tree::TimeFDDA, tree::TimeFDDC, tree::EnergyCommonZNA, tree::EnergyCommonZNC, tree::TimeZNA, tree::TimeZNC, tree::NeutronClass, @@ -102,29 +102,29 @@ DECLARE_SOA_TABLE(Tree, "AOD", "TREE", struct upcRhoAnalysis { Produces Tree; - double PcEtaCut = 0.9; // physics coordination recommendation + float PcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; Configurable do4pi{"do4pi", true, "do 4pi analysis"}; - Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; - Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; - Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; + Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; + Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; + Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; - Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; - Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; + Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; + Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; Configurable tracksMinItsNClsCut{"tracksMinItsNClsCut", 6, "min ITS clusters cut"}; - Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; + Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; Configurable tracksMinTpcNClsCut{"tracksMinTpcNClsCut", 120, "min TPC clusters cut"}; Configurable tracksMinTpcNClsCrossedRowsCut{"tracksMinTpcNClsCrossedRowsCut", 140, "min TPC crossed rows cut"}; - Configurable tracksMinTpcChi2NClCut{"tracksMinTpcChi2NClCut", 1.0, "min TPC chi2/Ncls cut"}; - Configurable tracksMaxTpcChi2NClCut{"tracksMaxTpcChi2NClCut", 1.8, "max TPC chi2/Ncls cut"}; - Configurable tracksMinTpcNClsCrossedOverFindableCut{"tracksMinTpcNClsCrossedOverFindableCut", 1.05, "min TPC crossed rows / findable clusters cut"}; - Configurable tracksMinPtCut{"tracksMinPtCut", 0.2, "min pT cut on tracks"}; + Configurable tracksMinTpcChi2NClCut{"tracksMinTpcChi2NClCut", 1.0, "min TPC chi2/Ncls cut"}; + Configurable tracksMaxTpcChi2NClCut{"tracksMaxTpcChi2NClCut", 1.8, "max TPC chi2/Ncls cut"}; + Configurable tracksMinTpcNClsCrossedOverFindableCut{"tracksMinTpcNClsCrossedOverFindableCut", 1.05, "min TPC crossed rows / findable clusters cut"}; + Configurable tracksMinPtCut{"tracksMinPtCut", 0.2, "min pT cut on tracks"}; - Configurable systemMassMinCut{"systemMassMinCut", 0.4, "min M cut for reco system"}; - Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; - Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; - Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; + Configurable systemMassMinCut{"systemMassMinCut", 0.4, "min M cut for reco system"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; + Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; + Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; ConfigurableAxis mCutAxis{"mCutAxis", {160, 0.4, 1.2}, "m (GeV/#it{c}^{2})"}; @@ -205,7 +205,7 @@ struct upcRhoAnalysis { "TPC crossed rows/N_{clusters}", "TOF requirement", "p_{T}", "DCA", "#eta", "exactly 2 tracks", "PID"}; - auto hSelectionCounter = QC.add("QC/tracks/hSelectionCounter", ";;counts", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); + auto hSelectionCounter = QC.add("QC/tracks/hSelectionCounter", ";;counts", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); for (int i = 0; i < static_cast(selectionCounterLabels.size()); ++i) hSelectionCounter->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); // TOF hit check @@ -550,7 +550,7 @@ struct upcRhoAnalysis { template bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut { - double radius = 0.0; + float radius = 0.0; for (const auto& track : cutTracks) radius += std::pow(track.tpcNSigmaPi(), 2); return radius < std::pow(tracksTpcNSigmaPiCut, 2); @@ -593,7 +593,7 @@ struct upcRhoAnalysis { return system; } - double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy + float getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy { // two possible definitions of phi: randomize the tracks std::vector indices = {0, 1}; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed @@ -607,7 +607,7 @@ struct upcRhoAnalysis { } template - double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) + float getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) { // two possible definitions of phi: charge-based assignment TLorentzVector pOne, pTwo; pOne = (cutTracks[0].sign() > 0) ? cutTracks4Vecs[0] : cutTracks4Vecs[1]; @@ -618,7 +618,7 @@ struct upcRhoAnalysis { } template - double getPhiChargeMC(const T& cutTracks, const std::vector& cutTracks4Vecs) + float getPhiChargeMC(const T& cutTracks, const std::vector& cutTracks4Vecs) { // the same as for data but using pdg code instead of charge TLorentzVector pOne, pTwo; pOne = (cutTracks[0].pdgCode() > 0) ? cutTracks4Vecs[0] : cutTracks4Vecs[1]; @@ -677,7 +677,7 @@ struct upcRhoAnalysis { std::vector cutTracks4Vecs; for (const auto& track : tracks) { - // double p = momentum(track.px(), track.py(), track.pz()); + // float p = momentum(track.px(), track.py(), track.pz()); QC.fill(HIST("QC/tracks/raw/hPt"), track.pt()); QC.fill(HIST("QC/tracks/raw/hEta"), eta(track.px(), track.py(), track.pz())); QC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); @@ -711,11 +711,11 @@ struct upcRhoAnalysis { // reonstruct system and calculate total charge, save commonly used values into variables TLorentzVector system = reconstructSystem(cutTracks4Vecs); int totalCharge = tracksTotalCharge(cutTracks); - double mass = system.M(); - double pT = system.Pt(); - double pTsquare = pT * pT; - double rapidity = system.Rapidity(); - double systemPhi = system.Phi() + o2::constants::math::PI; + float mass = system.M(); + float pT = system.Pt(); + float pTsquare = pT * pT; + float rapidity = system.Rapidity(); + float systemPhi = system.Phi() + o2::constants::math::PI; if (do4pi && cutTracks.size() == 4 && totalCharge == 0) { // fill out some 4pi QC histograms @@ -744,33 +744,34 @@ struct upcRhoAnalysis { for (int i = 0; i < static_cast(cutTracks.size()); i++) QC.fill(HIST("QC/tracks/hSelectionCounter"), 15); - double phiRandom = getPhiRandom(cutTracks4Vecs); - double phiCharge = getPhiCharge(cutTracks, cutTracks4Vecs); + float phiRandom = getPhiRandom(cutTracks4Vecs); + float phiCharge = getPhiCharge(cutTracks, cutTracks4Vecs); // 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]; - double leadingPt = leadingMomentumTrack.pt(); - double subleadingPt = subleadingMomentumTrack.pt(); - double leadingEta = eta(leadingMomentumTrack.px(), leadingMomentumTrack.py(), leadingMomentumTrack.pz()); - double subleadingEta = eta(subleadingMomentumTrack.px(), subleadingMomentumTrack.py(), subleadingMomentumTrack.pz()); - double leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); - double subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); + 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()); // fill TOF hit checker QC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); // fill tree + int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; std::vector trackSigns = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; - std::vector trackPts = {leadingPt, subleadingPt}; - std::vector trackEtas = {leadingEta, subleadingEta}; - std::vector trackPhis = {leadingPhi, subleadingPhi}; - std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; - std::vector trackPiPIDs = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; - std::vector trackElPIDs = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; - std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; - std::vector trackDcaZs = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; - std::vector trackTpcSignals = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; - Tree(collision.runNumber(), collision.globalBC(), collision.numContrib(), + std::vector trackPts = {leadingPt, subleadingPt}; + std::vector trackEtas = {leadingEta, subleadingEta}; + std::vector trackPhis = {leadingPhi, subleadingPhi}; + std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; + std::vector trackPiPIDs = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; + std::vector trackElPIDs = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; + std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; + std::vector trackDcaZs = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; + std::vector trackTpcSignals = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; + Tree(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(), @@ -1087,11 +1088,11 @@ struct upcRhoAnalysis { return; TLorentzVector system = reconstructSystem(mcParticles4Vecs); - double mass = system.M(); - double pT = system.Pt(); - double pTsquare = pT * pT; - double rapidity = system.Rapidity(); - double systemPhi = system.Phi() + o2::constants::math::PI; + float mass = system.M(); + float pT = system.Pt(); + float pTsquare = pT * pT; + float rapidity = system.Rapidity(); + float systemPhi = system.Phi() + o2::constants::math::PI; if (do4pi && cutMcParticles.size() == 4) { for (int i = 0; i < static_cast(cutMcParticles.size()); i++) { @@ -1114,8 +1115,8 @@ struct upcRhoAnalysis { MC.fill(HIST("MC/tracks/pions/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); MC.fill(HIST("MC/tracks/pions/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - double phiRandom = getPhiRandom(mcParticles4Vecs); - double phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); + float phiRandom = getPhiRandom(mcParticles4Vecs); + float phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); MC.fill(HIST("MC/system/hM"), mass); MC.fill(HIST("MC/system/hPt"), pT); From 5c05e797cfef046d2f6b5c5de4c0c9f87df48e42 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 30 Jan 2025 20:30:55 +0100 Subject: [PATCH 02/14] changed system eta to system y in tree --- PWGUD/Tasks/upcRhoAnalysis.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 336bb144d8b..9ced55c7e59 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -70,7 +70,7 @@ DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); // store things for reconstruction of lorentz vectors DECLARE_SOA_COLUMN(RhoPt, rhoPt, float); -DECLARE_SOA_COLUMN(RhoEta, rhoEta, float); +DECLARE_SOA_COLUMN(RhoY, rhoY, float); DECLARE_SOA_COLUMN(RhoPhi, rhoPhi, float); DECLARE_SOA_COLUMN(RhoM, rhoM, float); // other stuff @@ -95,7 +95,7 @@ DECLARE_SOA_TABLE(Tree, "AOD", "TREE", tree::PosX, tree::PosY, tree::PosZ, tree::TotalFT0AmplitudeA, tree::TotalFT0AmplitudeC, tree::TotalFV0AmplitudeA, tree::TotalFDDAmplitudeA, tree::TotalFDDAmplitudeC, tree::TimeFT0A, tree::TimeFT0C, tree::TimeFV0A, tree::TimeFDDA, tree::TimeFDDC, tree::EnergyCommonZNA, tree::EnergyCommonZNC, tree::TimeZNA, tree::TimeZNC, tree::NeutronClass, - tree::TotalCharge, tree::RhoPt, tree::RhoEta, tree::RhoPhi, tree::RhoM, tree::RhoPhiRandom, tree::RhoPhiCharge, + tree::TotalCharge, tree::RhoPt, tree::RhoY, tree::RhoPhi, tree::RhoM, tree::RhoPhiRandom, tree::RhoPhiCharge, tree::TrackSign, tree::TrackPt, tree::TrackEta, tree::TrackPhi, tree::TrackM, tree::TrackPiPID, tree::TrackElPID, tree::TrackDcaXY, tree::TrackDcaZ, tree::TrackTpcSignal); } // namespace o2::aod @@ -776,7 +776,7 @@ struct upcRhoAnalysis { collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), neutronClass, - totalCharge, pT, system.Eta(), system.Phi(), mass, phiRandom, phiCharge, + totalCharge, pT, rapidity, system.Phi(), mass, phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackMs, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); // fill raw histograms according to the total charge switch (totalCharge) { From 6e1652a550073c6442a1212cdd8af6a97567ebb4 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Mon, 3 Feb 2025 14:40:54 +0100 Subject: [PATCH 03/14] baseline for electron PID, unify qc histograms --- PWGUD/Tasks/upcRhoAnalysis.cxx | 46 +++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 9ced55c7e59..51fddd1ba61 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -105,12 +105,14 @@ struct upcRhoAnalysis { float PcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; Configurable do4pi{"do4pi", true, "do 4pi analysis"}; + Configurable doElectrons{"doElectrons", true, "do analysis with PIDed electrons"}; Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; + Configurable tracksTpcNSigmaElCut{"tracksTpcNSigmaElCut", 3.0, "TPC nSigma electron cut"}; Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; Configurable tracksMinItsNClsCut{"tracksMinItsNClsCut", 6, "min ITS clusters cut"}; Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; @@ -142,6 +144,7 @@ struct upcRhoAnalysis { HistogramRegistry QC{"QC", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry Pions{"Pions", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry Electrons{"Electrons", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry System{"System", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry MC{"MC", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry FourPiQA{"4piQA", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -183,7 +186,6 @@ struct upcRhoAnalysis { QC.add("QC/collisions/selected/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); // all tracks QC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma_{#pi};counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/raw/hTofNSigmaPi", ";TOF n#sigma_{#pi};counts", kTH1D, {{400, -20.0, 20.0}}); QC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma_{e};counts", kTH1D, {{400, -10.0, 30.0}}); QC.add("QC/tracks/raw/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); QC.add("QC/tracks/raw/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); @@ -191,10 +193,14 @@ struct upcRhoAnalysis { QC.add("QC/tracks/raw/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); QC.add("QC/tracks/raw/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); QC.add("QC/tracks/raw/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); + QC.add("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable", ";TPC crossed rows/findable N_{cls};counts", kTH1D, {{100, 0.0, 10.0}}); QC.add("QC/tracks/raw/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); QC.add("QC/tracks/raw/hEta", ";y;counts", kTH1D, {etaAxis}); - QC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); // tracks passing selections + QC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + // tracks passing selections + QC.add("QC/tracks/cut/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); QC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + QC.add("QC/tracks/cut/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); QC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); QC.add("QC/tracks/cut/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); QC.add("QC/tracks/cut/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); @@ -219,13 +225,28 @@ struct upcRhoAnalysis { Pions.add("pions/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); Pions.add("pions/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); Pions.add("pions/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - // selected + // from selected systems Pions.add("pions/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); Pions.add("pions/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); Pions.add("pions/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); Pions.add("pions/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); Pions.add("pions/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); Pions.add("pions/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + // ELECTRONS + // no selection + Electrons.add("electrons/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + Electrons.add("electrons/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + Electrons.add("electrons/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + Electrons.add("electrons/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + Electrons.add("electrons/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + Electrons.add("electrons/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + // from selected systems + Electrons.add("electrons/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + Electrons.add("electrons/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + Electrons.add("electrons/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + Electrons.add("electrons/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + Electrons.add("electrons/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + Electrons.add("electrons/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); // RAW RHOS System.add("system/raw/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); @@ -548,7 +569,7 @@ struct upcRhoAnalysis { } template - bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut + bool tracksPassPiPID(const T& cutTracks) // n-dimensional pion PID cut { float radius = 0.0; for (const auto& track : cutTracks) @@ -556,6 +577,15 @@ struct upcRhoAnalysis { return radius < std::pow(tracksTpcNSigmaPiCut, 2); } + template + bool tracksPassElPID(const T& cutTracks) // n-dimensional electron PID cut + { + float radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaEl(), 2); + return radius < std::pow(tracksTpcNSigmaElCut, 2); + } + template int tracksTotalCharge(const T& cutTracks) // total charge of selected tracks { @@ -677,12 +707,12 @@ struct upcRhoAnalysis { std::vector cutTracks4Vecs; for (const auto& track : tracks) { + QC.fill(HIST("QC/tracks/hSelectionCounter"), 0); // float p = momentum(track.px(), track.py(), track.pz()); QC.fill(HIST("QC/tracks/raw/hPt"), track.pt()); QC.fill(HIST("QC/tracks/raw/hEta"), eta(track.px(), track.py(), track.pz())); QC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); QC.fill(HIST("QC/tracks/raw/hTpcNSigmaPi"), track.tpcNSigmaPi()); - QC.fill(HIST("QC/tracks/raw/hTofNSigmaPi"), track.tofNSigmaPi()); QC.fill(HIST("QC/tracks/raw/hTpcNSigmaEl"), track.tpcNSigmaEl()); QC.fill(HIST("QC/tracks/raw/hDcaXYZ"), track.dcaZ(), track.dcaXY()); QC.fill(HIST("QC/tracks/raw/hItsNCls"), track.itsNCls()); @@ -690,7 +720,7 @@ struct upcRhoAnalysis { QC.fill(HIST("QC/tracks/raw/hTpcChi2NCl"), track.tpcChi2NCl()); QC.fill(HIST("QC/tracks/raw/hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); QC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); - QC.fill(HIST("QC/tracks/hSelectionCounter"), 0); + QC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); if (!trackPassesCuts(track)) continue; @@ -699,6 +729,8 @@ struct upcRhoAnalysis { TLorentzVector track4Vec; track4Vec.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass cutTracks4Vecs.push_back(track4Vec); + QC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi"), track.tpcNSigmaPi()); + QC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl"), track.tpcNSigmaEl()); QC.fill(HIST("QC/tracks/cut/hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); QC.fill(HIST("QC/tracks/cut/hTpcSignalVsPt"), track.pt(), track.tpcSignal()); QC.fill(HIST("QC/tracks/cut/hDcaXYZ"), track.dcaZ(), track.dcaXY()); @@ -756,6 +788,7 @@ struct upcRhoAnalysis { float subleadingEta = eta(subleadingMomentumTrack.px(), subleadingMomentumTrack.py(), subleadingMomentumTrack.pz()); float leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); + // fill TOF hit checker QC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); @@ -778,6 +811,7 @@ struct upcRhoAnalysis { collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), neutronClass, totalCharge, pT, rapidity, system.Phi(), mass, phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackMs, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); + // fill raw histograms according to the total charge switch (totalCharge) { case 0: From 21abdcb5aa36e1d5f27a19f955d031ff55af0867 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 5 Feb 2025 15:28:11 +0100 Subject: [PATCH 04/14] added derived data table for MC --- PWGUD/Tasks/upcRhoAnalysis.cxx | 88 ++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 15 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 51fddd1ba61..c7c2507560f 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -13,6 +13,7 @@ /// includes event tagging based on ZN information, track selection, reconstruction, /// and also some basic stuff for decay phi anisotropy studies /// \author Jakub Juracka, jakub.juracka@cern.ch +/// \file ? #include #include @@ -39,7 +40,7 @@ using FullUdTracks = soa::Join); DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, std::vector); DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, std::vector); DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, std::vector); -} // namespace tree -DECLARE_SOA_TABLE(Tree, "AOD", "TREE", - tree::RunNumber, tree::LocalBC, tree::NumContrib, - tree::PosX, tree::PosY, tree::PosZ, tree::TotalFT0AmplitudeA, tree::TotalFT0AmplitudeC, tree::TotalFV0AmplitudeA, tree::TotalFDDAmplitudeA, tree::TotalFDDAmplitudeC, - tree::TimeFT0A, tree::TimeFT0C, tree::TimeFV0A, tree::TimeFDDA, tree::TimeFDDC, - tree::EnergyCommonZNA, tree::EnergyCommonZNC, tree::TimeZNA, tree::TimeZNC, tree::NeutronClass, - tree::TotalCharge, tree::RhoPt, tree::RhoY, tree::RhoPhi, tree::RhoM, tree::RhoPhiRandom, tree::RhoPhiCharge, - tree::TrackSign, tree::TrackPt, tree::TrackEta, tree::TrackPhi, tree::TrackM, tree::TrackPiPID, tree::TrackElPID, tree::TrackDcaXY, tree::TrackDcaZ, tree::TrackTpcSignal); +} // namespace recoTree +DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", + recoTree::RunNumber, recoTree::LocalBC, recoTree::NumContrib, + recoTree::PosX, recoTree::PosY, recoTree::PosZ, recoTree::TotalFT0AmplitudeA, recoTree::TotalFT0AmplitudeC, recoTree::TotalFV0AmplitudeA, recoTree::TotalFDDAmplitudeA, recoTree::TotalFDDAmplitudeC, + recoTree::TimeFT0A, recoTree::TimeFT0C, recoTree::TimeFV0A, recoTree::TimeFDDA, recoTree::TimeFDDC, + recoTree::EnergyCommonZNA, recoTree::EnergyCommonZNC, recoTree::TimeZNA, recoTree::TimeZNC, recoTree::NeutronClass, + recoTree::TotalCharge, recoTree::RhoPt, recoTree::RhoY, recoTree::RhoPhi, recoTree::RhoM, recoTree::RhoPhiRandom, recoTree::RhoPhiCharge, + recoTree::TrackSign, recoTree::TrackPt, recoTree::TrackEta, recoTree::TrackPhi, recoTree::TrackM, recoTree::TrackPiPID, recoTree::TrackElPID, recoTree::TrackDcaXY, recoTree::TrackDcaZ, recoTree::TrackTpcSignal); + +namespace mcTree +{ +// misc event info +DECLARE_SOA_COLUMN(LocalBc, localBc, int); +// event vertex +DECLARE_SOA_COLUMN(PosX, posX, float); +DECLARE_SOA_COLUMN(PosY, posY, float); +DECLARE_SOA_COLUMN(PosZ, posZ, float); +// rho lorentz vector reconstruction +DECLARE_SOA_COLUMN(RhoPt, rhoPt, float); +DECLARE_SOA_COLUMN(RhoY, rhoY, float); +DECLARE_SOA_COLUMN(RhoPhi, rhoPhi, float); +DECLARE_SOA_COLUMN(RhoM, rhoM, float); +// other stuff +DECLARE_SOA_COLUMN(RhoPhiRandom, rhoPhiRandom, float); +DECLARE_SOA_COLUMN(RhoPhiCharge, rhoPhiCharge, float); +// Pion tracks +DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); +// for lorentz vector reconstruction +DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +} // namespace mcTree +DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", + mcTree::LocalBc, + mcTree::PosX, mcTree::PosY, mcTree::PosZ, mcTree::RhoPt, mcTree::RhoY, mcTree::RhoPhi, mcTree::RhoM, mcTree::RhoPhiRandom, mcTree::RhoPhiCharge, + mcTree::TrackSign, mcTree::TrackPt, mcTree::TrackEta, mcTree::TrackPhi, mcTree::TrackM); } // namespace o2::aod struct upcRhoAnalysis { - Produces Tree; + Produces RecoTree; + Produces McTree; float PcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; @@ -108,6 +139,7 @@ struct upcRhoAnalysis { Configurable doElectrons{"doElectrons", true, "do analysis with PIDed electrons"}; Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; + Configurable collisionsNumContribsMaxCut{"collisionsNumContribsMaxCut", 7, "max number of contributors cut on collisions"}; Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; @@ -140,6 +172,8 @@ struct upcRhoAnalysis { ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; + ConfigurableAxis znCommonEnergyAxis{"znCommonEnergyAxis", {250, -5.0, 20.0}, "ZN common energy (TeV)"}; + ConfigurableAxis znTimeAxis{"znTimeAxis", {200, -10.0, 10.0}, "ZN time (ns)"}; // ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; HistogramRegistry QC{"QC", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -156,8 +190,8 @@ struct upcRhoAnalysis { QC.add("QC/collisions/all/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); QC.add("QC/collisions/all/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); QC.add("QC/collisions/all/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - QC.add("QC/collisions/all/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); - QC.add("QC/collisions/all/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); + QC.add("QC/collisions/all/hZdcCommonEnergy", ";ZNA common energy (TeV);ZNC common energy (TeV);counts", kTH2D, {znCommonEnergyAxis, znCommonEnergyAxis}); + QC.add("QC/collisions/all/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {znTimeAxis, znTimeAxis}); QC.add("QC/collisions/all/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); QC.add("QC/collisions/all/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); QC.add("QC/collisions/all/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); @@ -172,6 +206,7 @@ struct upcRhoAnalysis { QC.add("QC/collisions/selected/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); QC.add("QC/collisions/selected/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); QC.add("QC/collisions/selected/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); + QC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); QC.add("QC/collisions/selected/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); QC.add("QC/collisions/selected/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); QC.add("QC/collisions/selected/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); @@ -510,6 +545,16 @@ struct upcRhoAnalysis { } } + template + bool collisionPassesCuts(const C& collision) // collision cuts + { + if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + return false; + // if (collision.numContrib() > collisionsNumContribsMaxCut) + // return false; + return true; + } + template bool trackPassesCuts(const T& track) // track cuts (PID done separately) { @@ -679,7 +724,7 @@ struct upcRhoAnalysis { QC.fill(HIST("QC/collisions/all/hTimeFDDC"), collision.timeFDDC()); // vertex z-position cut - if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + if (!collisionPassesCuts(collision)) return; // event tagging @@ -702,6 +747,7 @@ struct upcRhoAnalysis { XnXn = true; neutronClass = 3; } + // vectors for storing selected tracks and their 4-vectors std::vector cutTracks; std::vector cutTracks4Vecs; @@ -792,7 +838,7 @@ struct upcRhoAnalysis { // fill TOF hit checker QC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); - // fill tree + // fill recoTree int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; std::vector trackSigns = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; std::vector trackPts = {leadingPt, subleadingPt}; @@ -804,7 +850,7 @@ struct upcRhoAnalysis { std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; std::vector trackDcaZs = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; std::vector trackTpcSignals = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; - Tree(collision.runNumber(), localBc, collision.numContrib(), + RecoTree(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(), @@ -823,6 +869,7 @@ struct upcRhoAnalysis { System.fill(HIST("system/raw/unlike-sign/hPtVsM"), mass, pT); System.fill(HIST("system/raw/unlike-sign/hY"), rapidity); System.fill(HIST("system/raw/unlike-sign/hPhi"), systemPhi); + QC.fill(HIST("QC/collisions/selected/hNumContribVsSystemPt"), pT, collision.numContrib()); break; case 2: @@ -1160,6 +1207,17 @@ struct upcRhoAnalysis { MC.fill(HIST("MC/system/hPhi"), systemPhi); MC.fill(HIST("MC/system/hPhiRandom"), phiRandom); MC.fill(HIST("MC/system/hPhiCharge"), phiCharge); + + // fill mcTree + int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; + std::vector trackSigns = {leadingMomentumPion.pdgCode() / std::abs(leadingMomentumPion.pdgCode()), subleadingMomentumPion.pdgCode() / std::abs(subleadingMomentumPion.pdgCode())}; + std::vector trackPts = {pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; + std::vector trackEtas = {eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())}; + std::vector trackPhis = {phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; + std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; + McTree(localBc, + mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), pT, rapidity, systemPhi, mass, phiRandom, phiCharge, + trackSigns, trackPts, trackEtas, trackPhis, trackMs); } template From 4e2db3fdc96a11a2c80bc583736f21c00c0776ff Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Thu, 6 Feb 2025 11:57:19 +0100 Subject: [PATCH 05/14] some O2 Linter fixes --- PWGUD/Tasks/upcRhoAnalysis.cxx | 1370 ++++++++++++++++---------------- 1 file changed, 687 insertions(+), 683 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index c7c2507560f..19f51a46852 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -40,7 +40,7 @@ using FullUdTracks = soa::Join); DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, std::vector); } // namespace recoTree DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", - recoTree::RunNumber, recoTree::LocalBC, recoTree::NumContrib, - recoTree::PosX, recoTree::PosY, recoTree::PosZ, recoTree::TotalFT0AmplitudeA, recoTree::TotalFT0AmplitudeC, recoTree::TotalFV0AmplitudeA, recoTree::TotalFDDAmplitudeA, recoTree::TotalFDDAmplitudeC, - recoTree::TimeFT0A, recoTree::TimeFT0C, recoTree::TimeFV0A, recoTree::TimeFDDA, recoTree::TimeFDDC, - recoTree::EnergyCommonZNA, recoTree::EnergyCommonZNC, recoTree::TimeZNA, recoTree::TimeZNC, recoTree::NeutronClass, - recoTree::TotalCharge, recoTree::RhoPt, recoTree::RhoY, recoTree::RhoPhi, recoTree::RhoM, recoTree::RhoPhiRandom, recoTree::RhoPhiCharge, - recoTree::TrackSign, recoTree::TrackPt, recoTree::TrackEta, recoTree::TrackPhi, recoTree::TrackM, recoTree::TrackPiPID, recoTree::TrackElPID, recoTree::TrackDcaXY, recoTree::TrackDcaZ, recoTree::TrackTpcSignal); - -namespace mcTree + 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::TotalCharge, reco_tree::RhoPt, reco_tree::RhoY, reco_tree::RhoPhi, reco_tree::RhoM, reco_tree::RhoPhiRandom, reco_tree::RhoPhiCharge, + reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackM, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); + +namespace mc_tree { // misc event info DECLARE_SOA_COLUMN(LocalBc, localBc, int); @@ -124,24 +124,24 @@ DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); } // namespace mcTree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", - mcTree::LocalBc, - mcTree::PosX, mcTree::PosY, mcTree::PosZ, mcTree::RhoPt, mcTree::RhoY, mcTree::RhoPhi, mcTree::RhoM, mcTree::RhoPhiRandom, mcTree::RhoPhiCharge, - mcTree::TrackSign, mcTree::TrackPt, mcTree::TrackEta, mcTree::TrackPhi, mcTree::TrackM); + mc_tree::LocalBc, + mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, mc_tree::RhoPt, mc_tree::RhoY, mc_tree::RhoPhi, mc_tree::RhoM, mc_tree::RhoPhiRandom, mc_tree::RhoPhiCharge, + mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi, mc_tree::TrackM); } // namespace o2::aod struct upcRhoAnalysis { - Produces RecoTree; - Produces McTree; + Produces recoTree; + Produces mcTree; - float PcEtaCut = 0.9; // physics coordination recommendation + float pcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; Configurable do4pi{"do4pi", true, "do 4pi analysis"}; Configurable doElectrons{"doElectrons", true, "do analysis with PIDed electrons"}; Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; Configurable collisionsNumContribsMaxCut{"collisionsNumContribsMaxCut", 7, "max number of contributors cut on collisions"}; - Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; - Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; + Configurable znCommonEnergyCut{"znCommonEnergyCut", 0.0, "ZN common energy cut"}; + Configurable znTimeCut{"znTimeCut", 2.0, "ZN time cut"}; Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; Configurable tracksTpcNSigmaElCut{"tracksTpcNSigmaElCut", 3.0, "TPC nSigma electron cut"}; @@ -176,372 +176,374 @@ struct upcRhoAnalysis { ConfigurableAxis znTimeAxis{"znTimeAxis", {200, -10.0, 10.0}, "ZN time (ns)"}; // ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; - HistogramRegistry QC{"QC", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry Pions{"Pions", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry Electrons{"Electrons", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry System{"System", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry MC{"MC", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry FourPiQA{"4piQA", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rQC{"rQC", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rPions{"rPions", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rElectrons{"rElectrons", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rSystem{"rSystem", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rMC{"rMC", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rFourPiQA{"rFourPiQA", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(o2::framework::InitContext&) { // QA // // collisions - QC.add("QC/collisions/all/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - QC.add("QC/collisions/all/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - QC.add("QC/collisions/all/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - QC.add("QC/collisions/all/hZdcCommonEnergy", ";ZNA common energy (TeV);ZNC common energy (TeV);counts", kTH2D, {znCommonEnergyAxis, znCommonEnergyAxis}); - QC.add("QC/collisions/all/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {znTimeAxis, znTimeAxis}); - QC.add("QC/collisions/all/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); + rQC.add("QC/collisions/all/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); + rQC.add("QC/collisions/all/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); + rQC.add("QC/collisions/all/hZdcCommonEnergy", ";ZNA common energy (TeV);ZNC common energy (TeV);counts", kTH2D, {znCommonEnergyAxis, znCommonEnergyAxis}); + rQC.add("QC/collisions/all/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {znTimeAxis, znTimeAxis}); + rQC.add("QC/collisions/all/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); // events with selected rho candidates - QC.add("QC/collisions/selected/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - QC.add("QC/collisions/selected/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - QC.add("QC/collisions/selected/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - QC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); - QC.add("QC/collisions/selected/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); - QC.add("QC/collisions/selected/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); - QC.add("QC/collisions/selected/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/selected/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); + rQC.add("QC/collisions/selected/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); + rQC.add("QC/collisions/selected/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); + rQC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); + rQC.add("QC/collisions/selected/hNumContribVsSystemY", ";y;number of contributors;counts", kTH2D, {yAxis,{36, -0.5, 35.5}}); + rQC.add("QC/collisions/selected/hNumContribVsSystemM", ";m (GeV/#it{c}^{2});number of contributors;counts", kTH2D, {mAxis,{36, -0.5, 35.5}}); + rQC.add("QC/collisions/selected/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); + rQC.add("QC/collisions/selected/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); + rQC.add("QC/collisions/selected/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/selected/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/selected/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/selected/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/selected/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/selected/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/selected/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/selected/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/selected/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/selected/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); // all tracks - QC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma_{#pi};counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma_{e};counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/raw/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); - QC.add("QC/tracks/raw/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); - QC.add("QC/tracks/raw/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); - QC.add("QC/tracks/raw/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); - QC.add("QC/tracks/raw/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); - QC.add("QC/tracks/raw/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); - QC.add("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable", ";TPC crossed rows/findable N_{cls};counts", kTH1D, {{100, 0.0, 10.0}}); - QC.add("QC/tracks/raw/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - QC.add("QC/tracks/raw/hEta", ";y;counts", kTH1D, {etaAxis}); - QC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rQC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma_{#pi};counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma_{e};counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/raw/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); + rQC.add("QC/tracks/raw/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); + rQC.add("QC/tracks/raw/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); + rQC.add("QC/tracks/raw/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); + rQC.add("QC/tracks/raw/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); + rQC.add("QC/tracks/raw/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); + rQC.add("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable", ";TPC crossed rows/findable N_{cls};counts", kTH1D, {{100, 0.0, 10.0}}); + rQC.add("QC/tracks/raw/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rQC.add("QC/tracks/raw/hEta", ";y;counts", kTH1D, {etaAxis}); + rQC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); // tracks passing selections - QC.add("QC/tracks/cut/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - QC.add("QC/tracks/cut/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - QC.add("QC/tracks/cut/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - QC.add("QC/tracks/cut/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - QC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); - QC.add("QC/tracks/cut/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); + rQC.add("QC/tracks/cut/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/cut/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/cut/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + rQC.add("QC/tracks/cut/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + rQC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); + rQC.add("QC/tracks/cut/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); // selection counter std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS hit", "ITS N_{clusters}", "ITS #chi^{2}/N_{clusters}", "TPC hit", "TPC N_{clusters} found", "TPC #chi^{2}/N_{clusters}", "TPC crossed rows", "TPC crossed rows/N_{clusters}", "TOF requirement", "p_{T}", "DCA", "#eta", "exactly 2 tracks", "PID"}; - auto hSelectionCounter = QC.add("QC/tracks/hSelectionCounter", ";;counts", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); + auto hSelectionCounter = rQC.add("QC/tracks/hSelectionCounter", ";;counts", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); for (int i = 0; i < static_cast(selectionCounterLabels.size()); ++i) hSelectionCounter->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); // TOF hit check - QC.add("QC/tracks/hTofHitCheck", ";leading track TOF hit;subleading track TOF hit;counts", kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}}); + rQC.add("QC/tracks/hTofHitCheck", ";leading track TOF hit;subleading track TOF hit;counts", kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}}); // RECO HISTOS // // PIONS // no selection - Pions.add("pions/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - Pions.add("pions/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rPions.add("pions/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rPions.add("pions/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rPions.add("pions/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rPions.add("pions/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rPions.add("pions/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rPions.add("pions/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); // from selected systems - Pions.add("pions/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - Pions.add("pions/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rPions.add("pions/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rPions.add("pions/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rPions.add("pions/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rPions.add("pions/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rPions.add("pions/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rPions.add("pions/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); // ELECTRONS // no selection - Electrons.add("electrons/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Electrons.add("electrons/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Electrons.add("electrons/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - Electrons.add("electrons/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Electrons.add("electrons/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Electrons.add("electrons/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rElectrons.add("electrons/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rElectrons.add("electrons/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rElectrons.add("electrons/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rElectrons.add("electrons/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rElectrons.add("electrons/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rElectrons.add("electrons/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); // from selected systems - Electrons.add("electrons/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Electrons.add("electrons/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Electrons.add("electrons/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - Electrons.add("electrons/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Electrons.add("electrons/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Electrons.add("electrons/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rElectrons.add("electrons/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rElectrons.add("electrons/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rElectrons.add("electrons/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rElectrons.add("electrons/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rElectrons.add("electrons/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rElectrons.add("electrons/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); // RAW RHOS - System.add("system/raw/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - System.add("system/raw/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - System.add("system/raw/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - System.add("system/raw/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/raw/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/raw/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - System.add("system/raw/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - System.add("system/raw/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - System.add("system/raw/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/raw/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/raw/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - System.add("system/raw/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - System.add("system/raw/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - System.add("system/raw/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/raw/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/raw/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rSystem.add("system/raw/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rSystem.add("system/raw/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rSystem.add("system/raw/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/raw/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/raw/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rSystem.add("system/raw/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rSystem.add("system/raw/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rSystem.add("system/raw/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/raw/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/raw/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rSystem.add("system/raw/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rSystem.add("system/raw/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rSystem.add("system/raw/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/raw/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); // SELECTED RHOS // no selection - System.add("system/cut/no-selection/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/no-selection/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/no-selection/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/no-selection/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/no-selection/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/no-selection/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/no-selection/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/no-selection/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/no-selection/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/no-selection/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/no-selection/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/no-selection/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/no-selection/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/no-selection/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/no-selection/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/no-selection/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/no-selection/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); // 0n0n - System.add("system/cut/0n0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0n0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0n0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0n0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0n0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0n0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0n0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0n0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0n0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0n0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0n0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0n0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0n0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/0n0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0n0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/0n0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0n0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); // Xn0n - System.add("system/cut/Xn0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/Xn0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/Xn0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/Xn0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/Xn0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/Xn0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/Xn0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/Xn0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/Xn0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/Xn0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); // 0nXn - System.add("system/cut/0nXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0nXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0nXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0nXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0nXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0nXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0nXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0nXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0nXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0nXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0nXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0nXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0nXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/0nXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0nXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/0nXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/0nXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); // XnXn - System.add("system/cut/XnXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/XnXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/XnXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/XnXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/XnXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/XnXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/XnXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/XnXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/XnXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/XnXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/XnXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/XnXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/XnXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/XnXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/XnXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + + rSystem.add("system/cut/XnXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rSystem.add("system/cut/XnXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); // MC - MC.add("MC/collisions/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - MC.add("MC/collisions/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - MC.add("MC/collisions/hNPions", ";number of pions;counts", kTH1D, {{11, -0.5, 10.5}}); - MC.add("MC/collisions/hNumOfCollisionRecos", ";number of collision reconstructions;counts", kTH1D, {{11, -0.5, 10.5}}); - - MC.add("MC/tracks/all/hPdgCode", ";pdg code;counts", kTH1D, {{2001, -1000.5, 1000.5}}); - MC.add("MC/tracks/all/hProducedByGenerator", ";produced by generator;counts", kTH1D, {{2, -0.5, 1.5}}); - MC.add("MC/tracks/all/hIsPhysicalPrimary", ";is physical primary;counts", kTH1D, {{2, -0.5, 1.5}}); - MC.add("MC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - MC.add("MC/tracks/all/hEta", ";#eta;counts", kTH1D, {etaAxis}); - MC.add("MC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - MC.add("MC/tracks/pions/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - MC.add("MC/tracks/pions/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); - MC.add("MC/tracks/pions/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - - MC.add("MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - MC.add("MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - MC.add("MC/system/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - MC.add("MC/system/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - MC.add("MC/system/hY", ";y;counts", kTH1D, {yAxis}); - MC.add("MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - MC.add("MC/system/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - MC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rMC.add("MC/collisions/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); + rMC.add("MC/collisions/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); + rMC.add("MC/collisions/hNPions", ";number of pions;counts", kTH1D, {{11, -0.5, 10.5}}); + rMC.add("MC/collisions/hNumOfCollisionRecos", ";number of collision reconstructions;counts", kTH1D, {{11, -0.5, 10.5}}); + + rMC.add("MC/tracks/all/hPdgCode", ";pdg code;counts", kTH1D, {{2001, -1000.5, 1000.5}}); + rMC.add("MC/tracks/all/hProducedByGenerator", ";produced by generator;counts", kTH1D, {{2, -0.5, 1.5}}); + rMC.add("MC/tracks/all/hIsPhysicalPrimary", ";is physical primary;counts", kTH1D, {{2, -0.5, 1.5}}); + rMC.add("MC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rMC.add("MC/tracks/all/hEta", ";#eta;counts", kTH1D, {etaAxis}); + rMC.add("MC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rMC.add("MC/tracks/pions/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rMC.add("MC/tracks/pions/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); + rMC.add("MC/tracks/pions/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + + rMC.add("MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rMC.add("MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rMC.add("MC/system/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rMC.add("MC/system/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rMC.add("MC/system/hY", ";y;counts", kTH1D, {yAxis}); + rMC.add("MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rMC.add("MC/system/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rMC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); // 4 pi QA if (do4pi) { - FourPiQA.add("FourPiQA/reco/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/reco/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); - FourPiQA.add("FourPiQA/reco/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - FourPiQA.add("FourPiQA/reco/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - FourPiQA.add("FourPiQA/reco/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/reco/system/hY", ";y;counts", kTH1D, {yAxis}); - FourPiQA.add("FourPiQA/reco/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - FourPiQA.add("FourPiQA/MC/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/MC/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); - FourPiQA.add("FourPiQA/MC/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - FourPiQA.add("FourPiQA/MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - FourPiQA.add("FourPiQA/MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/MC/system/hY", ";y;counts", kTH1D, {yAxis}); - FourPiQA.add("FourPiQA/MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rFourPiQA.add("FourPiQA/reco/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rFourPiQA.add("FourPiQA/reco/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); + rFourPiQA.add("FourPiQA/reco/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rFourPiQA.add("FourPiQA/reco/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rFourPiQA.add("FourPiQA/reco/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rFourPiQA.add("FourPiQA/reco/system/hY", ";y;counts", kTH1D, {yAxis}); + rFourPiQA.add("FourPiQA/reco/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rFourPiQA.add("FourPiQA/MC/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rFourPiQA.add("FourPiQA/MC/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); + rFourPiQA.add("FourPiQA/MC/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rFourPiQA.add("FourPiQA/MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rFourPiQA.add("FourPiQA/MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rFourPiQA.add("FourPiQA/MC/system/hY", ";y;counts", kTH1D, {yAxis}); + rFourPiQA.add("FourPiQA/MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); } } @@ -560,55 +562,55 @@ struct upcRhoAnalysis { { if (!track.isPVContributor()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 1); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 1); if (!track.hasITS()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 2); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 2); if (track.itsNCls() < tracksMinItsNClsCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 3); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 3); if (track.itsChi2NCl() > tracksMaxItsChi2NClCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 4); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 4); if (!track.hasTPC()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 5); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 5); if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < tracksMinTpcNClsCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 6); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 6); if (track.tpcChi2NCl() > tracksMaxTpcChi2NClCut || track.tpcChi2NCl() < tracksMinTpcChi2NClCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 7); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 7); if (track.tpcNClsCrossedRows() < tracksMinTpcNClsCrossedRowsCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 8); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 8); if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < tracksMinTpcNClsCrossedOverFindableCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 9); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 9); if (requireTof && !track.hasTOF()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 10); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 10); if (track.pt() < tracksMinPtCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 11); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 11); if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0105 + 0.0350 / std::pow(track.pt(), 1.01))) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 12); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 12); - if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) + if (std::abs(eta(track.px(), track.py(), track.pz())) > pcEtaCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 13); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 13); // if all selections passed return true; } @@ -707,44 +709,44 @@ struct upcRhoAnalysis { void processReco(C const& collision, T const& tracks) { // QC histograms - QC.fill(HIST("QC/collisions/all/hPosXY"), collision.posX(), collision.posY()); - QC.fill(HIST("QC/collisions/all/hPosZ"), collision.posZ()); - QC.fill(HIST("QC/collisions/all/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - QC.fill(HIST("QC/collisions/all/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - QC.fill(HIST("QC/collisions/all/hNumContrib"), collision.numContrib()); - QC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - QC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - QC.fill(HIST("QC/collisions/all/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - QC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - QC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - QC.fill(HIST("QC/collisions/all/hTimeFT0A"), collision.timeFT0A()); - QC.fill(HIST("QC/collisions/all/hTimeFT0C"), collision.timeFT0C()); - QC.fill(HIST("QC/collisions/all/hTimeFV0A"), collision.timeFV0A()); - QC.fill(HIST("QC/collisions/all/hTimeFDDA"), collision.timeFDDA()); - QC.fill(HIST("QC/collisions/all/hTimeFDDC"), collision.timeFDDC()); + rQC.fill(HIST("QC/collisions/all/hPosXY"), collision.posX(), collision.posY()); + rQC.fill(HIST("QC/collisions/all/hPosZ"), collision.posZ()); + rQC.fill(HIST("QC/collisions/all/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); + rQC.fill(HIST("QC/collisions/all/hZdcTime"), collision.timeZNA(), collision.timeZNC()); + rQC.fill(HIST("QC/collisions/all/hNumContrib"), collision.numContrib()); + rQC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); + rQC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); + rQC.fill(HIST("QC/collisions/all/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); + rQC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); + rQC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); + rQC.fill(HIST("QC/collisions/all/hTimeFT0A"), collision.timeFT0A()); + rQC.fill(HIST("QC/collisions/all/hTimeFT0C"), collision.timeFT0C()); + rQC.fill(HIST("QC/collisions/all/hTimeFV0A"), collision.timeFV0A()); + rQC.fill(HIST("QC/collisions/all/hTimeFDDA"), collision.timeFDDA()); + rQC.fill(HIST("QC/collisions/all/hTimeFDDC"), collision.timeFDDC()); // vertex z-position cut if (!collisionPassesCuts(collision)) return; // event tagging - bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... + bool xnxn = false, onon = false, xnon = false, onxn = false; // note: On == 0n... int neutronClass = -1; - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) { - OnOn = true; + if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() < znCommonEnergyCut) { + onon = true; neutronClass = 0; } - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) { - XnOn = true; + if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() < znCommonEnergyCut) { + xnon = true; neutronClass = 1; } - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) { - OnXn = true; + if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) { + onxn = true; neutronClass = 2; } - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && - collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) { - XnXn = true; + if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && + collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) { + xnxn = true; neutronClass = 3; } @@ -753,20 +755,20 @@ struct upcRhoAnalysis { std::vector cutTracks4Vecs; for (const auto& track : tracks) { - QC.fill(HIST("QC/tracks/hSelectionCounter"), 0); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 0); // float p = momentum(track.px(), track.py(), track.pz()); - QC.fill(HIST("QC/tracks/raw/hPt"), track.pt()); - QC.fill(HIST("QC/tracks/raw/hEta"), eta(track.px(), track.py(), track.pz())); - QC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); - QC.fill(HIST("QC/tracks/raw/hTpcNSigmaPi"), track.tpcNSigmaPi()); - QC.fill(HIST("QC/tracks/raw/hTpcNSigmaEl"), track.tpcNSigmaEl()); - QC.fill(HIST("QC/tracks/raw/hDcaXYZ"), track.dcaZ(), track.dcaXY()); - QC.fill(HIST("QC/tracks/raw/hItsNCls"), track.itsNCls()); - QC.fill(HIST("QC/tracks/raw/hItsChi2NCl"), track.itsChi2NCl()); - QC.fill(HIST("QC/tracks/raw/hTpcChi2NCl"), track.tpcChi2NCl()); - QC.fill(HIST("QC/tracks/raw/hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); - QC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); - QC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); + rQC.fill(HIST("QC/tracks/raw/hPt"), track.pt()); + rQC.fill(HIST("QC/tracks/raw/hEta"), eta(track.px(), track.py(), track.pz())); + rQC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); + rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaPi"), track.tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaEl"), track.tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/raw/hDcaXYZ"), track.dcaZ(), track.dcaXY()); + rQC.fill(HIST("QC/tracks/raw/hItsNCls"), track.itsNCls()); + rQC.fill(HIST("QC/tracks/raw/hItsChi2NCl"), track.itsChi2NCl()); + rQC.fill(HIST("QC/tracks/raw/hTpcChi2NCl"), track.tpcChi2NCl()); + rQC.fill(HIST("QC/tracks/raw/hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); + rQC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); + rQC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); if (!trackPassesCuts(track)) continue; @@ -775,13 +777,13 @@ struct upcRhoAnalysis { TLorentzVector track4Vec; track4Vec.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass cutTracks4Vecs.push_back(track4Vec); - QC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi"), track.tpcNSigmaPi()); - QC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl"), track.tpcNSigmaEl()); - QC.fill(HIST("QC/tracks/cut/hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); - QC.fill(HIST("QC/tracks/cut/hTpcSignalVsPt"), track.pt(), track.tpcSignal()); - QC.fill(HIST("QC/tracks/cut/hDcaXYZ"), track.dcaZ(), track.dcaXY()); + rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi"), track.tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl"), track.tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/cut/hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); + rQC.fill(HIST("QC/tracks/cut/hTpcSignalVsPt"), track.pt(), track.tpcSignal()); + rQC.fill(HIST("QC/tracks/cut/hDcaXYZ"), track.dcaZ(), track.dcaXY()); } - QC.fill(HIST("QC/tracks/cut/hRemainingTracks"), cutTracks.size()); + rQC.fill(HIST("QC/tracks/cut/hRemainingTracks"), cutTracks.size()); if (cutTracks.size() != cutTracks4Vecs.size()) { // sanity check LOG(error); return; @@ -798,29 +800,29 @@ struct upcRhoAnalysis { if (do4pi && cutTracks.size() == 4 && totalCharge == 0) { // fill out some 4pi QC histograms for (int i = 0; i < static_cast(cutTracks.size()); i++) { - FourPiQA.fill(HIST("FourPiQA/reco/tracks/hPt"), cutTracks[i].pt()); - FourPiQA.fill(HIST("FourPiQA/reco/tracks/hEta"), eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz())); - FourPiQA.fill(HIST("FourPiQA/reco/tracks/hPhi"), phi(cutTracks[i].px(), cutTracks[i].py())); + rFourPiQA.fill(HIST("FourPiQA/reco/tracks/hPt"), cutTracks[i].pt()); + rFourPiQA.fill(HIST("FourPiQA/reco/tracks/hEta"), eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz())); + rFourPiQA.fill(HIST("FourPiQA/reco/tracks/hPhi"), phi(cutTracks[i].px(), cutTracks[i].py())); } - FourPiQA.fill(HIST("FourPiQA/reco/system/hM"), mass); - FourPiQA.fill(HIST("FourPiQA/reco/system/hPt"), pT); - FourPiQA.fill(HIST("FourPiQA/reco/system/hY"), rapidity); - FourPiQA.fill(HIST("FourPiQA/reco/system/hPhi"), systemPhi); + rFourPiQA.fill(HIST("FourPiQA/reco/system/hM"), mass); + rFourPiQA.fill(HIST("FourPiQA/reco/system/hPt"), pT); + rFourPiQA.fill(HIST("FourPiQA/reco/system/hY"), rapidity); + rFourPiQA.fill(HIST("FourPiQA/reco/system/hPhi"), systemPhi); } // further consider only two pion systems if (cutTracks.size() != 2) return; for (int i = 0; i < static_cast(cutTracks.size()); i++) - QC.fill(HIST("QC/tracks/hSelectionCounter"), 14); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 14); - QC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); - QC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); if (!tracksPassPiPID(cutTracks)) return; for (int i = 0; i < static_cast(cutTracks.size()); i++) - QC.fill(HIST("QC/tracks/hSelectionCounter"), 15); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 15); float phiRandom = getPhiRandom(cutTracks4Vecs); float phiCharge = getPhiCharge(cutTracks, cutTracks4Vecs); @@ -836,7 +838,7 @@ struct upcRhoAnalysis { float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); // fill TOF hit checker - QC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); + rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); // fill recoTree int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; @@ -850,7 +852,7 @@ struct upcRhoAnalysis { std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; std::vector trackDcaZs = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; std::vector trackTpcSignals = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; - RecoTree(collision.runNumber(), localBc, collision.numContrib(), + recoTree(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(), @@ -861,37 +863,39 @@ struct upcRhoAnalysis { // fill raw histograms according to the total charge switch (totalCharge) { case 0: - Pions.fill(HIST("pions/no-selection/unlike-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/no-selection/unlike-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/no-selection/unlike-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/raw/unlike-sign/hM"), mass); - System.fill(HIST("system/raw/unlike-sign/hPt"), pT); - System.fill(HIST("system/raw/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/raw/unlike-sign/hY"), rapidity); - System.fill(HIST("system/raw/unlike-sign/hPhi"), systemPhi); - QC.fill(HIST("QC/collisions/selected/hNumContribVsSystemPt"), pT, collision.numContrib()); + rPions.fill(HIST("pions/no-selection/unlike-sign/hPt"), leadingPt, subleadingPt); + rPions.fill(HIST("pions/no-selection/unlike-sign/hEta"), leadingEta, subleadingEta); + rPions.fill(HIST("pions/no-selection/unlike-sign/hPhi"), leadingPhi, subleadingPhi); + rSystem.fill(HIST("system/raw/unlike-sign/hM"), mass); + rSystem.fill(HIST("system/raw/unlike-sign/hPt"), pT); + rSystem.fill(HIST("system/raw/unlike-sign/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/raw/unlike-sign/hY"), rapidity); + rSystem.fill(HIST("system/raw/unlike-sign/hPhi"), systemPhi); + rQC.fill(HIST("QC/collisions/selected/hNumContribVsSystemPt"), pT, collision.numContrib()); + rQC.fill(HIST("QC/collisions/selected/hNumContribVsSystemY"), rapidity, collision.numContrib()); + rQC.fill(HIST("QC/collisions/selected/hNumContribVsSystemM"), mass, collision.numContrib()); break; case 2: - Pions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/raw/like-sign/positive/hM"), mass); - System.fill(HIST("system/raw/like-sign/positive/hPt"), pT); - System.fill(HIST("system/raw/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/raw/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/raw/like-sign/positive/hPhi"), systemPhi); + rPions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); + rPions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); + rPions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); + rSystem.fill(HIST("system/raw/like-sign/positive/hM"), mass); + rSystem.fill(HIST("system/raw/like-sign/positive/hPt"), pT); + rSystem.fill(HIST("system/raw/like-sign/positive/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/raw/like-sign/positive/hY"), rapidity); + rSystem.fill(HIST("system/raw/like-sign/positive/hPhi"), systemPhi); break; case -2: - Pions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/raw/like-sign/negative/hM"), mass); - System.fill(HIST("system/raw/like-sign/negative/hPt"), pT); - System.fill(HIST("system/raw/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/raw/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/raw/like-sign/negative/hPhi"), systemPhi); + rPions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); + rPions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); + rPions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); + rSystem.fill(HIST("system/raw/like-sign/negative/hM"), mass); + rSystem.fill(HIST("system/raw/like-sign/negative/hPt"), pT); + rSystem.fill(HIST("system/raw/like-sign/negative/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/raw/like-sign/negative/hY"), rapidity); + rSystem.fill(HIST("system/raw/like-sign/negative/hPhi"), systemPhi); break; default: @@ -902,234 +906,234 @@ struct upcRhoAnalysis { if (!systemPassCuts(system)) return; - QC.fill(HIST("QC/collisions/selected/hPosXY"), collision.posX(), collision.posY()); - QC.fill(HIST("QC/collisions/selected/hPosZ"), collision.posZ()); - QC.fill(HIST("QC/collisions/selected/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - QC.fill(HIST("QC/collisions/selected/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - QC.fill(HIST("QC/collisions/selected/hNumContrib"), collision.numContrib()); - QC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - QC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - QC.fill(HIST("QC/collisions/selected/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - QC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - QC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - QC.fill(HIST("QC/collisions/selected/hTimeFT0A"), collision.timeFT0A()); - QC.fill(HIST("QC/collisions/selected/hTimeFT0C"), collision.timeFT0C()); - QC.fill(HIST("QC/collisions/selected/hTimeFV0A"), collision.timeFV0A()); - QC.fill(HIST("QC/collisions/selected/hTimeFDDA"), collision.timeFDDA()); - QC.fill(HIST("QC/collisions/selected/hTimeFDDC"), collision.timeFDDC()); + rQC.fill(HIST("QC/collisions/selected/hPosXY"), collision.posX(), collision.posY()); + rQC.fill(HIST("QC/collisions/selected/hPosZ"), collision.posZ()); + rQC.fill(HIST("QC/collisions/selected/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); + rQC.fill(HIST("QC/collisions/selected/hZdcTime"), collision.timeZNA(), collision.timeZNC()); + rQC.fill(HIST("QC/collisions/selected/hNumContrib"), collision.numContrib()); + rQC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); + rQC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); + rQC.fill(HIST("QC/collisions/selected/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); + rQC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); + rQC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); + rQC.fill(HIST("QC/collisions/selected/hTimeFT0A"), collision.timeFT0A()); + rQC.fill(HIST("QC/collisions/selected/hTimeFT0C"), collision.timeFT0C()); + rQC.fill(HIST("QC/collisions/selected/hTimeFV0A"), collision.timeFV0A()); + rQC.fill(HIST("QC/collisions/selected/hTimeFDDA"), collision.timeFDDA()); + rQC.fill(HIST("QC/collisions/selected/hTimeFDDC"), collision.timeFDDC()); // fill histograms for system passing cuts switch (totalCharge) { case 0: - Pions.fill(HIST("pions/selected/unlike-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/selected/unlike-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/selected/unlike-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/cut/no-selection/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/no-selection/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (OnOn) { - System.fill(HIST("system/cut/0n0n/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0n0n/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnOn) { - System.fill(HIST("system/cut/Xn0n/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (OnXn) { - System.fill(HIST("system/cut/0nXn/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0nXn/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnXn) { - System.fill(HIST("system/cut/XnXn/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/XnXn/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + rPions.fill(HIST("pions/selected/unlike-sign/hPt"), leadingPt, subleadingPt); + rPions.fill(HIST("pions/selected/unlike-sign/hEta"), leadingEta, subleadingEta); + rPions.fill(HIST("pions/selected/unlike-sign/hPhi"), leadingPhi, subleadingPhi); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hM"), mass); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPt"), pT); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hY"), rapidity); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + if (onon) { + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hM"), mass); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPt"), pT); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hY"), rapidity); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (xnon) { + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hM"), mass); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPt"), pT); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hY"), rapidity); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (onxn) { + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hM"), mass); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPt"), pT); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hY"), rapidity); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (xnxn) { + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hM"), mass); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPt"), pT); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hY"), rapidity); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); } break; case 2: - Pions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (OnOn) { - System.fill(HIST("system/cut/0n0n/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnOn) { - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (OnXn) { - System.fill(HIST("system/cut/0nXn/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnXn) { - System.fill(HIST("system/cut/XnXn/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + rPions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); + rPions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); + rPions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hM"), mass); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPt"), pT); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hY"), rapidity); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + if (onon) { + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hM"), mass); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPt"), pT); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hY"), rapidity); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (xnon) { + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hM"), mass); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt"), pT); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hY"), rapidity); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (onxn) { + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hM"), mass); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPt"), pT); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hY"), rapidity); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (xnxn) { + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hM"), mass); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPt"), pT); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hY"), rapidity); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); } break; case -2: - Pions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (OnOn) { - System.fill(HIST("system/cut/0n0n/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnOn) { - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (OnXn) { - System.fill(HIST("system/cut/0nXn/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnXn) { - System.fill(HIST("system/cut/XnXn/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + rPions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); + rPions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); + rPions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hM"), mass); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPt"), pT); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hY"), rapidity); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + if (onon) { + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hM"), mass); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPt"), pT); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hY"), rapidity); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (xnon) { + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hM"), mass); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt"), pT); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hY"), rapidity); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (onxn) { + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hM"), mass); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPt"), pT); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hY"), rapidity); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); + } else if (xnxn) { + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hM"), mass); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPt"), pT); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPt2"), pTsquare); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPtVsM"), mass, pT); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hY"), rapidity); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhi"), systemPhi); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiCharge"), phiCharge); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); + rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); } break; @@ -1141,19 +1145,19 @@ struct upcRhoAnalysis { template void processMC(C const& mcCollision, T const& mcParticles) { - MC.fill(HIST("MC/collisions/hPosXY"), mcCollision.posX(), mcCollision.posY()); - MC.fill(HIST("MC/collisions/hPosZ"), mcCollision.posZ()); + rMC.fill(HIST("MC/collisions/hPosXY"), mcCollision.posX(), mcCollision.posY()); + rMC.fill(HIST("MC/collisions/hPosZ"), mcCollision.posZ()); std::vector cutMcParticles; std::vector mcParticles4Vecs; for (auto const& mcParticle : mcParticles) { - MC.fill(HIST("MC/tracks/all/hPdgCode"), mcParticle.pdgCode()); - MC.fill(HIST("MC/tracks/all/hProducedByGenerator"), mcParticle.producedByGenerator()); - MC.fill(HIST("MC/tracks/all/hIsPhysicalPrimary"), mcParticle.isPhysicalPrimary()); - MC.fill(HIST("MC/tracks/all/hPt"), pt(mcParticle.px(), mcParticle.py())); - MC.fill(HIST("MC/tracks/all/hEta"), eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())); - MC.fill(HIST("MC/tracks/all/hPhi"), phi(mcParticle.px(), mcParticle.py())); + rMC.fill(HIST("MC/tracks/all/hPdgCode"), mcParticle.pdgCode()); + rMC.fill(HIST("MC/tracks/all/hProducedByGenerator"), mcParticle.producedByGenerator()); + rMC.fill(HIST("MC/tracks/all/hIsPhysicalPrimary"), mcParticle.isPhysicalPrimary()); + rMC.fill(HIST("MC/tracks/all/hPt"), pt(mcParticle.px(), mcParticle.py())); + rMC.fill(HIST("MC/tracks/all/hEta"), eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())); + rMC.fill(HIST("MC/tracks/all/hPhi"), phi(mcParticle.px(), mcParticle.py())); if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.pdgCode()) != 211) continue; cutMcParticles.push_back(mcParticle); @@ -1161,7 +1165,7 @@ struct upcRhoAnalysis { pion4Vec.SetPxPyPzE(mcParticle.px(), mcParticle.py(), mcParticle.pz(), mcParticle.e()); mcParticles4Vecs.push_back(pion4Vec); } - MC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); + rMC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); if (mcParticles4Vecs.size() != cutMcParticles.size()) return; @@ -1177,14 +1181,14 @@ struct upcRhoAnalysis { if (do4pi && cutMcParticles.size() == 4) { for (int i = 0; i < static_cast(cutMcParticles.size()); i++) { - FourPiQA.fill(HIST("FourPiQA/MC/tracks/hPt"), pt(cutMcParticles[i].px(), cutMcParticles[i].py())); - FourPiQA.fill(HIST("FourPiQA/MC/tracks/hEta"), eta(cutMcParticles[i].px(), cutMcParticles[i].py(), cutMcParticles[i].pz())); - FourPiQA.fill(HIST("FourPiQA/MC/tracks/hPhi"), phi(cutMcParticles[i].px(), cutMcParticles[i].py())); + rFourPiQA.fill(HIST("FourPiQA/MC/tracks/hPt"), pt(cutMcParticles[i].px(), cutMcParticles[i].py())); + rFourPiQA.fill(HIST("FourPiQA/MC/tracks/hEta"), eta(cutMcParticles[i].px(), cutMcParticles[i].py(), cutMcParticles[i].pz())); + rFourPiQA.fill(HIST("FourPiQA/MC/tracks/hPhi"), phi(cutMcParticles[i].px(), cutMcParticles[i].py())); } - FourPiQA.fill(HIST("FourPiQA/MC/system/hM"), mass); - FourPiQA.fill(HIST("FourPiQA/MC/system/hPt"), pT); - FourPiQA.fill(HIST("FourPiQA/MC/system/hY"), rapidity); - FourPiQA.fill(HIST("FourPiQA/MC/system/hPhi"), systemPhi); + rFourPiQA.fill(HIST("FourPiQA/MC/system/hM"), mass); + rFourPiQA.fill(HIST("FourPiQA/MC/system/hPt"), pT); + rFourPiQA.fill(HIST("FourPiQA/MC/system/hY"), rapidity); + rFourPiQA.fill(HIST("FourPiQA/MC/system/hPhi"), systemPhi); } if (cutMcParticles.size() != 2) @@ -1192,21 +1196,21 @@ struct upcRhoAnalysis { 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]; - MC.fill(HIST("MC/tracks/pions/hPt"), pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - MC.fill(HIST("MC/tracks/pions/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); - MC.fill(HIST("MC/tracks/pions/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); + rMC.fill(HIST("MC/tracks/pions/hPt"), pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())); + rMC.fill(HIST("MC/tracks/pions/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); + rMC.fill(HIST("MC/tracks/pions/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); float phiRandom = getPhiRandom(mcParticles4Vecs); float phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); - MC.fill(HIST("MC/system/hM"), mass); - MC.fill(HIST("MC/system/hPt"), pT); - MC.fill(HIST("MC/system/hPtVsM"), mass, pT); - MC.fill(HIST("MC/system/hPt2"), pTsquare); - MC.fill(HIST("MC/system/hY"), rapidity); - MC.fill(HIST("MC/system/hPhi"), systemPhi); - MC.fill(HIST("MC/system/hPhiRandom"), phiRandom); - MC.fill(HIST("MC/system/hPhiCharge"), phiCharge); + rMC.fill(HIST("MC/system/hM"), mass); + rMC.fill(HIST("MC/system/hPt"), pT); + rMC.fill(HIST("MC/system/hPtVsM"), mass, pT); + rMC.fill(HIST("MC/system/hPt2"), pTsquare); + rMC.fill(HIST("MC/system/hY"), rapidity); + rMC.fill(HIST("MC/system/hPhi"), systemPhi); + rMC.fill(HIST("MC/system/hPhiRandom"), phiRandom); + rMC.fill(HIST("MC/system/hPhiCharge"), phiCharge); // fill mcTree int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; @@ -1215,7 +1219,7 @@ struct upcRhoAnalysis { std::vector trackEtas = {eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())}; std::vector trackPhis = {phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; - McTree(localBc, + mcTree(localBc, mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), pT, rapidity, systemPhi, mass, phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackMs); } @@ -1223,7 +1227,7 @@ struct upcRhoAnalysis { template void checkNumberOfCollisionReconstructions(C const& collisions) { - MC.fill(HIST("MC/collisions/hNumOfCollisionRecos"), collisions.size()); + rMC.fill(HIST("MC/collisions/hNumOfCollisionRecos"), collisions.size()); } void processSGdata(FullUdSgCollision const& collision, FullUdTracks const& tracks) From 60806d5231f4a34b5bb34291fb13bb8f2b320d17 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Sat, 8 Feb 2025 14:15:25 +0100 Subject: [PATCH 06/14] removed code for 4pi, beginning of templatisation for histogram filling (collision QC) --- PWGUD/Tasks/upcRhoAnalysis.cxx | 185 ++++++++++++++------------------- 1 file changed, 80 insertions(+), 105 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 19f51a46852..65ac18f0267 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -13,7 +13,7 @@ /// includes event tagging based on ZN information, track selection, reconstruction, /// and also some basic stuff for decay phi anisotropy studies /// \author Jakub Juracka, jakub.juracka@cern.ch -/// \file ? +/// \file upcRhoAnalysis.cxx #include #include @@ -66,7 +66,7 @@ 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); +// DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); // Rhos DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); // store things for reconstruction of lorentz vectors @@ -95,7 +95,7 @@ DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", 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::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, /* reco_tree::NeutronClass, */ reco_tree::TotalCharge, reco_tree::RhoPt, reco_tree::RhoY, reco_tree::RhoPhi, reco_tree::RhoM, reco_tree::RhoPhiRandom, reco_tree::RhoPhiCharge, reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackM, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); @@ -135,8 +135,10 @@ struct upcRhoAnalysis { float pcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; - Configurable do4pi{"do4pi", true, "do 4pi analysis"}; + + Configurable doPions{"doPions", true, "do analysis with PIDed pions"}; Configurable doElectrons{"doElectrons", true, "do analysis with PIDed electrons"}; + Configurable doKaons{"doKaons", true, "do analysis with PIDed kaons"}; Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; Configurable collisionsNumContribsMaxCut{"collisionsNumContribsMaxCut", 7, "max number of contributors cut on collisions"}; @@ -145,6 +147,7 @@ struct upcRhoAnalysis { Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; Configurable tracksTpcNSigmaElCut{"tracksTpcNSigmaElCut", 3.0, "TPC nSigma electron cut"}; + Configurable tracksTpcNSigmaKaCut{"tracksTpcNSigmaKaCut", 3.0, "TPC nSigma kaon cut"}; Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; Configurable tracksMinItsNClsCut{"tracksMinItsNClsCut", 6, "min ITS clusters cut"}; Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; @@ -181,7 +184,6 @@ struct upcRhoAnalysis { HistogramRegistry rElectrons{"rElectrons", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry rSystem{"rSystem", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry rMC{"rMC", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry rFourPiQA{"rFourPiQA", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(o2::framework::InitContext&) { @@ -206,9 +208,6 @@ struct upcRhoAnalysis { rQC.add("QC/collisions/selected/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); rQC.add("QC/collisions/selected/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); rQC.add("QC/collisions/selected/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - rQC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); - rQC.add("QC/collisions/selected/hNumContribVsSystemY", ";y;number of contributors;counts", kTH2D, {yAxis,{36, -0.5, 35.5}}); - rQC.add("QC/collisions/selected/hNumContribVsSystemM", ";m (GeV/#it{c}^{2});number of contributors;counts", kTH2D, {mAxis,{36, -0.5, 35.5}}); rQC.add("QC/collisions/selected/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); rQC.add("QC/collisions/selected/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); rQC.add("QC/collisions/selected/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); @@ -221,9 +220,14 @@ struct upcRhoAnalysis { rQC.add("QC/collisions/selected/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); rQC.add("QC/collisions/selected/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); rQC.add("QC/collisions/selected/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + + rQC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); + rQC.add("QC/collisions/selected/hNumContribVsSystemY", ";y;number of contributors;counts", kTH2D, {yAxis,{36, -0.5, 35.5}}); + rQC.add("QC/collisions/selected/hNumContribVsSystemM", ";m (GeV/#it{c}^{2});number of contributors;counts", kTH2D, {mAxis,{36, -0.5, 35.5}}); // all tracks - rQC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma_{#pi};counts", kTH1D, {{400, -10.0, 30.0}}); - rQC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma_{e};counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/raw/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); rQC.add("QC/tracks/raw/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); rQC.add("QC/tracks/raw/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); rQC.add("QC/tracks/raw/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); @@ -239,6 +243,8 @@ struct upcRhoAnalysis { rQC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); rQC.add("QC/tracks/cut/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); rQC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/cut/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/cut/hTpcNSigmaKa2D", ";TPC n#sigma(K_{leading});TPC n#sigma(K_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); rQC.add("QC/tracks/cut/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); rQC.add("QC/tracks/cut/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); rQC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); @@ -527,24 +533,28 @@ struct upcRhoAnalysis { rMC.add("MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); rMC.add("MC/system/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); rMC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + } - // 4 pi QA - if (do4pi) { - rFourPiQA.add("FourPiQA/reco/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rFourPiQA.add("FourPiQA/reco/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); - rFourPiQA.add("FourPiQA/reco/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rFourPiQA.add("FourPiQA/reco/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - rFourPiQA.add("FourPiQA/reco/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rFourPiQA.add("FourPiQA/reco/system/hY", ";y;counts", kTH1D, {yAxis}); - rFourPiQA.add("FourPiQA/reco/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rFourPiQA.add("FourPiQA/MC/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rFourPiQA.add("FourPiQA/MC/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); - rFourPiQA.add("FourPiQA/MC/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rFourPiQA.add("FourPiQA/MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - rFourPiQA.add("FourPiQA/MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rFourPiQA.add("FourPiQA/MC/system/hY", ";y;counts", kTH1D, {yAxis}); - rFourPiQA.add("FourPiQA/MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - } + template + void fillCollisionQcHistos(const C& collision) // fills collision QC histograms before/after cuts + { + static constexpr std::string_view mode[2] = {"all", "selected"}; + + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hPosXY"), collision.posX(), collision.posY()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hPosZ"), collision.posZ()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hZdcTime"), collision.timeZNA(), collision.timeZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hNumContrib"), collision.numContrib()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFT0A"), collision.timeFT0A()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFT0C"), collision.timeFT0C()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFV0A"), collision.timeFV0A()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFDDA"), collision.timeFDDA()); + rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFDDC"), collision.timeFDDC()); } template @@ -615,6 +625,27 @@ struct upcRhoAnalysis { return true; } + template + int mostProbablePID(const T& cutTracks) { + // calculate NSigma "radii" + float squareRadiusPi = 0.0, squareRadiusEl = 0.0, squareRadiusKa = 0.0; + for (const auto& track : cutTracks) { + squareRadiusPi += std::pow(track.tpcNSigmaPi(), 2); + squareRadiusEl += std::pow(track.tpcNSigmaEl(), 2); + squareRadiusKa += std::pow(track.tpcNSigmaKa(), 2); + } + // select most probable PID based on lowest NSigma radius + if (doPions && squareRadiusPi < squareRadiusEl && squareRadiusPi < squareRadiusKa && squareRadiusPi < std::pow(tracksTpcNSigmaPiCut, 2)) { + return 0; + } else if (doElectrons && squareRadiusEl < squareRadiusPi && squareRadiusEl < squareRadiusKa && squareRadiusEl < std::pow(tracksTpcNSigmaElCut, 2)) { + return 1; + } else if (doKaons && squareRadiusKa < squareRadiusPi && squareRadiusKa < squareRadiusEl && squareRadiusKa < std::pow(tracksTpcNSigmaKaCut, 2)) { + return 2; + } else { + return -1; + } + } + template bool tracksPassPiPID(const T& cutTracks) // n-dimensional pion PID cut { @@ -651,7 +682,7 @@ struct upcRhoAnalysis { return charge; } - bool systemPassCuts(const TLorentzVector& system) // system cuts + bool systemPassesCuts(const TLorentzVector& system) // system cuts { if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) return false; @@ -708,24 +739,7 @@ struct upcRhoAnalysis { template void processReco(C const& collision, T const& tracks) { - // QC histograms - rQC.fill(HIST("QC/collisions/all/hPosXY"), collision.posX(), collision.posY()); - rQC.fill(HIST("QC/collisions/all/hPosZ"), collision.posZ()); - rQC.fill(HIST("QC/collisions/all/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - rQC.fill(HIST("QC/collisions/all/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - rQC.fill(HIST("QC/collisions/all/hNumContrib"), collision.numContrib()); - rQC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - rQC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - rQC.fill(HIST("QC/collisions/all/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - rQC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - rQC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - rQC.fill(HIST("QC/collisions/all/hTimeFT0A"), collision.timeFT0A()); - rQC.fill(HIST("QC/collisions/all/hTimeFT0C"), collision.timeFT0C()); - rQC.fill(HIST("QC/collisions/all/hTimeFV0A"), collision.timeFV0A()); - rQC.fill(HIST("QC/collisions/all/hTimeFDDA"), collision.timeFDDA()); - rQC.fill(HIST("QC/collisions/all/hTimeFDDC"), collision.timeFDDC()); - - // vertex z-position cut + fillCollisionQcHistos<0>(collision); // fill QC histograms before cuts if (!collisionPassesCuts(collision)) return; @@ -762,6 +776,7 @@ struct upcRhoAnalysis { rQC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaPi"), track.tpcNSigmaPi()); rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaEl"), track.tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaKa"), track.tpcNSigmaKa()); rQC.fill(HIST("QC/tracks/raw/hDcaXYZ"), track.dcaZ(), track.dcaXY()); rQC.fill(HIST("QC/tracks/raw/hItsNCls"), track.itsNCls()); rQC.fill(HIST("QC/tracks/raw/hItsChi2NCl"), track.itsChi2NCl()); @@ -779,6 +794,7 @@ struct upcRhoAnalysis { cutTracks4Vecs.push_back(track4Vec); rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi"), track.tpcNSigmaPi()); rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl"), track.tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaKa"), track.tpcNSigmaKa()); rQC.fill(HIST("QC/tracks/cut/hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); rQC.fill(HIST("QC/tracks/cut/hTpcSignalVsPt"), track.pt(), track.tpcSignal()); rQC.fill(HIST("QC/tracks/cut/hDcaXYZ"), track.dcaZ(), track.dcaXY()); @@ -788,48 +804,36 @@ struct upcRhoAnalysis { LOG(error); return; } - // reonstruct system and calculate total charge, save commonly used values into variables - TLorentzVector system = reconstructSystem(cutTracks4Vecs); - int totalCharge = tracksTotalCharge(cutTracks); - float mass = system.M(); - float pT = system.Pt(); - float pTsquare = pT * pT; - float rapidity = system.Rapidity(); - float systemPhi = system.Phi() + o2::constants::math::PI; - - if (do4pi && cutTracks.size() == 4 && totalCharge == 0) { - // fill out some 4pi QC histograms - for (int i = 0; i < static_cast(cutTracks.size()); i++) { - rFourPiQA.fill(HIST("FourPiQA/reco/tracks/hPt"), cutTracks[i].pt()); - rFourPiQA.fill(HIST("FourPiQA/reco/tracks/hEta"), eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz())); - rFourPiQA.fill(HIST("FourPiQA/reco/tracks/hPhi"), phi(cutTracks[i].px(), cutTracks[i].py())); - } - rFourPiQA.fill(HIST("FourPiQA/reco/system/hM"), mass); - rFourPiQA.fill(HIST("FourPiQA/reco/system/hPt"), pT); - rFourPiQA.fill(HIST("FourPiQA/reco/system/hY"), rapidity); - rFourPiQA.fill(HIST("FourPiQA/reco/system/hPhi"), systemPhi); - } // further consider only two pion systems if (cutTracks.size() != 2) return; for (int i = 0; i < static_cast(cutTracks.size()); i++) rQC.fill(HIST("QC/tracks/hSelectionCounter"), 14); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaKa2D"), cutTracks[0].tpcNSigmaKa(), cutTracks[1].tpcNSigmaKa()); if (!tracksPassPiPID(cutTracks)) return; for (int i = 0; i < static_cast(cutTracks.size()); i++) rQC.fill(HIST("QC/tracks/hSelectionCounter"), 15); + // reonstruct system and calculate total charge, save commonly used values into variables + TLorentzVector system = reconstructSystem(cutTracks4Vecs); + int totalCharge = tracksTotalCharge(cutTracks); + float mass = system.M(); + float pT = system.Pt(); + float pTsquare = pT * pT; + float rapidity = system.Rapidity(); + float systemPhi = system.Phi() + o2::constants::math::PI; float phiRandom = getPhiRandom(cutTracks4Vecs); float phiCharge = getPhiCharge(cutTracks, cutTracks4Vecs); // 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]; + float leadingPt = leadingMomentumTrack.pt(); float subleadingPt = subleadingMomentumTrack.pt(); float leadingEta = eta(leadingMomentumTrack.px(), leadingMomentumTrack.py(), leadingMomentumTrack.pz()); @@ -856,7 +860,7 @@ struct upcRhoAnalysis { 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(), - collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), neutronClass, + collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), /* neutronClass, */ totalCharge, pT, rapidity, system.Phi(), mass, phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackMs, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); @@ -903,24 +907,9 @@ struct upcRhoAnalysis { } // apply cuts to system - if (!systemPassCuts(system)) + if (!systemPassesCuts(system)) return; - - rQC.fill(HIST("QC/collisions/selected/hPosXY"), collision.posX(), collision.posY()); - rQC.fill(HIST("QC/collisions/selected/hPosZ"), collision.posZ()); - rQC.fill(HIST("QC/collisions/selected/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - rQC.fill(HIST("QC/collisions/selected/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - rQC.fill(HIST("QC/collisions/selected/hNumContrib"), collision.numContrib()); - rQC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - rQC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - rQC.fill(HIST("QC/collisions/selected/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - rQC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - rQC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - rQC.fill(HIST("QC/collisions/selected/hTimeFT0A"), collision.timeFT0A()); - rQC.fill(HIST("QC/collisions/selected/hTimeFT0C"), collision.timeFT0C()); - rQC.fill(HIST("QC/collisions/selected/hTimeFV0A"), collision.timeFV0A()); - rQC.fill(HIST("QC/collisions/selected/hTimeFDDA"), collision.timeFDDA()); - rQC.fill(HIST("QC/collisions/selected/hTimeFDDC"), collision.timeFDDC()); + fillCollisionQcHistos<1>(collision); // fill QC histograms for collisions with selected system // fill histograms for system passing cuts switch (totalCharge) { @@ -1166,7 +1155,9 @@ struct upcRhoAnalysis { mcParticles4Vecs.push_back(pion4Vec); } rMC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); - + + if (cutMcParticles.size() != 2) + return; if (mcParticles4Vecs.size() != cutMcParticles.size()) return; if (tracksTotalChargeMC(cutMcParticles) != 0) // shouldn't happen in theory @@ -1178,21 +1169,8 @@ struct upcRhoAnalysis { float pTsquare = pT * pT; float rapidity = system.Rapidity(); float systemPhi = system.Phi() + o2::constants::math::PI; - - if (do4pi && cutMcParticles.size() == 4) { - for (int i = 0; i < static_cast(cutMcParticles.size()); i++) { - rFourPiQA.fill(HIST("FourPiQA/MC/tracks/hPt"), pt(cutMcParticles[i].px(), cutMcParticles[i].py())); - rFourPiQA.fill(HIST("FourPiQA/MC/tracks/hEta"), eta(cutMcParticles[i].px(), cutMcParticles[i].py(), cutMcParticles[i].pz())); - rFourPiQA.fill(HIST("FourPiQA/MC/tracks/hPhi"), phi(cutMcParticles[i].px(), cutMcParticles[i].py())); - } - rFourPiQA.fill(HIST("FourPiQA/MC/system/hM"), mass); - rFourPiQA.fill(HIST("FourPiQA/MC/system/hPt"), pT); - rFourPiQA.fill(HIST("FourPiQA/MC/system/hY"), rapidity); - rFourPiQA.fill(HIST("FourPiQA/MC/system/hPhi"), systemPhi); - } - - if (cutMcParticles.size() != 2) - return; + float phiRandom = getPhiRandom(mcParticles4Vecs); + float phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); 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]; @@ -1200,9 +1178,6 @@ struct upcRhoAnalysis { rMC.fill(HIST("MC/tracks/pions/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); rMC.fill(HIST("MC/tracks/pions/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - float phiRandom = getPhiRandom(mcParticles4Vecs); - float phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); - rMC.fill(HIST("MC/system/hM"), mass); rMC.fill(HIST("MC/system/hPt"), pT); rMC.fill(HIST("MC/system/hPtVsM"), mass, pT); From 8814d6c250dab1468fddc29c8e69736e36818482 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Sat, 8 Feb 2025 18:41:42 +0100 Subject: [PATCH 07/14] make use of addClone for init of registries --- PWGUD/Tasks/upcRhoAnalysis.cxx | 411 ++++++++------------------------- 1 file changed, 101 insertions(+), 310 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 65ac18f0267..6c0c25a3c11 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -177,11 +177,9 @@ struct upcRhoAnalysis { ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; ConfigurableAxis znCommonEnergyAxis{"znCommonEnergyAxis", {250, -5.0, 20.0}, "ZN common energy (TeV)"}; ConfigurableAxis znTimeAxis{"znTimeAxis", {200, -10.0, 10.0}, "ZN time (ns)"}; - // ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; - + HistogramRegistry rQC{"rQC", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry rPions{"rPions", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry rElectrons{"rElectrons", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rTracks{"rTracks", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry rSystem{"rSystem", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry rMC{"rMC", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -205,26 +203,12 @@ struct upcRhoAnalysis { rQC.add("QC/collisions/all/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); rQC.add("QC/collisions/all/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); // events with selected rho candidates - rQC.add("QC/collisions/selected/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - rQC.add("QC/collisions/selected/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - rQC.add("QC/collisions/selected/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - rQC.add("QC/collisions/selected/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); - rQC.add("QC/collisions/selected/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); - rQC.add("QC/collisions/selected/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - rQC.add("QC/collisions/selected/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - rQC.add("QC/collisions/selected/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - rQC.add("QC/collisions/selected/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - rQC.add("QC/collisions/selected/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - rQC.add("QC/collisions/selected/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - rQC.add("QC/collisions/selected/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - rQC.add("QC/collisions/selected/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - rQC.add("QC/collisions/selected/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - rQC.add("QC/collisions/selected/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - + rQC.addClone("QC/collisions/all/", "QC/collisions/selected/"); // clone "all" histograms as "selected" rQC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); rQC.add("QC/collisions/selected/hNumContribVsSystemY", ";y;number of contributors;counts", kTH2D, {yAxis,{36, -0.5, 35.5}}); rQC.add("QC/collisions/selected/hNumContribVsSystemM", ";m (GeV/#it{c}^{2});number of contributors;counts", kTH2D, {mAxis,{36, -0.5, 35.5}}); - // all tracks + + // tracks rQC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); rQC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); rQC.add("QC/tracks/raw/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); @@ -238,78 +222,60 @@ struct upcRhoAnalysis { rQC.add("QC/tracks/raw/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); rQC.add("QC/tracks/raw/hEta", ";y;counts", kTH1D, {etaAxis}); rQC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rQC.add("QC/tracks/raw/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + rQC.add("QC/tracks/raw/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); // tracks passing selections - rQC.add("QC/tracks/cut/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.addClone("QC/tracks/raw/", "QC/tracks/cut/"); // clone "raw" histograms as "cut" + rQC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); rQC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - rQC.add("QC/tracks/cut/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); rQC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - rQC.add("QC/tracks/cut/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); rQC.add("QC/tracks/cut/hTpcNSigmaKa2D", ";TPC n#sigma(K_{leading});TPC n#sigma(K_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - rQC.add("QC/tracks/cut/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - rQC.add("QC/tracks/cut/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - rQC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); - rQC.add("QC/tracks/cut/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); // selection counter std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS hit", "ITS N_{clusters}", "ITS #chi^{2}/N_{clusters}", "TPC hit", "TPC N_{clusters} found", "TPC #chi^{2}/N_{clusters}", "TPC crossed rows", "TPC crossed rows/N_{clusters}", "TOF requirement", "p_{T}", "DCA", "#eta", "exactly 2 tracks", "PID"}; - auto hSelectionCounter = rQC.add("QC/tracks/hSelectionCounter", ";;counts", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); + rQC.add("QC/tracks/hSelectionCounter", ";;tracks passing selections", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); for (int i = 0; i < static_cast(selectionCounterLabels.size()); ++i) - hSelectionCounter->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); - // TOF hit check + rQC.get(HIST("QC/tracks/hSelectionCounter"))->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); rQC.add("QC/tracks/hTofHitCheck", ";leading track TOF hit;subleading track TOF hit;counts", kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}}); - // RECO HISTOS // - // PIONS - // no selection - rPions.add("pions/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rPions.add("pions/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rPions.add("pions/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rPions.add("pions/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rPions.add("pions/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rPions.add("pions/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - // from selected systems - rPions.add("pions/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rPions.add("pions/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rPions.add("pions/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rPions.add("pions/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rPions.add("pions/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rPions.add("pions/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - // ELECTRONS - // no selection - rElectrons.add("electrons/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rElectrons.add("electrons/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rElectrons.add("electrons/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rElectrons.add("electrons/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rElectrons.add("electrons/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rElectrons.add("electrons/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - // from selected systems - rElectrons.add("electrons/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rElectrons.add("electrons/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rElectrons.add("electrons/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rElectrons.add("electrons/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rElectrons.add("electrons/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rElectrons.add("electrons/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - - // RAW RHOS + + // TRACKS (2D) + // pions + if (doPions) { + rTracks.add("tracks/pions/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rTracks.add("tracks/pions/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rTracks.add("tracks/pions/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rTracks.addClone("tracks/pions/no-selection/unlike-sign/", "tracks/pions/no-selection/like-sign/"); + rTracks.addClone("tracks/pions/no-selection/", "tracks/pions/selected/"); + } + // electrons + if (doElectrons) { + rTracks.add("tracks/electrons/no-selection/unlike-sign/hPt", ";p_{T}(e_{leading}) (GeV/#it{c});p_{T}(e_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rTracks.add("tracks/electrons/no-selection/unlike-sign/hEta", ";#eta(e_{leading});#eta(e_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rTracks.add("tracks/electrons/no-selection/unlike-sign/hPhi", ";#phi(e_{leading});#phi(e_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rTracks.addClone("tracks/electrons/no-selection/unlike-sign/", "tracks/electrons/no-selection/like-sign/"); + rTracks.addClone("tracks/electrons/no-selection/", "tracks/electrons/selected/"); + } + // kaons + if (doKaons) { + rTracks.add("tracks/kaons/no-selection/unlike-sign/hPt", ";p_{T}(K_{leading}) (GeV/#it{c});p_{T}(K_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rTracks.add("tracks/kaons/no-selection/unlike-sign/hEta", ";#eta(K_{leading});#eta(K_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rTracks.add("tracks/kaons/no-selection/unlike-sign/hPhi", ";#phi(K_{leading});#phi(K_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rTracks.addClone("tracks/kaons/no-selection/unlike-sign/", "tracks/kaons/no-selection/like-sign/"); + rTracks.addClone("tracks/kaons/no-selection/", "tracks/kaons/selected/"); + } + + // SYSTEM rSystem.add("system/raw/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); rSystem.add("system/raw/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); rSystem.add("system/raw/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); rSystem.add("system/raw/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); rSystem.add("system/raw/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rSystem.add("system/raw/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - rSystem.add("system/raw/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rSystem.add("system/raw/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - rSystem.add("system/raw/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/raw/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rSystem.add("system/raw/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - rSystem.add("system/raw/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rSystem.add("system/raw/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - rSystem.add("system/raw/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/raw/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - - // SELECTED RHOS - // no selection + // clones for like-sign + rSystem.addClone("system/raw/unlike-sign/", "system/raw/like-sign/positive/"); + rSystem.addClone("system/raw/unlike-sign/", "system/raw/like-sign/negative/"); + // selected rhos rSystem.add("system/cut/no-selection/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); rSystem.add("system/cut/no-selection/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); rSystem.add("system/cut/no-selection/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); @@ -322,199 +288,22 @@ struct upcRhoAnalysis { rSystem.add("system/cut/no-selection/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); rSystem.add("system/cut/no-selection/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); rSystem.add("system/cut/no-selection/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/no-selection/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/no-selection/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/no-selection/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/no-selection/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // 0n0n - rSystem.add("system/cut/0n0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/0n0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/0n0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/0n0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/0n0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/0n0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // Xn0n - rSystem.add("system/cut/Xn0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/Xn0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/Xn0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/Xn0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // 0nXn - rSystem.add("system/cut/0nXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/0nXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/0nXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/0nXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/0nXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/0nXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // XnXn - rSystem.add("system/cut/XnXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/XnXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/XnXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/XnXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - rSystem.add("system/cut/XnXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/XnXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - + // clones for like-sign + rSystem.addClone("system/cut/no-selection/unlike-sign/", "system/cut/no-selection/like-sign/positive/"); + rSystem.addClone("system/cut/no-selection/unlike-sign/", "system/cut/no-selection/like-sign/negative/"); + // clones for neutron classes + rSystem.addClone("system/cut/no-selection/", "system/cut/0n0n/"); + rSystem.addClone("system/cut/no-selection/", "system/cut/Xn0n/"); + rSystem.addClone("system/cut/no-selection/", "system/cut/0nXn/"); + rSystem.addClone("system/cut/no-selection/", "system/cut/XnXn/"); + // MC + // collisions rMC.add("MC/collisions/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); rMC.add("MC/collisions/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); rMC.add("MC/collisions/hNPions", ";number of pions;counts", kTH1D, {{11, -0.5, 10.5}}); rMC.add("MC/collisions/hNumOfCollisionRecos", ";number of collision reconstructions;counts", kTH1D, {{11, -0.5, 10.5}}); - + // tracks rMC.add("MC/tracks/all/hPdgCode", ";pdg code;counts", kTH1D, {{2001, -1000.5, 1000.5}}); rMC.add("MC/tracks/all/hProducedByGenerator", ";produced by generator;counts", kTH1D, {{2, -0.5, 1.5}}); rMC.add("MC/tracks/all/hIsPhysicalPrimary", ";is physical primary;counts", kTH1D, {{2, -0.5, 1.5}}); @@ -524,7 +313,7 @@ struct upcRhoAnalysis { rMC.add("MC/tracks/pions/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); rMC.add("MC/tracks/pions/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); rMC.add("MC/tracks/pions/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - + // system rMC.add("MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); rMC.add("MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); rMC.add("MC/system/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); @@ -535,26 +324,26 @@ struct upcRhoAnalysis { rMC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); } - template + template void fillCollisionQcHistos(const C& collision) // fills collision QC histograms before/after cuts { - static constexpr std::string_view mode[2] = {"all", "selected"}; - - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hPosXY"), collision.posX(), collision.posY()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hPosZ"), collision.posZ()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hNumContrib"), collision.numContrib()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFT0A"), collision.timeFT0A()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFT0C"), collision.timeFT0C()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFV0A"), collision.timeFV0A()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFDDA"), collision.timeFDDA()); - rQC.fill(HIST("QC/collisions/") + HIST(mode[i]) + HIST("/hTimeFDDC"), collision.timeFDDC()); + static constexpr std::string_view Mode[2] = {"all", "selected"}; + + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hPosXY"), collision.posX(), collision.posY()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hPosZ"), collision.posZ()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hZdcTime"), collision.timeZNA(), collision.timeZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hNumContrib"), collision.numContrib()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFT0A"), collision.timeFT0A()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFT0C"), collision.timeFT0C()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFV0A"), collision.timeFV0A()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFDDA"), collision.timeFDDA()); + rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFDDC"), collision.timeFDDC()); } template @@ -630,20 +419,22 @@ struct upcRhoAnalysis { // calculate NSigma "radii" float squareRadiusPi = 0.0, squareRadiusEl = 0.0, squareRadiusKa = 0.0; for (const auto& track : cutTracks) { - squareRadiusPi += std::pow(track.tpcNSigmaPi(), 2); - squareRadiusEl += std::pow(track.tpcNSigmaEl(), 2); - squareRadiusKa += std::pow(track.tpcNSigmaKa(), 2); + if (doPions) + squareRadiusPi += std::pow(track.tpcNSigmaPi(), 2); + if (doElectrons) + squareRadiusEl += std::pow(track.tpcNSigmaEl(), 2); + if (doKaons) + squareRadiusKa += std::pow(track.tpcNSigmaKa(), 2); } // select most probable PID based on lowest NSigma radius - if (doPions && squareRadiusPi < squareRadiusEl && squareRadiusPi < squareRadiusKa && squareRadiusPi < std::pow(tracksTpcNSigmaPiCut, 2)) { + if (doPions && (!doElectrons || squareRadiusPi < squareRadiusEl) && (!doKaons || squareRadiusPi < squareRadiusKa) && squareRadiusPi < std::pow(tracksTpcNSigmaPiCut, 2)) return 0; - } else if (doElectrons && squareRadiusEl < squareRadiusPi && squareRadiusEl < squareRadiusKa && squareRadiusEl < std::pow(tracksTpcNSigmaElCut, 2)) { + else if (doElectrons && (!doPions || squareRadiusEl < squareRadiusPi) && (!doKaons || squareRadiusEl < squareRadiusKa) && squareRadiusEl < std::pow(tracksTpcNSigmaElCut, 2)) return 1; - } else if (doKaons && squareRadiusKa < squareRadiusPi && squareRadiusKa < squareRadiusEl && squareRadiusKa < std::pow(tracksTpcNSigmaKaCut, 2)) { + else if (doKaons && (!doPions || squareRadiusKa < squareRadiusPi) && (!doElectrons || squareRadiusKa < squareRadiusEl) && squareRadiusKa < std::pow(tracksTpcNSigmaKaCut, 2)) return 2; - } else { + else return -1; - } } template @@ -867,9 +658,9 @@ struct upcRhoAnalysis { // fill raw histograms according to the total charge switch (totalCharge) { case 0: - rPions.fill(HIST("pions/no-selection/unlike-sign/hPt"), leadingPt, subleadingPt); - rPions.fill(HIST("pions/no-selection/unlike-sign/hEta"), leadingEta, subleadingEta); - rPions.fill(HIST("pions/no-selection/unlike-sign/hPhi"), leadingPhi, subleadingPhi); + rTracks.fill(HIST("tracks/pions/no-selection/unlike-sign/hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/pions/no-selection/unlike-sign/hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/pions/no-selection/unlike-sign/hPhi"), leadingPhi, subleadingPhi); rSystem.fill(HIST("system/raw/unlike-sign/hM"), mass); rSystem.fill(HIST("system/raw/unlike-sign/hPt"), pT); rSystem.fill(HIST("system/raw/unlike-sign/hPtVsM"), mass, pT); @@ -881,9 +672,9 @@ struct upcRhoAnalysis { break; case 2: - rPions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - rPions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - rPions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); + rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); rSystem.fill(HIST("system/raw/like-sign/positive/hM"), mass); rSystem.fill(HIST("system/raw/like-sign/positive/hPt"), pT); rSystem.fill(HIST("system/raw/like-sign/positive/hPtVsM"), mass, pT); @@ -892,9 +683,9 @@ struct upcRhoAnalysis { break; case -2: - rPions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - rPions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - rPions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); + rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); rSystem.fill(HIST("system/raw/like-sign/negative/hM"), mass); rSystem.fill(HIST("system/raw/like-sign/negative/hPt"), pT); rSystem.fill(HIST("system/raw/like-sign/negative/hPtVsM"), mass, pT); @@ -914,9 +705,9 @@ struct upcRhoAnalysis { // fill histograms for system passing cuts switch (totalCharge) { case 0: - rPions.fill(HIST("pions/selected/unlike-sign/hPt"), leadingPt, subleadingPt); - rPions.fill(HIST("pions/selected/unlike-sign/hEta"), leadingEta, subleadingEta); - rPions.fill(HIST("pions/selected/unlike-sign/hPhi"), leadingPhi, subleadingPhi); + rTracks.fill(HIST("tracks/pions/selected/unlike-sign/hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/pions/selected/unlike-sign/hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/pions/selected/unlike-sign/hPhi"), leadingPhi, subleadingPhi); rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hM"), mass); rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPt"), pT); rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPt2"), pTsquare); @@ -985,9 +776,9 @@ struct upcRhoAnalysis { break; case 2: - rPions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - rPions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - rPions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); + rTracks.fill(HIST("tracks/pions/selected/like-sign/hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/pions/selected/like-sign/hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hM"), mass); rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPt"), pT); rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPt2"), pTsquare); @@ -1056,9 +847,9 @@ struct upcRhoAnalysis { break; case -2: - rPions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - rPions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - rPions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); + rTracks.fill(HIST("tracks/pions/selected/like-sign/hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/pions/selected/like-sign/hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hM"), mass); rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPt"), pT); rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPt2"), pTsquare); From cf480fd66580bcf5ac6463fb38f65171b2a5b2a3 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 12 Feb 2025 16:43:31 +0100 Subject: [PATCH 08/14] finished templatisation of histo filling --- PWGUD/Tasks/upcRhoAnalysis.cxx | 672 +++++++++++---------------------- 1 file changed, 212 insertions(+), 460 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 6c0c25a3c11..6a36a06a4ca 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -16,6 +16,7 @@ /// \file upcRhoAnalysis.cxx #include +#include #include #include "Framework/AnalysisTask.h" @@ -83,7 +84,6 @@ DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); -DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); // other stuff DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, std::vector); DECLARE_SOA_COLUMN(TrackElPID, trackElPID, std::vector); @@ -97,7 +97,7 @@ 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::TotalCharge, reco_tree::RhoPt, reco_tree::RhoY, reco_tree::RhoPhi, reco_tree::RhoM, reco_tree::RhoPhiRandom, reco_tree::RhoPhiCharge, - reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackM, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); + reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); namespace mc_tree { @@ -121,12 +121,11 @@ DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); -DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); } // namespace mcTree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", mc_tree::LocalBc, mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, mc_tree::RhoPt, mc_tree::RhoY, mc_tree::RhoPhi, mc_tree::RhoM, mc_tree::RhoPhiRandom, mc_tree::RhoPhiCharge, - mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi, mc_tree::TrackM); + mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi); } // namespace o2::aod struct upcRhoAnalysis { @@ -136,12 +135,8 @@ struct upcRhoAnalysis { float pcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; - Configurable doPions{"doPions", true, "do analysis with PIDed pions"}; - Configurable doElectrons{"doElectrons", true, "do analysis with PIDed electrons"}; - Configurable doKaons{"doKaons", true, "do analysis with PIDed kaons"}; - Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; - Configurable collisionsNumContribsMaxCut{"collisionsNumContribsMaxCut", 7, "max number of contributors cut on collisions"}; + Configurable collisionsNumContribsMaxCut{"collisionsNumContribsMaxCut", 4, "max number of contributors cut on collisions"}; Configurable znCommonEnergyCut{"znCommonEnergyCut", 0.0, "ZN common energy cut"}; Configurable znTimeCut{"znTimeCut", 2.0, "ZN time cut"}; @@ -209,93 +204,64 @@ struct upcRhoAnalysis { rQC.add("QC/collisions/selected/hNumContribVsSystemM", ";m (GeV/#it{c}^{2});number of contributors;counts", kTH2D, {mAxis,{36, -0.5, 35.5}}); // tracks - rQC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); - rQC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); - rQC.add("QC/tracks/raw/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); - rQC.add("QC/tracks/raw/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); - rQC.add("QC/tracks/raw/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); - rQC.add("QC/tracks/raw/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); - rQC.add("QC/tracks/raw/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); - rQC.add("QC/tracks/raw/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); - rQC.add("QC/tracks/raw/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); - rQC.add("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable", ";TPC crossed rows/findable N_{cls};counts", kTH1D, {{100, 0.0, 10.0}}); - rQC.add("QC/tracks/raw/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rQC.add("QC/tracks/raw/hEta", ";y;counts", kTH1D, {etaAxis}); - rQC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rQC.add("QC/tracks/raw/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - rQC.add("QC/tracks/raw/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + rQC.add("QC/tracks/all/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/all/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/all/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/all/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); + rQC.add("QC/tracks/all/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); + rQC.add("QC/tracks/all/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); + rQC.add("QC/tracks/all/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); + rQC.add("QC/tracks/all/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); + rQC.add("QC/tracks/all/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); + rQC.add("QC/tracks/all/hTpcNClsCrossedRowsOverNClsFindable", ";TPC crossed rows/findable N_{cls};counts", kTH1D, {{100, 0.0, 10.0}}); + rQC.add("QC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rQC.add("QC/tracks/all/hEta", ";y;counts", kTH1D, {etaAxis}); + rQC.add("QC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rQC.add("QC/tracks/all/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + rQC.add("QC/tracks/all/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); // tracks passing selections - rQC.addClone("QC/tracks/raw/", "QC/tracks/cut/"); // clone "raw" histograms as "cut" - rQC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); - rQC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - rQC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - rQC.add("QC/tracks/cut/hTpcNSigmaKa2D", ";TPC n#sigma(K_{leading});TPC n#sigma(K_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.addClone("QC/tracks/all/", "QC/tracks/selected/"); // clone "raw" histograms as "cut" + rQC.add("QC/tracks/selected/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); + rQC.add("QC/tracks/selected/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/selected/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/selected/hTpcNSigmaKa2D", ";TPC n#sigma(K_{leading});TPC n#sigma(K_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); // selection counter std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS hit", "ITS N_{clusters}", "ITS #chi^{2}/N_{clusters}", "TPC hit", "TPC N_{clusters} found", "TPC #chi^{2}/N_{clusters}", "TPC crossed rows", "TPC crossed rows/N_{clusters}", "TOF requirement", - "p_{T}", "DCA", "#eta", "exactly 2 tracks", "PID"}; + "p_{T}", "DCA", "#eta", "exactly 2 tracks"}; rQC.add("QC/tracks/hSelectionCounter", ";;tracks passing selections", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); for (int i = 0; i < static_cast(selectionCounterLabels.size()); ++i) rQC.get(HIST("QC/tracks/hSelectionCounter"))->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); rQC.add("QC/tracks/hTofHitCheck", ";leading track TOF hit;subleading track TOF hit;counts", kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}}); // TRACKS (2D) - // pions - if (doPions) { - rTracks.add("tracks/pions/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rTracks.add("tracks/pions/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rTracks.add("tracks/pions/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rTracks.addClone("tracks/pions/no-selection/unlike-sign/", "tracks/pions/no-selection/like-sign/"); - rTracks.addClone("tracks/pions/no-selection/", "tracks/pions/selected/"); - } - // electrons - if (doElectrons) { - rTracks.add("tracks/electrons/no-selection/unlike-sign/hPt", ";p_{T}(e_{leading}) (GeV/#it{c});p_{T}(e_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rTracks.add("tracks/electrons/no-selection/unlike-sign/hEta", ";#eta(e_{leading});#eta(e_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rTracks.add("tracks/electrons/no-selection/unlike-sign/hPhi", ";#phi(e_{leading});#phi(e_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rTracks.addClone("tracks/electrons/no-selection/unlike-sign/", "tracks/electrons/no-selection/like-sign/"); - rTracks.addClone("tracks/electrons/no-selection/", "tracks/electrons/selected/"); - } - // kaons - if (doKaons) { - rTracks.add("tracks/kaons/no-selection/unlike-sign/hPt", ";p_{T}(K_{leading}) (GeV/#it{c});p_{T}(K_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rTracks.add("tracks/kaons/no-selection/unlike-sign/hEta", ";#eta(K_{leading});#eta(K_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - rTracks.add("tracks/kaons/no-selection/unlike-sign/hPhi", ";#phi(K_{leading});#phi(K_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - rTracks.addClone("tracks/kaons/no-selection/unlike-sign/", "tracks/kaons/no-selection/like-sign/"); - rTracks.addClone("tracks/kaons/no-selection/", "tracks/kaons/selected/"); - } + rTracks.add("tracks/all/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rTracks.add("tracks/all/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rTracks.add("tracks/all/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rTracks.addClone("tracks/all/unlike-sign/", "tracks/all/like-sign/positive/"); + rTracks.addClone("tracks/all/unlike-sign/", "tracks/all/like-sign/negative/"); + rTracks.addClone("tracks/all/", "tracks/selected/"); // SYSTEM - rSystem.add("system/raw/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - rSystem.add("system/raw/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - rSystem.add("system/raw/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - rSystem.add("system/raw/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/raw/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/all/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rSystem.add("system/all/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rSystem.add("system/all/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/all/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rSystem.add("system/all/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/all/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/all/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/all/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); // clones for like-sign - rSystem.addClone("system/raw/unlike-sign/", "system/raw/like-sign/positive/"); - rSystem.addClone("system/raw/unlike-sign/", "system/raw/like-sign/negative/"); + rSystem.addClone("system/all/unlike-sign/", "system/all/like-sign/positive/"); + rSystem.addClone("system/all/unlike-sign/", "system/all/like-sign/negative/"); // selected rhos - rSystem.add("system/cut/no-selection/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - rSystem.add("system/cut/no-selection/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - // clones for like-sign - rSystem.addClone("system/cut/no-selection/unlike-sign/", "system/cut/no-selection/like-sign/positive/"); - rSystem.addClone("system/cut/no-selection/unlike-sign/", "system/cut/no-selection/like-sign/negative/"); + rSystem.addClone("system/all/", "system/selected/no-selection/"); // clones for neutron classes - rSystem.addClone("system/cut/no-selection/", "system/cut/0n0n/"); - rSystem.addClone("system/cut/no-selection/", "system/cut/Xn0n/"); - rSystem.addClone("system/cut/no-selection/", "system/cut/0nXn/"); - rSystem.addClone("system/cut/no-selection/", "system/cut/XnXn/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/0n0n/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/Xn0n/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/0nXn/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/XnXn/"); // MC // collisions @@ -310,9 +276,9 @@ struct upcRhoAnalysis { rMC.add("MC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); rMC.add("MC/tracks/all/hEta", ";#eta;counts", kTH1D, {etaAxis}); rMC.add("MC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - rMC.add("MC/tracks/pions/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - rMC.add("MC/tracks/pions/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); - rMC.add("MC/tracks/pions/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rMC.add("MC/tracks/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rMC.add("MC/tracks/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); + rMC.add("MC/tracks/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); // system rMC.add("MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); rMC.add("MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); @@ -324,35 +290,90 @@ struct upcRhoAnalysis { rMC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); } + static constexpr std::string_view AppliedSelections[2] = {"all/", "selected/"}; + static constexpr std::string_view ChargeLabel[3] = {"unlike-sign/", "like-sign/positive/", "like-sign/negative/"}; + static constexpr std::string_view NeutronClass[5] = {"no-selection/", "0n0n/", "Xn0n/", "0nXn/", "XnXn/"}; + template void fillCollisionQcHistos(const C& collision) // fills collision QC histograms before/after cuts { - static constexpr std::string_view Mode[2] = {"all", "selected"}; - - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hPosXY"), collision.posX(), collision.posY()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hPosZ"), collision.posZ()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hNumContrib"), collision.numContrib()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFT0A"), collision.timeFT0A()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFT0C"), collision.timeFT0C()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFV0A"), collision.timeFV0A()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFDDA"), collision.timeFDDA()); - rQC.fill(HIST("QC/collisions/") + HIST(Mode[cuts]) + HIST("/hTimeFDDC"), collision.timeFDDC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hPosXY"), collision.posX(), collision.posY()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hPosZ"), collision.posZ()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hZdcTime"), collision.timeZNA(), collision.timeZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hNumContrib"), collision.numContrib()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFT0A"), collision.timeFT0A()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFT0C"), collision.timeFT0C()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFV0A"), collision.timeFV0A()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFDDA"), collision.timeFDDA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFDDC"), collision.timeFDDC()); + } + + template + void fillTrackQcHistos(const T& track) + { + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hPt"), track.pt()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hEta"), eta(track.px(), track.py(), track.pz())); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hPhi"), phi(track.px(), track.py())); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNSigmaPi"), track.tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNSigmaEl"), track.tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNSigmaKa"), track.tpcNSigmaKa()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hDcaXYZ"), track.dcaZ(), track.dcaXY()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hItsNCls"), track.itsNCls()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hItsChi2NCl"), track.itsChi2NCl()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcChi2NCl"), track.tpcChi2NCl()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNClsCrossedRowsOverNClsFindable"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcSignalVsPt"), track.pt(), track.tpcSignal()); + } + + template + void fillTrack2dHistos(float leadingPt, float subleadingPt, float leadingEta, float subleadingEta, float leadingPhi, float subleadingPhi) + { + rTracks.fill(HIST("tracks/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhi"), leadingPhi, subleadingPhi); } + template + void fillSystemHistos(float mass, float pt, float rapidity, float phi, float phiRandom, float phiCharge) + { + if (cuts == 0) { + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hM"), mass); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPt"), pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPt2"), pt * pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPtVsM"), mass, pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hY"), rapidity); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhi"), phi); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhiCharge"), phiCharge); + } else { + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hM"), mass); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPt"), pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPt2"), pt * pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPtVsM"), mass, pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hY"), rapidity); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPhi"), phi); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPhiCharge"), phiCharge); + } + } + + template bool collisionPassesCuts(const C& collision) // collision cuts { if (std::abs(collision.posZ()) > collisionsPosZMaxCut) return false; - // if (collision.numContrib() > collisionsNumContribsMaxCut) - // return false; + if (collision.numContrib() > collisionsNumContribsMaxCut) + return false; return true; } @@ -414,29 +435,6 @@ struct upcRhoAnalysis { return true; } - template - int mostProbablePID(const T& cutTracks) { - // calculate NSigma "radii" - float squareRadiusPi = 0.0, squareRadiusEl = 0.0, squareRadiusKa = 0.0; - for (const auto& track : cutTracks) { - if (doPions) - squareRadiusPi += std::pow(track.tpcNSigmaPi(), 2); - if (doElectrons) - squareRadiusEl += std::pow(track.tpcNSigmaEl(), 2); - if (doKaons) - squareRadiusKa += std::pow(track.tpcNSigmaKa(), 2); - } - // select most probable PID based on lowest NSigma radius - if (doPions && (!doElectrons || squareRadiusPi < squareRadiusEl) && (!doKaons || squareRadiusPi < squareRadiusKa) && squareRadiusPi < std::pow(tracksTpcNSigmaPiCut, 2)) - return 0; - else if (doElectrons && (!doPions || squareRadiusEl < squareRadiusPi) && (!doKaons || squareRadiusEl < squareRadiusKa) && squareRadiusEl < std::pow(tracksTpcNSigmaElCut, 2)) - return 1; - else if (doKaons && (!doPions || squareRadiusKa < squareRadiusPi) && (!doElectrons || squareRadiusKa < squareRadiusEl) && squareRadiusKa < std::pow(tracksTpcNSigmaKaCut, 2)) - return 2; - else - return -1; - } - template bool tracksPassPiPID(const T& cutTracks) // n-dimensional pion PID cut { @@ -446,15 +444,6 @@ struct upcRhoAnalysis { return radius < std::pow(tracksTpcNSigmaPiCut, 2); } - template - bool tracksPassElPID(const T& cutTracks) // n-dimensional electron PID cut - { - float radius = 0.0; - for (const auto& track : cutTracks) - radius += std::pow(track.tpcNSigmaEl(), 2); - return radius < std::pow(tracksTpcNSigmaElCut, 2); - } - template int tracksTotalCharge(const T& cutTracks) // total charge of selected tracks { @@ -484,44 +473,44 @@ struct upcRhoAnalysis { return true; } - TLorentzVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors + TLorentzVector reconstructSystem(const std::vector& cutTracksLVs) // reconstruct system from 4-vectors { TLorentzVector system; - for (const auto& track4Vec : cutTracks4Vecs) - system += track4Vec; + for (const auto& trackLV : cutTracksLVs) + system += trackLV; return system; } - float getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy + float getPhiRandom(const std::vector& cutTracksLVs) // decay phi anisotropy { // two possible definitions of phi: randomize the tracks std::vector indices = {0, 1}; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices // calculate phi - TLorentzVector pOne = cutTracks4Vecs[indices[0]]; - TLorentzVector pTwo = cutTracks4Vecs[indices[1]]; + TLorentzVector pOne = cutTracksLVs[indices[0]]; + TLorentzVector pTwo = cutTracksLVs[indices[1]]; TLorentzVector pPlus = pOne + pTwo; TLorentzVector pMinus = pOne - pTwo; return pPlus.DeltaPhi(pMinus); } template - float getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) + float getPhiCharge(const T& cutTracks, const std::vector& cutTracksLVs) { // two possible definitions of phi: charge-based assignment TLorentzVector pOne, pTwo; - pOne = (cutTracks[0].sign() > 0) ? cutTracks4Vecs[0] : cutTracks4Vecs[1]; - pTwo = (cutTracks[0].sign() > 0) ? cutTracks4Vecs[1] : cutTracks4Vecs[0]; + pOne = (cutTracks[0].sign() > 0) ? cutTracksLVs[0] : cutTracksLVs[1]; + pTwo = (cutTracks[0].sign() > 0) ? cutTracksLVs[1] : cutTracksLVs[0]; TLorentzVector pPlus = pOne + pTwo; TLorentzVector pMinus = pOne - pTwo; return pPlus.DeltaPhi(pMinus); } template - float getPhiChargeMC(const T& cutTracks, const std::vector& cutTracks4Vecs) + float getPhiChargeMC(const T& cutTracks, const std::vector& cutTracksLVs) { // the same as for data but using pdg code instead of charge TLorentzVector pOne, pTwo; - pOne = (cutTracks[0].pdgCode() > 0) ? cutTracks4Vecs[0] : cutTracks4Vecs[1]; - pTwo = (cutTracks[0].pdgCode() > 0) ? cutTracks4Vecs[1] : cutTracks4Vecs[0]; + pOne = (cutTracks[0].pdgCode() > 0) ? cutTracksLVs[0] : cutTracksLVs[1]; + pTwo = (cutTracks[0].pdgCode() > 0) ? cutTracksLVs[1] : cutTracksLVs[0]; TLorentzVector pPlus = pOne + pTwo; TLorentzVector pMinus = pOne - pTwo; return pPlus.DeltaPhi(pMinus); @@ -534,96 +523,60 @@ struct upcRhoAnalysis { if (!collisionPassesCuts(collision)) return; - // event tagging bool xnxn = false, onon = false, xnon = false, onxn = false; // note: On == 0n... - int neutronClass = -1; - if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() < znCommonEnergyCut) { + if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() < znCommonEnergyCut) onon = true; - neutronClass = 0; - } - if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() < znCommonEnergyCut) { + if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() < znCommonEnergyCut) xnon = true; - neutronClass = 1; - } - if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) { + if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) onxn = true; - neutronClass = 2; - } if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && - collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) { + collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) xnxn = true; - neutronClass = 3; - } - // vectors for storing selected tracks and their 4-vectors - std::vector cutTracks; - std::vector cutTracks4Vecs; - + std::vector cutTracks; // store selected tracks for (const auto& track : tracks) { rQC.fill(HIST("QC/tracks/hSelectionCounter"), 0); - // float p = momentum(track.px(), track.py(), track.pz()); - rQC.fill(HIST("QC/tracks/raw/hPt"), track.pt()); - rQC.fill(HIST("QC/tracks/raw/hEta"), eta(track.px(), track.py(), track.pz())); - rQC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); - rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaPi"), track.tpcNSigmaPi()); - rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaEl"), track.tpcNSigmaEl()); - rQC.fill(HIST("QC/tracks/raw/hTpcNSigmaKa"), track.tpcNSigmaKa()); - rQC.fill(HIST("QC/tracks/raw/hDcaXYZ"), track.dcaZ(), track.dcaXY()); - rQC.fill(HIST("QC/tracks/raw/hItsNCls"), track.itsNCls()); - rQC.fill(HIST("QC/tracks/raw/hItsChi2NCl"), track.itsChi2NCl()); - rQC.fill(HIST("QC/tracks/raw/hTpcChi2NCl"), track.tpcChi2NCl()); - rQC.fill(HIST("QC/tracks/raw/hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); - rQC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); - rQC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRowsOverNClsFindable"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); - - if (!trackPassesCuts(track)) + fillTrackQcHistos<0>(track); // fill QC histograms before cuts + + if (!trackPassesCuts(track)) // apply track cuts continue; + fillTrackQcHistos<1>(track); // fill QC histograms after cuts cutTracks.push_back(track); - TLorentzVector track4Vec; - track4Vec.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass - cutTracks4Vecs.push_back(track4Vec); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi"), track.tpcNSigmaPi()); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl"), track.tpcNSigmaEl()); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaKa"), track.tpcNSigmaKa()); - rQC.fill(HIST("QC/tracks/cut/hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); - rQC.fill(HIST("QC/tracks/cut/hTpcSignalVsPt"), track.pt(), track.tpcSignal()); - rQC.fill(HIST("QC/tracks/cut/hDcaXYZ"), track.dcaZ(), track.dcaXY()); } - rQC.fill(HIST("QC/tracks/cut/hRemainingTracks"), cutTracks.size()); - if (cutTracks.size() != cutTracks4Vecs.size()) { // sanity check - LOG(error); - return; - } - - // further consider only two pion systems - if (cutTracks.size() != 2) + rQC.fill(HIST("QC/tracks/selected/hRemainingTracks"), cutTracks.size()); + + if (cutTracks.size() != 2) // further consider only two pion systems return; for (int i = 0; i < static_cast(cutTracks.size()); i++) rQC.fill(HIST("QC/tracks/hSelectionCounter"), 14); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); - rQC.fill(HIST("QC/tracks/cut/hTpcNSigmaKa2D"), cutTracks[0].tpcNSigmaKa(), cutTracks[1].tpcNSigmaKa()); + rQC.fill(HIST("QC/tracks/selected/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/selected/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/selected/hTpcNSigmaKa2D"), cutTracks[0].tpcNSigmaKa(), cutTracks[1].tpcNSigmaKa()); - if (!tracksPassPiPID(cutTracks)) - return; - for (int i = 0; i < static_cast(cutTracks.size()); i++) - rQC.fill(HIST("QC/tracks/hSelectionCounter"), 15); + // create a vector of 4-vectors for selected tracks + std::vector cutTracksLVs; + for (const auto& track : cutTracks) { + TLorentzVector trackLV; + trackLV.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass + cutTracksLVs.push_back(trackLV); + } // reonstruct system and calculate total charge, save commonly used values into variables - TLorentzVector system = reconstructSystem(cutTracks4Vecs); + TLorentzVector system = reconstructSystem(cutTracksLVs); int totalCharge = tracksTotalCharge(cutTracks); float mass = system.M(); float pT = system.Pt(); - float pTsquare = pT * pT; float rapidity = system.Rapidity(); float systemPhi = system.Phi() + o2::constants::math::PI; - float phiRandom = getPhiRandom(cutTracks4Vecs); - float phiCharge = getPhiCharge(cutTracks, cutTracks4Vecs); + float phiRandom = getPhiRandom(cutTracksLVs); + float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); // 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]; + rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); float leadingPt = leadingMomentumTrack.pt(); float subleadingPt = subleadingMomentumTrack.pt(); @@ -632,16 +585,12 @@ struct upcRhoAnalysis { float leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); - // fill TOF hit checker - rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); - // fill recoTree int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; std::vector trackSigns = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; std::vector trackPts = {leadingPt, subleadingPt}; std::vector trackEtas = {leadingEta, subleadingEta}; std::vector trackPhis = {leadingPhi, subleadingPhi}; - std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; std::vector trackPiPIDs = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; std::vector trackElPIDs = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; @@ -653,44 +602,23 @@ struct upcRhoAnalysis { collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), /* neutronClass, */ totalCharge, pT, rapidity, system.Phi(), mass, phiRandom, phiCharge, - trackSigns, trackPts, trackEtas, trackPhis, trackMs, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); + trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); - // fill raw histograms according to the total charge + // fill raw histograms according to total charge switch (totalCharge) { case 0: - rTracks.fill(HIST("tracks/pions/no-selection/unlike-sign/hPt"), leadingPt, subleadingPt); - rTracks.fill(HIST("tracks/pions/no-selection/unlike-sign/hEta"), leadingEta, subleadingEta); - rTracks.fill(HIST("tracks/pions/no-selection/unlike-sign/hPhi"), leadingPhi, subleadingPhi); - rSystem.fill(HIST("system/raw/unlike-sign/hM"), mass); - rSystem.fill(HIST("system/raw/unlike-sign/hPt"), pT); - rSystem.fill(HIST("system/raw/unlike-sign/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/raw/unlike-sign/hY"), rapidity); - rSystem.fill(HIST("system/raw/unlike-sign/hPhi"), systemPhi); - rQC.fill(HIST("QC/collisions/selected/hNumContribVsSystemPt"), pT, collision.numContrib()); - rQC.fill(HIST("QC/collisions/selected/hNumContribVsSystemY"), rapidity, collision.numContrib()); - rQC.fill(HIST("QC/collisions/selected/hNumContribVsSystemM"), mass, collision.numContrib()); + fillTrack2dHistos<0, 0>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<0, 0, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case 2: - rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); - rSystem.fill(HIST("system/raw/like-sign/positive/hM"), mass); - rSystem.fill(HIST("system/raw/like-sign/positive/hPt"), pT); - rSystem.fill(HIST("system/raw/like-sign/positive/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/raw/like-sign/positive/hY"), rapidity); - rSystem.fill(HIST("system/raw/like-sign/positive/hPhi"), systemPhi); + fillTrack2dHistos<0, 1>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<0, 0, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case -2: - rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - rTracks.fill(HIST("tracks/pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); - rSystem.fill(HIST("system/raw/like-sign/negative/hM"), mass); - rSystem.fill(HIST("system/raw/like-sign/negative/hPt"), pT); - rSystem.fill(HIST("system/raw/like-sign/negative/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/raw/like-sign/negative/hY"), rapidity); - rSystem.fill(HIST("system/raw/like-sign/negative/hPhi"), systemPhi); + fillTrack2dHistos<0, 2>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<0, 0, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; default: @@ -705,216 +633,42 @@ struct upcRhoAnalysis { // fill histograms for system passing cuts switch (totalCharge) { case 0: - rTracks.fill(HIST("tracks/pions/selected/unlike-sign/hPt"), leadingPt, subleadingPt); - rTracks.fill(HIST("tracks/pions/selected/unlike-sign/hEta"), leadingEta, subleadingEta); - rTracks.fill(HIST("tracks/pions/selected/unlike-sign/hPhi"), leadingPhi, subleadingPhi); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hM"), mass); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPt"), pT); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hY"), rapidity); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (onon) { - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hM"), mass); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPt"), pT); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hY"), rapidity); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (xnon) { - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hM"), mass); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPt"), pT); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hY"), rapidity); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (onxn) { - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hM"), mass); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPt"), pT); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hY"), rapidity); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (xnxn) { - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hM"), mass); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPt"), pT); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hY"), rapidity); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } + fillTrack2dHistos<1, 0>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<1, 0, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onon) + fillSystemHistos<1, 1, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnon) + fillSystemHistos<1, 2, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onxn) + fillSystemHistos<1, 3, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnxn) + fillSystemHistos<1, 4, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case 2: - rTracks.fill(HIST("tracks/pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - rTracks.fill(HIST("tracks/pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - rTracks.fill(HIST("tracks/pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hM"), mass); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPt"), pT); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hY"), rapidity); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (onon) { - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hM"), mass); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPt"), pT); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hY"), rapidity); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (xnon) { - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hM"), mass); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt"), pT); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hY"), rapidity); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (onxn) { - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hM"), mass); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPt"), pT); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hY"), rapidity); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (xnxn) { - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hM"), mass); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPt"), pT); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hY"), rapidity); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } + fillTrack2dHistos<1, 1>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<1, 0, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onon) + fillSystemHistos<1, 1, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnon) + fillSystemHistos<1, 2, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onxn) + fillSystemHistos<1, 3, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnxn) + fillSystemHistos<1, 4, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case -2: - rTracks.fill(HIST("tracks/pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - rTracks.fill(HIST("tracks/pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - rTracks.fill(HIST("tracks/pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hM"), mass); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPt"), pT); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hY"), rapidity); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (onon) { - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hM"), mass); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPt"), pT); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hY"), rapidity); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (xnon) { - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hM"), mass); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt"), pT); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hY"), rapidity); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (onxn) { - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hM"), mass); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPt"), pT); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hY"), rapidity); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (xnxn) { - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hM"), mass); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPt"), pT); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPt2"), pTsquare); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPtVsM"), mass, pT); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hY"), rapidity); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhi"), systemPhi); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandom"), phiRandom); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiCharge"), phiCharge); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - rSystem.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } + fillTrack2dHistos<1, 2>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<1, 0, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onon) + fillSystemHistos<1, 1, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnon) + fillSystemHistos<1, 2, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onxn) + fillSystemHistos<1, 3, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnxn) + fillSystemHistos<1, 4, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; default: @@ -929,7 +683,7 @@ struct upcRhoAnalysis { rMC.fill(HIST("MC/collisions/hPosZ"), mcCollision.posZ()); std::vector cutMcParticles; - std::vector mcParticles4Vecs; + std::vector mcParticlesLVs; for (auto const& mcParticle : mcParticles) { rMC.fill(HIST("MC/tracks/all/hPdgCode"), mcParticle.pdgCode()); @@ -941,38 +695,37 @@ struct upcRhoAnalysis { if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.pdgCode()) != 211) continue; cutMcParticles.push_back(mcParticle); - TLorentzVector pion4Vec; - pion4Vec.SetPxPyPzE(mcParticle.px(), mcParticle.py(), mcParticle.pz(), mcParticle.e()); - mcParticles4Vecs.push_back(pion4Vec); + TLorentzVector pionLV; + pionLV.SetPxPyPzE(mcParticle.px(), mcParticle.py(), mcParticle.pz(), mcParticle.e()); + mcParticlesLVs.push_back(pionLV); } rMC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); if (cutMcParticles.size() != 2) return; - if (mcParticles4Vecs.size() != cutMcParticles.size()) + if (mcParticlesLVs.size() != cutMcParticles.size()) return; if (tracksTotalChargeMC(cutMcParticles) != 0) // shouldn't happen in theory return; - TLorentzVector system = reconstructSystem(mcParticles4Vecs); + TLorentzVector system = reconstructSystem(mcParticlesLVs); float mass = system.M(); float pT = system.Pt(); - float pTsquare = pT * pT; float rapidity = system.Rapidity(); float systemPhi = system.Phi() + o2::constants::math::PI; - float phiRandom = getPhiRandom(mcParticles4Vecs); - float phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); + 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/pions/hPt"), pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - rMC.fill(HIST("MC/tracks/pions/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); - rMC.fill(HIST("MC/tracks/pions/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); + 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())); rMC.fill(HIST("MC/system/hM"), mass); rMC.fill(HIST("MC/system/hPt"), pT); rMC.fill(HIST("MC/system/hPtVsM"), mass, pT); - rMC.fill(HIST("MC/system/hPt2"), pTsquare); + rMC.fill(HIST("MC/system/hPt2"), pT * pT); rMC.fill(HIST("MC/system/hY"), rapidity); rMC.fill(HIST("MC/system/hPhi"), systemPhi); rMC.fill(HIST("MC/system/hPhiRandom"), phiRandom); @@ -984,10 +737,9 @@ struct upcRhoAnalysis { std::vector trackPts = {pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; std::vector trackEtas = {eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())}; std::vector trackPhis = {phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; - std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; mcTree(localBc, mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), pT, rapidity, systemPhi, mass, phiRandom, phiCharge, - trackSigns, trackPts, trackEtas, trackPhis, trackMs); + trackSigns, trackPts, trackEtas, trackPhis); } template From 51f36fa9e9a4ac184bb00a85adeacaeceb147d3e Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 12 Feb 2025 20:30:16 +0100 Subject: [PATCH 09/14] slimmed-down derived tables --- PWGUD/Tasks/upcRhoAnalysis.cxx | 151 ++++++++++++++------------------- 1 file changed, 64 insertions(+), 87 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 6a36a06a4ca..9a81cefec4d 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -43,11 +43,10 @@ namespace o2::aod { namespace reco_tree { -// misc event info +// event info DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); DECLARE_SOA_COLUMN(LocalBC, localBC, int); DECLARE_SOA_COLUMN(NumContrib, numContrib, int); -// event vertex DECLARE_SOA_COLUMN(PosX, posX, float); DECLARE_SOA_COLUMN(PosY, posY, float); DECLARE_SOA_COLUMN(PosZ, posZ, float); @@ -67,37 +66,26 @@ 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); -// Rhos -DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); -// store things for reconstruction of lorentz vectors -DECLARE_SOA_COLUMN(RhoPt, rhoPt, float); -DECLARE_SOA_COLUMN(RhoY, rhoY, float); -DECLARE_SOA_COLUMN(RhoPhi, rhoPhi, float); -DECLARE_SOA_COLUMN(RhoM, rhoM, float); -// other stuff -DECLARE_SOA_COLUMN(RhoPhiRandom, rhoPhiRandom, float); -DECLARE_SOA_COLUMN(RhoPhiCharge, rhoPhiCharge, float); -// Pion tracks -DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -// for lorentz vector reconstruction -DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); -// other stuff -DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, std::vector); -DECLARE_SOA_COLUMN(TrackElPID, trackElPID, std::vector); -DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, std::vector); -DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, std::vector); -DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, std::vector); +// 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]); } // namespace recoTree DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", - 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::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::TotalCharge, reco_tree::RhoPt, reco_tree::RhoY, reco_tree::RhoPhi, reco_tree::RhoM, reco_tree::RhoPhiRandom, reco_tree::RhoPhiCharge, - reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); + reco_tree::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, + 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); namespace mc_tree { @@ -107,25 +95,18 @@ DECLARE_SOA_COLUMN(LocalBc, localBc, int); DECLARE_SOA_COLUMN(PosX, posX, float); DECLARE_SOA_COLUMN(PosY, posY, float); DECLARE_SOA_COLUMN(PosZ, posZ, float); -// rho lorentz vector reconstruction -DECLARE_SOA_COLUMN(RhoPt, rhoPt, float); -DECLARE_SOA_COLUMN(RhoY, rhoY, float); -DECLARE_SOA_COLUMN(RhoPhi, rhoPhi, float); -DECLARE_SOA_COLUMN(RhoM, rhoM, float); -// other stuff -DECLARE_SOA_COLUMN(RhoPhiRandom, rhoPhiRandom, float); -DECLARE_SOA_COLUMN(RhoPhiCharge, rhoPhiCharge, float); -// Pion tracks -DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -// for lorentz vector reconstruction -DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +// 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]); } // namespace mcTree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", mc_tree::LocalBc, - mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, mc_tree::RhoPt, mc_tree::RhoY, mc_tree::RhoPhi, mc_tree::RhoM, mc_tree::RhoPhiRandom, mc_tree::RhoPhiCharge, - mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi); + 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); } // namespace o2::aod struct upcRhoAnalysis { @@ -199,9 +180,6 @@ struct upcRhoAnalysis { rQC.add("QC/collisions/all/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); // events with selected rho candidates rQC.addClone("QC/collisions/all/", "QC/collisions/selected/"); // clone "all" histograms as "selected" - rQC.add("QC/collisions/selected/hNumContribVsSystemPt", ";p_{T} (GeV/#it{c});number of contributors;counts", kTH2D, {ptAxis,{36, -0.5, 35.5}}); - rQC.add("QC/collisions/selected/hNumContribVsSystemY", ";y;number of contributors;counts", kTH2D, {yAxis,{36, -0.5, 35.5}}); - rQC.add("QC/collisions/selected/hNumContribVsSystemM", ";m (GeV/#it{c}^{2});number of contributors;counts", kTH2D, {mAxis,{36, -0.5, 35.5}}); // tracks rQC.add("QC/tracks/all/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); @@ -366,7 +344,6 @@ struct upcRhoAnalysis { } } - template bool collisionPassesCuts(const C& collision) // collision cuts { @@ -483,9 +460,9 @@ struct upcRhoAnalysis { float getPhiRandom(const std::vector& cutTracksLVs) // decay phi anisotropy { // two possible definitions of phi: randomize the tracks - std::vector indices = {0, 1}; + int indices[2] = {0, 1}; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed - std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices + std::shuffle(std::begin(indices), std::end(indices), std::default_random_engine(seed)); // shuffle indices // calculate phi TLorentzVector pOne = cutTracksLVs[indices[0]]; TLorentzVector pTwo = cutTracksLVs[indices[1]]; @@ -562,17 +539,7 @@ struct upcRhoAnalysis { trackLV.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass cutTracksLVs.push_back(trackLV); } - - // reonstruct system and calculate total charge, save commonly used values into variables - TLorentzVector system = reconstructSystem(cutTracksLVs); - int totalCharge = tracksTotalCharge(cutTracks); - float mass = system.M(); - float pT = system.Pt(); - float rapidity = system.Rapidity(); - float systemPhi = system.Phi() + o2::constants::math::PI; - float phiRandom = getPhiRandom(cutTracksLVs); - float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); - + // 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]; @@ -584,26 +551,36 @@ struct upcRhoAnalysis { float subleadingEta = eta(subleadingMomentumTrack.px(), subleadingMomentumTrack.py(), subleadingMomentumTrack.pz()); float leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); - + float phiRandom = getPhiRandom(cutTracksLVs); + float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); + // fill recoTree int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; - std::vector trackSigns = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; - std::vector trackPts = {leadingPt, subleadingPt}; - std::vector trackEtas = {leadingEta, subleadingEta}; - std::vector trackPhis = {leadingPhi, subleadingPhi}; - std::vector trackPiPIDs = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; - std::vector trackElPIDs = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; - std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; - std::vector trackDcaZs = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; - std::vector trackTpcSignals = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; - recoTree(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(), - collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), /* neutronClass, */ - totalCharge, pT, rapidity, system.Phi(), mass, phiRandom, phiCharge, - trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); - + int trackSigns[2] = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; + float trackPts[2] = {leadingPt, subleadingPt}; + float trackEtas[2] = {leadingEta, subleadingEta}; + float trackPhis[2] = {leadingPhi, subleadingPhi}; + float trackPiPIDs[2] = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; + float trackElPIDs[2] = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; + float trackKaPIDs[2] = {leadingMomentumTrack.tpcNSigmaKa(), subleadingMomentumTrack.tpcNSigmaKa()}; + float trackDcaXYs[2] = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; + float trackDcaZs[2] = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; + float trackTpcSignals[2] = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; + recoTree(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(), + collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), + phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackKaPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); + + if (!tracksPassPiPID(cutTracks)) // apply PID cut + return; + TLorentzVector system = reconstructSystem(cutTracksLVs); + int totalCharge = tracksTotalCharge(cutTracks); + float mass = system.M(); + float pT = system.Pt(); + float rapidity = system.Rapidity(); + float systemPhi = system.Phi() + o2::constants::math::PI; + // fill raw histograms according to total charge switch (totalCharge) { case 0: @@ -733,13 +710,13 @@ struct upcRhoAnalysis { // fill mcTree int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; - std::vector trackSigns = {leadingMomentumPion.pdgCode() / std::abs(leadingMomentumPion.pdgCode()), subleadingMomentumPion.pdgCode() / std::abs(subleadingMomentumPion.pdgCode())}; - std::vector trackPts = {pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; - std::vector trackEtas = {eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())}; - std::vector trackPhis = {phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; + int trackSigns[2] = {leadingMomentumPion.pdgCode() / std::abs(leadingMomentumPion.pdgCode()), subleadingMomentumPion.pdgCode() / std::abs(subleadingMomentumPion.pdgCode())}; + float trackPts[2] = {pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; + float trackEtas[2] = {eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())}; + float trackPhis[2] = {phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; mcTree(localBc, - mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), pT, rapidity, systemPhi, mass, phiRandom, phiCharge, - trackSigns, trackPts, trackEtas, trackPhis); + mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), + phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis); } template From ed5c3ea21017743fc6c78b23d10e3bba19ea1d5a Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Wed, 12 Feb 2025 20:32:57 +0100 Subject: [PATCH 10/14] small O2 Linter fix --- 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 9a81cefec4d..d3874cf25cc 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -136,7 +136,7 @@ struct upcRhoAnalysis { Configurable systemMassMinCut{"systemMassMinCut", 0.4, "min M cut for reco system"}; Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; - Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; + Configurable systemPtCut{"systemPtCut", 0.1, "max pT cut for reco system"}; Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; From b7c329a2372d859e6e75fc75b00b8075e04e665e Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Sat, 15 Feb 2025 10:13:53 +0100 Subject: [PATCH 11/14] configurable saving of track species based on PID --- PWGUD/Tasks/upcRhoAnalysis.cxx | 37 +++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index d3874cf25cc..9de68ee533d 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -109,10 +109,14 @@ DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", mc_tree::PhiRandom, mc_tree::PhiCharge, mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi); } // namespace o2::aod -struct upcRhoAnalysis { +struct UpcRhoAnalysis { Produces recoTree; Produces mcTree; + Configurable savePions{"savePions", true, "save pion tracks into derived tables"}; + Configurable saveElectrons{"saveElectrons", false, "save electron tracks into derived tables"}; + Configurable saveKaons{"saveKaons", false, "save kaon tracks into derived tables"}; + float pcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; @@ -421,6 +425,24 @@ struct upcRhoAnalysis { return radius < std::pow(tracksTpcNSigmaPiCut, 2); } + template + bool tracksPassElPID(const T& cutTracks) // n-dimensional electron PID cut + { + float radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaEl(), 2); + return radius < std::pow(tracksTpcNSigmaElCut, 2); + } + + template + bool tracksPassKaPID(const T& cutTracks) // n-dimensional kaon PID cut + { + float radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaKa(), 2); + return radius < std::pow(tracksTpcNSigmaKaCut, 2); + } + template int tracksTotalCharge(const T& cutTracks) // total charge of selected tracks { @@ -431,7 +453,7 @@ struct upcRhoAnalysis { } template - int tracksTotalChargeMC(const T& cutTracks) // total charge of selected tracks + int tracksTotalChargeMC(const T& cutTracks) // total charge of selected MC tracks { int charge = 0; for (const auto& track : cutTracks) @@ -566,11 +588,12 @@ struct upcRhoAnalysis { float trackDcaXYs[2] = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; float trackDcaZs[2] = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; float trackTpcSignals[2] = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; - recoTree(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(), - collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), - phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackKaPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); + if ((savePions && tracksPassPiPID(cutTracks)) || (saveElectrons && tracksPassElPID(cutTracks)) || (saveKaons && tracksPassKaPID(cutTracks))) + recoTree(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(), + collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), + phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackKaPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); if (!tracksPassPiPID(cutTracks)) // apply PID cut return; From 9c6b79d7a9c3f05bc3c63e6a7611a87bf40e399d Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Sat, 15 Feb 2025 19:41:39 +0100 Subject: [PATCH 12/14] bug fix --- PWGUD/Tasks/upcRhoAnalysis.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 9de68ee533d..9c79cd10cd2 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -754,29 +754,29 @@ struct UpcRhoAnalysis { return; processReco(collision, tracks); } - PROCESS_SWITCH(upcRhoAnalysis, processSGdata, "analyse SG data", true); + PROCESS_SWITCH(UpcRhoAnalysis, processSGdata, "analyse SG data", true); void processDGdata(FullUdDgCollision const& collision, FullUdTracks const& tracks) { processReco(collision, tracks); } - PROCESS_SWITCH(upcRhoAnalysis, processDGdata, "analyse DG data", false); + PROCESS_SWITCH(UpcRhoAnalysis, processDGdata, "analyse DG data", false); void processMCdata(aod::UDMcCollision const& mcCollision, aod::UDMcParticles const& mcParticles) { processMC(mcCollision, mcParticles); } - PROCESS_SWITCH(upcRhoAnalysis, processMCdata, "analyse MC data", false); + PROCESS_SWITCH(UpcRhoAnalysis, processMCdata, "analyse MC data", false); void processCollisionRecoCheck(aod::McCollision const& /* mcCollision */, soa::SmallGroups> const& collisions) { checkNumberOfCollisionReconstructions(collisions); } - PROCESS_SWITCH(upcRhoAnalysis, processCollisionRecoCheck, "check number of collision reconstructions", false); + PROCESS_SWITCH(UpcRhoAnalysis, processCollisionRecoCheck, "check number of collision reconstructions", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - o2::framework::adaptAnalysisTask(cfgc)}; + o2::framework::adaptAnalysisTask(cfgc)}; } From c486d7c7cd98cd421a6139a6c2b9023657999d40 Mon Sep 17 00:00:00 2001 From: Jakub Juracka Date: Tue, 18 Feb 2025 09:56:50 +0100 Subject: [PATCH 13/14] added system selections for MC --- PWGUD/Tasks/upcRhoAnalysis.cxx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 9c79cd10cd2..8b5b37f5350 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -270,6 +270,7 @@ struct UpcRhoAnalysis { rMC.add("MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); rMC.add("MC/system/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); rMC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rMC.addClone("MC/system/", "MC/system/selected/"); } static constexpr std::string_view AppliedSelections[2] = {"all/", "selected/"}; @@ -731,6 +732,17 @@ struct UpcRhoAnalysis { rMC.fill(HIST("MC/system/hPhiRandom"), phiRandom); rMC.fill(HIST("MC/system/hPhiCharge"), phiCharge); + if (systemPassesCuts(system)) { + rMC.fill(HIST("MC/system/selected/hM"), mass); + rMC.fill(HIST("MC/system/selected/hPt"), pT); + rMC.fill(HIST("MC/system/selected/hPtVsM"), mass, pT); + rMC.fill(HIST("MC/system/selected/hPt2"), pT * pT); + rMC.fill(HIST("MC/system/selected/hY"), rapidity); + rMC.fill(HIST("MC/system/selected/hPhi"), systemPhi); + rMC.fill(HIST("MC/system/selected/hPhiRandom"), phiRandom); + rMC.fill(HIST("MC/system/selected/hPhiCharge"), phiCharge); + } + // fill mcTree int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; int trackSigns[2] = {leadingMomentumPion.pdgCode() / std::abs(leadingMomentumPion.pdgCode()), subleadingMomentumPion.pdgCode() / std::abs(subleadingMomentumPion.pdgCode())}; From 053f379b048af72c2e5383003a143e7ebfb54de5 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 18 Feb 2025 09:04:52 +0000 Subject: [PATCH 14/14] Please consider the following formatting changes --- PWGUD/Tasks/upcRhoAnalysis.cxx | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 8b5b37f5350..1395d66c04b 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -79,12 +79,12 @@ 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]); -} // namespace recoTree +} // namespace reco_tree DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", 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::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, 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); namespace mc_tree @@ -102,10 +102,10 @@ 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]); -} // namespace mcTree +} // namespace mc_tree DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", mc_tree::LocalBc, - mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, + 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); } // namespace o2::aod @@ -157,7 +157,7 @@ struct UpcRhoAnalysis { ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; ConfigurableAxis znCommonEnergyAxis{"znCommonEnergyAxis", {250, -5.0, 20.0}, "ZN common energy (TeV)"}; ConfigurableAxis znTimeAxis{"znTimeAxis", {200, -10.0, 10.0}, "ZN time (ns)"}; - + HistogramRegistry rQC{"rQC", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry rTracks{"rTracks", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry rSystem{"rSystem", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -244,7 +244,7 @@ struct UpcRhoAnalysis { rSystem.addClone("system/selected/no-selection/", "system/selected/Xn0n/"); rSystem.addClone("system/selected/no-selection/", "system/selected/0nXn/"); rSystem.addClone("system/selected/no-selection/", "system/selected/XnXn/"); - + // MC // collisions rMC.add("MC/collisions/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); @@ -481,7 +481,7 @@ struct UpcRhoAnalysis { return system; } - float getPhiRandom(const std::vector& cutTracksLVs) // decay phi anisotropy + float getPhiRandom(const std::vector& cutTracksLVs) // decay phi anisotropy { // two possible definitions of phi: randomize the tracks int indices[2] = {0, 1}; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed @@ -533,7 +533,7 @@ struct UpcRhoAnalysis { if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) xnxn = true; - + std::vector cutTracks; // store selected tracks for (const auto& track : tracks) { rQC.fill(HIST("QC/tracks/hSelectionCounter"), 0); @@ -546,7 +546,7 @@ struct UpcRhoAnalysis { cutTracks.push_back(track); } rQC.fill(HIST("QC/tracks/selected/hRemainingTracks"), cutTracks.size()); - + if (cutTracks.size() != 2) // further consider only two pion systems return; for (int i = 0; i < static_cast(cutTracks.size()); i++) @@ -562,12 +562,12 @@ struct UpcRhoAnalysis { trackLV.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass cutTracksLVs.push_back(trackLV); } - + // 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]; rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); - + float leadingPt = leadingMomentumTrack.pt(); float subleadingPt = subleadingMomentumTrack.pt(); float leadingEta = eta(leadingMomentumTrack.px(), leadingMomentumTrack.py(), leadingMomentumTrack.pz()); @@ -576,7 +576,7 @@ struct UpcRhoAnalysis { float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); float phiRandom = getPhiRandom(cutTracksLVs); float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); - + // fill recoTree int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; int trackSigns[2] = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; @@ -593,9 +593,9 @@ struct UpcRhoAnalysis { recoTree(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(), - collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), + collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackKaPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); - + if (!tracksPassPiPID(cutTracks)) // apply PID cut return; TLorentzVector system = reconstructSystem(cutTracksLVs); @@ -604,7 +604,7 @@ struct UpcRhoAnalysis { float pT = system.Pt(); float rapidity = system.Rapidity(); float systemPhi = system.Phi() + o2::constants::math::PI; - + // fill raw histograms according to total charge switch (totalCharge) { case 0: @@ -701,7 +701,7 @@ struct UpcRhoAnalysis { mcParticlesLVs.push_back(pionLV); } rMC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); - + if (cutMcParticles.size() != 2) return; if (mcParticlesLVs.size() != cutMcParticles.size())