From cd7667f9d5902801012bcba11509604ca3c70096 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Fri, 18 Jul 2025 19:52:45 +0530 Subject: [PATCH 01/26] Removed filters for Event and track counts --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 245 +++++++++++++++++++++--------- 1 file changed, 175 insertions(+), 70 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index bd1811a0c56..7fd7dab4fad 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -50,6 +50,8 @@ namespace branch { // Run Number DECLARE_SOA_COLUMN(RunNumber, runNumber, int); +// Check UPC mode +DECLARE_SOA_COLUMN(IfCheckUPCmode, ifCheckUPCmode, uint16_t); // vertex Position DECLARE_SOA_COLUMN(PosX, posX, double); DECLARE_SOA_COLUMN(PosY, posY, double); @@ -159,6 +161,8 @@ DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", branch::RunNumber, + branch::IfCheckUPCmode, + branch::PosX, branch::PosY, branch::PosZ, @@ -263,6 +267,9 @@ DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", branch::RunNumber, + + branch::IfCheckUPCmode, + branch::PosX, branch::PosY, branch::PosZ, @@ -375,18 +382,21 @@ struct ExclusiveRhoTo4Pi { // Histogram Registry HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable parameters + Configurable ifCheckUPCmode{"ifCheckUPCmode", false, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable zdcCut{"zdcCut", 0., "ZDC threshold"}; - Configurable occupancyCut{"occupancyCut", 20000, "Occupancy Cut"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; + Configurable gapSideCut{"gapSideCut", 2, "Gap Side"}; Configurable sbpCut{"sbpCut", 1, "Sbp"}; Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; Configurable vtxITSTPCcut{"vtxITSTPCcut", 1, "vtxITSTPCcut"}; Configurable tfbCut{"tfbCut", 1, "tfbCut"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; + Configurable hasITSCut{"hasITSCut", 1, "has hit is ITS"}; + Configurable hasTPCCut{"hasTPCCut", 1, "has hit is TPC"}; Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; Configurable tpcChi2Cut{"tpcChi2Cut", 4, "Max tpcChi2NCl"}; @@ -408,9 +418,9 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { - // QA plots: Event Counter - histosData.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {10, 0, 10}}); + histosData.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); + histosData.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); // QA plots: event selection histosData.add("FT0A", "T0A amplitude", kTH1F, {{2000, 0.0, 500.0}}); histosData.add("FT0C", "T0C amplitude", kTH1F, {{2000, 0.0, 500.0}}); @@ -448,17 +458,6 @@ struct ExclusiveRhoTo4Pi { histosData.add("tofNSigmaPr_pions", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosData.add("tofNSigmaEl_pions", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosData.add("tofNSigmaMu_pions", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - // QA averages - histosData.add("avg_pT_pi_vs_runNo", "Average pion p_{T} vs run number; Run Number; p_{T} [GeV/c]", kTH2F, {{1355, 544013, 545367}, {1000, -0.1, 2}}); - histosData.add("avg_eta_pi_vs_runNo", "Average pion #eta vs run number; Run Number; #eta", kTH2F, {{1355, 544013, 545367}, {etaAxis}}); - histosData.add("avg_phi_pi_vs_runNo", "Average pion #phi vs run number; Run Number; #phi [rad]", kTH2F, {{1355, 544013, 545367}, {1000, -1 * o2::constants::math::PI, o2::constants::math::PI}}); - histosData.add("avg_dcaxy_vs_runNo", "Average pion DCA XY vs run number; Run Number; DCA XY [cm]", kTH2F, {{1355, 544013, 545367}, {1000, -0.2, 0.2}}); - histosData.add("avg_dcaz_vs_runNo", "Average pion DCA Z vs run number; Run Number; DCA Z [cm]", kTH2F, {{1355, 544013, 545367}, {1000, -0.2, 0.2}}); - histosData.add("avg_pT_pi_vs_runNo_selected4piEvents", "Average pion p_{T} vs run number; Run Number; p_{T} [GeV/c]", kTH2F, {{1355, 544013, 545367}, {1000, -0.1, 2}}); - histosData.add("avg_eta_pi_vs_runNo_selected4piEvents", "Average pion #eta vs run number; Run Number; #eta", kTH2F, {{1355, 544013, 545367}, {etaAxis}}); - histosData.add("avg_phi_pi_vs_runNo_selected4piEvents", "Average pion #phi vs run number; Run Number; #phi [rad]", kTH2F, {{1355, 544013, 545367}, {1000, -1 * o2::constants::math::PI, o2::constants::math::PI}}); - histosData.add("avg_dcaxy_vs_runNo_selected4piEvents", "Average pion DCA XY vs run number; Run Number; DCA XY [cm]", kTH2F, {{1355, 544013, 545367}, {1000, -0.2, 0.2}}); - histosData.add("avg_dcaz_vs_runNo_selected4piEvents", "Average pion DCA Z vs run number; Run Number; DCA Z [cm]", kTH2F, {{1355, 544013, 545367}, {1000, -0.2, 0.2}}); // Track Transverse Momentum histosData.add("pT_track_all", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {pTAxis}); histosData.add("pT_track_pions", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {pTAxis}); @@ -528,30 +527,91 @@ struct ExclusiveRhoTo4Pi { histosData.add("phi_vs_costheta_large_mass", "Phi vs cosTheta for large mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); } // End of init function - //--------------------------------------------------------------------------------------------------------------------------------------------- - Filter vertexCut = (nabs(o2::aod::collision::posZ) <= vZCut) && (o2::aod::collision::numContrib == numPVContrib); - Filter fitcuts = o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut && o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut && o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut; - Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); - Filter bcSelectionCuts = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); - Filter occupCut = nabs(o2::aod::udcollision::occupancyInTime) < occupancyCut; - Filter onlyPVtracks = o2::aod::udtrack::isPVContributor == true; - //--------------------------------------------------------------------------------------------------------------------------------------------- - - using UDtracks = soa::Filtered>; - using UDCollisions = soa::Filtered>; + using UDtracks = soa::Join; + using UDCollisions = soa::Join; void processData(UDCollisions::iterator const& collision, UDtracks const& tracks) { + // Check if the event is in UPC mode + if (ifCheckUPCmode && (collision.flags() != 1)) { + return; + } + // no Cuts histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 0); int gapSide = collision.gapSide(); std::vector parameters = {pvCut, dcaZcut, dcaXYcut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, pTcut}; int truegapSide = sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut); + // FTOA + if (!(collision.totalFT0AmplitudeA() <= ft0aCut)) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 1); + + // FT0C + if (!(collision.totalFT0AmplitudeC() <= ft0cCut)) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 2); + + // FV0 + if (!(collision.totalFV0AmplitudeA() <= fv0Cut)) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 3); + + // noSamebunchPileup + if (collision.sbp() != sbpCut) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 4); + + // kIsVertexITSTPC + if (collision.vtxITSTPC() != vtxITSTPCcut) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 5); + + // kNoITSROFrameBorder + if (collision.itsROFb() != itsROFbCut) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 6); + + // kNoTimeFrameBorder + if (collision.tfb() != tfbCut) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 7); + + // ZDC + if (!(collision.energyCommonZNA() <= zdcCut || collision.energyCommonZNC() <= zdcCut)) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 8); + + // Vertex Z cut + if (!(std::abs(collision.posZ()) <= vZCut)) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 9); + + // true Gap Side + if (truegapSide != gapSideCut) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 10); + + // number of PV contributors + if (!(collision.numContrib() == numPVContrib)) { + return; + } + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 11); + histosData.fill(HIST("GapSide"), gapSide); histosData.fill(HIST("TrueGapSide"), truegapSide); - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 1); histosData.fill(HIST("vertexX"), collision.posX()); histosData.fill(HIST("vertexY"), collision.posY()); histosData.fill(HIST("vertexZ"), collision.posZ()); @@ -567,41 +627,87 @@ struct ExclusiveRhoTo4Pi { std::vector selectedPionPlusTracks; std::vector selectedPionMinusTracks; - double avgpT = 0.0; - double avgEta = 0.0; - double avgPhi = 0.0; - double avgdcaxy = 0.0; - double avgdcaz = 0.0; - for (const auto& t0 : tracks) { ROOT::Math::PxPyPzMVector trackVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); - avgpT += trackVector.Pt(); - avgEta += trackVector.Eta(); - avgPhi += trackVector.Phi(); - avgdcaxy += t0.dcaXY(); - avgdcaz += t0.dcaZ(); - - if (trackselector(t0, parameters)) { - selectedTracks.push_back(t0); - if (selectionPIDPion(t0, true, nSigmaTPCcut, nSigmaTOFcut)) { - selectedPionTracks.push_back(t0); - if (t0.sign() == 1) { - selectedPionPlusTracks.push_back(t0); - } - if (t0.sign() == -1) { - selectedPionMinusTracks.push_back(t0); - } - } // End of Selection PID Pion - } // End of track selections - } // End of loop over tracks + // no Cuts + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); + + // is PV Contributor + if (!(t0.isPVContributor() == pvCut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); + + // track pT cut + if (!(trackVector.Pt() >= pTcut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); + + // track Eta cut + if (!(std::abs(trackVector.Eta()) <= etaCut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); - histosData.fill(HIST("avg_pT_pi_vs_runNo"), collision.runNumber(), avgpT / tracks.size()); - histosData.fill(HIST("avg_eta_pi_vs_runNo"), collision.runNumber(), avgEta / tracks.size()); - histosData.fill(HIST("avg_phi_pi_vs_runNo"), collision.runNumber(), avgPhi / tracks.size()); - histosData.fill(HIST("avg_dcaxy_vs_runNo"), collision.runNumber(), avgdcaxy / tracks.size()); - histosData.fill(HIST("avg_dcaz_vs_runNo"), collision.runNumber(), avgdcaz / tracks.size()); + // dcaZ + if (!(std::abs(t0.dcaZ()) <= dcaZcut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); + + // dcaXY + if (!(std::abs(t0.dcaXY()) <= getMaxDCAxy(trackVector.Pt()))) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); + + // has ITS hit + if (!(t0.hasITS() == hasITSCut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); + + // has TPC hit + if (!(t0.hasTPC() == hasTPCCut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); + + // ITS chi2 + if (!(t0.itsChi2NCl() <= itsChi2Cut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); + + // TPC chi2 + if (!(t0.tpcChi2NCl() <= tpcChi2Cut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); + + // TPC N Cls Findable + if (!(t0.tpcNClsFindable() >= tpcNClsFindableCut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); + + selectedTracks.push_back(t0); + if (selectionPIDPion(t0, true, nSigmaTPCcut, nSigmaTOFcut)) { + selectedPionTracks.push_back(t0); + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + if (t0.sign() == 1) { + selectedPionPlusTracks.push_back(t0); + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + } + if (t0.sign() == -1) { + selectedPionMinusTracks.push_back(t0); + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); + } + } // End of Selection PID Pion + } // End of loop over tracks int numSelectedTracks = static_cast(selectedTracks.size()); int numSelectedPionTracks = static_cast(selectedPionTracks.size()); @@ -647,11 +753,11 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("dcaZ_pions"), selectedPionTracks[i].dcaZ()); } // End of loop over tracks with selection and PID of pions + // event should have at least 4 pions if (numSelectedPionTracks != numFourPionTracks) { return; } - - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 2); + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); // Check if there is at least one track with TOF in the selected events, otherwise return bool hasAtleastOneTOF = false; @@ -662,12 +768,10 @@ struct ExclusiveRhoTo4Pi { } } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 3); - // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 4); + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 13); ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -696,12 +800,6 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("rapidity_track_pions_contributed"), p3.Rapidity()); histosData.fill(HIST("rapidity_track_pions_contributed"), p4.Rapidity()); - histosData.fill(HIST("avg_pT_pi_vs_runNo_selected4piEvents"), collision.runNumber(), (p1.Pt() + p2.Pt() + p3.Pt() + p4.Pt()) / 4.0); - histosData.fill(HIST("avg_eta_pi_vs_runNo_selected4piEvents"), collision.runNumber(), (p1.Eta() + p2.Eta() + p3.Eta() + p4.Eta()) / 4.0); - histosData.fill(HIST("avg_phi_pi_vs_runNo_selected4piEvents"), collision.runNumber(), (p1.Phi() + p2.Phi() + p3.Phi() + p4.Phi()) / 4.0); - histosData.fill(HIST("avg_dcaxy_vs_runNo_selected4piEvents"), collision.runNumber(), (selectedPionPlusTracks[0].dcaXY() + selectedPionPlusTracks[1].dcaXY() + selectedPionMinusTracks[0].dcaXY() + selectedPionMinusTracks[1].dcaXY()) / 4.0); - histosData.fill(HIST("avg_dcaz_vs_runNo_selected4piEvents"), collision.runNumber(), (selectedPionPlusTracks[0].dcaZ() + selectedPionPlusTracks[1].dcaZ() + selectedPionMinusTracks[0].dcaZ() + selectedPionMinusTracks[1].dcaZ()) / 4.0); - k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); @@ -729,6 +827,8 @@ struct ExclusiveRhoTo4Pi { sigFromData( // run number collision.runNumber(), + // UPC mode + collision.flags(), // vertex collision.posX(), collision.posY(), collision.posZ(), // FIT Signals @@ -786,7 +886,6 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_rap_0_charge_within_rap"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_0_charge_within_rap"), p1234.M()); if (p1234.Pt() < rhoPtCut) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 5); // Fill the Invariant Mass Histogram histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); // Two Pion Masses @@ -831,7 +930,7 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 6); + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); @@ -848,6 +947,8 @@ struct ExclusiveRhoTo4Pi { bkgFromData( // Run Number collision.runNumber(), + // UPC mode + collision.flags(), // vertex collision.posX(), collision.posY(), collision.posZ(), // FIT Signals @@ -903,7 +1004,6 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_rap_non_0_charge_within_rap"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_non_0_charge_within_rap"), p1234.M()); if (p1234.Pt() < rhoPtCut) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 7); histosData.fill(HIST("fourpion_mass_non_0_charge_domA"), p1234.M()); } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { @@ -966,6 +1066,11 @@ struct ExclusiveRhoTo4Pi { return phi; } + double getMaxDCAxy(double pT) + { + return 0.0105 + 0.035 / std::pow(pT, 1.1); + } + }; // End of Struct exclusiveRhoTo4Pi WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From dc0c051df7e444633b41c1f6796801d61c573eae Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:23:27 +0530 Subject: [PATCH 02/26] modified track selection criteria --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 119 ++++++++++++++++++------------ 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 7fd7dab4fad..95865ca8ef9 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -381,7 +381,7 @@ struct ExclusiveRhoTo4Pi { Produces bkgFromData; // Histogram Registry HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - // Configurable parameters + // Configurable Event parameters:1 Configurable ifCheckUPCmode{"ifCheckUPCmode", false, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; @@ -394,20 +394,31 @@ struct ExclusiveRhoTo4Pi { Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; Configurable vtxITSTPCcut{"vtxITSTPCcut", 1, "vtxITSTPCcut"}; Configurable tfbCut{"tfbCut", 1, "tfbCut"}; - Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; - Configurable hasITSCut{"hasITSCut", 1, "has hit is ITS"}; - Configurable hasTPCCut{"hasTPCCut", 1, "has hit is TPC"}; - Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; - Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; - Configurable tpcChi2Cut{"tpcChi2Cut", 4, "Max tpcChi2NCl"}; - Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min tpcNClsFindable"}; - Configurable itsChi2Cut{"itsChi2Cut", 36, "Max itsChi2NCl"}; + // Configurable Track parameters:1 + Configurable useOnlyPVtracks{"useOnlyPVtracks", true, "Use Only PV tracks"}; + Configurable useITS{"useITS", true, "only use tracks with hit in ITS"}; + Configurable itsNClsCut{"itsNClsCut", 4, "Min No of itsNCls"}; + Configurable itsClusterMapCut{"itsClusterMapCut", 1, "min no of ITS clusters in cluster map"}; + Configurable itsChi2NClCut{"itsChi2NClCut", 3.0, "Max ITS Chi2/NCl"}; + Configurable useTPC{"useTPC", true, "has TPC hit"}; + Configurable minFoundTPCclusters{"minFoundTPCclusters", 120, "Min TPC Findable Clusters"}; + Configurable tpcChi2NClsMin{"tpcChi2NClsMin", 1.0, "Min TPC Chi2/NCls"}; + Configurable tpcChi2NClsMax{"tpcChi2NClsMax", 3.0, "Max TPC Chi2/NCls"}; + Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; + Configurable tpcNClsCrossedRowsCut{"tpcNClsCrossedRowsCut", 130, "Min TPC Crossed Rows"}; + Configurable tpcCrossedRowsOverFindableCut{"tpcCrossedRowsOverFindableCut", 1.0, "Min TPC Crossed Rows over Findable Clusters"}; + Configurable pTcut{"pTcut", 0.1, "Track Pt"}; + Configurable dcaZcut{"dcaZcut", 1, "dcaZ cut"}; Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; - Configurable pTcut{"pTcut", 0.15, "Track Pt"}; + // Configurable PID parameters + Configurable useTOF{"useTOF", true, "has TOF for PID"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; + // Configurable Rho parameters Configurable rhoRapCut{"rhoRapCut", 0.5, "Max abs Rapidity of rho"}; Configurable rhoPtCut{"rhoPtCut", 0.15, "Min Pt of rho"}; + Configurable rhoMassMin{"rhoMassMin", 1, "Min Mass of rho"}; + Configurable rhoMassMax{"rhoMassMax", 2.5, "Max Mass of rho"}; // Axis Configurations ConfigurableAxis pTAxis{"pTAxis", {1000, 0, 2}, "Axis for pT histograms"}; ConfigurableAxis etaAxis{"etaAxis", {1000, -1.1, 1.1}, "Axis for Eta histograms"}; @@ -419,7 +430,7 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { // QA plots: Event Counter - histosData.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); + histosData.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {21, -1, 20}}); histosData.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); // QA plots: event selection histosData.add("FT0A", "T0A amplitude", kTH1F, {{2000, 0.0, 500.0}}); @@ -441,6 +452,7 @@ struct ExclusiveRhoTo4Pi { histosData.add("tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosData.add("itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosData.add("tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosData.add("itsClusterMap", "ITS Cluster Map; itsClusterMap; Counts", kTH1F, {{200, 0, 200}}); // QA plots: PID histosData.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); histosData.add("tpcSignal_pions", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); @@ -532,18 +544,16 @@ struct ExclusiveRhoTo4Pi { void processData(UDCollisions::iterator const& collision, UDtracks const& tracks) { + + // no cuts + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), -1); + // Check if the event is in UPC mode if (ifCheckUPCmode && (collision.flags() != 1)) { return; } - - // no Cuts histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 0); - int gapSide = collision.gapSide(); - std::vector parameters = {pvCut, dcaZcut, dcaXYcut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, pTcut}; - int truegapSide = sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut); - // FTOA if (!(collision.totalFT0AmplitudeA() <= ft0aCut)) { return; @@ -599,7 +609,7 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 9); // true Gap Side - if (truegapSide != gapSideCut) { + if (sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut) != gapSideCut) { return; } histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 10); @@ -610,8 +620,8 @@ struct ExclusiveRhoTo4Pi { } histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 11); - histosData.fill(HIST("GapSide"), gapSide); - histosData.fill(HIST("TrueGapSide"), truegapSide); + histosData.fill(HIST("GapSide"), collision.gapSide()); + histosData.fill(HIST("TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); histosData.fill(HIST("vertexX"), collision.posX()); histosData.fill(HIST("vertexY"), collision.posY()); histosData.fill(HIST("vertexZ"), collision.posZ()); @@ -635,76 +645,88 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); // is PV Contributor - if (!(t0.isPVContributor() == pvCut)) { + if (!(t0.isPVContributor() == useOnlyPVtracks)) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); - // track pT cut - if (!(trackVector.Pt() >= pTcut)) { + // has ITS hit + if ((useITS == true) && (t0.hasITS() != true)) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); - // track Eta cut - if (!(std::abs(trackVector.Eta()) <= etaCut)) { + // min no of itsNCls + if (t0.itsNCls() < itsNClsCut) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); - // dcaZ - if (!(std::abs(t0.dcaZ()) <= dcaZcut)) { + // min ITS chi2NCl + if (t0.itsChi2NCl() > itsChi2NClCut) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); - // dcaXY - if (!(std::abs(t0.dcaXY()) <= getMaxDCAxy(trackVector.Pt()))) { + // has TPC hit + if ((useTPC == true) && (t0.hasTPC() != true)) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); - // has ITS hit - if (!(t0.hasITS() == hasITSCut)) { + // min no of found TPC clusters + if (t0.tpcNClsFindable() - t0.tpcNClsFindableMinusFound() < minFoundTPCclusters) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); - // has TPC hit - if (!(t0.hasTPC() == hasTPCCut)) { + // range of tpcChi2NCl + if (!((tpcChi2NClsMin < t0.tpcChi2NCl()) && (t0.tpcChi2NCl() < tpcChi2NClsMax))) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); - // ITS chi2 - if (!(t0.itsChi2NCl() <= itsChi2Cut)) { + // tpcNClsCrossedRows + if (t0.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); - // TPC chi2 - if (!(t0.tpcChi2NCl() <= tpcChi2Cut)) { + // ratio of crossed TPC rows over findable clusters + if ((t0.tpcNClsCrossedRows() / t0.tpcNClsFindable()) < tpcCrossedRowsOverFindableCut) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); - // TPC N Cls Findable - if (!(t0.tpcNClsFindable() >= tpcNClsFindableCut)) { + // pT cut + if (trackVector.Pt() < pTcut) { continue; } histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); + // dcaZ cut + if ((std::abs(t0.dcaZ()) > dcaZcut) || (t0.dcaXY() > getMaxDCAxy(trackVector.Pt()))) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + + // eta cut + if (std::abs(trackVector.Eta()) > etaCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + selectedTracks.push_back(t0); - if (selectionPIDPion(t0, true, nSigmaTPCcut, nSigmaTOFcut)) { + if (selectionPIDPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { selectedPionTracks.push_back(t0); - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); if (t0.sign() == 1) { selectedPionPlusTracks.push_back(t0); - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 14); } if (t0.sign() == -1) { selectedPionMinusTracks.push_back(t0); - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 15); } } // End of Selection PID Pion } // End of loop over tracks @@ -729,6 +751,7 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("tpcNClsFindable"), selectedTracks[i].tpcNClsFindable()); histosData.fill(HIST("dcaXY"), selectedTracks[i].dcaXY()); histosData.fill(HIST("dcaZ"), selectedTracks[i].dcaZ()); + histosData.fill(HIST("itsClusterMap"), selectedTracks[i].itsClusterMap()); } // End of loop over tracks with selection only for (int i = 0; i < numSelectedPionTracks; i++) { @@ -753,13 +776,13 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("dcaZ_pions"), selectedPionTracks[i].dcaZ()); } // End of loop over tracks with selection and PID of pions - // event should have at least 4 pions + // event should have exactly 4 pions if (numSelectedPionTracks != numFourPionTracks) { return; } histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); - // Check if there is at least one track with TOF in the selected events, otherwise return + // Check if there is at least one track with TOF in the selected events (for derived Data) bool hasAtleastOneTOF = false; for (int i = 0; i < numPiPlusTracks; i++) { if (selectedPionPlusTracks[i].hasTOF() == true) { @@ -886,6 +909,10 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_rap_0_charge_within_rap"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_0_charge_within_rap"), p1234.M()); if (p1234.Pt() < rhoPtCut) { + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); + if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 15); + } // Fill the Invariant Mass Histogram histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); // Two Pion Masses @@ -930,7 +957,7 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); + histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 16); ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); From 9a8d0fbe9eb75a46dc98b5a72d05d2ec2507457d Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:35:18 +0000 Subject: [PATCH 03/26] added 2 different track selection criteria --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 206 ++++++++++++++++++++---------- 1 file changed, 138 insertions(+), 68 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 95865ca8ef9..b12b4d2a228 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -381,7 +381,7 @@ struct ExclusiveRhoTo4Pi { Produces bkgFromData; // Histogram Registry HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - // Configurable Event parameters:1 + // Configurable Event parameters Configurable ifCheckUPCmode{"ifCheckUPCmode", false, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; @@ -394,22 +394,28 @@ struct ExclusiveRhoTo4Pi { Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; Configurable vtxITSTPCcut{"vtxITSTPCcut", 1, "vtxITSTPCcut"}; Configurable tfbCut{"tfbCut", 1, "tfbCut"}; - // Configurable Track parameters:1 + // track Selection mode + Configurable trackSelectionMode{"trackSelectionMode", 0, "Different modes of track selection"}; + // Configurable Track parameters common to mode 0 and 1 Configurable useOnlyPVtracks{"useOnlyPVtracks", true, "Use Only PV tracks"}; Configurable useITS{"useITS", true, "only use tracks with hit in ITS"}; + Configurable useTPC{"useTPC", true, "has TPC hit"}; + Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; + Configurable pTcut{"pTcut", 0.1, "Track Pt"}; + Configurable dcaZcut{"dcaZcut", 1, "dcaZ cut"}; + Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; + // Configurable Track parameters for mode 0 only Configurable itsNClsCut{"itsNClsCut", 4, "Min No of itsNCls"}; Configurable itsClusterMapCut{"itsClusterMapCut", 1, "min no of ITS clusters in cluster map"}; Configurable itsChi2NClCut{"itsChi2NClCut", 3.0, "Max ITS Chi2/NCl"}; - Configurable useTPC{"useTPC", true, "has TPC hit"}; Configurable minFoundTPCclusters{"minFoundTPCclusters", 120, "Min TPC Findable Clusters"}; Configurable tpcChi2NClsMin{"tpcChi2NClsMin", 1.0, "Min TPC Chi2/NCls"}; Configurable tpcChi2NClsMax{"tpcChi2NClsMax", 3.0, "Max TPC Chi2/NCls"}; - Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; Configurable tpcNClsCrossedRowsCut{"tpcNClsCrossedRowsCut", 130, "Min TPC Crossed Rows"}; Configurable tpcCrossedRowsOverFindableCut{"tpcCrossedRowsOverFindableCut", 1.0, "Min TPC Crossed Rows over Findable Clusters"}; - Configurable pTcut{"pTcut", 0.1, "Track Pt"}; - Configurable dcaZcut{"dcaZcut", 1, "dcaZ cut"}; - Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; + // Configurable Track parameters for mode: 1 only + Configurable itsChi2Cut{"itsChi2Cut", 36, "ITS Chi2"}; + Configurable tpcChi2Cut{"tpcChi2Cut", 4.0, "TPC Chi2"}; // Configurable PID parameters Configurable useTOF{"useTOF", true, "has TOF for PID"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; @@ -640,81 +646,145 @@ struct ExclusiveRhoTo4Pi { for (const auto& t0 : tracks) { ROOT::Math::PxPyPzMVector trackVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); - // no Cuts histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); - // is PV Contributor - if (!(t0.isPVContributor() == useOnlyPVtracks)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); + if (trackSelectionMode == 0) { - // has ITS hit - if ((useITS == true) && (t0.hasITS() != true)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); + // is PV Contributor + if (!(t0.isPVContributor() == useOnlyPVtracks)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); - // min no of itsNCls - if (t0.itsNCls() < itsNClsCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); + // has ITS hit + if ((useITS == true) && (t0.hasITS() != true)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); - // min ITS chi2NCl - if (t0.itsChi2NCl() > itsChi2NClCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); + // min no of itsNCls + if (t0.itsNCls() < itsNClsCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); - // has TPC hit - if ((useTPC == true) && (t0.hasTPC() != true)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); + // min ITS chi2NCl + if (t0.itsChi2NCl() > itsChi2NClCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); - // min no of found TPC clusters - if (t0.tpcNClsFindable() - t0.tpcNClsFindableMinusFound() < minFoundTPCclusters) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); + // has TPC hit + if ((useTPC == true) && (t0.hasTPC() != true)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); - // range of tpcChi2NCl - if (!((tpcChi2NClsMin < t0.tpcChi2NCl()) && (t0.tpcChi2NCl() < tpcChi2NClsMax))) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); + // min no of found TPC clusters + if (t0.tpcNClsFindable() - t0.tpcNClsFindableMinusFound() < minFoundTPCclusters) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); - // tpcNClsCrossedRows - if (t0.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); + // range of tpcChi2NCl + if (!((tpcChi2NClsMin < t0.tpcChi2NCl()) && (t0.tpcChi2NCl() < tpcChi2NClsMax))) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); - // ratio of crossed TPC rows over findable clusters - if ((t0.tpcNClsCrossedRows() / t0.tpcNClsFindable()) < tpcCrossedRowsOverFindableCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); + // tpcNClsCrossedRows + if (t0.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); - // pT cut - if (trackVector.Pt() < pTcut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); + // ratio of crossed TPC rows over findable clusters + if ((t0.tpcNClsCrossedRows() / t0.tpcNClsFindable()) < tpcCrossedRowsOverFindableCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); - // dcaZ cut - if ((std::abs(t0.dcaZ()) > dcaZcut) || (t0.dcaXY() > getMaxDCAxy(trackVector.Pt()))) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + // pT cut + if (trackVector.Pt() < pTcut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); - // eta cut - if (std::abs(trackVector.Eta()) > etaCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + // dcaZ cut + if ((std::abs(t0.dcaZ()) > dcaZcut) || (t0.dcaXY() > getMaxDCAxy(trackVector.Pt()))) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + + // eta cut + if (std::abs(trackVector.Eta()) > etaCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + } // end of trackSelectionMode == 0 + + if (trackSelectionMode == 1) { + // is PV Contributor + if (!(t0.isPVContributor() == useOnlyPVtracks)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); + + // pT cut + if (trackVector.Pt() < pTcut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); + + // eta cut + if (std::abs(trackVector.Eta()) > etaCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); + + // dcaZ cut + if ((std::abs(t0.dcaZ()) > dcaZcut)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); + + // dcaXY cut + if (std::abs(t0.dcaXY()) > getMaxDCAxy(trackVector.Pt())) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); + + // has ITS hit + if ((useITS == true) && (t0.hasITS() != true)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); + + // has TPC hit + if ((useTPC == true) && (t0.hasTPC() != true)) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); + + // ITS Chi2 Cut + if (t0.itsChi2NCl() > itsChi2Cut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); + + // TPC Chi2 Cut + if (t0.tpcChi2NCl() > tpcChi2Cut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); + + // TPC Clusters findable cut + if (t0.tpcNClsFindable() < tpcNClsFindableCut) { + continue; + } + histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); + } // end of trackSelectionMode == 1 selectedTracks.push_back(t0); if (selectionPIDPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { From 2626c7adbb0de90071e23734d645c9a877702e48 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sat, 26 Jul 2025 17:37:46 +0000 Subject: [PATCH 04/26] Added filters for fast analysis and new process for event and track counters --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 597 +++++++++++++++--------------- 1 file changed, 308 insertions(+), 289 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index b12b4d2a228..97068a4c9a9 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -376,48 +376,38 @@ struct ExclusiveRhoTo4Pi { int numPiPlus = 2; int numPiMinus = 2; float zeroPointEight = 0.8; + std::vector trackSelectionParams; // Derived Data Produces sigFromData; Produces bkgFromData; // Histogram Registry - HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosData{"Data", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosCounter{"counters", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable Event parameters Configurable ifCheckUPCmode{"ifCheckUPCmode", false, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; - Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; + Configurable ft0aCut{"ft0aCut", 50., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable zdcCut{"zdcCut", 0., "ZDC threshold"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; - Configurable gapSideCut{"gapSideCut", 2, "Gap Side"}; Configurable sbpCut{"sbpCut", 1, "Sbp"}; Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; Configurable vtxITSTPCcut{"vtxITSTPCcut", 1, "vtxITSTPCcut"}; Configurable tfbCut{"tfbCut", 1, "tfbCut"}; - // track Selection mode - Configurable trackSelectionMode{"trackSelectionMode", 0, "Different modes of track selection"}; - // Configurable Track parameters common to mode 0 and 1 + // Configurable Track parameters Configurable useOnlyPVtracks{"useOnlyPVtracks", true, "Use Only PV tracks"}; - Configurable useITS{"useITS", true, "only use tracks with hit in ITS"}; - Configurable useTPC{"useTPC", true, "has TPC hit"}; - Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; - Configurable pTcut{"pTcut", 0.1, "Track Pt"}; - Configurable dcaZcut{"dcaZcut", 1, "dcaZ cut"}; + Configurable pTcut{"pTcut", 0.15, "Track Pt"}; Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; - // Configurable Track parameters for mode 0 only - Configurable itsNClsCut{"itsNClsCut", 4, "Min No of itsNCls"}; - Configurable itsClusterMapCut{"itsClusterMapCut", 1, "min no of ITS clusters in cluster map"}; - Configurable itsChi2NClCut{"itsChi2NClCut", 3.0, "Max ITS Chi2/NCl"}; - Configurable minFoundTPCclusters{"minFoundTPCclusters", 120, "Min TPC Findable Clusters"}; - Configurable tpcChi2NClsMin{"tpcChi2NClsMin", 1.0, "Min TPC Chi2/NCls"}; - Configurable tpcChi2NClsMax{"tpcChi2NClsMax", 3.0, "Max TPC Chi2/NCls"}; - Configurable tpcNClsCrossedRowsCut{"tpcNClsCrossedRowsCut", 130, "Min TPC Crossed Rows"}; - Configurable tpcCrossedRowsOverFindableCut{"tpcCrossedRowsOverFindableCut", 1.0, "Min TPC Crossed Rows over Findable Clusters"}; - // Configurable Track parameters for mode: 1 only - Configurable itsChi2Cut{"itsChi2Cut", 36, "ITS Chi2"}; - Configurable tpcChi2Cut{"tpcChi2Cut", 4.0, "TPC Chi2"}; + Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; + Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; + Configurable useITStracksOnly{"useITStracksOnly", true, "only use tracks with hit in ITS"}; + Configurable useTPCtracksOnly{"useTPCtracksOnly", true, "only use tracks with hit in TPC"}; + Configurable itsChi2NClsCut{"itsChi2NClsCut", 36, "ITS Chi2NCls"}; + Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 4.0, "TPC Chi2NCls"}; + Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; // Configurable PID parameters - Configurable useTOF{"useTOF", true, "has TOF for PID"}; + Configurable useTOF{"useTOF", true, "if track has TOF use TOF"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; // Configurable Rho parameters @@ -435,32 +425,35 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { - // QA plots: Event Counter - histosData.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {21, -1, 20}}); - histosData.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); + // QA plots: Event and Track Counter + histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); + histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); // QA plots: event selection - histosData.add("FT0A", "T0A amplitude", kTH1F, {{2000, 0.0, 500.0}}); - histosData.add("FT0C", "T0C amplitude", kTH1F, {{2000, 0.0, 500.0}}); + histosData.add("UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); + histosData.add("FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); + histosData.add("FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); + histosData.add("FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosData.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); + histosData.add("FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 500}}); + histosData.add("FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 500}}); histosData.add("vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); histosData.add("vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); histosData.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); + histosData.add("GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); + histosData.add("TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); histosData.add("occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); - histosData.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); - histosData.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); // QA plots: tracks - histosData.add("dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{5000, -1, 1}}); + histosData.add("dcaXY_all", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{5000, -1, 1}}); histosData.add("dcaXY_pions", "dcaXY_pions; dcaXY of Pions [cm]; Counts", kTH1F, {{5000, -1, 1}}); - histosData.add("dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{5000, -1, 1}}); + histosData.add("dcaZ_all", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{5000, -1, 1}}); histosData.add("dcaZ_pions", "dcaZ_pions; dcaZ of Pions [cm]; Counts", kTH1F, {{5000, -1, 1}}); - histosData.add("tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosData.add("itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosData.add("tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); - histosData.add("itsClusterMap", "ITS Cluster Map; itsClusterMap; Counts", kTH1F, {{200, 0, 200}}); + histosData.add("itsChi2NCl_all", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosData.add("itsChi2_all", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); + histosData.add("tpcChi2NCl_all", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosData.add("tpcNClsFindable_all", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: PID - histosData.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosData.add("tpcSignal_all", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); histosData.add("tpcSignal_pions", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); histosData.add("tpcNSigmaPi_all", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosData.add("tpcNSigmaPi_pions", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); @@ -468,7 +461,7 @@ struct ExclusiveRhoTo4Pi { histosData.add("tpcNSigmaPr_pions", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosData.add("tpcNSigmaEl_pions", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosData.add("tpcNSigmaMu_pions", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosData.add("tofBeta_all", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); histosData.add("tofBeta_pions", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); histosData.add("tofNSigmaPi_all", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosData.add("tofNSigmaPi_pions", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); @@ -545,86 +538,26 @@ struct ExclusiveRhoTo4Pi { histosData.add("phi_vs_costheta_large_mass", "Phi vs cosTheta for large mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); } // End of init function + //--------------------------------------------------------------------------------------------------------------------------------------------- + // Event Cuts + Filter vertexZcut = (nabs(o2::aod::collision::posZ) <= vZCut); + Filter numPVcontributorsCut = (o2::aod::collision::numContrib == numPVContrib); + Filter fitcuts = (o2::aod::udcollision::totalFV0AmplitudeA <= fv0Cut) && (o2::aod::udcollision::totalFT0AmplitudeA <= ft0aCut) && (o2::aod::udcollision::totalFT0AmplitudeC <= ft0cCut); + Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA <= zdcCut) && (o2::aod::udzdc::energyCommonZNC <= zdcCut); + Filter bcSelectionCuts = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); + // Track Cuts + Filter onlyPVtracks = o2::aod::udtrack::isPVContributor == useOnlyPVtracks; + //--------------------------------------------------------------------------------------------------------------------------------------------- + using UDtracks = soa::Join; using UDCollisions = soa::Join; - void processData(UDCollisions::iterator const& collision, UDtracks const& tracks) + void processData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) { - - // no cuts - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), -1); - - // Check if the event is in UPC mode + // Check if the Event is reconstructed in UPC mode if (ifCheckUPCmode && (collision.flags() != 1)) { return; } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 0); - - // FTOA - if (!(collision.totalFT0AmplitudeA() <= ft0aCut)) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 1); - - // FT0C - if (!(collision.totalFT0AmplitudeC() <= ft0cCut)) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 2); - - // FV0 - if (!(collision.totalFV0AmplitudeA() <= fv0Cut)) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 3); - - // noSamebunchPileup - if (collision.sbp() != sbpCut) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 4); - - // kIsVertexITSTPC - if (collision.vtxITSTPC() != vtxITSTPCcut) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 5); - - // kNoITSROFrameBorder - if (collision.itsROFb() != itsROFbCut) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 6); - - // kNoTimeFrameBorder - if (collision.tfb() != tfbCut) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 7); - - // ZDC - if (!(collision.energyCommonZNA() <= zdcCut || collision.energyCommonZNC() <= zdcCut)) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 8); - - // Vertex Z cut - if (!(std::abs(collision.posZ()) <= vZCut)) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 9); - - // true Gap Side - if (sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut) != gapSideCut) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 10); - - // number of PV contributors - if (!(collision.numContrib() == numPVContrib)) { - return; - } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 11); histosData.fill(HIST("GapSide"), collision.gapSide()); histosData.fill(HIST("TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); @@ -632,11 +565,14 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("vertexY"), collision.posY()); histosData.fill(HIST("vertexZ"), collision.posZ()); histosData.fill(HIST("occupancy"), collision.occupancyInTime()); - histosData.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); + histosData.fill(HIST("FV0A"), collision.totalFV0AmplitudeA()); histosData.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); histosData.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); histosData.fill(HIST("ZDC_A"), collision.energyCommonZNA()); histosData.fill(HIST("ZDC_C"), collision.energyCommonZNC()); + histosData.fill(HIST("FDDA"), collision.totalFDDAmplitudeA()); + histosData.fill(HIST("FDDC"), collision.totalFDDAmplitudeC()); + histosData.fill(HIST("UPCmode"), collision.flags()); std::vector selectedTracks; std::vector selectedPionTracks; @@ -644,159 +580,17 @@ struct ExclusiveRhoTo4Pi { std::vector selectedPionMinusTracks; for (const auto& t0 : tracks) { - - ROOT::Math::PxPyPzMVector trackVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); - // no Cuts - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); - - if (trackSelectionMode == 0) { - - // is PV Contributor - if (!(t0.isPVContributor() == useOnlyPVtracks)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); - - // has ITS hit - if ((useITS == true) && (t0.hasITS() != true)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); - - // min no of itsNCls - if (t0.itsNCls() < itsNClsCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); - - // min ITS chi2NCl - if (t0.itsChi2NCl() > itsChi2NClCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); - - // has TPC hit - if ((useTPC == true) && (t0.hasTPC() != true)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); - - // min no of found TPC clusters - if (t0.tpcNClsFindable() - t0.tpcNClsFindableMinusFound() < minFoundTPCclusters) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); - - // range of tpcChi2NCl - if (!((tpcChi2NClsMin < t0.tpcChi2NCl()) && (t0.tpcChi2NCl() < tpcChi2NClsMax))) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); - - // tpcNClsCrossedRows - if (t0.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); - - // ratio of crossed TPC rows over findable clusters - if ((t0.tpcNClsCrossedRows() / t0.tpcNClsFindable()) < tpcCrossedRowsOverFindableCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); - - // pT cut - if (trackVector.Pt() < pTcut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); - - // dcaZ cut - if ((std::abs(t0.dcaZ()) > dcaZcut) || (t0.dcaXY() > getMaxDCAxy(trackVector.Pt()))) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); - - // eta cut - if (std::abs(trackVector.Eta()) > etaCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); - } // end of trackSelectionMode == 0 - - if (trackSelectionMode == 1) { - // is PV Contributor - if (!(t0.isPVContributor() == useOnlyPVtracks)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); - - // pT cut - if (trackVector.Pt() < pTcut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); - - // eta cut - if (std::abs(trackVector.Eta()) > etaCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); - - // dcaZ cut - if ((std::abs(t0.dcaZ()) > dcaZcut)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); - - // dcaXY cut - if (std::abs(t0.dcaXY()) > getMaxDCAxy(trackVector.Pt())) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); - - // has ITS hit - if ((useITS == true) && (t0.hasITS() != true)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); - - // has TPC hit - if ((useTPC == true) && (t0.hasTPC() != true)) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); - - // ITS Chi2 Cut - if (t0.itsChi2NCl() > itsChi2Cut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); - - // TPC Chi2 Cut - if (t0.tpcChi2NCl() > tpcChi2Cut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); - - // TPC Clusters findable cut - if (t0.tpcNClsFindable() < tpcNClsFindableCut) { - continue; - } - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); - } // end of trackSelectionMode == 1 - + if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { + continue; + } selectedTracks.push_back(t0); if (selectionPIDPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { selectedPionTracks.push_back(t0); - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); if (t0.sign() == 1) { selectedPionPlusTracks.push_back(t0); - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 14); } if (t0.sign() == -1) { selectedPionMinusTracks.push_back(t0); - histosData.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 15); } } // End of Selection PID Pion } // End of loop over tracks @@ -808,49 +602,55 @@ struct ExclusiveRhoTo4Pi { for (int i = 0; i < numSelectedTracks; i++) { ROOT::Math::PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); - histosData.fill(HIST("tpcSignal"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); - histosData.fill(HIST("tofBeta"), selectedTrackVector.P(), selectedTracks[i].beta()); - histosData.fill(HIST("tpcNSigmaPi_all"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaPi_all"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); histosData.fill(HIST("pT_track_all"), selectedTrackVector.Pt()); histosData.fill(HIST("eta_track_all"), selectedTrackVector.Eta()); histosData.fill(HIST("phi_track_all"), selectedTrackVector.Phi()); histosData.fill(HIST("rapidity_track_all"), selectedTrackVector.Rapidity()); - histosData.fill(HIST("itsChi2NCl"), selectedTracks[i].itsChi2NCl()); - histosData.fill(HIST("tpcChi2NCl"), selectedTracks[i].tpcChi2NCl()); - histosData.fill(HIST("tpcNClsFindable"), selectedTracks[i].tpcNClsFindable()); - histosData.fill(HIST("dcaXY"), selectedTracks[i].dcaXY()); - histosData.fill(HIST("dcaZ"), selectedTracks[i].dcaZ()); - histosData.fill(HIST("itsClusterMap"), selectedTracks[i].itsClusterMap()); + + histosData.fill(HIST("dcaXY_all"), selectedTracks[i].dcaXY()); + histosData.fill(HIST("dcaZ_all"), selectedTracks[i].dcaZ()); + + histosData.fill(HIST("itsChi2NCl_all"), selectedTracks[i].itsChi2NCl()); + histosData.fill(HIST("itsChi2_all"), selectedTracks[i].itsChi2NCl() * selectedTracks[i].itsNCls()); + histosData.fill(HIST("tpcChi2NCl_all"), selectedTracks[i].tpcChi2NCl()); + histosData.fill(HIST("tpcNClsFindable_all"), selectedTracks[i].tpcNClsFindable()); + + histosData.fill(HIST("tpcSignal_all"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); + histosData.fill(HIST("tpcNSigmaPi_all"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); + histosData.fill(HIST("tofBeta_all"), selectedTrackVector.P(), selectedTracks[i].beta()); + histosData.fill(HIST("tofNSigmaPi_all"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); } // End of loop over tracks with selection only for (int i = 0; i < numSelectedPionTracks; i++) { ROOT::Math::PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); + + histosData.fill(HIST("pT_track_pions"), selectedPionTrackVector.Pt()); + histosData.fill(HIST("eta_track_pions"), selectedPionTrackVector.Eta()); + histosData.fill(HIST("phi_track_pions"), selectedPionTrackVector.Phi()); + histosData.fill(HIST("rapidity_track_pions"), selectedPionTrackVector.Rapidity()); + + histosData.fill(HIST("dcaXY_pions"), selectedPionTracks[i].dcaXY()); + histosData.fill(HIST("dcaZ_pions"), selectedPionTracks[i].dcaZ()); + histosData.fill(HIST("tpcSignal_pions"), selectedPionTrackVector.P(), selectedPionTracks[i].tpcSignal()); - histosData.fill(HIST("tofBeta_pions"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); histosData.fill(HIST("tpcNSigmaPi_pions"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tpcNSigmaKa_pions"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tpcNSigmaPr_pions"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tpcNSigmaEl_pions"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tpcNSigmaMu_pions"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); + + histosData.fill(HIST("tofBeta_pions"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); histosData.fill(HIST("tofNSigmaPi_pions"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tofNSigmaKa_pions"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tofNSigmaPr_pions"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tofNSigmaEl_pions"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); histosData.fill(HIST("tofNSigmaMu_pions"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("pT_track_pions"), selectedPionTrackVector.Pt()); - histosData.fill(HIST("eta_track_pions"), selectedPionTrackVector.Eta()); - histosData.fill(HIST("phi_track_pions"), selectedPionTrackVector.Phi()); - histosData.fill(HIST("rapidity_track_pions"), selectedPionTrackVector.Rapidity()); - histosData.fill(HIST("dcaXY_pions"), selectedPionTracks[i].dcaXY()); - histosData.fill(HIST("dcaZ_pions"), selectedPionTracks[i].dcaZ()); } // End of loop over tracks with selection and PID of pions // event should have exactly 4 pions if (numSelectedPionTracks != numFourPionTracks) { return; } - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); // Check if there is at least one track with TOF in the selected events (for derived Data) bool hasAtleastOneTOF = false; @@ -864,8 +664,6 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 13); - ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); @@ -979,10 +777,6 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_rap_0_charge_within_rap"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_0_charge_within_rap"), p1234.M()); if (p1234.Pt() < rhoPtCut) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); - if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 15); - } // Fill the Invariant Mass Histogram histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); // Two Pion Masses @@ -997,7 +791,6 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("collin_soper_costheta_2"), fourPiCosThetaPair2); histosData.fill(HIST("phi_vs_costheta_1"), fourPiPhiPair1, fourPiCosThetaPair1); histosData.fill(HIST("phi_vs_costheta_2"), fourPiPhiPair2, fourPiCosThetaPair2); - // Small Mass CosTheta and Phi if ((k13.M() + k24.M()) > (k14.M() + k23.M())) { histosData.fill(HIST("collin_soper_phi_large_mass"), fourPiPhiPair1); @@ -1027,8 +820,6 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - histosData.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 16); - ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); @@ -1113,7 +904,184 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 Data + void processCounter(UDCollisions::iterator const& collision, UDtracks const& tracks) + { + + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 0); + + // UPC mode + if (ifCheckUPCmode && collision.flags() != 1) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 1); + + // vtxITSTPC + if (collision.vtxITSTPC() != vtxITSTPCcut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 2); + + // sbp + if (collision.sbp() != sbpCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 3); + + // itsROFb + if (collision.itsROFb() != itsROFbCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 4); + + // tfb + if (collision.tfb() != tfbCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 5); + + // FT0A + if (collision.totalFT0AmplitudeA() > ft0aCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 6); + // FT0C + if (collision.totalFT0AmplitudeC() > ft0cCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 7); + // FV0A + if (collision.totalFV0AmplitudeA() > fv0Cut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 8); + + // ZDC + if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 9); + + // numContributors + if (collision.numContrib() != numPVContrib) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 10); + + // vertexZ + if (std::abs(collision.posZ()) > vZCut) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 11); + + std::vector selectedPionTracks; + std::vector selectedPionPlusTracks; + std::vector selectedPionMinusTracks; + + for (const auto& track : tracks) { + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); + ROOT::Math::PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); + // is PV contributor + if (track.isPVContributor() != useOnlyPVtracks) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); + // pt cut + if (trackVector.Pt() < pTcut) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); + // eta cut + if (std::abs(trackVector.Eta()) > etaCut) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); + // DCA Z cut + if (std::abs(track.dcaZ()) > dcaZcut) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); + // DCA XY cut + float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); + if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + continue; + } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); + // ITS Track only + if (useITStracksOnly && !track.hasITS()) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); + // TPC Track only + if (useTPCtracksOnly && !track.hasTPC()) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); + // ITS Chi2 N Clusters cut + if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); + // TPC Chi2 N Clusters cut + if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); + // TPC N Clusters Findable cut + if (track.hasTPC() && track.tpcNClsFindable() < tpcNClsFindableCut) { + continue; + } + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); + // Selection PID Pion + if (selectionPIDPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + selectedPionTracks.push_back(track); + if (track.sign() == 1) { + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + selectedPionPlusTracks.push_back(track); + } + if (track.sign() == -1) { + histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); + selectedPionMinusTracks.push_back(track); + } + } // End of Selection PID Pion + } // End of loop over tracks + + int numSelectedPionTracks = static_cast(selectedPionTracks.size()); + int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); + int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); + // Events with 4 pions + if (numSelectedPionTracks != numFourPionTracks) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); + + // Selecting Events with net charge = 0 + if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 13); + ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; + + if ((p1234.Pt() < rhoPtCut) && (std::abs(p1234.Rapidity()) < rhoRapCut)) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); + if ((rhoMassMin < p1234.M()) && (p1234.M() < rhoMassMax)) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 15); + } + } + } // End of Zero Charge Events + + if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 16); + } // End of Non Zero Charge Events + + } // End of processCounter function + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processCounter, "The Process for 4 Pion Analysis from data", true); double cosThetaCollinsSoperFrame(ROOT::Math::PtEtaPhiMVector pair1, ROOT::Math::PtEtaPhiMVector pair2, ROOT::Math::PtEtaPhiMVector fourpion) { @@ -1163,11 +1131,62 @@ struct ExclusiveRhoTo4Pi { return phi; } - double getMaxDCAxy(double pT) + template + bool isSelectedTrack(T const& track, + float ptcut, + float etaCut, + float dcaxycut, + float dcazcut, + bool ifITS, + bool ifTPC, + float itschi2nclscut, + float tpcchi2nclscut, + float tpcnclsfindablecut) { - return 0.0105 + 0.035 / std::pow(pT, 1.1); - } + ROOT::Math::PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); + // pt cut + if (trackVector.Pt() < ptcut) { + return false; + } + // eta cut + if (std::fabs(trackVector.Eta()) > etaCut) { + return false; + } + // DCA Z cut + if (std::fabs(track.dcaZ()) > dcazcut) { + return false; + } + // DCA XY cut + float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); + if (dcaxycut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + return false; + } else if (dcaxycut != 0 && (std::fabs(track.dcaXY()) > dcaxycut)) { + return false; + } + // ITS Track only + if (ifITS && !track.hasITS()) { + return false; + } + // TPC Track only + if (ifTPC && !track.hasTPC()) { + return false; + } + // ITS Chi2 N Clusters cut + if (track.hasITS() && track.itsChi2NCl() > itschi2nclscut) { + return false; + } + // TPC Chi2 N Clusters cut + if (track.hasTPC() && track.tpcChi2NCl() > tpcchi2nclscut) { + return false; + } + // TPC N Clusters Findable cut + if (track.hasTPC() && track.tpcNClsFindable() < tpcnclsfindablecut) { + return false; + } + // All cuts passed + return true; + } // End of Track Selection function }; // End of Struct exclusiveRhoTo4Pi WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From d24e5db5dce50acd4bed42b629e002f93ba98080 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 27 Jul 2025 09:19:50 +0000 Subject: [PATCH 05/26] made the event and track counters seperate function --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 109 ++++++++++++++++++------------ 1 file changed, 64 insertions(+), 45 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 97068a4c9a9..daae60d111c 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -376,7 +376,6 @@ struct ExclusiveRhoTo4Pi { int numPiPlus = 2; int numPiMinus = 2; float zeroPointEight = 0.8; - std::vector trackSelectionParams; // Derived Data Produces sigFromData; Produces bkgFromData; @@ -440,14 +439,14 @@ struct ExclusiveRhoTo4Pi { histosData.add("vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); histosData.add("vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); histosData.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); - histosData.add("GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); - histosData.add("TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); + histosData.add("GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosData.add("TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); histosData.add("occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); // QA plots: tracks - histosData.add("dcaXY_all", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{5000, -1, 1}}); - histosData.add("dcaXY_pions", "dcaXY_pions; dcaXY of Pions [cm]; Counts", kTH1F, {{5000, -1, 1}}); - histosData.add("dcaZ_all", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{5000, -1, 1}}); - histosData.add("dcaZ_pions", "dcaZ_pions; dcaZ of Pions [cm]; Counts", kTH1F, {{5000, -1, 1}}); + histosData.add("dcaXY_all", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosData.add("dcaXY_pions", "dcaXY_pions; dcaXY of Pions [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosData.add("dcaZ_all", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosData.add("dcaZ_pions", "dcaZ_pions; dcaZ of Pions [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosData.add("itsChi2NCl_all", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosData.add("itsChi2_all", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosData.add("tpcChi2NCl_all", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); @@ -904,7 +903,7 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 Data - void processCounter(UDCollisions::iterator const& collision, UDtracks const& tracks) + void processEventCounter(UDCollisions::iterator const& collision, soa::Filtered const& tracks) { histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 0); @@ -977,6 +976,59 @@ struct ExclusiveRhoTo4Pi { std::vector selectedPionPlusTracks; std::vector selectedPionMinusTracks; + for (const auto& t0 : tracks) { + if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { + continue; + } + if (selectionPIDPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + selectedPionTracks.push_back(t0); + if (t0.sign() == 1) { + selectedPionPlusTracks.push_back(t0); + } + if (t0.sign() == -1) { + selectedPionMinusTracks.push_back(t0); + } + } // End of Selection PID Pion + } // End of loop over tracks + + int numSelectedPionTracks = static_cast(selectedPionTracks.size()); + int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); + int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); + // Events with 4 pions + if (numSelectedPionTracks != numFourPionTracks) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); + + // Selecting Events with net charge = 0 + if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 13); + ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; + + if ((p1234.Pt() < rhoPtCut) && (std::abs(p1234.Rapidity()) < rhoRapCut)) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); + if ((rhoMassMin < p1234.M()) && (p1234.M() < rhoMassMax)) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 15); + } + } + } // End of Zero Charge Events + + if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { + histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 16); + } // End of Non Zero Charge Events + + } // End of processCounter function + + void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) + { + // Check if the Event is reconstructed in UPC mode + if (ifCheckUPCmode && (collision.flags() != 1)) { + return; + } for (const auto& track : tracks) { histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); ROOT::Math::PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); @@ -1036,52 +1088,19 @@ struct ExclusiveRhoTo4Pi { // Selection PID Pion if (selectionPIDPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); - selectedPionTracks.push_back(track); if (track.sign() == 1) { histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); - selectedPionPlusTracks.push_back(track); } if (track.sign() == -1) { histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); - selectedPionMinusTracks.push_back(track); } } // End of Selection PID Pion } // End of loop over tracks - - int numSelectedPionTracks = static_cast(selectedPionTracks.size()); - int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); - int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); - // Events with 4 pions - if (numSelectedPionTracks != numFourPionTracks) { - return; - } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); - - // Selecting Events with net charge = 0 - if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 13); - ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; - - if ((p1234.Pt() < rhoPtCut) && (std::abs(p1234.Rapidity()) < rhoRapCut)) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); - if ((rhoMassMin < p1234.M()) && (p1234.M() < rhoMassMax)) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 15); - } - } - } // End of Zero Charge Events - - if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 16); - } // End of Non Zero Charge Events - } // End of processCounter function - PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); - PROCESS_SWITCH(ExclusiveRhoTo4Pi, processCounter, "The Process for 4 Pion Analysis from data", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "Data Analysis Function", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounter, "Event Counter Function", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounter, "Track Counter Function", true); double cosThetaCollinsSoperFrame(ROOT::Math::PtEtaPhiMVector pair1, ROOT::Math::PtEtaPhiMVector pair2, ROOT::Math::PtEtaPhiMVector fourpion) { @@ -1143,7 +1162,6 @@ struct ExclusiveRhoTo4Pi { float tpcchi2nclscut, float tpcnclsfindablecut) { - ROOT::Math::PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // pt cut if (trackVector.Pt() < ptcut) { @@ -1187,6 +1205,7 @@ struct ExclusiveRhoTo4Pi { // All cuts passed return true; } // End of Track Selection function + }; // End of Struct exclusiveRhoTo4Pi WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 85c1d07ef96d659ecb4497d240e97f75f32b89d2 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 3 Aug 2025 06:45:53 +0000 Subject: [PATCH 06/26] modified the Counter histograms --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 155 +++++++++++++++++------------- 1 file changed, 89 insertions(+), 66 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index daae60d111c..a122bf1ec02 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -376,6 +376,9 @@ struct ExclusiveRhoTo4Pi { int numPiPlus = 2; int numPiMinus = 2; float zeroPointEight = 0.8; + // Run Numbers + static int runNos[113]; + static int numRunNums; // Derived Data Produces sigFromData; Produces bkgFromData; @@ -404,7 +407,7 @@ struct ExclusiveRhoTo4Pi { Configurable useTPCtracksOnly{"useTPCtracksOnly", true, "only use tracks with hit in TPC"}; Configurable itsChi2NClsCut{"itsChi2NClsCut", 36, "ITS Chi2NCls"}; Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 4.0, "TPC Chi2NCls"}; - Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; + Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; // Configurable PID parameters Configurable useTOF{"useTOF", true, "if track has TOF use TOF"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; @@ -425,8 +428,14 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { // QA plots: Event and Track Counter - histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); - histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{1355, 544013, 545367}, {20, 0, 20}}); + histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {20, 0, 20}}); + histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {20, 0, 20}}); + histosCounter.add("fourPionCounts_0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_n0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_n0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_n0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); // QA plots: event selection histosData.add("UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); histosData.add("FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); @@ -535,6 +544,7 @@ struct ExclusiveRhoTo4Pi { histosData.add("collin_soper_costheta_large_mass", "#theta Distribution;cos(#theta); Counts", kTH1F, {cosThetaAxis}); histosData.add("phi_vs_costheta_small_mass", "Phi vs cosTheta for small mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); histosData.add("phi_vs_costheta_large_mass", "Phi vs cosTheta for large mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); + setHistBinLabels(); } // End of init function //--------------------------------------------------------------------------------------------------------------------------------------------- @@ -546,6 +556,9 @@ struct ExclusiveRhoTo4Pi { Filter bcSelectionCuts = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); // Track Cuts Filter onlyPVtracks = o2::aod::udtrack::isPVContributor == useOnlyPVtracks; + Filter tpcchi2nclsFilter = o2::aod::track::tpcChi2NCl <= tpcChi2NClsCut; + Filter itschi2nclsFilter = o2::aod::track::itsChi2NCl <= itsChi2NClsCut; + Filter tpcCuts = (nabs(o2::aod::pidtpc::tpcNSigmaPi) <= nSigmaTPCcut); //--------------------------------------------------------------------------------------------------------------------------------------------- using UDtracks = soa::Join; @@ -553,6 +566,9 @@ struct ExclusiveRhoTo4Pi { void processData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) { + + int runIndex = getRunNumberIndex(collision.runNumber()); + // Check if the Event is reconstructed in UPC mode if (ifCheckUPCmode && (collision.flags() != 1)) { return; @@ -769,13 +785,18 @@ struct ExclusiveRhoTo4Pi { // Four Collins Soper Phi and CosTheta fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); + histosCounter.fill(HIST("fourPionCounts_0c"), runIndex); + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosData.fill(HIST("fourpion_pT_0_charge_within_rap"), p1234.Pt()); histosData.fill(HIST("fourpion_eta_0_charge_within_rap"), p1234.Eta()); histosData.fill(HIST("fourpion_phi_0_charge_within_rap"), p1234.Phi()); histosData.fill(HIST("fourpion_rap_0_charge_within_rap"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_0_charge_within_rap"), p1234.M()); + histosCounter.fill(HIST("fourPionCounts_0c_within_rap"), runIndex); if (p1234.Pt() < rhoPtCut) { + // Selected Four Pion Events + histosCounter.fill(HIST("fourPionCounts_0c_selected"), runIndex); // Fill the Invariant Mass Histogram histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); // Two Pion Masses @@ -884,14 +905,18 @@ struct ExclusiveRhoTo4Pi { // Four Mass p1234.M()); + histosCounter.fill(HIST("fourPionCounts_n0c"), runIndex); + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosData.fill(HIST("fourpion_pT_non_0_charge_within_rap"), p1234.Pt()); histosData.fill(HIST("fourpion_eta_non_0_charge_within_rap"), p1234.Eta()); histosData.fill(HIST("fourpion_phi_non_0_charge_within_rap"), p1234.Phi()); histosData.fill(HIST("fourpion_rap_non_0_charge_within_rap"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_non_0_charge_within_rap"), p1234.M()); + histosCounter.fill(HIST("fourPionCounts_n0c_within_rap"), runIndex); if (p1234.Pt() < rhoPtCut) { histosData.fill(HIST("fourpion_mass_non_0_charge_domA"), p1234.M()); + histosCounter.fill(HIST("fourPionCounts_n0c_selected"), runIndex); } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { histosData.fill(HIST("fourpion_mass_non_0_charge_domB"), p1234.M()); @@ -903,124 +928,74 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 Data - void processEventCounter(UDCollisions::iterator const& collision, soa::Filtered const& tracks) + void processEventCounter(UDCollisions::iterator const& collision) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 0); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 0); // UPC mode if (ifCheckUPCmode && collision.flags() != 1) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 1); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 1); // vtxITSTPC if (collision.vtxITSTPC() != vtxITSTPCcut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 2); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 2); // sbp if (collision.sbp() != sbpCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 3); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 3); // itsROFb if (collision.itsROFb() != itsROFbCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 4); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 4); // tfb if (collision.tfb() != tfbCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 5); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 5); // FT0A if (collision.totalFT0AmplitudeA() > ft0aCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 6); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 6); // FT0C if (collision.totalFT0AmplitudeC() > ft0cCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 7); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 7); // FV0A if (collision.totalFV0AmplitudeA() > fv0Cut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 8); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 8); // ZDC if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 9); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); // numContributors if (collision.numContrib() != numPVContrib) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 10); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // vertexZ if (std::abs(collision.posZ()) > vZCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 11); - - std::vector selectedPionTracks; - std::vector selectedPionPlusTracks; - std::vector selectedPionMinusTracks; - - for (const auto& t0 : tracks) { - if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { - continue; - } - if (selectionPIDPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { - selectedPionTracks.push_back(t0); - if (t0.sign() == 1) { - selectedPionPlusTracks.push_back(t0); - } - if (t0.sign() == -1) { - selectedPionMinusTracks.push_back(t0); - } - } // End of Selection PID Pion - } // End of loop over tracks - - int numSelectedPionTracks = static_cast(selectedPionTracks.size()); - int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); - int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); - // Events with 4 pions - if (numSelectedPionTracks != numFourPionTracks) { - return; - } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 12); - - // Selecting Events with net charge = 0 - if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 13); - ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; - - if ((p1234.Pt() < rhoPtCut) && (std::abs(p1234.Rapidity()) < rhoRapCut)) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 14); - if ((rhoMassMin < p1234.M()) && (p1234.M() < rhoMassMax)) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 15); - } - } - } // End of Zero Charge Events - - if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), collision.runNumber(), 16); - } // End of Non Zero Charge Events - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); } // End of processCounter function void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) @@ -1206,8 +1181,56 @@ struct ExclusiveRhoTo4Pi { return true; } // End of Track Selection function + int getRunNumberIndex(int runNumber) + { + for (int i = 0; i < numRunNums; ++i) { + if (runNos[i] == runNumber) { + return i; + } + } + return -1; // Not found + } // End of getRunNumberIndex function + + void setHistBinLabels() + { + auto h1 = histosCounter.get(HIST("EventsCounts_vs_runNo")); + auto h2 = histosCounter.get(HIST("TracksCounts_vs_runNo")); + auto h3 = histosCounter.get(HIST("fourPionCounts_0c")); + auto h4 = histosCounter.get(HIST("fourPionCounts_0c_within_rap")); + auto h5 = histosCounter.get(HIST("fourPionCounts_0c_selected")); + auto h6 = histosCounter.get(HIST("fourPionCounts_n0c")); + auto h7 = histosCounter.get(HIST("fourPionCounts_n0c_within_rap")); + auto h8 = histosCounter.get(HIST("fourPionCounts_n0c_selected")); + + for (int i = 0; i < numRunNums; ++i) { + h1->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h2->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h3->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h4->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h5->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h6->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h7->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h8->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + } + } // end of setHistBinLabels function + }; // End of Struct exclusiveRhoTo4Pi +int ExclusiveRhoTo4Pi::runNos[113] = { + 544013, 544028, 544032, 544091, 544095, 544098, 544116, 544121, 544122, 544123, + 544124, 544184, 544185, 544389, 544390, 544391, 544392, 544451, 544454, 544474, + 544475, 544476, 544477, 544490, 544491, 544492, 544508, 544510, 544511, 544512, + 544514, 544515, 544518, 544548, 544549, 544550, 544551, 544564, 544565, 544567, + 544568, 544580, 544582, 544583, 544585, 544614, 544640, 544652, 544653, 544672, + 544674, 544692, 544693, 544694, 544696, 544739, 544742, 544754, 544767, 544794, + 544795, 544797, 544813, 544868, 544886, 544887, 544896, 544911, 544913, 544914, + 544917, 544931, 544947, 544961, 544963, 544964, 544968, 544991, 544992, 545004, + 545008, 545009, 545041, 545042, 545044, 545047, 545060, 545062, 545063, 545064, + 545066, 545086, 545103, 545117, 545171, 545184, 545185, 545210, 545222, 545223, + 545246, 545249, 545262, 545289, 545291, 545294, 545295, 545296, 545311, 545312, + 545332, 545345, 545367}; +int ExclusiveRhoTo4Pi::numRunNums = 113; + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ From e033a1eb7ce6041947e2285211effe81c1e4f664 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 3 Aug 2025 12:27:35 +0000 Subject: [PATCH 07/26] modifies the collin-soper angle selection criteria --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 189 +++++++++++++++--------------- 1 file changed, 92 insertions(+), 97 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index a122bf1ec02..d77cfa442d0 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -44,6 +44,12 @@ using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; +using PtEtaPhiMVector = ROOT::Math::PtEtaPhiMVector; +using Boost = ROOT::Math::Boost; +using XYZVectorF = ROOT::Math::XYZVectorF; +using PxPyPzEVector = ROOT::Math::PxPyPzEVector; +using PxPyPzMVector = ROOT::Math::PxPyPzMVector; + namespace o2::aod { namespace branch @@ -151,11 +157,15 @@ DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); DECLARE_SOA_COLUMN(FourPionPhi, fourPionPhi, double); DECLARE_SOA_COLUMN(FourPionRapidity, fourPionRapidity, double); DECLARE_SOA_COLUMN(FourPionMass, fourPionMass, double); -// Four Pion Phi Pair 1, Pair 2, CosTheta Pair 1, CosTheta Pair 2 +// Collin-Soper Angles DECLARE_SOA_COLUMN(FourPionPhiPair1, fourPionPhiPair1, double); DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); +DECLARE_SOA_COLUMN(FourPionPhiPair3, fourPionPhiPair3, double); +DECLARE_SOA_COLUMN(FourPionPhiPair4, fourPionPhiPair4, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); +DECLARE_SOA_COLUMN(FourPionCosThetaPair3, fourPionCosThetaPair3, double); +DECLARE_SOA_COLUMN(FourPionCosThetaPair4, fourPionCosThetaPair4, double); } // namespace branch DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", @@ -262,8 +272,12 @@ DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", branch::FourPionMass, branch::FourPionPhiPair1, branch::FourPionPhiPair2, + branch::FourPionPhiPair3, + branch::FourPionPhiPair4, branch::FourPionCosThetaPair1, - branch::FourPionCosThetaPair2); + branch::FourPionCosThetaPair2, + branch::FourPionCosThetaPair3, + branch::FourPionCosThetaPair4); DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", branch::RunNumber, @@ -376,6 +390,7 @@ struct ExclusiveRhoTo4Pi { int numPiPlus = 2; int numPiMinus = 2; float zeroPointEight = 0.8; + double mRho0 = 0.77526; // GeV/c^2 // Run Numbers static int runNos[113]; static int numRunNums; @@ -530,20 +545,8 @@ struct ExclusiveRhoTo4Pi { histosData.add("fourpion_mass_non_0_charge_domA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // pT < 0.15GeV histosData.add("fourpion_mass_non_0_charge_domB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // 0.15GeV < pT < 0.8GeV histosData.add("fourpion_mass_non_0_charge_domC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // 0.8GeV < pT - // Collin Soper Theta and Phi - histosData.add("collin_soper_phi_1", "#phi Distribution; #phi; Events", kTH1F, {phiAxis}); - histosData.add("collin_soper_phi_2", "#phi Distribution; #phi; Events", kTH1F, {phiAxis}); - histosData.add("collin_soper_costheta_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {cosThetaAxis}); - histosData.add("collin_soper_costheta_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {cosThetaAxis}); - histosData.add("phi_vs_costheta_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); - histosData.add("phi_vs_costheta_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); // Collin Soper Theta and Phi after selection - histosData.add("collin_soper_phi_small_mass", "#phi Distribution; #phi; Events", kTH1F, {phiAxis}); - histosData.add("collin_soper_phi_large_mass", "#phi Distribution; #phi; Events", kTH1F, {phiAxis}); - histosData.add("collin_soper_costheta_small_mass", "#theta Distribution;cos(#theta); Counts", kTH1F, {cosThetaAxis}); - histosData.add("collin_soper_costheta_large_mass", "#theta Distribution;cos(#theta); Counts", kTH1F, {cosThetaAxis}); - histosData.add("phi_vs_costheta_small_mass", "Phi vs cosTheta for small mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); - histosData.add("phi_vs_costheta_large_mass", "Phi vs cosTheta for large mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); + histosData.add("CSphi_vs_CScosTheta", "Phi vs cosTheta for small mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); setHistBinLabels(); } // End of init function @@ -616,7 +619,7 @@ struct ExclusiveRhoTo4Pi { int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); for (int i = 0; i < numSelectedTracks; i++) { - ROOT::Math::PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("pT_track_all"), selectedTrackVector.Pt()); histosData.fill(HIST("eta_track_all"), selectedTrackVector.Eta()); histosData.fill(HIST("phi_track_all"), selectedTrackVector.Phi()); @@ -637,7 +640,7 @@ struct ExclusiveRhoTo4Pi { } // End of loop over tracks with selection only for (int i = 0; i < numSelectedPionTracks; i++) { - ROOT::Math::PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("pT_track_pions"), selectedPionTrackVector.Pt()); histosData.fill(HIST("eta_track_pions"), selectedPionTrackVector.Eta()); @@ -679,12 +682,12 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; + PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; - ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("pT_track_pions_contributed"), p1.Pt()); histosData.fill(HIST("pT_track_pions_contributed"), p2.Pt()); @@ -711,7 +714,7 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; + PxPyPzMVector p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; k13 = k1 + k3; @@ -725,10 +728,14 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_rap_0_charge"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_0_charge"), p1234.M()); - double fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - double fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - double fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - double fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + double fourPiPhiPair1 = collinSoperPhi(k13, k1234); + double fourPiPhiPair2 = collinSoperPhi(k14, k1234); + double fourPiPhiPair3 = collinSoperPhi(k23, k1234); + double fourPiPhiPair4 = collinSoperPhi(k24, k1234); + double fourPiCosThetaPair1 = collinSoperCosTheta(k13, k1234); + double fourPiCosThetaPair2 = collinSoperCosTheta(k14, k1234); + double fourPiCosThetaPair3 = collinSoperCosTheta(k23, k1234); + double fourPiCosThetaPair4 = collinSoperCosTheta(k24, k1234); sigFromData( // run number @@ -783,7 +790,8 @@ struct ExclusiveRhoTo4Pi { // Four Mass p1234.M(), // Four Collins Soper Phi and CosTheta - fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); + fourPiPhiPair1, fourPiPhiPair2, fourPiPhiPair3, fourPiPhiPair4, + fourPiCosThetaPair1, fourPiCosThetaPair2, fourPiCosThetaPair3, fourPiCosThetaPair4); histosCounter.fill(HIST("fourPionCounts_0c"), runIndex); @@ -795,37 +803,30 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_mass_0_charge_within_rap"), p1234.M()); histosCounter.fill(HIST("fourPionCounts_0c_within_rap"), runIndex); if (p1234.Pt() < rhoPtCut) { - // Selected Four Pion Events - histosCounter.fill(HIST("fourPionCounts_0c_selected"), runIndex); - // Fill the Invariant Mass Histogram - histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); - // Two Pion Masses - histosData.fill(HIST("twopion_mass_1"), (p1 + p3).M()); - histosData.fill(HIST("twopion_mass_2"), (p1 + p4).M()); - histosData.fill(HIST("twopion_mass_3"), (p2 + p3).M()); - histosData.fill(HIST("twopion_mass_4"), (p2 + p4).M()); - // Fill the Collins-Soper Frame histograms - histosData.fill(HIST("collin_soper_phi_1"), fourPiPhiPair1); - histosData.fill(HIST("collin_soper_phi_2"), fourPiPhiPair2); - histosData.fill(HIST("collin_soper_costheta_1"), fourPiCosThetaPair1); - histosData.fill(HIST("collin_soper_costheta_2"), fourPiCosThetaPair2); - histosData.fill(HIST("phi_vs_costheta_1"), fourPiPhiPair1, fourPiCosThetaPair1); - histosData.fill(HIST("phi_vs_costheta_2"), fourPiPhiPair2, fourPiCosThetaPair2); - // Small Mass CosTheta and Phi - if ((k13.M() + k24.M()) > (k14.M() + k23.M())) { - histosData.fill(HIST("collin_soper_phi_large_mass"), fourPiPhiPair1); - histosData.fill(HIST("collin_soper_costheta_large_mass"), fourPiCosThetaPair1); - histosData.fill(HIST("phi_vs_costheta_large_mass"), fourPiPhiPair1, fourPiCosThetaPair1); - histosData.fill(HIST("collin_soper_phi_small_mass"), fourPiPhiPair2); - histosData.fill(HIST("collin_soper_costheta_small_mass"), fourPiCosThetaPair2); - histosData.fill(HIST("phi_vs_costheta_small_mass"), fourPiPhiPair2, fourPiCosThetaPair2); - } else { - histosData.fill(HIST("collin_soper_phi_small_mass"), fourPiPhiPair1); - histosData.fill(HIST("collin_soper_costheta_small_mass"), fourPiCosThetaPair1); - histosData.fill(HIST("phi_vs_costheta_small_mass"), fourPiPhiPair1, fourPiCosThetaPair1); - histosData.fill(HIST("collin_soper_phi_large_mass"), fourPiPhiPair2); - histosData.fill(HIST("collin_soper_costheta_large_mass"), fourPiCosThetaPair2); - histosData.fill(HIST("phi_vs_costheta_large_mass"), fourPiPhiPair2, fourPiCosThetaPair2); + if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { + // Selected Four Pion Events + histosCounter.fill(HIST("fourPionCounts_0c_selected"), runIndex); + // Fill the Invariant Mass Histogram + histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); + // Two Pion Masses + histosData.fill(HIST("twopion_mass_1"), (p1 + p3).M()); + histosData.fill(HIST("twopion_mass_2"), (p1 + p4).M()); + histosData.fill(HIST("twopion_mass_3"), (p2 + p3).M()); + histosData.fill(HIST("twopion_mass_4"), (p2 + p4).M()); + // Fill the Collins-Soper Frame histograms + double mDiff13 = std::abs((k13.M() - mRho0)); + double mDiff14 = std::abs((k14.M() - mRho0)); + double mDiff23 = std::abs((k23.M() - mRho0)); + double mDiff24 = std::abs((k24.M() - mRho0)); + if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { + histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair1, fourPiCosThetaPair1); + } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { + histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair2, fourPiCosThetaPair2); + } else if ((mDiff23 < mDiff13) && (mDiff23 < mDiff14) && (mDiff23 < mDiff24)) { + histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair3, fourPiCosThetaPair3); + } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { + histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair4, fourPiCosThetaPair4); + } } } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { @@ -840,11 +841,11 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; + PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p1234 = p1 + p2 + p3 + p4; histosData.fill(HIST("fourpion_pT_non_0_charge"), p1234.Pt()); histosData.fill(HIST("fourpion_eta_non_0_charge"), p1234.Eta()); @@ -1006,7 +1007,7 @@ struct ExclusiveRhoTo4Pi { } for (const auto& track : tracks) { histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); - ROOT::Math::PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // is PV contributor if (track.isPVContributor() != useOnlyPVtracks) { continue; @@ -1077,52 +1078,46 @@ struct ExclusiveRhoTo4Pi { PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounter, "Event Counter Function", true); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounter, "Track Counter Function", true); - double cosThetaCollinsSoperFrame(ROOT::Math::PtEtaPhiMVector pair1, ROOT::Math::PtEtaPhiMVector pair2, ROOT::Math::PtEtaPhiMVector fourpion) + double collinSoperPhi(PtEtaPhiMVector twoPionVector, PtEtaPhiMVector fourPionVector) { + // Half of the energy per pair of the colliding nucleons. double halfSqrtSnn = 2680.; double massOfLead208 = 193.6823; double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); - ROOT::Math::PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile - ROOT::Math::PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target - ROOT::Math::PtEtaPhiMVector v1 = pair1; - ROOT::Math::PtEtaPhiMVector v2 = pair2; - ROOT::Math::PtEtaPhiMVector v12 = fourpion; + PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile + PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target // Boost to center of mass frame - ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::XYZVectorF v1CM{(boostv12(v1).Vect()).Unit()}; - ROOT::Math::XYZVectorF v2CM{(boostv12(v2).Vect()).Unit()}; - ROOT::Math::XYZVectorF beam1CM{(boostv12(pProjCM).Vect()).Unit()}; - ROOT::Math::XYZVectorF beam2CM{(boostv12(pTargCM).Vect()).Unit()}; + Boost boosTo4PiCM{fourPionVector.BoostToCM()}; + XYZVectorF twoPionVectorCM{(boosTo4PiCM(twoPionVector).Vect()).Unit()}; + XYZVectorF beam1CM{(boosTo4PiCM(pProjCM).Vect()).Unit()}; + XYZVectorF beam2CM{(boosTo4PiCM(pTargCM).Vect()).Unit()}; // Axes - ROOT::Math::XYZVectorF zaxisCS{((beam1CM.Unit() - beam2CM.Unit()).Unit())}; - double cosThetaCS = zaxisCS.Dot((v1CM)); - return cosThetaCS; + XYZVectorF zaxisCS{((beam1CM.Unit() - beam2CM.Unit()).Unit())}; + XYZVectorF yaxisCS{(beam1CM.Cross(beam2CM)).Unit()}; + XYZVectorF xaxisCS{(yaxisCS.Cross(zaxisCS)).Unit()}; + double phi = std::atan2(yaxisCS.Dot(twoPionVectorCM), xaxisCS.Dot(twoPionVectorCM)); + return phi; } - double phiCollinsSoperFrame(ROOT::Math::PtEtaPhiMVector pair1, ROOT::Math::PtEtaPhiMVector pair2, ROOT::Math::PtEtaPhiMVector fourpion) + double collinSoperCosTheta(PtEtaPhiMVector twoPionVector, PtEtaPhiMVector fourPionVector) { // Half of the energy per pair of the colliding nucleons. double halfSqrtSnn = 2680.; double massOfLead208 = 193.6823; double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); - ROOT::Math::PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile - ROOT::Math::PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target - ROOT::Math::PtEtaPhiMVector v1 = pair1; - ROOT::Math::PtEtaPhiMVector v2 = pair2; - ROOT::Math::PtEtaPhiMVector v12 = fourpion; + PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile + PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target // Boost to center of mass frame - ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::XYZVectorF v1CM{(boostv12(v1).Vect()).Unit()}; - ROOT::Math::XYZVectorF v2CM{(boostv12(v2).Vect()).Unit()}; - ROOT::Math::XYZVectorF beam1CM{(boostv12(pProjCM).Vect()).Unit()}; - ROOT::Math::XYZVectorF beam2CM{(boostv12(pTargCM).Vect()).Unit()}; + Boost boosTo4PiCM{fourPionVector.BoostToCM()}; + XYZVectorF twoPionVectorCM{(boosTo4PiCM(twoPionVector).Vect()).Unit()}; + XYZVectorF beam1CM{(boosTo4PiCM(pProjCM).Vect()).Unit()}; + XYZVectorF beam2CM{(boosTo4PiCM(pTargCM).Vect()).Unit()}; // Axes - ROOT::Math::XYZVectorF zaxisCS{((beam1CM.Unit() - beam2CM.Unit()).Unit())}; - ROOT::Math::XYZVectorF yaxisCS{(beam1CM.Cross(beam2CM)).Unit()}; - ROOT::Math::XYZVectorF xaxisCS{(yaxisCS.Cross(zaxisCS)).Unit()}; - - double phi = std::atan2(yaxisCS.Dot(v1CM), xaxisCS.Dot(v1CM)); - return phi; + XYZVectorF zaxisCS{((beam1CM.Unit() - beam2CM.Unit()).Unit())}; + XYZVectorF yaxisCS{(beam1CM.Cross(beam2CM)).Unit()}; + XYZVectorF xaxisCS{(yaxisCS.Cross(zaxisCS)).Unit()}; + double cosThetaCS = zaxisCS.Dot(twoPionVectorCM); + return cosThetaCS; } template @@ -1137,7 +1132,7 @@ struct ExclusiveRhoTo4Pi { float tpcchi2nclscut, float tpcnclsfindablecut) { - ROOT::Math::PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // pt cut if (trackVector.Pt() < ptcut) { return false; From 5085e634f014ff5918aee0e7e6db119a5e310831 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 3 Aug 2025 14:15:44 +0000 Subject: [PATCH 08/26] Added cut labels to counters --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 63 +++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index d77cfa442d0..23bd84b0117 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -394,6 +394,10 @@ struct ExclusiveRhoTo4Pi { // Run Numbers static int runNos[113]; static int numRunNums; + static std::string eventLabels[12]; + static std::string trackLabels[14]; + static int numTrackCuts; + static int numEventCuts; // Derived Data Produces sigFromData; Produces bkgFromData; @@ -443,8 +447,8 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { // QA plots: Event and Track Counter - histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {20, 0, 20}}); - histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {20, 0, 20}}); + histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {12, 0, 12}}); + histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); histosCounter.add("fourPionCounts_0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); @@ -827,8 +831,8 @@ struct ExclusiveRhoTo4Pi { } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair4, fourPiCosThetaPair4); } - } - } + } // End of Pt selection for rho mass + } // End of Pt selection for rho mass if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { histosData.fill(HIST("fourpion_mass_0_charge_domB"), p1234.M()); } @@ -1001,33 +1005,34 @@ struct ExclusiveRhoTo4Pi { void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) { + int runIndex = getRunNumberIndex(collision.runNumber()); // Check if the Event is reconstructed in UPC mode if (ifCheckUPCmode && (collision.flags() != 1)) { return; } for (const auto& track : tracks) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 0); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // is PV contributor if (track.isPVContributor() != useOnlyPVtracks) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 1); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); // pt cut if (trackVector.Pt() < pTcut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 2); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); // eta cut if (std::abs(trackVector.Eta()) > etaCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 3); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); // DCA Z cut if (std::abs(track.dcaZ()) > dcaZcut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 4); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); // DCA XY cut float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { @@ -1035,40 +1040,40 @@ struct ExclusiveRhoTo4Pi { } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 5); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); // ITS Track only if (useITStracksOnly && !track.hasITS()) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 6); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); // TPC Track only if (useTPCtracksOnly && !track.hasTPC()) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 7); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); // ITS Chi2 N Clusters cut if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 8); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); // TPC Chi2 N Clusters cut if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 9); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); // TPC N Clusters Findable cut if (track.hasTPC() && track.tpcNClsFindable() < tpcNClsFindableCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 10); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); // Selection PID Pion if (selectionPIDPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 11); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); if (track.sign() == 1) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 12); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 12); } if (track.sign() == -1) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), collision.runNumber(), 13); + histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 13); } } // End of Selection PID Pion } // End of loop over tracks @@ -1114,8 +1119,6 @@ struct ExclusiveRhoTo4Pi { XYZVectorF beam2CM{(boosTo4PiCM(pTargCM).Vect()).Unit()}; // Axes XYZVectorF zaxisCS{((beam1CM.Unit() - beam2CM.Unit()).Unit())}; - XYZVectorF yaxisCS{(beam1CM.Cross(beam2CM)).Unit()}; - XYZVectorF xaxisCS{(yaxisCS.Cross(zaxisCS)).Unit()}; double cosThetaCS = zaxisCS.Dot(twoPionVectorCM); return cosThetaCS; } @@ -1207,6 +1210,12 @@ struct ExclusiveRhoTo4Pi { h7->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); h8->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); } + for (int i = 0; i < numEventCuts; ++i) { + h1->GetYaxis()->SetBinLabel(i + 1, eventLabels[i].c_str()); + } + for (int i = 0; i < numTrackCuts; ++i) { + h2->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); + } } // end of setHistBinLabels function }; // End of Struct exclusiveRhoTo4Pi @@ -1224,8 +1233,22 @@ int ExclusiveRhoTo4Pi::runNos[113] = { 545066, 545086, 545103, 545117, 545171, 545184, 545185, 545210, 545222, 545223, 545246, 545249, 545262, 545289, 545291, 545294, 545295, 545296, 545311, 545312, 545332, 545345, 545367}; + int ExclusiveRhoTo4Pi::numRunNums = 113; +std::string ExclusiveRhoTo4Pi::eventLabels[12] = { + "No Cuts", "UPC mode", "vtxITSTPC=1", "sbp=1", "itsROFb=1", "tfb=1", + "FT0A <= 50", "FT0C <= 50", "FV0A <= 50", "ZDC <= 0", "n PV Contrib = 4", "V_{z} < 10cm"}; + +int ExclusiveRhoTo4Pi::numEventCuts = 20; + +std::string ExclusiveRhoTo4Pi::trackLabels[14] = { + "No Cuts", "isPVContributor", "pT > 0.15 GeV/c", "|#eta| < 0.9", "DCA Z < 2 cm", "DCA XY cut", + "hasITS", "hasTPC", "itsChi2NCl < 36", "tpcChi2NCl < 4", "tpcNClsFindable < 70", "#pi tracks", + "#pi^{+} tracks", "#pi^{-} tracks"}; + +int ExclusiveRhoTo4Pi::numTrackCuts = 14; + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ From 72861f43d2ee71c8b94d38576e03cd8cbb341075 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 3 Aug 2025 14:27:09 +0000 Subject: [PATCH 09/26] fix cpplint error --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 23bd84b0117..56d3be32a24 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -1238,14 +1238,15 @@ int ExclusiveRhoTo4Pi::numRunNums = 113; std::string ExclusiveRhoTo4Pi::eventLabels[12] = { "No Cuts", "UPC mode", "vtxITSTPC=1", "sbp=1", "itsROFb=1", "tfb=1", - "FT0A <= 50", "FT0C <= 50", "FV0A <= 50", "ZDC <= 0", "n PV Contrib = 4", "V_{z} < 10cm"}; + "FT0A <= 50", "FT0C <= 50", "FV0A <= 50", "ZDC <= 0", + "n PV Contrib = 4", "V_{z} < 10cm"}; int ExclusiveRhoTo4Pi::numEventCuts = 20; std::string ExclusiveRhoTo4Pi::trackLabels[14] = { - "No Cuts", "isPVContributor", "pT > 0.15 GeV/c", "|#eta| < 0.9", "DCA Z < 2 cm", "DCA XY cut", - "hasITS", "hasTPC", "itsChi2NCl < 36", "tpcChi2NCl < 4", "tpcNClsFindable < 70", "#pi tracks", - "#pi^{+} tracks", "#pi^{-} tracks"}; + "No Cuts", "isPVContributor", "pT > 0.15 GeV/c", "|#eta| < 0.9", "DCA Z < 2 cm", + "DCA XY cut", "hasITS", "hasTPC", "itsChi2NCl < 36", "tpcChi2NCl < 4", + "tpcNClsFindable < 70", "#pi tracks", "#pi^{+} tracks", "#pi^{-} tracks"}; int ExclusiveRhoTo4Pi::numTrackCuts = 14; From 3c487cf49d2b1a3e31100f880bcffbecc39bde25 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sun, 3 Aug 2025 15:36:55 +0000 Subject: [PATCH 10/26] fixed the cpplint issues --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 47 +++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 56d3be32a24..b6ce41e54f7 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -36,6 +36,7 @@ #include #include +#include #include using namespace std; @@ -394,10 +395,10 @@ struct ExclusiveRhoTo4Pi { // Run Numbers static int runNos[113]; static int numRunNums; - static std::string eventLabels[12]; - static std::string trackLabels[14]; - static int numTrackCuts; - static int numEventCuts; + // static std::string eventLabels[12]; + // static std::string trackLabels[14]; + // static int numTrackCuts; + // static int numEventCuts; // Derived Data Produces sigFromData; Produces bkgFromData; @@ -1191,6 +1192,20 @@ struct ExclusiveRhoTo4Pi { void setHistBinLabels() { + + std::string eventLabels[12] = { + "No Cuts", "UPC mode", "vtxITSTPC=1", "sbp=1", "itsROFb=1", "tfb=1", + "FT0A <= 50", "FT0C <= 50", "FV0A <= 50", "ZDC <= 0", + "n PV Contrib = 4", "V_{z} < 10cm"}; + + int numEventCuts = 12; + + std::string trackLabels[14] = { + "No Cuts", "isPVContributor", "pT > 0.15 GeV/c", "|#eta| < 0.9", "DCA Z < 2 cm", + "DCA XY cut", "hasITS", "hasTPC", "itsChi2NCl < 36", "tpcChi2NCl < 4", + "tpcNClsFindable < 70", "#pi tracks", "#pi^{+} tracks", "#pi^{-} tracks"}; + int numTrackCuts = 14; + auto h1 = histosCounter.get(HIST("EventsCounts_vs_runNo")); auto h2 = histosCounter.get(HIST("TracksCounts_vs_runNo")); auto h3 = histosCounter.get(HIST("fourPionCounts_0c")); @@ -1236,19 +1251,21 @@ int ExclusiveRhoTo4Pi::runNos[113] = { int ExclusiveRhoTo4Pi::numRunNums = 113; -std::string ExclusiveRhoTo4Pi::eventLabels[12] = { - "No Cuts", "UPC mode", "vtxITSTPC=1", "sbp=1", "itsROFb=1", "tfb=1", - "FT0A <= 50", "FT0C <= 50", "FV0A <= 50", "ZDC <= 0", - "n PV Contrib = 4", "V_{z} < 10cm"}; - -int ExclusiveRhoTo4Pi::numEventCuts = 20; +// std::string ExclusiveRhoTo4Pi::eventLabels[12] = { +// "No Cuts","UPC mode","vtxITSTPC=1","sbp=1","itsROFb=1","tfb=1", +// "FT0A <= 50","FT0C <= 50","FV0A <= 50","ZDC <= 0", +// "n PV Contrib = 4","V_{z} < 10cm" +// }; -std::string ExclusiveRhoTo4Pi::trackLabels[14] = { - "No Cuts", "isPVContributor", "pT > 0.15 GeV/c", "|#eta| < 0.9", "DCA Z < 2 cm", - "DCA XY cut", "hasITS", "hasTPC", "itsChi2NCl < 36", "tpcChi2NCl < 4", - "tpcNClsFindable < 70", "#pi tracks", "#pi^{+} tracks", "#pi^{-} tracks"}; +// int ExclusiveRhoTo4Pi::numEventCuts = 20; -int ExclusiveRhoTo4Pi::numTrackCuts = 14; +// std::string ExclusiveRhoTo4Pi::trackLabels[14] = { +// "No Cuts","isPVContributor","pT > 0.15 GeV/c","|#eta| < 0.9","DCA Z < 2 cm", +// "DCA XY cut","hasITS","hasTPC","itsChi2NCl < 36","tpcChi2NCl < 4", +// "tpcNClsFindable < 70","#pi tracks","#pi^{+} tracks","#pi^{-} tracks" +// }; +// +// int ExclusiveRhoTo4Pi::numTrackCuts = 14; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 5c037c152620041546e9c5689bb6c0c474122a55 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:59:57 +0000 Subject: [PATCH 11/26] Added counter histo within mass range --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 33 +++++++++++-------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index b6ce41e54f7..0f4cbd0be70 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -395,10 +395,6 @@ struct ExclusiveRhoTo4Pi { // Run Numbers static int runNos[113]; static int numRunNums; - // static std::string eventLabels[12]; - // static std::string trackLabels[14]; - // static int numTrackCuts; - // static int numEventCuts; // Derived Data Produces sigFromData; Produces bkgFromData; @@ -438,7 +434,7 @@ struct ExclusiveRhoTo4Pi { Configurable rhoMassMin{"rhoMassMin", 1, "Min Mass of rho"}; Configurable rhoMassMax{"rhoMassMax", 2.5, "Max Mass of rho"}; // Axis Configurations - ConfigurableAxis pTAxis{"pTAxis", {1000, 0, 2}, "Axis for pT histograms"}; + ConfigurableAxis pTAxis{"pTAxis", {1000, 0, 1}, "Axis for pT histograms"}; ConfigurableAxis etaAxis{"etaAxis", {1000, -1.1, 1.1}, "Axis for Eta histograms"}; ConfigurableAxis rapidityAxis{"rapidityAxis", {1000, -2.5, 2.5}, "Axis for Rapidity histograms"}; ConfigurableAxis invMassAxis{"invMassAxis", {1000, 1, 2.5}, "Axis for Phi histograms"}; @@ -451,9 +447,11 @@ struct ExclusiveRhoTo4Pi { histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {12, 0, 12}}); histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); histosCounter.add("fourPionCounts_0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_0c_within_mass", "Four Pion Counts within mass range; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_n0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); + histosCounter.add("fourPionCounts_n0c_within_mass", "Four Pion Counts within mass range; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_n0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_n0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); // QA plots: event selection @@ -800,6 +798,10 @@ struct ExclusiveRhoTo4Pi { histosCounter.fill(HIST("fourPionCounts_0c"), runIndex); + if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { + histosCounter.fill(HIST("fourPionCounts_0c_within_mass"), runIndex); + } + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosData.fill(HIST("fourpion_pT_0_charge_within_rap"), p1234.Pt()); histosData.fill(HIST("fourpion_eta_0_charge_within_rap"), p1234.Eta()); @@ -912,7 +914,9 @@ struct ExclusiveRhoTo4Pi { p1234.M()); histosCounter.fill(HIST("fourPionCounts_n0c"), runIndex); - + if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { + histosCounter.fill(HIST("fourPionCounts_n0c_within_mass"), runIndex); + } if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosData.fill(HIST("fourpion_pT_non_0_charge_within_rap"), p1234.Pt()); histosData.fill(HIST("fourpion_eta_non_0_charge_within_rap"), p1234.Eta()); @@ -1231,6 +1235,7 @@ struct ExclusiveRhoTo4Pi { for (int i = 0; i < numTrackCuts; ++i) { h2->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); } + } // end of setHistBinLabels function }; // End of Struct exclusiveRhoTo4Pi @@ -1251,22 +1256,6 @@ int ExclusiveRhoTo4Pi::runNos[113] = { int ExclusiveRhoTo4Pi::numRunNums = 113; -// std::string ExclusiveRhoTo4Pi::eventLabels[12] = { -// "No Cuts","UPC mode","vtxITSTPC=1","sbp=1","itsROFb=1","tfb=1", -// "FT0A <= 50","FT0C <= 50","FV0A <= 50","ZDC <= 0", -// "n PV Contrib = 4","V_{z} < 10cm" -// }; - -// int ExclusiveRhoTo4Pi::numEventCuts = 20; - -// std::string ExclusiveRhoTo4Pi::trackLabels[14] = { -// "No Cuts","isPVContributor","pT > 0.15 GeV/c","|#eta| < 0.9","DCA Z < 2 cm", -// "DCA XY cut","hasITS","hasTPC","itsChi2NCl < 36","tpcChi2NCl < 4", -// "tpcNClsFindable < 70","#pi tracks","#pi^{+} tracks","#pi^{-} tracks" -// }; -// -// int ExclusiveRhoTo4Pi::numTrackCuts = 14; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ From c3c9dbf92a674a06850b9ddc80a7cb30f9cc57d9 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Tue, 26 Aug 2025 01:21:08 -0400 Subject: [PATCH 12/26] new RCT flag added --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 98 +++++++++++++++++-------------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 0f4cbd0be70..098916c4503 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -402,7 +402,7 @@ struct ExclusiveRhoTo4Pi { HistogramRegistry histosData{"Data", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosCounter{"counters", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable Event parameters - Configurable ifCheckUPCmode{"ifCheckUPCmode", false, "Enable UPC reconstruction only"}; + Configurable ifUPC{"ifUPC", 1, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 50., "FT0A threshold"}; @@ -444,8 +444,8 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { // QA plots: Event and Track Counter - histosCounter.add("EventsCounts_vs_runNo", "Number of Selected 4-Pion Events per Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {12, 0, 12}}); - histosCounter.add("TracksCounts_vs_runNo", "Number of Selected Tracks per Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + histosCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + histosCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); histosCounter.add("fourPionCounts_0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_0c_within_mass", "Four Pion Counts within mass range; Run Number; Events", kTH1F, {{113, 0, 113}}); histosCounter.add("fourPionCounts_0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); @@ -456,18 +456,22 @@ struct ExclusiveRhoTo4Pi { histosCounter.add("fourPionCounts_n0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); // QA plots: event selection histosData.add("UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); + histosData.add("GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosData.add("TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosData.add("isCBTOk", "isCBTOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosData.add("isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosData.add("isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosData.add("isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); histosData.add("FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); histosData.add("FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); histosData.add("FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); - histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosData.add("FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 500}}); - histosData.add("FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 500}}); + histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosData.add("FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); + histosData.add("FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosData.add("vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); histosData.add("vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); histosData.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); - histosData.add("GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); - histosData.add("TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); histosData.add("occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); // QA plots: tracks histosData.add("dcaXY_all", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); @@ -573,15 +577,24 @@ struct ExclusiveRhoTo4Pi { void processData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) { - int runIndex = getRunNumberIndex(collision.runNumber()); - // Check if the Event is reconstructed in UPC mode - if (ifCheckUPCmode && (collision.flags() != 1)) { + if (collision.flags() != ifUPC) { return; } + // RCT flag + if (!sgSelector.isCBTHadronZdcOk(collision)) { + return; + } + + int runIndex = getRunNumberIndex(collision.runNumber()); + histosData.fill(HIST("GapSide"), collision.gapSide()); histosData.fill(HIST("TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosData.fill(HIST("isCBTOk"), sgSelector.isCBTOk(collision)); + histosData.fill(HIST("isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosData.fill(HIST("isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosData.fill(HIST("isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); histosData.fill(HIST("vertexX"), collision.posX()); histosData.fill(HIST("vertexY"), collision.posY()); histosData.fill(HIST("vertexZ"), collision.posZ()); @@ -940,79 +953,74 @@ struct ExclusiveRhoTo4Pi { void processEventCounter(UDCollisions::iterator const& collision) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 0); - - // UPC mode - if (ifCheckUPCmode && collision.flags() != 1) { + // RCT flag + if (!sgSelector.isCBTHadronZdcOk(collision)) { return; } histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 1); - + // UPC mode + if (collision.flags() != ifUPC) { + return; + } + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 2); // vtxITSTPC if (collision.vtxITSTPC() != vtxITSTPCcut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 2); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 3); // sbp if (collision.sbp() != sbpCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 3); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 4); // itsROFb if (collision.itsROFb() != itsROFbCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 4); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 5); // tfb if (collision.tfb() != tfbCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 5); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 6); // FT0A if (collision.totalFT0AmplitudeA() > ft0aCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 6); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 7); // FT0C if (collision.totalFT0AmplitudeC() > ft0cCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 7); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 8); // FV0A if (collision.totalFV0AmplitudeA() > fv0Cut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 8); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); // ZDC if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // numContributors if (collision.numContrib() != numPVContrib) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); - + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); // vertexZ if (std::abs(collision.posZ()) > vZCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); + histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 12); } // End of processCounter function void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) { int runIndex = getRunNumberIndex(collision.runNumber()); // Check if the Event is reconstructed in UPC mode - if (ifCheckUPCmode && (collision.flags() != 1)) { + if (collision.flags() != ifUPC) { return; } for (const auto& track : tracks) { @@ -1197,17 +1205,17 @@ struct ExclusiveRhoTo4Pi { void setHistBinLabels() { - std::string eventLabels[12] = { - "No Cuts", "UPC mode", "vtxITSTPC=1", "sbp=1", "itsROFb=1", "tfb=1", - "FT0A <= 50", "FT0C <= 50", "FV0A <= 50", "ZDC <= 0", - "n PV Contrib = 4", "V_{z} < 10cm"}; + std::string eventLabels[13] = { + "No Cuts", "isCBTHadronOk", "UPC or STD", "vtxITSTPC=" + std::to_string(vtxITSTPCcut), "sbp=" + std::to_string(sbpCut), "itsROFb=" + std::to_string(itsROFbCut), "tfb=" + std::to_string(tfbCut), + "FT0A<=" + std::to_string(fv0Cut), "FT0C<=" + std::to_string(ft0cCut), "FV0A<=" + std::to_string(ft0aCut), "ZDC <=0", + "n PV Contrib = 4", "V_{z} < cm" + std::to_string(vZCut) + "cm"}; - int numEventCuts = 12; + int numEventCuts = 13; std::string trackLabels[14] = { - "No Cuts", "isPVContributor", "pT > 0.15 GeV/c", "|#eta| < 0.9", "DCA Z < 2 cm", - "DCA XY cut", "hasITS", "hasTPC", "itsChi2NCl < 36", "tpcChi2NCl < 4", - "tpcNClsFindable < 70", "#pi tracks", "#pi^{+} tracks", "#pi^{-} tracks"}; + "No Cuts", "isPVContributor", "pT>" + std::to_string(pTcut) + " GeV/c", "|#eta|<" + std::to_string(etaCut), "DCA Z<" + std::to_string(dcaZcut) + " cm", + "DCA XY cut", "hasITS", "hasTPC", "itsChi2NCl<" + std::to_string(itsChi2NClsCut), "tpcChi2NCl<" + std::to_string(tpcChi2NClsCut), + "tpcNClsFindable>" + std::to_string(tpcNClsFindableCut), "#pi tracks", "#pi^{+} tracks", "#pi^{-} tracks"}; int numTrackCuts = 14; auto h1 = histosCounter.get(HIST("EventsCounts_vs_runNo")); @@ -1218,6 +1226,8 @@ struct ExclusiveRhoTo4Pi { auto h6 = histosCounter.get(HIST("fourPionCounts_n0c")); auto h7 = histosCounter.get(HIST("fourPionCounts_n0c_within_rap")); auto h8 = histosCounter.get(HIST("fourPionCounts_n0c_selected")); + auto h9 = histosCounter.get(HIST("fourPionCounts_0c_within_mass")); + auto h10 = histosCounter.get(HIST("fourPionCounts_n0c_within_mass")); for (int i = 0; i < numRunNums; ++i) { h1->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); @@ -1228,6 +1238,8 @@ struct ExclusiveRhoTo4Pi { h6->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); h7->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); h8->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h9->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + h10->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); } for (int i = 0; i < numEventCuts; ++i) { h1->GetYaxis()->SetBinLabel(i + 1, eventLabels[i].c_str()); From 88a7e56af1a479291178e6374953485a770c77f4 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Tue, 26 Aug 2025 01:31:33 -0400 Subject: [PATCH 13/26] Added variable labels for histogram --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 41 ++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 098916c4503..7d875f0e1b9 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -1202,20 +1202,49 @@ struct ExclusiveRhoTo4Pi { return -1; // Not found } // End of getRunNumberIndex function + std::string strFormat(double value, int precision = 2) + { + std::ostringstream oss; + oss << std::fixed << std::setprecision(precision) << value; + return oss.str(); + } + void setHistBinLabels() { std::string eventLabels[13] = { - "No Cuts", "isCBTHadronOk", "UPC or STD", "vtxITSTPC=" + std::to_string(vtxITSTPCcut), "sbp=" + std::to_string(sbpCut), "itsROFb=" + std::to_string(itsROFbCut), "tfb=" + std::to_string(tfbCut), - "FT0A<=" + std::to_string(fv0Cut), "FT0C<=" + std::to_string(ft0cCut), "FV0A<=" + std::to_string(ft0aCut), "ZDC <=0", - "n PV Contrib = 4", "V_{z} < cm" + std::to_string(vZCut) + "cm"}; + "No Cuts", + "isCBTHadronOk", + "UPC or STD", + "vtxITSTPC=" + strFormat(vtxITSTPCcut, 0), + "sbp=" + strFormat(sbpCut, 0), + "itsROFb=" + strFormat(itsROFbCut, 0), + "tfb=" + strFormat(tfbCut, 0), + "FT0A<=" + strFormat(fv0Cut), + "FT0C<=" + strFormat(ft0cCut), + "FV0A<=" + strFormat(ft0aCut), + "ZDC", + "n PV Contrib = 4", + "V_{z} < " + strFormat(vZCut) + " cm"}; int numEventCuts = 13; std::string trackLabels[14] = { - "No Cuts", "isPVContributor", "pT>" + std::to_string(pTcut) + " GeV/c", "|#eta|<" + std::to_string(etaCut), "DCA Z<" + std::to_string(dcaZcut) + " cm", - "DCA XY cut", "hasITS", "hasTPC", "itsChi2NCl<" + std::to_string(itsChi2NClsCut), "tpcChi2NCl<" + std::to_string(tpcChi2NClsCut), - "tpcNClsFindable>" + std::to_string(tpcNClsFindableCut), "#pi tracks", "#pi^{+} tracks", "#pi^{-} tracks"}; + "No Cuts", + "isPVContributor", + "pT>" + strFormat(pTcut) + " GeV/c", + "|#eta|<" + strFormat(etaCut), + "DCA Z<" + strFormat(dcaZcut) + " cm", + "DCA XY cut", + "hasITS", + "hasTPC", + "itsChi2NCl<" + strFormat(itsChi2NClsCut), + "tpcChi2NCl<" + strFormat(tpcChi2NClsCut), + "tpcNClsFindable>" + strFormat(tpcNClsFindableCut), + "#pi tracks", + "#pi^{+} tracks", + "#pi^{-} tracks"}; + int numTrackCuts = 14; auto h1 = histosCounter.get(HIST("EventsCounts_vs_runNo")); From 041772d6504cf5098c3f4ce8a6d37b74762878a3 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Tue, 26 Aug 2025 22:07:36 -0400 Subject: [PATCH 14/26] isCBTHadronZdcOK->isCBTHadronOk --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 463 +----------------------------- 1 file changed, 2 insertions(+), 461 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 7d875f0e1b9..bdd7d202086 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -51,339 +51,6 @@ using XYZVectorF = ROOT::Math::XYZVectorF; using PxPyPzEVector = ROOT::Math::PxPyPzEVector; using PxPyPzMVector = ROOT::Math::PxPyPzMVector; -namespace o2::aod -{ -namespace branch -{ -// Run Number -DECLARE_SOA_COLUMN(RunNumber, runNumber, int); -// Check UPC mode -DECLARE_SOA_COLUMN(IfCheckUPCmode, ifCheckUPCmode, uint16_t); -// vertex Position -DECLARE_SOA_COLUMN(PosX, posX, double); -DECLARE_SOA_COLUMN(PosY, posY, double); -DECLARE_SOA_COLUMN(PosZ, posZ, double); -// FIT signals -DECLARE_SOA_COLUMN(Fv0signal, fv0signal, double); -DECLARE_SOA_COLUMN(Ft0asignal, ft0asignal, double); -DECLARE_SOA_COLUMN(Ft0csignal, ft0csignal, double); -DECLARE_SOA_COLUMN(Fddasignal, fddasignal, double); -DECLARE_SOA_COLUMN(Fddcsignal, fddcsignal, double); -// FIT times -DECLARE_SOA_COLUMN(TimeFv0, timeFv0, double); -DECLARE_SOA_COLUMN(TimeFt0a, timeFt0a, double); -DECLARE_SOA_COLUMN(TimeFt0c, timeFt0c, double); -DECLARE_SOA_COLUMN(TimeFdda, timeFdda, double); -DECLARE_SOA_COLUMN(TimeFddc, timeFddc, double); -// ZDC times -DECLARE_SOA_COLUMN(TimeZna, timeZna, double); -DECLARE_SOA_COLUMN(TimeZnc, timeZnc, double); -// Occupancy -DECLARE_SOA_COLUMN(Occupancy, occupancy, double); -// Atleast one pion has TOF -DECLARE_SOA_COLUMN(HasAtLeastOneTOF, hasAtLeastOneTOF, bool); -// DCA XY -DECLARE_SOA_COLUMN(Dcaxy1, dcaxy1, double); -DECLARE_SOA_COLUMN(Dcaxy2, dcaxy2, double); -DECLARE_SOA_COLUMN(Dcaxy3, dcaxy3, double); -DECLARE_SOA_COLUMN(Dcaxy4, dcaxy4, double); -// DCA Z -DECLARE_SOA_COLUMN(Dcaz1, dcaz1, double); -DECLARE_SOA_COLUMN(Dcaz2, dcaz2, double); -DECLARE_SOA_COLUMN(Dcaz3, dcaz3, double); -DECLARE_SOA_COLUMN(Dcaz4, dcaz4, double); -// TPC nSigmaPi -DECLARE_SOA_COLUMN(TpcNsigmaPi1, tpcNsigmaPi1, double); -DECLARE_SOA_COLUMN(TpcNsigmaPi2, tpcNsigmaPi2, double); -DECLARE_SOA_COLUMN(TpcNsigmaPi3, tpcNsigmaPi3, double); -DECLARE_SOA_COLUMN(TpcNsigmaPi4, tpcNsigmaPi4, double); -// TPC nSigmaKa -DECLARE_SOA_COLUMN(TpcNsigmaKa1, tpcNsigmaKa1, double); -DECLARE_SOA_COLUMN(TpcNsigmaKa2, tpcNsigmaKa2, double); -DECLARE_SOA_COLUMN(TpcNsigmaKa3, tpcNsigmaKa3, double); -DECLARE_SOA_COLUMN(TpcNsigmaKa4, tpcNsigmaKa4, double); -// TPC nSigmaPr -DECLARE_SOA_COLUMN(TpcNsigmaPr1, tpcNsigmaPr1, double); -DECLARE_SOA_COLUMN(TpcNsigmaPr2, tpcNsigmaPr2, double); -DECLARE_SOA_COLUMN(TpcNsigmaPr3, tpcNsigmaPr3, double); -DECLARE_SOA_COLUMN(TpcNsigmaPr4, tpcNsigmaPr4, double); -// TPC nSigmaEl -DECLARE_SOA_COLUMN(TpcNsigmaEl1, tpcNsigmaEl1, double); -DECLARE_SOA_COLUMN(TpcNsigmaEl2, tpcNsigmaEl2, double); -DECLARE_SOA_COLUMN(TpcNsigmaEl3, tpcNsigmaEl3, double); -DECLARE_SOA_COLUMN(TpcNsigmaEl4, tpcNsigmaEl4, double); -// TPC nSigmaMu -DECLARE_SOA_COLUMN(TpcNsigmaMu1, tpcNsigmaMu1, double); -DECLARE_SOA_COLUMN(TpcNsigmaMu2, tpcNsigmaMu2, double); -DECLARE_SOA_COLUMN(TpcNsigmaMu3, tpcNsigmaMu3, double); -DECLARE_SOA_COLUMN(TpcNsigmaMu4, tpcNsigmaMu4, double); -// TPC Chi2 -DECLARE_SOA_COLUMN(TpcChi21, tpcChi21, double); -DECLARE_SOA_COLUMN(TpcChi22, tpcChi22, double); -DECLARE_SOA_COLUMN(TpcChi23, tpcChi23, double); -DECLARE_SOA_COLUMN(TpcChi24, tpcChi24, double); -// TPC NClsFindable -DECLARE_SOA_COLUMN(TpcNClsFindable1, tpcNClsFindable1, double); -DECLARE_SOA_COLUMN(TpcNClsFindable2, tpcNClsFindable2, double); -DECLARE_SOA_COLUMN(TpcNClsFindable3, tpcNClsFindable3, double); -DECLARE_SOA_COLUMN(TpcNClsFindable4, tpcNClsFindable4, double); -// ITS Chi2 -DECLARE_SOA_COLUMN(ItsChi21, itsChi21, double); -DECLARE_SOA_COLUMN(ItsChi22, itsChi22, double); -DECLARE_SOA_COLUMN(ItsChi23, itsChi23, double); -DECLARE_SOA_COLUMN(ItsChi24, itsChi24, double); -// PionPt -DECLARE_SOA_COLUMN(PionPt1, pionPt1, double); -DECLARE_SOA_COLUMN(PionPt2, pionPt2, double); -DECLARE_SOA_COLUMN(PionPt3, pionPt3, double); -DECLARE_SOA_COLUMN(PionPt4, pionPt4, double); -// Pion Eta -DECLARE_SOA_COLUMN(PionEta1, pionEta1, double); -DECLARE_SOA_COLUMN(PionEta2, pionEta2, double); -DECLARE_SOA_COLUMN(PionEta3, pionEta3, double); -DECLARE_SOA_COLUMN(PionEta4, pionEta4, double); -// Pion Phi -DECLARE_SOA_COLUMN(PionPhi1, pionPhi1, double); -DECLARE_SOA_COLUMN(PionPhi2, pionPhi2, double); -DECLARE_SOA_COLUMN(PionPhi3, pionPhi3, double); -DECLARE_SOA_COLUMN(PionPhi4, pionPhi4, double); -// Pion Rapidity -DECLARE_SOA_COLUMN(PionRapidity1, pionRapidity1, double); -DECLARE_SOA_COLUMN(PionRapidity2, pionRapidity2, double); -DECLARE_SOA_COLUMN(PionRapidity3, pionRapidity3, double); -DECLARE_SOA_COLUMN(PionRapidity4, pionRapidity4, double); -// Four Pion Pt, Eta, Phi Rapidity -DECLARE_SOA_COLUMN(FourPionPt, fourPionPt, double); -DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); -DECLARE_SOA_COLUMN(FourPionPhi, fourPionPhi, double); -DECLARE_SOA_COLUMN(FourPionRapidity, fourPionRapidity, double); -DECLARE_SOA_COLUMN(FourPionMass, fourPionMass, double); -// Collin-Soper Angles -DECLARE_SOA_COLUMN(FourPionPhiPair1, fourPionPhiPair1, double); -DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); -DECLARE_SOA_COLUMN(FourPionPhiPair3, fourPionPhiPair3, double); -DECLARE_SOA_COLUMN(FourPionPhiPair4, fourPionPhiPair4, double); -DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); -DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); -DECLARE_SOA_COLUMN(FourPionCosThetaPair3, fourPionCosThetaPair3, double); -DECLARE_SOA_COLUMN(FourPionCosThetaPair4, fourPionCosThetaPair4, double); -} // namespace branch - -DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", - branch::RunNumber, - - branch::IfCheckUPCmode, - - branch::PosX, - branch::PosY, - branch::PosZ, - - branch::Fv0signal, - branch::Ft0asignal, - branch::Ft0csignal, - branch::Fddasignal, - branch::Fddcsignal, - - branch::TimeFv0, - branch::TimeFt0a, - branch::TimeFt0c, - branch::TimeFdda, - branch::TimeFddc, - branch::TimeZna, - branch::TimeZnc, - - branch::Occupancy, - - branch::HasAtLeastOneTOF, - - branch::Dcaxy1, - branch::Dcaxy2, - branch::Dcaxy3, - branch::Dcaxy4, - - branch::Dcaz1, - branch::Dcaz2, - branch::Dcaz3, - branch::Dcaz4, - - branch::TpcNsigmaPi1, - branch::TpcNsigmaPi2, - branch::TpcNsigmaPi3, - branch::TpcNsigmaPi4, - - branch::TpcNsigmaKa1, - branch::TpcNsigmaKa2, - branch::TpcNsigmaKa3, - branch::TpcNsigmaKa4, - - branch::TpcNsigmaPr1, - branch::TpcNsigmaPr2, - branch::TpcNsigmaPr3, - branch::TpcNsigmaPr4, - - branch::TpcNsigmaEl1, - branch::TpcNsigmaEl2, - branch::TpcNsigmaEl3, - branch::TpcNsigmaEl4, - - branch::TpcNsigmaMu1, - branch::TpcNsigmaMu2, - branch::TpcNsigmaMu3, - branch::TpcNsigmaMu4, - - branch::TpcChi21, - branch::TpcChi22, - branch::TpcChi23, - branch::TpcChi24, - - branch::TpcNClsFindable1, - branch::TpcNClsFindable2, - branch::TpcNClsFindable3, - branch::TpcNClsFindable4, - - branch::ItsChi21, - branch::ItsChi22, - branch::ItsChi23, - branch::ItsChi24, - - branch::PionPt1, - branch::PionPt2, - branch::PionPt3, - branch::PionPt4, - - branch::PionEta1, - branch::PionEta2, - branch::PionEta3, - branch::PionEta4, - - branch::PionPhi1, - branch::PionPhi2, - branch::PionPhi3, - branch::PionPhi4, - - branch::PionRapidity1, - branch::PionRapidity2, - branch::PionRapidity3, - branch::PionRapidity4, - - branch::FourPionPt, - branch::FourPionEta, - branch::FourPionPhi, - branch::FourPionRapidity, - branch::FourPionMass, - branch::FourPionPhiPair1, - branch::FourPionPhiPair2, - branch::FourPionPhiPair3, - branch::FourPionPhiPair4, - branch::FourPionCosThetaPair1, - branch::FourPionCosThetaPair2, - branch::FourPionCosThetaPair3, - branch::FourPionCosThetaPair4); - -DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", - branch::RunNumber, - - branch::IfCheckUPCmode, - - branch::PosX, - branch::PosY, - branch::PosZ, - - branch::Fv0signal, - branch::Ft0asignal, - branch::Ft0csignal, - branch::Fddasignal, - branch::Fddcsignal, - - branch::TimeFv0, - branch::TimeFt0a, - branch::TimeFt0c, - branch::TimeFdda, - branch::TimeFddc, - branch::TimeZna, - branch::TimeZnc, - - branch::Occupancy, - - branch::HasAtLeastOneTOF, - - branch::Dcaxy1, - branch::Dcaxy2, - branch::Dcaxy3, - branch::Dcaxy4, - - branch::Dcaz1, - branch::Dcaz2, - branch::Dcaz3, - branch::Dcaz4, - - branch::TpcNsigmaPi1, - branch::TpcNsigmaPi2, - branch::TpcNsigmaPi3, - branch::TpcNsigmaPi4, - - branch::TpcNsigmaKa1, - branch::TpcNsigmaKa2, - branch::TpcNsigmaKa3, - branch::TpcNsigmaKa4, - - branch::TpcNsigmaPr1, - branch::TpcNsigmaPr2, - branch::TpcNsigmaPr3, - branch::TpcNsigmaPr4, - - branch::TpcNsigmaEl1, - branch::TpcNsigmaEl2, - branch::TpcNsigmaEl3, - branch::TpcNsigmaEl4, - - branch::TpcNsigmaMu1, - branch::TpcNsigmaMu2, - branch::TpcNsigmaMu3, - branch::TpcNsigmaMu4, - - branch::TpcChi21, - branch::TpcChi22, - branch::TpcChi23, - branch::TpcChi24, - - branch::TpcNClsFindable1, - branch::TpcNClsFindable2, - branch::TpcNClsFindable3, - branch::TpcNClsFindable4, - - branch::ItsChi21, - branch::ItsChi22, - branch::ItsChi23, - branch::ItsChi24, - - branch::PionPt1, - branch::PionPt2, - branch::PionPt3, - branch::PionPt4, - - branch::PionEta1, - branch::PionEta2, - branch::PionEta3, - branch::PionEta4, - - branch::PionPhi1, - branch::PionPhi2, - branch::PionPhi3, - branch::PionPhi4, - - branch::PionRapidity1, - branch::PionRapidity2, - branch::PionRapidity3, - branch::PionRapidity4, - - branch::FourPionPt, - branch::FourPionEta, - branch::FourPionPhi, - branch::FourPionRapidity, - branch::FourPionMass); -} // namespace o2::aod - struct ExclusiveRhoTo4Pi { SGSelector sgSelector; // Defining constants @@ -395,9 +62,6 @@ struct ExclusiveRhoTo4Pi { // Run Numbers static int runNos[113]; static int numRunNums; - // Derived Data - Produces sigFromData; - Produces bkgFromData; // Histogram Registry HistogramRegistry histosData{"Data", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosCounter{"counters", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -577,13 +241,8 @@ struct ExclusiveRhoTo4Pi { void processData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) { - // Check if the Event is reconstructed in UPC mode - if (collision.flags() != ifUPC) { - return; - } - - // RCT flag - if (!sgSelector.isCBTHadronZdcOk(collision)) { + // Check if the Event is reconstructed in UPC mode and RCT flag + if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronOk(collision))) { return; } @@ -686,15 +345,6 @@ struct ExclusiveRhoTo4Pi { return; } - // Check if there is at least one track with TOF in the selected events (for derived Data) - bool hasAtleastOneTOF = false; - for (int i = 0; i < numPiPlusTracks; i++) { - if (selectedPionPlusTracks[i].hasTOF() == true) { - hasAtleastOneTOF = true; - break; - } - } - // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { @@ -753,62 +403,6 @@ struct ExclusiveRhoTo4Pi { double fourPiCosThetaPair3 = collinSoperCosTheta(k23, k1234); double fourPiCosThetaPair4 = collinSoperCosTheta(k24, k1234); - sigFromData( - // run number - collision.runNumber(), - // UPC mode - collision.flags(), - // vertex - collision.posX(), collision.posY(), collision.posZ(), - // FIT Signals - collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - // FIT and ZDC Signals - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - // Occupancy - collision.occupancyInTime(), - // has atleast one TOF - hasAtleastOneTOF, - // DCA XY and Z - selectedPionPlusTracks[0].dcaXY(), selectedPionPlusTracks[1].dcaXY(), selectedPionMinusTracks[0].dcaXY(), selectedPionMinusTracks[1].dcaXY(), - selectedPionPlusTracks[0].dcaZ(), selectedPionPlusTracks[1].dcaZ(), selectedPionMinusTracks[0].dcaZ(), selectedPionMinusTracks[1].dcaZ(), - // TPC N Sigma Pi - selectedPionPlusTracks[0].tpcNSigmaPi(), selectedPionPlusTracks[1].tpcNSigmaPi(), selectedPionMinusTracks[0].tpcNSigmaPi(), selectedPionMinusTracks[1].tpcNSigmaPi(), - // TPC N Sigma Ka - selectedPionPlusTracks[0].tpcNSigmaKa(), selectedPionPlusTracks[1].tpcNSigmaKa(), selectedPionMinusTracks[0].tpcNSigmaKa(), selectedPionMinusTracks[1].tpcNSigmaKa(), - // TPC N Sigma Pr - selectedPionPlusTracks[0].tpcNSigmaPr(), selectedPionPlusTracks[1].tpcNSigmaPr(), selectedPionMinusTracks[0].tpcNSigmaPr(), selectedPionMinusTracks[1].tpcNSigmaPr(), - // TPC N Sigma El - selectedPionPlusTracks[0].tpcNSigmaEl(), selectedPionPlusTracks[1].tpcNSigmaEl(), selectedPionMinusTracks[0].tpcNSigmaEl(), selectedPionMinusTracks[1].tpcNSigmaEl(), - // TPC N Sigma Mu - selectedPionPlusTracks[0].tpcNSigmaMu(), selectedPionPlusTracks[1].tpcNSigmaMu(), selectedPionMinusTracks[0].tpcNSigmaMu(), selectedPionMinusTracks[1].tpcNSigmaMu(), - // tpc Chi2 NCl - selectedPionPlusTracks[0].tpcChi2NCl(), selectedPionPlusTracks[1].tpcChi2NCl(), selectedPionMinusTracks[0].tpcChi2NCl(), selectedPionMinusTracks[1].tpcChi2NCl(), - // TPC NCls Findable - selectedPionPlusTracks[0].tpcNClsFindable(), selectedPionPlusTracks[1].tpcNClsFindable(), selectedPionMinusTracks[0].tpcNClsFindable(), selectedPionMinusTracks[1].tpcNClsFindable(), - // ITS Chi2 NCl - selectedPionPlusTracks[0].itsChi2NCl(), selectedPionPlusTracks[1].itsChi2NCl(), selectedPionMinusTracks[0].itsChi2NCl(), selectedPionMinusTracks[1].itsChi2NCl(), - // Pion Pt - p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), - // Pion Eta - p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), - // Pion Phi - p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), - // Pion Rapidity - p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), - // Four Pt - p1234.Pt(), - // Four Eta - p1234.Eta(), - // Four Phi - p1234.Phi(), - // Four Rapidity - p1234.Rapidity(), - // Four Mass - p1234.M(), - // Four Collins Soper Phi and CosTheta - fourPiPhiPair1, fourPiPhiPair2, fourPiPhiPair3, fourPiPhiPair4, - fourPiCosThetaPair1, fourPiCosThetaPair2, fourPiCosThetaPair3, fourPiCosThetaPair4); - histosCounter.fill(HIST("fourPionCounts_0c"), runIndex); if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { @@ -873,59 +467,6 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("fourpion_rap_non_0_charge"), p1234.Rapidity()); histosData.fill(HIST("fourpion_mass_non_0_charge"), p1234.M()); - bkgFromData( - // Run Number - collision.runNumber(), - // UPC mode - collision.flags(), - // vertex - collision.posX(), collision.posY(), collision.posZ(), - // FIT Signals - collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - // FIT and ZDC Signals - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - // Occupancy - collision.occupancyInTime(), - // has atleast one TOF - hasAtleastOneTOF, - // DCA XY and Z - selectedPionTracks[0].dcaXY(), selectedPionTracks[1].dcaXY(), selectedPionTracks[2].dcaXY(), selectedPionTracks[3].dcaXY(), - selectedPionTracks[0].dcaZ(), selectedPionTracks[1].dcaZ(), selectedPionTracks[2].dcaZ(), selectedPionTracks[3].dcaZ(), - // TPC N Sigma Pi - selectedPionTracks[0].tpcNSigmaPi(), selectedPionTracks[1].tpcNSigmaPi(), selectedPionTracks[2].tpcNSigmaPi(), selectedPionTracks[3].tpcNSigmaPi(), - // TPC N Sigma Ka - selectedPionTracks[0].tpcNSigmaKa(), selectedPionTracks[1].tpcNSigmaKa(), selectedPionTracks[2].tpcNSigmaKa(), selectedPionTracks[3].tpcNSigmaKa(), - // TPC N Sigma Pr - selectedPionTracks[0].tpcNSigmaPr(), selectedPionTracks[1].tpcNSigmaPr(), selectedPionTracks[2].tpcNSigmaPr(), selectedPionTracks[3].tpcNSigmaPr(), - // TPC N Sigma El - selectedPionTracks[0].tpcNSigmaEl(), selectedPionTracks[1].tpcNSigmaEl(), selectedPionTracks[2].tpcNSigmaEl(), selectedPionTracks[3].tpcNSigmaEl(), - // TPC N Sigma Mu - selectedPionTracks[0].tpcNSigmaMu(), selectedPionTracks[1].tpcNSigmaMu(), selectedPionTracks[2].tpcNSigmaMu(), selectedPionTracks[3].tpcNSigmaMu(), - // tpc Chi2 NCl - selectedPionTracks[0].tpcChi2NCl(), selectedPionTracks[1].tpcChi2NCl(), selectedPionTracks[2].tpcChi2NCl(), selectedPionTracks[3].tpcChi2NCl(), - // TPC NCls Findable - selectedPionTracks[0].tpcNClsFindable(), selectedPionTracks[1].tpcNClsFindable(), selectedPionTracks[2].tpcNClsFindable(), selectedPionTracks[3].tpcNClsFindable(), - // ITS Chi2 NCl - selectedPionTracks[0].itsChi2NCl(), selectedPionTracks[1].itsChi2NCl(), selectedPionTracks[2].itsChi2NCl(), selectedPionTracks[3].itsChi2NCl(), - // Pion Pt - p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), - // Pion Eta - p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), - // Pion Phi - p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), - // Pion Rapidity - p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), - // Four Pt - p1234.Pt(), - // Four Eta - p1234.Eta(), - // Four Phi - p1234.Phi(), - // Four Rapidity - p1234.Rapidity(), - // Four Mass - p1234.M()); - histosCounter.fill(HIST("fourPionCounts_n0c"), runIndex); if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { histosCounter.fill(HIST("fourPionCounts_n0c_within_mass"), runIndex); From 53e407aa1ddce640cb7807b72dcfc69cd31efaa2 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Sun, 14 Sep 2025 15:52:48 -0400 Subject: [PATCH 15/26] Modified all the histograms and added more QA plots --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 756 ++++++++++++++++-------------- 1 file changed, 393 insertions(+), 363 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index bdd7d202086..160158f4452 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -57,14 +57,16 @@ struct ExclusiveRhoTo4Pi { int numFourPionTracks = 4; int numPiPlus = 2; int numPiMinus = 2; - float zeroPointEight = 0.8; double mRho0 = 0.77526; // GeV/c^2 // Run Numbers static int runNos[113]; static int numRunNums; // Histogram Registry - HistogramRegistry histosData{"Data", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry histosCounter{"counters", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosDataCounter{"Counters", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosQA{"QA", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosPID{"PID", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosKin{"Kinematics", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histos4piKin{"Four-Pion-Kinematics", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable Event parameters Configurable ifUPC{"ifUPC", 1, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; @@ -90,13 +92,8 @@ struct ExclusiveRhoTo4Pi { Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; // Configurable PID parameters Configurable useTOF{"useTOF", true, "if track has TOF use TOF"}; - Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; - Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; - // Configurable Rho parameters - Configurable rhoRapCut{"rhoRapCut", 0.5, "Max abs Rapidity of rho"}; - Configurable rhoPtCut{"rhoPtCut", 0.15, "Min Pt of rho"}; - Configurable rhoMassMin{"rhoMassMin", 1, "Min Mass of rho"}; - Configurable rhoMassMax{"rhoMassMax", 2.5, "Max Mass of rho"}; + Configurable nSigmaTPCcut{"nSigmaTPCcut", 5, "TPC cut"}; + Configurable nSigmaTOFcut{"nSigmaTOFcut", 5, "TOF cut"}; // Axis Configurations ConfigurableAxis pTAxis{"pTAxis", {1000, 0, 1}, "Axis for pT histograms"}; ConfigurableAxis etaAxis{"etaAxis", {1000, -1.1, 1.1}, "Axis for Eta histograms"}; @@ -108,116 +105,137 @@ struct ExclusiveRhoTo4Pi { void init(InitContext const&) { // QA plots: Event and Track Counter - histosCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {14, 0, 14}}); - histosCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); - histosCounter.add("fourPionCounts_0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_0c_within_mass", "Four Pion Counts within mass range; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_n0c", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_n0c_within_mass", "Four Pion Counts within mass range; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_n0c_within_rap", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); - histosCounter.add("fourPionCounts_n0c_selected", "Four Pion Counts; Run Number; Events", kTH1F, {{113, 0, 113}}); - // QA plots: event selection - histosData.add("UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); - histosData.add("GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); - histosData.add("TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); - histosData.add("isCBTOk", "isCBTOk; bool; Events", kTH1F, {{4, 0, 4}}); - histosData.add("isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); - histosData.add("isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); - histosData.add("isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); - histosData.add("FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); - histosData.add("FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); - histosData.add("FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); - histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); - histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); - histosData.add("FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosData.add("FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosData.add("vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); - histosData.add("vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); - histosData.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); - histosData.add("occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); - // QA plots: tracks - histosData.add("dcaXY_all", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosData.add("dcaXY_pions", "dcaXY_pions; dcaXY of Pions [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosData.add("dcaZ_all", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosData.add("dcaZ_pions", "dcaZ_pions; dcaZ of Pions [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosData.add("itsChi2NCl_all", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosData.add("itsChi2_all", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); - histosData.add("tpcChi2NCl_all", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosData.add("tpcNClsFindable_all", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); - // QA plots: PID - histosData.add("tpcSignal_all", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosData.add("tpcSignal_pions", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosData.add("tpcNSigmaPi_all", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tpcNSigmaPi_pions", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tpcNSigmaKa_pions", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tpcNSigmaPr_pions", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tpcNSigmaEl_pions", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tpcNSigmaMu_pions", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofBeta_all", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosData.add("tofBeta_pions", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosData.add("tofNSigmaPi_all", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofNSigmaPi_pions", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofNSigmaKa_pions", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofNSigmaPr_pions", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofNSigmaEl_pions", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosData.add("tofNSigmaMu_pions", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - // Track Transverse Momentum - histosData.add("pT_track_all", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {pTAxis}); - histosData.add("pT_track_pions", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {pTAxis}); - histosData.add("pT_track_pions_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {pTAxis}); - // Track Pseudorapidity - histosData.add("eta_track_all", "Pseudorapidity with track selection; #eta; Counts", kTH1F, {etaAxis}); - histosData.add("eta_track_pions", "Pseudorapidity with track selection and PID selection of Pi; #eta; Events", kTH1F, {etaAxis}); - histosData.add("eta_track_pions_contributed", "Pseudorapidity with track selection and PID selection of Pi which are contributed to selected event; #eta; Events", kTH1F, {etaAxis}); - // Track Phi - histosData.add("phi_track_all", "Phi with track selection; #phi [rad]; Counts", kTH1F, {phiAxis}); - histosData.add("phi_track_pions", "Phi with track selection and PID selection of Pi; #phi [rad]; Events", kTH1F, {phiAxis}); - histosData.add("phi_track_pions_contributed", "Phi with track selection and PID selection of Pi which are contributed to selected event; #phi [rad]; Events", kTH1F, {phiAxis}); - // Track Rapidity - histosData.add("rapidity_track_all", "Rapidity with track selection; y; Counts", kTH1F, {rapidityAxis}); - histosData.add("rapidity_track_pions", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {rapidityAxis}); - histosData.add("rapidity_track_pions_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {rapidityAxis}); - // Four Pion Transverse Momentum - histosData.add("fourpion_pT_0_charge", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {pTAxis}); - histosData.add("fourpion_pT_0_charge_within_rap", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {pTAxis}); - histosData.add("fourpion_pT_non_0_charge", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {pTAxis}); - histosData.add("fourpion_pT_non_0_charge_within_rap", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {pTAxis}); - // Four Pion Eta - histosData.add("fourpion_eta_0_charge", "Four Pion #eta (0 charge); #eta; Events", kTH1F, {etaAxis}); - histosData.add("fourpion_eta_0_charge_within_rap", "Four Pion #eta (0 charge within rap); #eta; Events", kTH1F, {etaAxis}); - histosData.add("fourpion_eta_non_0_charge", "Four Pion #eta (non 0 charge); #eta; #eta; Events", kTH1F, {etaAxis}); - histosData.add("fourpion_eta_non_0_charge_within_rap", "Four Pion #eta (non 0 charge within rap); #eta; Events", kTH1F, {etaAxis}); - // Four Pion Phi - histosData.add("fourpion_phi_0_charge", "Four Pion #phi (0 charge); #phi [rad]; Events", kTH1F, {phiAxis}); - histosData.add("fourpion_phi_0_charge_within_rap", "Four Pion #phi (0 charge within rap); #phi [rad]; Events", kTH1F, {phiAxis}); - histosData.add("fourpion_phi_non_0_charge", "Four Pion #phi (non 0 charge); #phi [rad]; Events", kTH1F, {phiAxis}); - histosData.add("fourpion_phi_non_0_charge_within_rap", "Four Pion #phi (non 0 charge within rap); #phi [rad]; Events", kTH1F, {phiAxis}); - // Four Pion Rapidity - histosData.add("fourpion_rap_0_charge", "Four Pion Rapidity (0 charge); y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosData.add("fourpion_rap_0_charge_within_rap", "Four Pion Rapidity (0 charge within rap); y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosData.add("fourpion_rap_non_0_charge", "Four Pion Rapidity (non 0 charge); y; Events", kTH1F, {rapidityAxis}); - histosData.add("fourpion_rap_non_0_charge_within_rap", "Four Pion Rapidity (non 0 charge within rap); y; Events", kTH1F, {rapidityAxis}); - // Four Pion Mass - histosData.add("fourpion_mass_0_charge", "Four Pion Invariant Mass (0 charge); m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]; Events", kTH1F, {invMassAxis}); - histosData.add("fourpion_mass_0_charge_within_rap", "Four Pion Invariant Mass (0 charge within rap); m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]; Events", kTH1F, {invMassAxis}); - histosData.add("fourpion_mass_non_0_charge", "Four Pion Invariant Mass (non 0 charge); m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]; Events", kTH1F, {invMassAxis}); - histosData.add("fourpion_mass_non_0_charge_within_rap", "Four Pion Invariant Mass (non 0 charge within rap); m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]; Events", kTH1F, {invMassAxis}); - // Pair Invariant Mass - histosData.add("twopion_mass_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosData.add("twopion_mass_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosData.add("twopion_mass_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosData.add("twopion_mass_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - // Four Pion Invariant Mass - histosData.add("fourpion_mass_0_charge_domA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // pT < 0.15GeV - histosData.add("fourpion_mass_0_charge_domB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // 0.15GeV < pT < 0.8GeV - histosData.add("fourpion_mass_0_charge_domC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // 0.8GeV < pT - histosData.add("fourpion_mass_non_0_charge_domA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // pT < 0.15GeV - histosData.add("fourpion_mass_non_0_charge_domB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // 0.15GeV < pT < 0.8GeV - histosData.add("fourpion_mass_non_0_charge_domC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {invMassAxis}); // 0.8GeV < pT - // Collin Soper Theta and Phi after selection - histosData.add("CSphi_vs_CScosTheta", "Phi vs cosTheta for small mass; #phi; cos(#theta)", kTH2F, {phiAxis, cosThetaAxis}); + histosDataCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + // QA plots: event selection-selected events + histosQA.add("Events/selected/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); + histosQA.add("Events/selected/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/selected/TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/selected/isCBTOk", "isCBTOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/selected/isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/selected/isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/selected/isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/selected/FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); + histosQA.add("Events/selected/FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); + histosQA.add("Events/selected/FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); + histosQA.add("Events/selected/ZDC_A", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosQA.add("Events/selected/ZDC_C", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosQA.add("Events/selected/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/selected/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/selected/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); + histosQA.add("Events/selected/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); + histosQA.add("Events/selected/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); + histosQA.add("Events/selected/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); + // QA plots: event selection-4 pion events + histosQA.add("Events/4pion/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); + histosQA.add("Events/4pion/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/4pion/TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/4pion/isCBTOk", "isCBTOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/4pion/isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/4pion/isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/4pion/isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/4pion/FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); + histosQA.add("Events/4pion/FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); + histosQA.add("Events/4pion/FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); + histosQA.add("Events/4pion/ZDC_A", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosQA.add("Events/4pion/ZDC_C", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosQA.add("Events/4pion/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/4pion/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/4pion/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); + histosQA.add("Events/4pion/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); + histosQA.add("Events/4pion/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); + histosQA.add("Events/4pion/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); + // QA plots: All tracks in selected events + histosQA.add("Tracks/all/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/all/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/all/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/all/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); + histosQA.add("Tracks/all/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/all/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + // QA plots: Selected tracks in selected events + histosQA.add("Tracks/selected/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/selected/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/selected/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/selected/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); + histosQA.add("Tracks/selected/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/selected/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + // QA plots: Pion tracks in selected events + histosQA.add("Tracks/pions/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/pions/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/pions/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/pions/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); + histosQA.add("Tracks/pions/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/pions/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + // QA plots: Pion tracks from 4pi in selected events + histosQA.add("Tracks/pions-from-4pi/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/pions-from-4pi/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/pions-from-4pi/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/pions-from-4pi/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); + histosQA.add("Tracks/pions-from-4pi/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/pions-from-4pi/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + // QA plots: PID- All tracks + histosPID.add("all/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("all/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("all/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + // QA plots: PID- Selected tracks + histosPID.add("selected/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("selected/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("selected/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + // QA plots: PID- Pion tracks + histosPID.add("pions/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("pions/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("pions/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + // QA plots: PID- Pion tracks from 4pi events + histosPID.add("pions-from-4pi/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("pions-from-4pi/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("pions-from-4pi/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + // Kinematics for all particles + histosKin.add("all", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); + histosKin.add("selected", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); + histosKin.add("pions", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); + histosKin.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis}); + // Rho Prime Kinematics + histos4piKin.add("two-pion-mass", ";m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}}); + histos4piKin.add("zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Collin-Soper cos(#theta); Collin-Soper #varphi [rad];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, cosThetaAxis, phiAxis, {113, 0, 113}}); + histos4piKin.add("non-zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + //___________________________________________________________________________________________________________________________ + setHistBinLabels(); } // End of init function @@ -248,24 +266,24 @@ struct ExclusiveRhoTo4Pi { int runIndex = getRunNumberIndex(collision.runNumber()); - histosData.fill(HIST("GapSide"), collision.gapSide()); - histosData.fill(HIST("TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); - histosData.fill(HIST("isCBTOk"), sgSelector.isCBTOk(collision)); - histosData.fill(HIST("isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); - histosData.fill(HIST("isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); - histosData.fill(HIST("isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); - histosData.fill(HIST("vertexX"), collision.posX()); - histosData.fill(HIST("vertexY"), collision.posY()); - histosData.fill(HIST("vertexZ"), collision.posZ()); - histosData.fill(HIST("occupancy"), collision.occupancyInTime()); - histosData.fill(HIST("FV0A"), collision.totalFV0AmplitudeA()); - histosData.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); - histosData.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); - histosData.fill(HIST("ZDC_A"), collision.energyCommonZNA()); - histosData.fill(HIST("ZDC_C"), collision.energyCommonZNC()); - histosData.fill(HIST("FDDA"), collision.totalFDDAmplitudeA()); - histosData.fill(HIST("FDDC"), collision.totalFDDAmplitudeC()); - histosData.fill(HIST("UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/selected/UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/selected/GapSide"), collision.gapSide()); + histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/selected/isCBTOk"), sgSelector.isCBTOk(collision)); + histosQA.fill(HIST("Events/selected/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosQA.fill(HIST("Events/selected/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosQA.fill(HIST("Events/selected/isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); + histosQA.fill(HIST("Events/selected/vertexX"), collision.posX()); + histosQA.fill(HIST("Events/selected/vertexY"), collision.posY()); + histosQA.fill(HIST("Events/selected/vertexZ"), collision.posZ()); + histosQA.fill(HIST("Events/selected/occupancy"), collision.occupancyInTime()); + histosQA.fill(HIST("Events/selected/FV0A"), collision.totalFV0AmplitudeA()); + histosQA.fill(HIST("Events/selected/FT0A"), collision.totalFT0AmplitudeA()); + histosQA.fill(HIST("Events/selected/FT0C"), collision.totalFT0AmplitudeC()); + histosQA.fill(HIST("Events/selected/ZDC_A"), collision.energyCommonZNA()); + histosQA.fill(HIST("Events/selected/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); + histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); std::vector selectedTracks; std::vector selectedPionTracks; @@ -273,12 +291,94 @@ struct ExclusiveRhoTo4Pi { std::vector selectedPionMinusTracks; for (const auto& t0 : tracks) { + + PxPyPzMVector tVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); + + // QA-Tracks before selection + histosQA.fill(HIST("Tracks/all/dcaXY"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/dcaZ"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); + histosQA.fill(HIST("Tracks/all/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); + histosQA.fill(HIST("Tracks/all/tpcChi2NCl"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/tpcNClsFindable"), t0.tpcNClsFindable()); + + // PID before track selection + histosPID.fill(HIST("all/tpcSignal"), tVector.P(), t0.tpcSignal()); + histosPID.fill(HIST("all/tpcNSigmaPi"), t0.tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaKa"), t0.tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaPr"), t0.tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaEl"), t0.tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaMu"), t0.tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("all/tofBeta"), tVector.P(), t0.beta()); + histosPID.fill(HIST("all/tofNSigmaPi"), t0.tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaKa"), t0.tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaPr"), t0.tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaEl"), t0.tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaMu"), t0.tofNSigmaMu(), tVector.Pt()); + + // Kinematics for all particles before selection + histosKin.fill(HIST("all"), tVector.Pt(), tVector.Eta(), tVector.Phi()); + + // Selecting good tracks if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { continue; } + + // QA-Tracks after selection + histosQA.fill(HIST("Tracks/selected/dcaXY"), t0.dcaXY()); + histosQA.fill(HIST("Tracks/selected/dcaZ"), t0.dcaZ()); + histosQA.fill(HIST("Tracks/selected/itsChi2NCl"), t0.itsChi2NCl()); + histosQA.fill(HIST("Tracks/selected/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); + histosQA.fill(HIST("Tracks/selected/tpcChi2NCl"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/selected/tpcNClsFindable"), t0.tpcNClsFindable()); + + // PID after track selection before selecting pions + histosPID.fill(HIST("selected/tpcSignal"), tVector.P(), t0.tpcSignal()); + histosPID.fill(HIST("selected/tpcNSigmaPi"), t0.tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaKa"), t0.tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaPr"), t0.tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaEl"), t0.tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaMu"), t0.tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("selected/tofBeta"), tVector.P(), t0.beta()); + histosPID.fill(HIST("selected/tofNSigmaPi"), t0.tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaKa"), t0.tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaPr"), t0.tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaEl"), t0.tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaMu"), t0.tofNSigmaMu(), tVector.Pt()); + + // Kinematics for all particles after track selection before selecting pions + histosKin.fill(HIST("selected"), tVector.Pt(), tVector.Eta(), tVector.Phi()); + selectedTracks.push_back(t0); - if (selectionPIDPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + selectedPionTracks.push_back(t0); + + // QA-Tracks after selecting pions + histosQA.fill(HIST("Tracks/pions/dcaXY"), t0.dcaXY()); + histosQA.fill(HIST("Tracks/pions/dcaZ"), t0.dcaZ()); + histosQA.fill(HIST("Tracks/pions/itsChi2NCl"), t0.itsChi2NCl()); + histosQA.fill(HIST("Tracks/pions/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); + histosQA.fill(HIST("Tracks/pions/tpcChi2NCl"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/pions/tpcNClsFindable"), t0.tpcNClsFindable()); + + // PID after selecting pions + histosPID.fill(HIST("pions/tpcSignal"), tVector.P(), t0.tpcSignal()); + histosPID.fill(HIST("pions/tpcNSigmaPi"), t0.tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaKa"), t0.tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaPr"), t0.tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaEl"), t0.tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaMu"), t0.tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("pions/tofBeta"), tVector.P(), t0.beta()); + histosPID.fill(HIST("pions/tofNSigmaPi"), t0.tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaKa"), t0.tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaPr"), t0.tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaEl"), t0.tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaMu"), t0.tofNSigmaMu(), tVector.Pt()); + + // Kinematics for pions + histosKin.fill(HIST("pions"), tVector.Pt(), tVector.Eta(), tVector.Phi()); + if (t0.sign() == 1) { selectedPionPlusTracks.push_back(t0); } @@ -288,58 +388,10 @@ struct ExclusiveRhoTo4Pi { } // End of Selection PID Pion } // End of loop over tracks - int numSelectedTracks = static_cast(selectedTracks.size()); int numSelectedPionTracks = static_cast(selectedPionTracks.size()); int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); - for (int i = 0; i < numSelectedTracks; i++) { - PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); - histosData.fill(HIST("pT_track_all"), selectedTrackVector.Pt()); - histosData.fill(HIST("eta_track_all"), selectedTrackVector.Eta()); - histosData.fill(HIST("phi_track_all"), selectedTrackVector.Phi()); - histosData.fill(HIST("rapidity_track_all"), selectedTrackVector.Rapidity()); - - histosData.fill(HIST("dcaXY_all"), selectedTracks[i].dcaXY()); - histosData.fill(HIST("dcaZ_all"), selectedTracks[i].dcaZ()); - - histosData.fill(HIST("itsChi2NCl_all"), selectedTracks[i].itsChi2NCl()); - histosData.fill(HIST("itsChi2_all"), selectedTracks[i].itsChi2NCl() * selectedTracks[i].itsNCls()); - histosData.fill(HIST("tpcChi2NCl_all"), selectedTracks[i].tpcChi2NCl()); - histosData.fill(HIST("tpcNClsFindable_all"), selectedTracks[i].tpcNClsFindable()); - - histosData.fill(HIST("tpcSignal_all"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); - histosData.fill(HIST("tpcNSigmaPi_all"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); - histosData.fill(HIST("tofBeta_all"), selectedTrackVector.P(), selectedTracks[i].beta()); - histosData.fill(HIST("tofNSigmaPi_all"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); - } // End of loop over tracks with selection only - - for (int i = 0; i < numSelectedPionTracks; i++) { - PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); - - histosData.fill(HIST("pT_track_pions"), selectedPionTrackVector.Pt()); - histosData.fill(HIST("eta_track_pions"), selectedPionTrackVector.Eta()); - histosData.fill(HIST("phi_track_pions"), selectedPionTrackVector.Phi()); - histosData.fill(HIST("rapidity_track_pions"), selectedPionTrackVector.Rapidity()); - - histosData.fill(HIST("dcaXY_pions"), selectedPionTracks[i].dcaXY()); - histosData.fill(HIST("dcaZ_pions"), selectedPionTracks[i].dcaZ()); - - histosData.fill(HIST("tpcSignal_pions"), selectedPionTrackVector.P(), selectedPionTracks[i].tpcSignal()); - histosData.fill(HIST("tpcNSigmaPi_pions"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaKa_pions"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaPr_pions"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaEl_pions"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaMu_pions"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); - - histosData.fill(HIST("tofBeta_pions"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); - histosData.fill(HIST("tofNSigmaPi_pions"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaKa_pions"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaPr_pions"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaEl_pions"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaMu_pions"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); - } // End of loop over tracks with selection and PID of pions - // event should have exactly 4 pions if (numSelectedPionTracks != numFourPionTracks) { return; @@ -348,213 +400,170 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; + // QA-Events-4pion + histosQA.fill(HIST("Events/4pion/UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/4pion/GapSide"), collision.gapSide()); + histosQA.fill(HIST("Events/4pion/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/4pion/isCBTOk"), sgSelector.isCBTOk(collision)); + histosQA.fill(HIST("Events/4pion/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosQA.fill(HIST("Events/4pion/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosQA.fill(HIST("Events/4pion/isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); + histosQA.fill(HIST("Events/4pion/vertexX"), collision.posX()); + histosQA.fill(HIST("Events/4pion/vertexY"), collision.posY()); + histosQA.fill(HIST("Events/4pion/vertexZ"), collision.posZ()); + histosQA.fill(HIST("Events/4pion/occupancy"), collision.occupancyInTime()); + histosQA.fill(HIST("Events/4pion/FV0A"), collision.totalFV0AmplitudeA()); + histosQA.fill(HIST("Events/4pion/FT0A"), collision.totalFT0AmplitudeA()); + histosQA.fill(HIST("Events/4pion/FT0C"), collision.totalFT0AmplitudeC()); + histosQA.fill(HIST("Events/4pion/ZDC_A"), collision.energyCommonZNA()); + histosQA.fill(HIST("Events/4pion/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); + histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); + + for (int i = 0; i < numFourPionTracks; i++) { + PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); + // Tracks QA for all four pions + histosQA.fill(HIST("Tracks/pions-from-4pi/dcaXY"), selectedPionTracks[i].dcaXY()); + histosQA.fill(HIST("Tracks/pions-from-4pi/dcaZ"), selectedPionTracks[i].dcaZ()); + histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2NCl"), selectedPionTracks[i].itsChi2NCl()); + histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2"), selectedPionTracks[i].itsChi2NCl() * selectedPionTracks[i].itsNCls()); + histosQA.fill(HIST("Tracks/pions-from-4pi/tpcChi2NCl"), selectedPionTracks[i].tpcChi2NCl()); + histosQA.fill(HIST("Tracks/pions-from-4pi/tpcNClsFindable"), selectedPionTracks[i].tpcNClsFindable()); + // PID for all four pions + histosPID.fill(HIST("pions-from-4pi/tpcSignal"), tVector.P(), selectedPionTracks[i].tpcSignal()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaPi"), selectedPionTracks[i].tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaKa"), selectedPionTracks[i].tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaPr"), selectedPionTracks[i].tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaEl"), selectedPionTracks[i].tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaMu"), selectedPionTracks[i].tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofBeta"), tVector.P(), selectedPionTracks[i].beta()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaPi"), selectedPionTracks[i].tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaKa"), selectedPionTracks[i].tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaPr"), selectedPionTracks[i].tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaEl"), selectedPionTracks[i].tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaMu"), selectedPionTracks[i].tofNSigmaMu(), tVector.Pt()); + } PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - histosData.fill(HIST("pT_track_pions_contributed"), p1.Pt()); - histosData.fill(HIST("pT_track_pions_contributed"), p2.Pt()); - histosData.fill(HIST("pT_track_pions_contributed"), p3.Pt()); - histosData.fill(HIST("pT_track_pions_contributed"), p4.Pt()); - - histosData.fill(HIST("eta_track_pions_contributed"), p1.Eta()); - histosData.fill(HIST("eta_track_pions_contributed"), p2.Eta()); - histosData.fill(HIST("eta_track_pions_contributed"), p3.Eta()); - histosData.fill(HIST("eta_track_pions_contributed"), p4.Eta()); - - histosData.fill(HIST("phi_track_pions_contributed"), p1.Phi()); - histosData.fill(HIST("phi_track_pions_contributed"), p2.Phi()); - histosData.fill(HIST("phi_track_pions_contributed"), p3.Phi()); - histosData.fill(HIST("phi_track_pions_contributed"), p4.Phi()); - - histosData.fill(HIST("rapidity_track_pions_contributed"), p1.Rapidity()); - histosData.fill(HIST("rapidity_track_pions_contributed"), p2.Rapidity()); - histosData.fill(HIST("rapidity_track_pions_contributed"), p3.Rapidity()); - histosData.fill(HIST("rapidity_track_pions_contributed"), p4.Rapidity()); - - k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); - k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); - k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); - k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); + // Kinematics for pions from 4 pion events + histosKin.fill(HIST("pions-from-4pi"), p1.Pt(), p1.Eta(), p1.Phi(), p1.Rapidity()); + histosKin.fill(HIST("pions-from-4pi"), p2.Pt(), p2.Eta(), p2.Phi(), p2.Rapidity()); + histosKin.fill(HIST("pions-from-4pi"), p3.Pt(), p3.Eta(), p3.Phi(), p3.Rapidity()); + histosKin.fill(HIST("pions-from-4pi"), p4.Pt(), p4.Eta(), p4.Phi(), p4.Rapidity()); PxPyPzMVector p1234 = p1 + p2 + p3 + p4; - k1234 = k1 + k2 + k3 + k4; - - k13 = k1 + k3; - k14 = k1 + k4; - k23 = k2 + k3; - k24 = k2 + k4; - - histosData.fill(HIST("fourpion_pT_0_charge"), p1234.Pt()); - histosData.fill(HIST("fourpion_eta_0_charge"), p1234.Eta()); - histosData.fill(HIST("fourpion_phi_0_charge"), p1234.Phi()); - histosData.fill(HIST("fourpion_rap_0_charge"), p1234.Rapidity()); - histosData.fill(HIST("fourpion_mass_0_charge"), p1234.M()); - - double fourPiPhiPair1 = collinSoperPhi(k13, k1234); - double fourPiPhiPair2 = collinSoperPhi(k14, k1234); - double fourPiPhiPair3 = collinSoperPhi(k23, k1234); - double fourPiPhiPair4 = collinSoperPhi(k24, k1234); - double fourPiCosThetaPair1 = collinSoperCosTheta(k13, k1234); - double fourPiCosThetaPair2 = collinSoperCosTheta(k14, k1234); - double fourPiCosThetaPair3 = collinSoperCosTheta(k23, k1234); - double fourPiCosThetaPair4 = collinSoperCosTheta(k24, k1234); - - histosCounter.fill(HIST("fourPionCounts_0c"), runIndex); - - if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { - histosCounter.fill(HIST("fourPionCounts_0c_within_mass"), runIndex); + PxPyPzMVector p13 = p1 + p3; + PxPyPzMVector p14 = p1 + p4; + PxPyPzMVector p23 = p2 + p3; + PxPyPzMVector p24 = p2 + p4; + + // Two Pion Mass combinations + histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M()); + + double fourPiPhiPair1 = collinSoperPhi(p13, p1234); + double fourPiPhiPair2 = collinSoperPhi(p14, p1234); + double fourPiPhiPair3 = collinSoperPhi(p23, p1234); + double fourPiPhiPair4 = collinSoperPhi(p24, p1234); + + double fourPiCosThetaPair1 = collinSoperCosTheta(p13, p1234); + double fourPiCosThetaPair2 = collinSoperCosTheta(p14, p1234); + double fourPiCosThetaPair3 = collinSoperCosTheta(p23, p1234); + double fourPiCosThetaPair4 = collinSoperCosTheta(p24, p1234); + + double mDiff13 = std::abs((p13.M() - mRho0)); + double mDiff14 = std::abs((p14.M() - mRho0)); + double mDiff23 = std::abs((p23.M() - mRho0)); + double mDiff24 = std::abs((p24.M() - mRho0)); + if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex); + } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair2, fourPiPhiPair2, runIndex); + } else if ((mDiff23 < mDiff13) && (mDiff23 < mDiff14) && (mDiff23 < mDiff24)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair3, fourPiPhiPair3, runIndex); + } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair4, fourPiPhiPair4, runIndex); } - - if (std::fabs(p1234.Rapidity()) < rhoRapCut) { - histosData.fill(HIST("fourpion_pT_0_charge_within_rap"), p1234.Pt()); - histosData.fill(HIST("fourpion_eta_0_charge_within_rap"), p1234.Eta()); - histosData.fill(HIST("fourpion_phi_0_charge_within_rap"), p1234.Phi()); - histosData.fill(HIST("fourpion_rap_0_charge_within_rap"), p1234.Rapidity()); - histosData.fill(HIST("fourpion_mass_0_charge_within_rap"), p1234.M()); - histosCounter.fill(HIST("fourPionCounts_0c_within_rap"), runIndex); - if (p1234.Pt() < rhoPtCut) { - if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { - // Selected Four Pion Events - histosCounter.fill(HIST("fourPionCounts_0c_selected"), runIndex); - // Fill the Invariant Mass Histogram - histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); - // Two Pion Masses - histosData.fill(HIST("twopion_mass_1"), (p1 + p3).M()); - histosData.fill(HIST("twopion_mass_2"), (p1 + p4).M()); - histosData.fill(HIST("twopion_mass_3"), (p2 + p3).M()); - histosData.fill(HIST("twopion_mass_4"), (p2 + p4).M()); - // Fill the Collins-Soper Frame histograms - double mDiff13 = std::abs((k13.M() - mRho0)); - double mDiff14 = std::abs((k14.M() - mRho0)); - double mDiff23 = std::abs((k23.M() - mRho0)); - double mDiff24 = std::abs((k24.M() - mRho0)); - if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { - histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair1, fourPiCosThetaPair1); - } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { - histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair2, fourPiCosThetaPair2); - } else if ((mDiff23 < mDiff13) && (mDiff23 < mDiff14) && (mDiff23 < mDiff24)) { - histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair3, fourPiCosThetaPair3); - } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { - histosData.fill(HIST("CSphi_vs_CScosTheta"), fourPiPhiPair4, fourPiCosThetaPair4); - } - } // End of Pt selection for rho mass - } // End of Pt selection for rho mass - if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { - histosData.fill(HIST("fourpion_mass_0_charge_domB"), p1234.M()); - } - if (p1234.Pt() > zeroPointEight) { - histosData.fill(HIST("fourpion_mass_0_charge_domC"), p1234.M()); - } - } // End of Rapidity range selection } // End of Analysis for 0 charge events // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p1234 = p1 + p2 + p3 + p4; - - histosData.fill(HIST("fourpion_pT_non_0_charge"), p1234.Pt()); - histosData.fill(HIST("fourpion_eta_non_0_charge"), p1234.Eta()); - histosData.fill(HIST("fourpion_phi_non_0_charge"), p1234.Phi()); - histosData.fill(HIST("fourpion_rap_non_0_charge"), p1234.Rapidity()); - histosData.fill(HIST("fourpion_mass_non_0_charge"), p1234.M()); - - histosCounter.fill(HIST("fourPionCounts_n0c"), runIndex); - if (rhoMassMin < p1234.M() && p1234.M() < rhoMassMax) { - histosCounter.fill(HIST("fourPionCounts_n0c_within_mass"), runIndex); - } - if (std::fabs(p1234.Rapidity()) < rhoRapCut) { - histosData.fill(HIST("fourpion_pT_non_0_charge_within_rap"), p1234.Pt()); - histosData.fill(HIST("fourpion_eta_non_0_charge_within_rap"), p1234.Eta()); - histosData.fill(HIST("fourpion_phi_non_0_charge_within_rap"), p1234.Phi()); - histosData.fill(HIST("fourpion_rap_non_0_charge_within_rap"), p1234.Rapidity()); - histosData.fill(HIST("fourpion_mass_non_0_charge_within_rap"), p1234.M()); - histosCounter.fill(HIST("fourPionCounts_n0c_within_rap"), runIndex); - if (p1234.Pt() < rhoPtCut) { - histosData.fill(HIST("fourpion_mass_non_0_charge_domA"), p1234.M()); - histosCounter.fill(HIST("fourPionCounts_n0c_selected"), runIndex); - } - if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { - histosData.fill(HIST("fourpion_mass_non_0_charge_domB"), p1234.M()); - } - if (p1234.Pt() > zeroPointEight) { - histosData.fill(HIST("fourpion_mass_non_0_charge_domC"), p1234.M()); - } - } // End of Rapidity range selection + // Kinematics for 4 pion system from non 0 charge events + histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 Data void processEventCounter(UDCollisions::iterator const& collision) { - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 0); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 0); // RCT flag if (!sgSelector.isCBTHadronZdcOk(collision)) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 1); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 1); // UPC mode if (collision.flags() != ifUPC) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 2); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 2); // vtxITSTPC if (collision.vtxITSTPC() != vtxITSTPCcut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 3); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 3); // sbp if (collision.sbp() != sbpCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 4); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 4); // itsROFb if (collision.itsROFb() != itsROFbCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 5); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 5); // tfb if (collision.tfb() != tfbCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 6); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 6); // FT0A if (collision.totalFT0AmplitudeA() > ft0aCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 7); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 7); // FT0C if (collision.totalFT0AmplitudeC() > ft0cCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 8); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 8); // FV0A if (collision.totalFV0AmplitudeA() > fv0Cut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); // ZDC if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // numContributors if (collision.numContrib() != numPVContrib) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); // vertexZ if (std::abs(collision.posZ()) > vZCut) { return; } - histosCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 12); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 12); } // End of processCounter function void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) @@ -565,28 +574,28 @@ struct ExclusiveRhoTo4Pi { return; } for (const auto& track : tracks) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // is PV contributor if (track.isPVContributor() != useOnlyPVtracks) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); // pt cut if (trackVector.Pt() < pTcut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); // eta cut if (std::abs(trackVector.Eta()) > etaCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); // DCA Z cut if (std::abs(track.dcaZ()) > dcaZcut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); // DCA XY cut float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { @@ -594,50 +603,53 @@ struct ExclusiveRhoTo4Pi { } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); // ITS Track only if (useITStracksOnly && !track.hasITS()) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); // TPC Track only if (useTPCtracksOnly && !track.hasTPC()) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); // ITS Chi2 N Clusters cut if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); // TPC Chi2 N Clusters cut if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); // TPC N Clusters Findable cut if (track.hasTPC() && track.tpcNClsFindable() < tpcNClsFindableCut) { continue; } - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); // Selection PID Pion - if (selectionPIDPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); + if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); if (track.sign() == 1) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 12); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 12); } if (track.sign() == -1) { - histosCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 13); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 13); } } // End of Selection PID Pion } // End of loop over tracks } // End of processCounter function + using MCtracks = soa::Join; + using MCCollisions = soa::Join; + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "Data Analysis Function", true); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounter, "Event Counter Function", true); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounter, "Track Counter Function", true); - double collinSoperPhi(PtEtaPhiMVector twoPionVector, PtEtaPhiMVector fourPionVector) + double collinSoperPhi(PxPyPzMVector twoPionVector, PxPyPzMVector fourPionVector) { // Half of the energy per pair of the colliding nucleons. double halfSqrtSnn = 2680.; @@ -658,7 +670,7 @@ struct ExclusiveRhoTo4Pi { return phi; } - double collinSoperCosTheta(PtEtaPhiMVector twoPionVector, PtEtaPhiMVector fourPionVector) + double collinSoperCosTheta(PxPyPzMVector twoPionVector, PxPyPzMVector fourPionVector) { // Half of the energy per pair of the colliding nucleons. double halfSqrtSnn = 2680.; @@ -733,6 +745,24 @@ struct ExclusiveRhoTo4Pi { return true; } // End of Track Selection function + template + bool ifPion(const T& candidate, bool use_tof, float nsigmatpc_cut, float nsigmatof_cut) + { + + if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < (nsigmatof_cut * nsigmatof_cut)) { + return true; + } + + if (use_tof && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } + + if (!use_tof && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } + return false; + } + int getRunNumberIndex(int runNumber) { for (int i = 0; i < numRunNums; ++i) { @@ -788,29 +818,29 @@ struct ExclusiveRhoTo4Pi { int numTrackCuts = 14; - auto h1 = histosCounter.get(HIST("EventsCounts_vs_runNo")); - auto h2 = histosCounter.get(HIST("TracksCounts_vs_runNo")); - auto h3 = histosCounter.get(HIST("fourPionCounts_0c")); - auto h4 = histosCounter.get(HIST("fourPionCounts_0c_within_rap")); - auto h5 = histosCounter.get(HIST("fourPionCounts_0c_selected")); - auto h6 = histosCounter.get(HIST("fourPionCounts_n0c")); - auto h7 = histosCounter.get(HIST("fourPionCounts_n0c_within_rap")); - auto h8 = histosCounter.get(HIST("fourPionCounts_n0c_selected")); - auto h9 = histosCounter.get(HIST("fourPionCounts_0c_within_mass")); - auto h10 = histosCounter.get(HIST("fourPionCounts_n0c_within_mass")); - - for (int i = 0; i < numRunNums; ++i) { - h1->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h2->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h3->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h4->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h5->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h6->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h7->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h8->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h9->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - h10->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - } + auto h1 = histosDataCounter.get(HIST("EventsCounts_vs_runNo")); + auto h2 = histosDataCounter.get(HIST("TracksCounts_vs_runNo")); + // auto h3 = histosDataCounter.get(HIST("fourPionCounts_0c")); + // auto h4 = histosDataCounter.get(HIST("fourPionCounts_0c_within_rap")); + // auto h5 = histosDataCounter.get(HIST("fourPionCounts_0c_selected")); + // auto h6 = histosDataCounter.get(HIST("fourPionCounts_n0c")); + // auto h7 = histosDataCounter.get(HIST("fourPionCounts_n0c_within_rap")); + // auto h8 = histosDataCounter.get(HIST("fourPionCounts_n0c_selected")); + // auto h9 = histosDataCounter.get(HIST("fourPionCounts_0c_within_mass")); + // auto h10 = histosDataCounter.get(HIST("fourPionCounts_n0c_within_mass")); + + // for (int i = 0; i < numRunNums; ++i) { + // h1->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h2->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h3->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h4->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h5->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h6->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h7->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h8->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h9->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // h10->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); + // } for (int i = 0; i < numEventCuts; ++i) { h1->GetYaxis()->SetBinLabel(i + 1, eventLabels[i].c_str()); } From 13bc2029401ac13683f3ca0c09d497220a7ad0a2 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Sun, 14 Sep 2025 16:23:04 -0400 Subject: [PATCH 16/26] Modified MC and other histograms --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 253 ++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 160158f4452..5d9ffdb9f1c 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -645,7 +645,260 @@ struct ExclusiveRhoTo4Pi { using MCtracks = soa::Join; using MCCollisions = soa::Join; + void processMCrec(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) + { + + if (collision.has_udMcCollision()) { + return; + } + + // Check if the Event is reconstructed in UPC mode and RCT flag + if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronOk(collision))) { + return; + } + + int runIndex = getRunNumberIndex(collision.runNumber()); + + histosQA.fill(HIST("Events/selected/UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/selected/GapSide"), collision.gapSide()); + histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/selected/isCBTOk"), sgSelector.isCBTOk(collision)); + histosQA.fill(HIST("Events/selected/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosQA.fill(HIST("Events/selected/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosQA.fill(HIST("Events/selected/isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); + histosQA.fill(HIST("Events/selected/vertexX"), collision.posX()); + histosQA.fill(HIST("Events/selected/vertexY"), collision.posY()); + histosQA.fill(HIST("Events/selected/vertexZ"), collision.posZ()); + histosQA.fill(HIST("Events/selected/occupancy"), collision.occupancyInTime()); + histosQA.fill(HIST("Events/selected/FV0A"), collision.totalFV0AmplitudeA()); + histosQA.fill(HIST("Events/selected/FT0A"), collision.totalFT0AmplitudeA()); + histosQA.fill(HIST("Events/selected/FT0C"), collision.totalFT0AmplitudeC()); + histosQA.fill(HIST("Events/selected/ZDC_A"), collision.energyCommonZNA()); + histosQA.fill(HIST("Events/selected/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); + histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); + + std::vector selectedTracks; + std::vector selectedPionTracks; + std::vector selectedPionPlusTracks; + std::vector selectedPionMinusTracks; + + for (const auto& t0 : tracks) { + + PxPyPzMVector tVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); + + // QA-Tracks before selection + histosQA.fill(HIST("Tracks/all/dcaXY"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/dcaZ"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); + histosQA.fill(HIST("Tracks/all/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); + histosQA.fill(HIST("Tracks/all/tpcChi2NCl"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/tpcNClsFindable"), t0.tpcNClsFindable()); + + // PID before track selection + histosPID.fill(HIST("all/tpcSignal"), tVector.P(), t0.tpcSignal()); + histosPID.fill(HIST("all/tpcNSigmaPi"), t0.tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaKa"), t0.tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaPr"), t0.tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaEl"), t0.tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("all/tpcNSigmaMu"), t0.tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("all/tofBeta"), tVector.P(), t0.beta()); + histosPID.fill(HIST("all/tofNSigmaPi"), t0.tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaKa"), t0.tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaPr"), t0.tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaEl"), t0.tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("all/tofNSigmaMu"), t0.tofNSigmaMu(), tVector.Pt()); + + // Kinematics for all particles before selection + histosKin.fill(HIST("all"), tVector.Pt(), tVector.Eta(), tVector.Phi()); + + // Selecting good tracks + if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { + continue; + } + if (!t0.has_udMcParticle()) { + continue; + } + + // QA-Tracks after selection + histosQA.fill(HIST("Tracks/selected/dcaXY"), t0.dcaXY()); + histosQA.fill(HIST("Tracks/selected/dcaZ"), t0.dcaZ()); + histosQA.fill(HIST("Tracks/selected/itsChi2NCl"), t0.itsChi2NCl()); + histosQA.fill(HIST("Tracks/selected/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); + histosQA.fill(HIST("Tracks/selected/tpcChi2NCl"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/selected/tpcNClsFindable"), t0.tpcNClsFindable()); + + // PID after track selection before selecting pions + histosPID.fill(HIST("selected/tpcSignal"), tVector.P(), t0.tpcSignal()); + histosPID.fill(HIST("selected/tpcNSigmaPi"), t0.tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaKa"), t0.tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaPr"), t0.tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaEl"), t0.tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("selected/tpcNSigmaMu"), t0.tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("selected/tofBeta"), tVector.P(), t0.beta()); + histosPID.fill(HIST("selected/tofNSigmaPi"), t0.tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaKa"), t0.tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaPr"), t0.tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaEl"), t0.tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("selected/tofNSigmaMu"), t0.tofNSigmaMu(), tVector.Pt()); + + // Kinematics for all particles after track selection before selecting pions + histosKin.fill(HIST("selected"), tVector.Pt(), tVector.Eta(), tVector.Phi()); + + selectedTracks.push_back(t0); + if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + + selectedPionTracks.push_back(t0); + + // QA-Tracks after selecting pions + histosQA.fill(HIST("Tracks/pions/dcaXY"), t0.dcaXY()); + histosQA.fill(HIST("Tracks/pions/dcaZ"), t0.dcaZ()); + histosQA.fill(HIST("Tracks/pions/itsChi2NCl"), t0.itsChi2NCl()); + histosQA.fill(HIST("Tracks/pions/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); + histosQA.fill(HIST("Tracks/pions/tpcChi2NCl"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/pions/tpcNClsFindable"), t0.tpcNClsFindable()); + + // PID after selecting pions + histosPID.fill(HIST("pions/tpcSignal"), tVector.P(), t0.tpcSignal()); + histosPID.fill(HIST("pions/tpcNSigmaPi"), t0.tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaKa"), t0.tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaPr"), t0.tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaEl"), t0.tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions/tpcNSigmaMu"), t0.tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("pions/tofBeta"), tVector.P(), t0.beta()); + histosPID.fill(HIST("pions/tofNSigmaPi"), t0.tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaKa"), t0.tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaPr"), t0.tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaEl"), t0.tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions/tofNSigmaMu"), t0.tofNSigmaMu(), tVector.Pt()); + + // Kinematics for pions + histosKin.fill(HIST("pions"), tVector.Pt(), tVector.Eta(), tVector.Phi()); + + if (t0.sign() == 1) { + selectedPionPlusTracks.push_back(t0); + } + if (t0.sign() == -1) { + selectedPionMinusTracks.push_back(t0); + } + } // End of Selection PID Pion + } // End of loop over tracks + + int numSelectedPionTracks = static_cast(selectedPionTracks.size()); + int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); + int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); + + // event should have exactly 4 pions + if (numSelectedPionTracks != numFourPionTracks) { + return; + } + + // Selecting Events with net charge = 0 + if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { + + // QA-Events-4pion + histosQA.fill(HIST("Events/4pion/UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/4pion/GapSide"), collision.gapSide()); + histosQA.fill(HIST("Events/4pion/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/4pion/isCBTOk"), sgSelector.isCBTOk(collision)); + histosQA.fill(HIST("Events/4pion/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosQA.fill(HIST("Events/4pion/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosQA.fill(HIST("Events/4pion/isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); + histosQA.fill(HIST("Events/4pion/vertexX"), collision.posX()); + histosQA.fill(HIST("Events/4pion/vertexY"), collision.posY()); + histosQA.fill(HIST("Events/4pion/vertexZ"), collision.posZ()); + histosQA.fill(HIST("Events/4pion/occupancy"), collision.occupancyInTime()); + histosQA.fill(HIST("Events/4pion/FV0A"), collision.totalFV0AmplitudeA()); + histosQA.fill(HIST("Events/4pion/FT0A"), collision.totalFT0AmplitudeA()); + histosQA.fill(HIST("Events/4pion/FT0C"), collision.totalFT0AmplitudeC()); + histosQA.fill(HIST("Events/4pion/ZDC_A"), collision.energyCommonZNA()); + histosQA.fill(HIST("Events/4pion/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); + histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); + + for (int i = 0; i < numFourPionTracks; i++) { + PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); + // Tracks QA for all four pions + histosQA.fill(HIST("Tracks/pions-from-4pi/dcaXY"), selectedPionTracks[i].dcaXY()); + histosQA.fill(HIST("Tracks/pions-from-4pi/dcaZ"), selectedPionTracks[i].dcaZ()); + histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2NCl"), selectedPionTracks[i].itsChi2NCl()); + histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2"), selectedPionTracks[i].itsChi2NCl() * selectedPionTracks[i].itsNCls()); + histosQA.fill(HIST("Tracks/pions-from-4pi/tpcChi2NCl"), selectedPionTracks[i].tpcChi2NCl()); + histosQA.fill(HIST("Tracks/pions-from-4pi/tpcNClsFindable"), selectedPionTracks[i].tpcNClsFindable()); + // PID for all four pions + histosPID.fill(HIST("pions-from-4pi/tpcSignal"), tVector.P(), selectedPionTracks[i].tpcSignal()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaPi"), selectedPionTracks[i].tpcNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaKa"), selectedPionTracks[i].tpcNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaPr"), selectedPionTracks[i].tpcNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaEl"), selectedPionTracks[i].tpcNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tpcNSigmaMu"), selectedPionTracks[i].tpcNSigmaMu(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofBeta"), tVector.P(), selectedPionTracks[i].beta()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaPi"), selectedPionTracks[i].tofNSigmaPi(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaKa"), selectedPionTracks[i].tofNSigmaKa(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaPr"), selectedPionTracks[i].tofNSigmaPr(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaEl"), selectedPionTracks[i].tofNSigmaEl(), tVector.Pt()); + histosPID.fill(HIST("pions-from-4pi/tofNSigmaMu"), selectedPionTracks[i].tofNSigmaMu(), tVector.Pt()); + } + + PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); + + // Kinematics for pions from 4 pion events + histosKin.fill(HIST("pions-from-4pi"), p1.Pt(), p1.Eta(), p1.Phi(), p1.Rapidity()); + histosKin.fill(HIST("pions-from-4pi"), p2.Pt(), p2.Eta(), p2.Phi(), p2.Rapidity()); + histosKin.fill(HIST("pions-from-4pi"), p3.Pt(), p3.Eta(), p3.Phi(), p3.Rapidity()); + histosKin.fill(HIST("pions-from-4pi"), p4.Pt(), p4.Eta(), p4.Phi(), p4.Rapidity()); + + PxPyPzMVector p1234 = p1 + p2 + p3 + p4; + PxPyPzMVector p13 = p1 + p3; + PxPyPzMVector p14 = p1 + p4; + PxPyPzMVector p23 = p2 + p3; + PxPyPzMVector p24 = p2 + p4; + + // Two Pion Mass combinations + histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M()); + + double fourPiPhiPair1 = collinSoperPhi(p13, p1234); + double fourPiPhiPair2 = collinSoperPhi(p14, p1234); + double fourPiPhiPair3 = collinSoperPhi(p23, p1234); + double fourPiPhiPair4 = collinSoperPhi(p24, p1234); + + double fourPiCosThetaPair1 = collinSoperCosTheta(p13, p1234); + double fourPiCosThetaPair2 = collinSoperCosTheta(p14, p1234); + double fourPiCosThetaPair3 = collinSoperCosTheta(p23, p1234); + double fourPiCosThetaPair4 = collinSoperCosTheta(p24, p1234); + + double mDiff13 = std::abs((p13.M() - mRho0)); + double mDiff14 = std::abs((p14.M() - mRho0)); + double mDiff23 = std::abs((p23.M() - mRho0)); + double mDiff24 = std::abs((p24.M() - mRho0)); + if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex); + } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair2, fourPiPhiPair2, runIndex); + } else if ((mDiff23 < mDiff13) && (mDiff23 < mDiff14) && (mDiff23 < mDiff24)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair3, fourPiPhiPair3, runIndex); + } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair4, fourPiPhiPair4, runIndex); + } + } // End of Analysis for 0 charge events + + // Selecting Events with net charge != 0 for estimation of background + if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { + PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); + PxPyPzMVector p1234 = p1 + p2 + p3 + p4; + // Kinematics for 4 pion system from non 0 charge events + histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } // End of Analysis for non 0 charge events + } // End of 4 Pion Analysis Process function for Pass5 MC + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "Data Analysis Function", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "MC reconstructed Analysis Function", false); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounter, "Event Counter Function", true); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounter, "Track Counter Function", true); From 44b6e117bbec2cbc7d88c316eaed20e80324f0ea Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Fri, 26 Sep 2025 17:19:11 -0400 Subject: [PATCH 17/26] Added MC truth process --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 194 +++++++++++++++++------------- 1 file changed, 109 insertions(+), 85 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 5d9ffdb9f1c..2fea056e611 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -31,6 +31,8 @@ #include "Math/Vector3D.h" #include "Math/Vector4D.h" #include "TPDGCode.h" +#include +#include #include #include @@ -58,6 +60,11 @@ struct ExclusiveRhoTo4Pi { int numPiPlus = 2; int numPiMinus = 2; double mRho0 = 0.77526; // GeV/c^2 + int rhoPrime = 30113; + // Pb-Pb at 5.36 TeV + double halfSqrtSnn = 2680.; + double massOfLead208 = 193.6823; + double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); // Run Numbers static int runNos[113]; static int numRunNums; @@ -67,6 +74,7 @@ struct ExclusiveRhoTo4Pi { HistogramRegistry histosPID{"PID", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosKin{"Kinematics", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histos4piKin{"Four-Pion-Kinematics", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosMCtruth{"MC-Truth", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable Event parameters Configurable ifUPC{"ifUPC", 1, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; @@ -150,7 +158,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Tracks/all/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/all/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/all/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); - histosQA.add("Tracks/all/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/all/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 10}}); histosQA.add("Tracks/all/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Selected tracks in selected events histosQA.add("Tracks/selected/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); @@ -175,65 +183,71 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Tracks/pions-from-4pi/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: PID- All tracks histosPID.add("all/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosPID.add("all/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosPID.add("all/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaPi", "TPC nSigma Pion for all tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaKa", "TPC nSigma Kaon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaPr", "TPC nSigma Proton for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaEl", "TPC nSigma Electron for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaMu", "TPC nSigma Muon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofBeta", "TOF beta vs p ; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("all/tofNSigmaPi", "TOF nSigma Pion for all tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaKa", "TOF nSigma Kaon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaPr", "TOF nSigma Proton for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaEl", "TOF nSigma Electron for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaMu", "TOF nSigma Muon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // QA plots: PID- Selected tracks histosPID.add("selected/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosPID.add("selected/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaPi", "TPC nSigma Pion for all selected tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaKa", "TPC nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaPr", "TPC nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaEl", "TPC nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaMu", "TPC nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosPID.add("selected/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaPi", "TOF nSigma Pion for all selected tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaKa", "TOF nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaPr", "TOF nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaEl", "TOF nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaMu", "TOF nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // QA plots: PID- Pion tracks histosPID.add("pions/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosPID.add("pions/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaPi", "TPC nSigma Pion for all selected pions in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaKa", "TPC nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaPr", "TPC nSigma Proton for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaEl", "TPC nSigma Electron for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaMu", "TPC nSigma Muon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosPID.add("pions/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaPi", "TOF nSigma Pion for all selected pions in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaKa", "TOF nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaPr", "TOF nSigma Proton for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaEl", "TOF nSigma Electron for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaMu", "TOF nSigma Muon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // QA plots: PID- Pion tracks from 4pi events histosPID.add("pions-from-4pi/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosPID.add("pions-from-4pi/tpcNSigmaPi", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaKa", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaPr", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaEl", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaMu", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaPi", "TPC nSigma Pion for all pions from 4-pi events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaKa", "TPC nSigma Kaon for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaPr", "TPC nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaEl", "TPC nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaMu", "TPC nSigma Muon for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosPID.add("pions-from-4pi/tofNSigmaPi", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaKa", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaPr", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaEl", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaMu", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaPi", "TOF nSigma Pion for all pions from 4-pi events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaKa", "TOF nSigma Kaon for all pions from 4-pi eventsn; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaPr", "TOF nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaEl", "TOF nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaMu", "TOF nSigma for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // Kinematics for all particles histosKin.add("all", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("selected", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("pions", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis}); // Rho Prime Kinematics - histos4piKin.add("two-pion-mass", ";m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}}); + histos4piKin.add("two-pion-mass", ";m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{4#pi} [GeV/c^{2}]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}, invMassAxis}); + histos4piKin.add("2PiPlusPiMinusMass", ";m_{#pi^{+}#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}#pi^{+}}#pi^{-}} [GeV/c^2]", kTHnSparseF, {{200, 0, 2.5}, {200, 0, 2.5}, invMassAxis}); + histos4piKin.add("2PiMinusPiPlusMass", ";m_{#pi^{-}#pi^{-}#pi^{+}} [GeV/c^2];m_{#pi^{-}#pi^{-}#pi^{+}} [GeV/c^2];m_{#pi^{+}#pi^{-}#pi^{+}}#pi^{-}} [GeV/c^2]", kTHnSparseF, {{200, 0, 2.5}, {200, 0, 2.5}, invMassAxis}); histos4piKin.add("zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Collin-Soper cos(#theta); Collin-Soper #varphi [rad];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, cosThetaAxis, phiAxis, {113, 0, 113}}); histos4piKin.add("non-zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + // MC truth + histosMCtruth.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, {113, 0, 113}}); + histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + //___________________________________________________________________________________________________________________________ setHistBinLabels(); @@ -285,7 +299,6 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); - std::vector selectedTracks; std::vector selectedPionTracks; std::vector selectedPionPlusTracks; std::vector selectedPionMinusTracks; @@ -295,8 +308,8 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector tVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); // QA-Tracks before selection - histosQA.fill(HIST("Tracks/all/dcaXY"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/all/dcaZ"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/dcaXY"), t0.dcaXY()); + histosQA.fill(HIST("Tracks/all/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/all/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/all/tpcChi2NCl"), t0.tpcChi2NCl()); @@ -349,7 +362,6 @@ struct ExclusiveRhoTo4Pi { // Kinematics for all particles after track selection before selecting pions histosKin.fill(HIST("selected"), tVector.Pt(), tVector.Eta(), tVector.Phi()); - selectedTracks.push_back(t0); if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { selectedPionTracks.push_back(t0); @@ -460,9 +472,15 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p14 = p1 + p4; PxPyPzMVector p23 = p2 + p3; PxPyPzMVector p24 = p2 + p4; + PxPyPzMVector p123 = p1 + p2 + p3; + PxPyPzMVector p124 = p1 + p2 + p4; + PxPyPzMVector p134 = p1 + p3 + p4; + PxPyPzMVector p234 = p2 + p3 + p4; // Two Pion Mass combinations - histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M()); + histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); + histos4piKin.fill(HIST("2PiPlusPiMinusMass"), p123.M(), p124.M(), p1234.M()); + histos4piKin.fill(HIST("2PiMinusPiPlusMass"), p134.M(), p234.M(), p1234.M()); double fourPiPhiPair1 = collinSoperPhi(p13, p1234); double fourPiPhiPair2 = collinSoperPhi(p14, p1234); @@ -648,12 +666,8 @@ struct ExclusiveRhoTo4Pi { void processMCrec(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) { - if (collision.has_udMcCollision()) { - return; - } - // Check if the Event is reconstructed in UPC mode and RCT flag - if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronOk(collision))) { + if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronOk(collision)) || (!collision.has_udMcCollision())) { return; } @@ -678,7 +692,6 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); - std::vector selectedTracks; std::vector selectedPionTracks; std::vector selectedPionPlusTracks; std::vector selectedPionMinusTracks; @@ -745,7 +758,6 @@ struct ExclusiveRhoTo4Pi { // Kinematics for all particles after track selection before selecting pions histosKin.fill(HIST("selected"), tVector.Pt(), tVector.Eta(), tVector.Phi()); - selectedTracks.push_back(t0); if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { selectedPionTracks.push_back(t0); @@ -858,7 +870,7 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p24 = p2 + p4; // Two Pion Mass combinations - histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M()); + histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); double fourPiPhiPair1 = collinSoperPhi(p13, p1234); double fourPiPhiPair2 = collinSoperPhi(p14, p1234); @@ -897,17 +909,43 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 MC + void processMCgen(aod::UDMcCollisions::iterator const& mccollision, aod::UDMcParticles const& mcParticles, aod::BCs const& bcs) + { + + if (bcs.size() == 0) { + return; + } + auto bc = bcs.begin(); + int runIndex = getRunNumberIndex(bc.runNumber()); + + for (const auto& particle : mcParticles) { + PxPyPzMVector p1234; + if ((particle.pdgCode() != rhoPrime) || (particle.daughters_as().size() != numFourPionTracks)) { + continue; + } + for (const auto& daughter : particle.daughters_as()) { + PxPyPzMVector dVector(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); + if (daughter.pdgCode() == PDG_t::kPiPlus) { + histosMCtruth.fill(HIST("pions-from-4pi"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); + p1234 = p1234 + dVector; + } + if (daughter.pdgCode() == PDG_t::kPiMinus) { + histosMCtruth.fill(HIST("pions-from-4pi"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); + p1234 = p1234 + dVector; + } + } // End of loop over daughters + histosMCtruth.fill(HIST("Four-pion"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } // End of loop over MC particles + } // End of processMCgen function + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "Data Analysis Function", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "MC generated Analysis Function", false); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "MC reconstructed Analysis Function", false); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounter, "Event Counter Function", true); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounter, "Track Counter Function", true); double collinSoperPhi(PxPyPzMVector twoPionVector, PxPyPzMVector fourPionVector) { - // Half of the energy per pair of the colliding nucleons. - double halfSqrtSnn = 2680.; - double massOfLead208 = 193.6823; - double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target // Boost to center of mass frame @@ -925,10 +963,6 @@ struct ExclusiveRhoTo4Pi { double collinSoperCosTheta(PxPyPzMVector twoPionVector, PxPyPzMVector fourPionVector) { - // Half of the energy per pair of the colliding nucleons. - double halfSqrtSnn = 2680.; - double massOfLead208 = 193.6823; - double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target // Boost to center of mass frame @@ -1073,33 +1107,23 @@ struct ExclusiveRhoTo4Pi { auto h1 = histosDataCounter.get(HIST("EventsCounts_vs_runNo")); auto h2 = histosDataCounter.get(HIST("TracksCounts_vs_runNo")); - // auto h3 = histosDataCounter.get(HIST("fourPionCounts_0c")); - // auto h4 = histosDataCounter.get(HIST("fourPionCounts_0c_within_rap")); - // auto h5 = histosDataCounter.get(HIST("fourPionCounts_0c_selected")); - // auto h6 = histosDataCounter.get(HIST("fourPionCounts_n0c")); - // auto h7 = histosDataCounter.get(HIST("fourPionCounts_n0c_within_rap")); - // auto h8 = histosDataCounter.get(HIST("fourPionCounts_n0c_selected")); - // auto h9 = histosDataCounter.get(HIST("fourPionCounts_0c_within_mass")); - // auto h10 = histosDataCounter.get(HIST("fourPionCounts_n0c_within_mass")); - - // for (int i = 0; i < numRunNums; ++i) { - // h1->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h2->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h3->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h4->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h5->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h6->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h7->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h8->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h9->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // h10->GetXaxis()->SetBinLabel(i + 1, std::to_string(runNos[i]).c_str()); - // } + + auto h3 = histos4piKin.get(HIST("zero-charge")); + auto h4 = histos4piKin.get(HIST("non-zero-charge")); + auto h5 = histosMCtruth.get(HIST("Four-pion")); + for (int i = 0; i < numEventCuts; ++i) { h1->GetYaxis()->SetBinLabel(i + 1, eventLabels[i].c_str()); } for (int i = 0; i < numTrackCuts; ++i) { h2->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); } + for (int i = 0; i < numRunNums; ++i) { + std::string runLabel = std::to_string(runNos[i]); + h3->GetAxis(7)->SetBinLabel(i + 1, runLabel.c_str()); + h4->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); + h5->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); + } } // end of setHistBinLabels function From eb2e876d5faced51721d67f0d988a1d31feb642a Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Fri, 26 Sep 2025 19:11:06 -0400 Subject: [PATCH 18/26] Fixed unused variable --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 2fea056e611..9e35fbe08ee 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -909,7 +909,7 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 MC - void processMCgen(aod::UDMcCollisions::iterator const& mccollision, aod::UDMcParticles const& mcParticles, aod::BCs const& bcs) + void processMCgen(aod::UDMcCollisions::iterator const&, aod::UDMcParticles const& mcParticles, aod::BCs const& bcs) { if (bcs.size() == 0) { From 536f7d399674289384cc216a3b23e810abbf917c Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Sat, 27 Sep 2025 11:20:01 -0400 Subject: [PATCH 19/26] Removed unnecessary includes --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 9e35fbe08ee..b19fc4c2d30 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -31,8 +31,6 @@ #include "Math/Vector3D.h" #include "Math/Vector4D.h" #include "TPDGCode.h" -#include -#include #include #include From 22c0bf9f2ce7dce12415d2491ba9b2b182ea9545 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Tue, 21 Oct 2025 00:48:52 -0400 Subject: [PATCH 20/26] Modified Combinatorial Background Estimation --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 42 ++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index b19fc4c2d30..d61157de5c2 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -57,6 +57,12 @@ struct ExclusiveRhoTo4Pi { int numFourPionTracks = 4; int numPiPlus = 2; int numPiMinus = 2; + // Numbers for background estimation + int zero = 0; + int one = 1; + int three = 3; + int four = 4; + // PDG Codes and rho mass double mRho0 = 0.77526; // GeV/c^2 int rhoPrime = 30113; // Pb-Pb at 5.36 TeV @@ -237,17 +243,17 @@ struct ExclusiveRhoTo4Pi { histosKin.add("pions", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis}); // Rho Prime Kinematics - histos4piKin.add("two-pion-mass", ";m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{4#pi} [GeV/c^{2}]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}, invMassAxis}); - histos4piKin.add("2PiPlusPiMinusMass", ";m_{#pi^{+}#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}#pi^{+}}#pi^{-}} [GeV/c^2]", kTHnSparseF, {{200, 0, 2.5}, {200, 0, 2.5}, invMassAxis}); - histos4piKin.add("2PiMinusPiPlusMass", ";m_{#pi^{-}#pi^{-}#pi^{+}} [GeV/c^2];m_{#pi^{-}#pi^{-}#pi^{+}} [GeV/c^2];m_{#pi^{+}#pi^{-}#pi^{+}}#pi^{-}} [GeV/c^2]", kTHnSparseF, {{200, 0, 2.5}, {200, 0, 2.5}, invMassAxis}); + histos4piKin.add("two-pion", ";p_{T}^{4#pi} [GeV/c] ;m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{4#pi} [GeV/c^{2}]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}, invMassAxis}); histos4piKin.add("zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Collin-Soper cos(#theta); Collin-Soper #varphi [rad];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, cosThetaAxis, phiAxis, {113, 0, 113}}); histos4piKin.add("non-zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + histos4piKin.add("3piMinus-1piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + histos4piKin.add("3piPlus-1piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + histos4piKin.add("4piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + histos4piKin.add("4piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); // MC truth histosMCtruth.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, {113, 0, 113}}); histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); - - //___________________________________________________________________________________________________________________________ - + //_______________________________________________________________________________________________________________________________________________ setHistBinLabels(); } // End of init function @@ -476,9 +482,7 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p234 = p2 + p3 + p4; // Two Pion Mass combinations - histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); - histos4piKin.fill(HIST("2PiPlusPiMinusMass"), p123.M(), p124.M(), p1234.M()); - histos4piKin.fill(HIST("2PiMinusPiPlusMass"), p134.M(), p234.M(), p1234.M()); + histos4piKin.fill(HIST("two-pion"), p1234.Pt(), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); double fourPiPhiPair1 = collinSoperPhi(p13, p1234); double fourPiPhiPair2 = collinSoperPhi(p14, p1234); @@ -513,6 +517,15 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p1234 = p1 + p2 + p3 + p4; // Kinematics for 4 pion system from non 0 charge events + if (numPionMinusTracks == three && numPiPlusTracks == one) { + histos4piKin.fill(HIST("3piMinus-1piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } else if (numPionMinusTracks == one && numPiPlusTracks == three) { + histos4piKin.fill(HIST("3piPlus-1piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } else if (numPionMinusTracks == four && numPiPlusTracks == zero) { + histos4piKin.fill(HIST("4piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } else if (numPionMinusTracks == zero && numPiPlusTracks == four) { + histos4piKin.fill(HIST("4piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 Data @@ -903,6 +916,15 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p1234 = p1 + p2 + p3 + p4; // Kinematics for 4 pion system from non 0 charge events + if (numPionMinusTracks == three && numPiPlusTracks == one) { + histos4piKin.fill(HIST("3piMinus-1piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } else if (numPionMinusTracks == one && numPiPlusTracks == three) { + histos4piKin.fill(HIST("3piPlus-1piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } else if (numPionMinusTracks == four && numPiPlusTracks == zero) { + histos4piKin.fill(HIST("4piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } else if (numPionMinusTracks == zero && numPiPlusTracks == four) { + histos4piKin.fill(HIST("4piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 MC @@ -1118,6 +1140,8 @@ struct ExclusiveRhoTo4Pi { } for (int i = 0; i < numRunNums; ++i) { std::string runLabel = std::to_string(runNos[i]); + h1->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); + h2->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); h3->GetAxis(7)->SetBinLabel(i + 1, runLabel.c_str()); h4->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); h5->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); From 749231fe0a5ebf3849861968ddfd2306e49115ad Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Mon, 27 Oct 2025 16:50:59 -0400 Subject: [PATCH 21/26] Added Event loss/cuts in tracks counter --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 86 ++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index d61157de5c2..3c570a4efa3 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -118,7 +118,8 @@ struct ExclusiveRhoTo4Pi { { // QA plots: Event and Track Counter histosDataCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {14, 0, 14}}); - histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Track", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + histosDataCounter.add("LostInTrackCut_vs_runNo", "Track Counter Run by Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); // QA plots: event selection-selected events histosQA.add("Events/selected/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); histosQA.add("Events/selected/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); @@ -241,7 +242,7 @@ struct ExclusiveRhoTo4Pi { histosKin.add("all", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("selected", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("pions", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); - histosKin.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis}); + histosKin.add("pions-from-4pion", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis}); // Rho Prime Kinematics histos4piKin.add("two-pion", ";p_{T}^{4#pi} [GeV/c] ;m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{4#pi} [GeV/c^{2}]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}, invMassAxis}); histos4piKin.add("zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Collin-Soper cos(#theta); Collin-Soper #varphi [rad];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, cosThetaAxis, phiAxis, {113, 0, 113}}); @@ -251,7 +252,7 @@ struct ExclusiveRhoTo4Pi { histos4piKin.add("4piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); histos4piKin.add("4piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); // MC truth - histosMCtruth.add("pions-from-4pi", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, {113, 0, 113}}); + histosMCtruth.add("4-pi-pions", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, {113, 0, 113}}); histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); //_______________________________________________________________________________________________________________________________________________ setHistBinLabels(); @@ -466,20 +467,16 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); // Kinematics for pions from 4 pion events - histosKin.fill(HIST("pions-from-4pi"), p1.Pt(), p1.Eta(), p1.Phi(), p1.Rapidity()); - histosKin.fill(HIST("pions-from-4pi"), p2.Pt(), p2.Eta(), p2.Phi(), p2.Rapidity()); - histosKin.fill(HIST("pions-from-4pi"), p3.Pt(), p3.Eta(), p3.Phi(), p3.Rapidity()); - histosKin.fill(HIST("pions-from-4pi"), p4.Pt(), p4.Eta(), p4.Phi(), p4.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p1.Pt(), p1.Eta(), p1.Phi(), p1.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p2.Pt(), p2.Eta(), p2.Phi(), p2.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p3.Pt(), p3.Eta(), p3.Phi(), p3.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p4.Pt(), p4.Eta(), p4.Phi(), p4.Rapidity()); PxPyPzMVector p1234 = p1 + p2 + p3 + p4; PxPyPzMVector p13 = p1 + p3; PxPyPzMVector p14 = p1 + p4; PxPyPzMVector p23 = p2 + p3; PxPyPzMVector p24 = p2 + p4; - PxPyPzMVector p123 = p1 + p2 + p3; - PxPyPzMVector p124 = p1 + p2 + p4; - PxPyPzMVector p134 = p1 + p3 + p4; - PxPyPzMVector p234 = p2 + p3 + p4; // Two Pion Mass combinations histos4piKin.fill(HIST("two-pion"), p1234.Pt(), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); @@ -599,74 +596,121 @@ struct ExclusiveRhoTo4Pi { { int runIndex = getRunNumberIndex(collision.runNumber()); // Check if the Event is reconstructed in UPC mode - if (collision.flags() != ifUPC) { + if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronZdcOk(collision))) { return; } + + bool ifRejectedEvent = false; + for (const auto& track : tracks) { + + if (ifRejectedEvent) { + break; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // is PV contributor if (track.isPVContributor() != useOnlyPVtracks) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 1); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); + // pt cut if (trackVector.Pt() < pTcut) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 2); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); + // eta cut if (std::abs(trackVector.Eta()) > etaCut) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 3); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); + // DCA Z cut if (std::abs(track.dcaZ()) > dcaZcut) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 4); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); + // DCA XY cut float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 5); + ifRejectedEvent = true; continue; } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 5); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); + // ITS Track only if (useITStracksOnly && !track.hasITS()) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 6); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); + // TPC Track only if (useTPCtracksOnly && !track.hasTPC()) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 7); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); + // ITS Chi2 N Clusters cut if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 8); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); + // TPC Chi2 N Clusters cut if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 9); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); + // TPC N Clusters Findable cut if (track.hasTPC() && track.tpcNClsFindable() < tpcNClsFindableCut) { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 10); + ifRejectedEvent = true; continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); + // Selection PID Pion if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); if (track.sign() == 1) { histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 12); + } else { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 12); } if (track.sign() == -1) { histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 13); + } else { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 13); } + } else { + histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 11); + ifRejectedEvent = true; } // End of Selection PID Pion } // End of loop over tracks } // End of processCounter function @@ -869,10 +913,10 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); // Kinematics for pions from 4 pion events - histosKin.fill(HIST("pions-from-4pi"), p1.Pt(), p1.Eta(), p1.Phi(), p1.Rapidity()); - histosKin.fill(HIST("pions-from-4pi"), p2.Pt(), p2.Eta(), p2.Phi(), p2.Rapidity()); - histosKin.fill(HIST("pions-from-4pi"), p3.Pt(), p3.Eta(), p3.Phi(), p3.Rapidity()); - histosKin.fill(HIST("pions-from-4pi"), p4.Pt(), p4.Eta(), p4.Phi(), p4.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p1.Pt(), p1.Eta(), p1.Phi(), p1.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p2.Pt(), p2.Eta(), p2.Phi(), p2.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p3.Pt(), p3.Eta(), p3.Phi(), p3.Rapidity()); + histosKin.fill(HIST("pions-from-4pion"), p4.Pt(), p4.Eta(), p4.Phi(), p4.Rapidity()); PxPyPzMVector p1234 = p1 + p2 + p3 + p4; PxPyPzMVector p13 = p1 + p3; @@ -881,7 +925,7 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p24 = p2 + p4; // Two Pion Mass combinations - histos4piKin.fill(HIST("two-pion-mass"), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); + histos4piKin.fill(HIST("two-pion"), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); double fourPiPhiPair1 = collinSoperPhi(p13, p1234); double fourPiPhiPair2 = collinSoperPhi(p14, p1234); @@ -897,6 +941,7 @@ struct ExclusiveRhoTo4Pi { double mDiff14 = std::abs((p14.M() - mRho0)); double mDiff23 = std::abs((p23.M() - mRho0)); double mDiff24 = std::abs((p24.M() - mRho0)); + if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex); } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { @@ -946,11 +991,11 @@ struct ExclusiveRhoTo4Pi { for (const auto& daughter : particle.daughters_as()) { PxPyPzMVector dVector(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); if (daughter.pdgCode() == PDG_t::kPiPlus) { - histosMCtruth.fill(HIST("pions-from-4pi"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); + histosMCtruth.fill(HIST("4-pi-pions"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); p1234 = p1234 + dVector; } if (daughter.pdgCode() == PDG_t::kPiMinus) { - histosMCtruth.fill(HIST("pions-from-4pi"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); + histosMCtruth.fill(HIST("4-pi-pions"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); p1234 = p1234 + dVector; } } // End of loop over daughters @@ -1127,6 +1172,7 @@ struct ExclusiveRhoTo4Pi { auto h1 = histosDataCounter.get(HIST("EventsCounts_vs_runNo")); auto h2 = histosDataCounter.get(HIST("TracksCounts_vs_runNo")); + auto h21 = histosDataCounter.get(HIST("LostInTrackCut_vs_runNo")); auto h3 = histos4piKin.get(HIST("zero-charge")); auto h4 = histos4piKin.get(HIST("non-zero-charge")); @@ -1137,11 +1183,13 @@ struct ExclusiveRhoTo4Pi { } for (int i = 0; i < numTrackCuts; ++i) { h2->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); + h21->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); } for (int i = 0; i < numRunNums; ++i) { std::string runLabel = std::to_string(runNos[i]); h1->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); h2->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); + h21->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); h3->GetAxis(7)->SetBinLabel(i + 1, runLabel.c_str()); h4->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); h5->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); From a2ad2f42ea89439180c6c94c9720cf22c490e7f6 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Mon, 3 Nov 2025 14:10:49 -0500 Subject: [PATCH 22/26] Modified Track Counter and added counters for MC --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 398 ++++++++++++++++++++---------- 1 file changed, 263 insertions(+), 135 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 9162eda8179..5a2eaf2d67e 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -51,13 +51,10 @@ using PxPyPzMVector = ROOT::Math::PxPyPzMVector; struct ExclusiveRhoTo4Pi { SGSelector sgSelector; - // Defining constants - int numFourPionTracks = 4; - int numPiPlus = 2; - int numPiMinus = 2; // Numbers for background estimation int zero = 0; int one = 1; + int two = 2; int three = 3; int four = 4; // PDG Codes and rho mass @@ -99,7 +96,7 @@ struct ExclusiveRhoTo4Pi { Configurable useTPCtracksOnly{"useTPCtracksOnly", true, "only use tracks with hit in TPC"}; Configurable itsChi2NClsCut{"itsChi2NClsCut", 36, "ITS Chi2NCls"}; Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 4.0, "TPC Chi2NCls"}; - Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min TPC Findable Clusters"}; + Configurable tpcNClsCrossedRowsCut{"tpcNClsCrossedRowsCut", 70, "Min TPC Findable Clusters"}; // Configurable PID parameters Configurable useTOF{"useTOF", true, "if track has TOF use TOF"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 5, "TPC cut"}; @@ -116,8 +113,7 @@ struct ExclusiveRhoTo4Pi { { // QA plots: Event and Track Counter histosDataCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {14, 0, 14}}); - histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Track", kTH2F, {{113, 0, 113}, {14, 0, 14}}); - histosDataCounter.add("LostInTrackCut_vs_runNo", "Track Counter Run by Run; Run Number; Number of Tracks", kTH2F, {{113, 0, 113}, {14, 0, 14}}); + histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Track", kTH2F, {{113, 0, 113}, {13, 0, 13}}); // QA plots: event selection-selected events histosQA.add("Events/selected/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); histosQA.add("Events/selected/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); @@ -162,75 +158,75 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Tracks/all/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/all/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/all/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 10}}); - histosQA.add("Tracks/all/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/all/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Selected tracks in selected events histosQA.add("Tracks/selected/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/selected/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/selected/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/selected/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/selected/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosQA.add("Tracks/selected/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/selected/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Pion tracks in selected events histosQA.add("Tracks/pions/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/pions/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/pions/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosQA.add("Tracks/pions/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/pions/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Pion tracks from 4pi in selected events histosQA.add("Tracks/pions-from-4pi/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions-from-4pi/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions-from-4pi/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/pions-from-4pi/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/pions-from-4pi/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosQA.add("Tracks/pions-from-4pi/tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/pions-from-4pi/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: PID- All tracks - histosPID.add("all/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("all/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600}}); histosPID.add("all/tpcNSigmaPi", "TPC nSigma Pion for all tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tpcNSigmaKa", "TPC nSigma Kaon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tpcNSigmaPr", "TPC nSigma Proton for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tpcNSigmaEl", "TPC nSigma Electron for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tpcNSigmaMu", "TPC nSigma Muon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofBeta", "TOF beta vs p ; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("all/tofBeta", "TOF beta vs p ; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {1500, 0.0, 1.5}}); histosPID.add("all/tofNSigmaPi", "TOF nSigma Pion for all tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tofNSigmaKa", "TOF nSigma Kaon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tofNSigmaPr", "TOF nSigma Proton for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tofNSigmaEl", "TOF nSigma Electron for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("all/tofNSigmaMu", "TOF nSigma Muon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // QA plots: PID- Selected tracks - histosPID.add("selected/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("selected/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600.0}}); histosPID.add("selected/tpcNSigmaPi", "TPC nSigma Pion for all selected tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tpcNSigmaKa", "TPC nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tpcNSigmaPr", "TPC nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tpcNSigmaEl", "TPC nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tpcNSigmaMu", "TPC nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("selected/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 2}, {1500, 0.0, 1.5}}); histosPID.add("selected/tofNSigmaPi", "TOF nSigma Pion for all selected tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tofNSigmaKa", "TOF nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tofNSigmaPr", "TOF nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tofNSigmaEl", "TOF nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("selected/tofNSigmaMu", "TOF nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // QA plots: PID- Pion tracks - histosPID.add("pions/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("pions/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600.0}}); histosPID.add("pions/tpcNSigmaPi", "TPC nSigma Pion for all selected pions in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tpcNSigmaKa", "TPC nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tpcNSigmaPr", "TPC nSigma Proton for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tpcNSigmaEl", "TPC nSigma Electron for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tpcNSigmaMu", "TPC nSigma Muon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("pions/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {1500, 0.0, 1.5}}); histosPID.add("pions/tofNSigmaPi", "TOF nSigma Pion for all selected pions in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tofNSigmaKa", "TOF nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tofNSigmaPr", "TOF nSigma Proton for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tofNSigmaEl", "TOF nSigma Electron for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions/tofNSigmaMu", "TOF nSigma Muon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); // QA plots: PID- Pion tracks from 4pi events - histosPID.add("pions-from-4pi/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosPID.add("pions-from-4pi/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600.0}}); histosPID.add("pions-from-4pi/tpcNSigmaPi", "TPC nSigma Pion for all pions from 4-pi events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tpcNSigmaKa", "TPC nSigma Kaon for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tpcNSigmaPr", "TPC nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tpcNSigmaEl", "TPC nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tpcNSigmaMu", "TPC nSigma Muon for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosPID.add("pions-from-4pi/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {1500, 0.0, 1.5}}); histosPID.add("pions-from-4pi/tofNSigmaPi", "TOF nSigma Pion for all pions from 4-pi events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tofNSigmaKa", "TOF nSigma Kaon for all pions from 4-pi eventsn; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); histosPID.add("pions-from-4pi/tofNSigmaPr", "TOF nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); @@ -254,6 +250,12 @@ struct ExclusiveRhoTo4Pi { histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); //_______________________________________________________________________________________________________________________________________________ setHistBinLabels(); + histosDataCounter.print(); + histosQA.print(); + histosPID.print(); + histosKin.print(); + histos4piKin.print(); + histosMCtruth.print(); } // End of init function //--------------------------------------------------------------------------------------------------------------------------------------------- @@ -316,7 +318,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/all/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/all/tpcChi2NCl"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/all/tpcNClsFindable"), t0.tpcNClsFindable()); + histosQA.fill(HIST("Tracks/all/tpcNClsCrossedRows"), t0.tpcNClsCrossedRows()); // PID before track selection histosPID.fill(HIST("all/tpcSignal"), tVector.P(), t0.tpcSignal()); @@ -336,7 +338,7 @@ struct ExclusiveRhoTo4Pi { histosKin.fill(HIST("all"), tVector.Pt(), tVector.Eta(), tVector.Phi()); // Selecting good tracks - if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { + if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsCrossedRowsCut)) { continue; } @@ -346,7 +348,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/selected/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/selected/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/selected/tpcChi2NCl"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/selected/tpcNClsFindable"), t0.tpcNClsFindable()); + histosQA.fill(HIST("Tracks/selected/tpcNClsCrossedRows"), t0.tpcNClsCrossedRows()); // PID after track selection before selecting pions histosPID.fill(HIST("selected/tpcSignal"), tVector.P(), t0.tpcSignal()); @@ -375,7 +377,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/pions/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/pions/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/pions/tpcChi2NCl"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/pions/tpcNClsFindable"), t0.tpcNClsFindable()); + histosQA.fill(HIST("Tracks/pions/tpcNClsCrossedRows"), t0.tpcNClsCrossedRows()); // PID after selecting pions histosPID.fill(HIST("pions/tpcSignal"), tVector.P(), t0.tpcSignal()); @@ -408,12 +410,12 @@ struct ExclusiveRhoTo4Pi { int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); // event should have exactly 4 pions - if (numSelectedPionTracks != numFourPionTracks) { + if (numSelectedPionTracks != four) { return; } // Selecting Events with net charge = 0 - if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { + if (numPionMinusTracks == two && numPiPlusTracks == two) { // QA-Events-4pion histosQA.fill(HIST("Events/4pion/UPCmode"), collision.flags()); @@ -435,7 +437,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); - for (int i = 0; i < numFourPionTracks; i++) { + for (int i = 0; i < four; i++) { PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); // Tracks QA for all four pions histosQA.fill(HIST("Tracks/pions-from-4pi/dcaXY"), selectedPionTracks[i].dcaXY()); @@ -443,7 +445,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2NCl"), selectedPionTracks[i].itsChi2NCl()); histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2"), selectedPionTracks[i].itsChi2NCl() * selectedPionTracks[i].itsNCls()); histosQA.fill(HIST("Tracks/pions-from-4pi/tpcChi2NCl"), selectedPionTracks[i].tpcChi2NCl()); - histosQA.fill(HIST("Tracks/pions-from-4pi/tpcNClsFindable"), selectedPionTracks[i].tpcNClsFindable()); + histosQA.fill(HIST("Tracks/pions-from-4pi/tpcNClsCrossedRows"), selectedPionTracks[i].tpcNClsCrossedRows()); // PID for all four pions histosPID.fill(HIST("pions-from-4pi/tpcSignal"), tVector.P(), selectedPionTracks[i].tpcSignal()); histosPID.fill(HIST("pions-from-4pi/tpcNSigmaPi"), selectedPionTracks[i].tpcNSigmaPi(), tVector.Pt()); @@ -505,7 +507,7 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for 0 charge events // Selecting Events with net charge != 0 for estimation of background - if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { + if (numPionMinusTracks != two && numPiPlusTracks != two) { PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); @@ -592,130 +594,125 @@ struct ExclusiveRhoTo4Pi { void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) { + int runIndex = getRunNumberIndex(collision.runNumber()); + // Check if the Event is reconstructed in UPC mode if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronZdcOk(collision))) { return; } - bool ifRejectedEvent = false; - for (const auto& track : tracks) { - if (ifRejectedEvent) { - break; - } - + // total tracks histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); + PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); - // is PV contributor - if (track.isPVContributor() != useOnlyPVtracks) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 1); - ifRejectedEvent = true; - continue; - } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); // pt cut if (trackVector.Pt() < pTcut) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 2); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); // eta cut if (std::abs(trackVector.Eta()) > etaCut) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 3); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); // DCA Z cut if (std::abs(track.dcaZ()) > dcaZcut) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 4); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); // DCA XY cut float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 5); - ifRejectedEvent = true; continue; } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 5); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); // ITS Track only if (useITStracksOnly && !track.hasITS()) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 6); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); // TPC Track only if (useTPCtracksOnly && !track.hasTPC()) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 7); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); // ITS Chi2 N Clusters cut if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 8); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); // TPC Chi2 N Clusters cut if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 9); - ifRejectedEvent = true; continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); // TPC N Clusters Findable cut - if (track.hasTPC() && track.tpcNClsFindable() < tpcNClsFindableCut) { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 10); - ifRejectedEvent = true; + if (track.hasTPC() && track.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { continue; } - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); // Selection PID Pion if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); - if (track.sign() == 1) { - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 12); - } else { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 12); - } - if (track.sign() == -1) { - histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 13); - } else { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 13); - } - } else { - histosDataCounter.fill(HIST("LostInTrackCut_vs_runNo"), runIndex, 11); - ifRejectedEvent = true; - } // End of Selection PID Pion + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); + + // is PV contributor + if (track.isPVContributor() != useOnlyPVtracks) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); + } // End of loop over tracks } // End of processCounter function using MCtracks = soa::Join; using MCCollisions = soa::Join; + void processMCgen(aod::UDMcCollisions::iterator const&, aod::UDMcParticles const& mcParticles, aod::BCs const& bcs) + { + + if (bcs.size() == 0) { + return; + } + auto bc = bcs.begin(); + int runIndex = getRunNumberIndex(bc.runNumber()); + + for (const auto& particle : mcParticles) { + PxPyPzMVector p1234; + if ((particle.pdgCode() != rhoPrime) || (particle.daughters_as().size() != four)) { + continue; + } + for (const auto& daughter : particle.daughters_as()) { + PxPyPzMVector dVector(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); + if (daughter.pdgCode() == PDG_t::kPiPlus) { + histosMCtruth.fill(HIST("4-pi-pions"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); + p1234 = p1234 + dVector; + } + if (daughter.pdgCode() == PDG_t::kPiMinus) { + histosMCtruth.fill(HIST("4-pi-pions"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); + p1234 = p1234 + dVector; + } + } // End of loop over daughters + histosMCtruth.fill(HIST("Four-pion"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + } // End of loop over MC particles + } // End of processMCgen function + void processMCrec(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) { @@ -759,7 +756,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/all/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/all/tpcChi2NCl"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/all/tpcNClsFindable"), t0.tpcNClsFindable()); + histosQA.fill(HIST("Tracks/all/tpcNClsCrossedRows"), t0.tpcNClsCrossedRows()); // PID before track selection histosPID.fill(HIST("all/tpcSignal"), tVector.P(), t0.tpcSignal()); @@ -779,7 +776,7 @@ struct ExclusiveRhoTo4Pi { histosKin.fill(HIST("all"), tVector.Pt(), tVector.Eta(), tVector.Phi()); // Selecting good tracks - if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsFindableCut)) { + if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsCrossedRowsCut)) { continue; } if (!t0.has_udMcParticle()) { @@ -792,7 +789,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/selected/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/selected/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/selected/tpcChi2NCl"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/selected/tpcNClsFindable"), t0.tpcNClsFindable()); + histosQA.fill(HIST("Tracks/selected/tpcNClsCrossedRows"), t0.tpcNClsCrossedRows()); // PID after track selection before selecting pions histosPID.fill(HIST("selected/tpcSignal"), tVector.P(), t0.tpcSignal()); @@ -821,7 +818,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/pions/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/pions/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/pions/tpcChi2NCl"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/pions/tpcNClsFindable"), t0.tpcNClsFindable()); + histosQA.fill(HIST("Tracks/pions/tpcNClsCrossedRows"), t0.tpcNClsCrossedRows()); // PID after selecting pions histosPID.fill(HIST("pions/tpcSignal"), tVector.P(), t0.tpcSignal()); @@ -854,12 +851,12 @@ struct ExclusiveRhoTo4Pi { int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); // event should have exactly 4 pions - if (numSelectedPionTracks != numFourPionTracks) { + if (numSelectedPionTracks != four) { return; } // Selecting Events with net charge = 0 - if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { + if (numPionMinusTracks == two && numPiPlusTracks == two) { // QA-Events-4pion histosQA.fill(HIST("Events/4pion/UPCmode"), collision.flags()); @@ -881,7 +878,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); - for (int i = 0; i < numFourPionTracks; i++) { + for (int i = 0; i < four; i++) { PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); // Tracks QA for all four pions histosQA.fill(HIST("Tracks/pions-from-4pi/dcaXY"), selectedPionTracks[i].dcaXY()); @@ -889,7 +886,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2NCl"), selectedPionTracks[i].itsChi2NCl()); histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2"), selectedPionTracks[i].itsChi2NCl() * selectedPionTracks[i].itsNCls()); histosQA.fill(HIST("Tracks/pions-from-4pi/tpcChi2NCl"), selectedPionTracks[i].tpcChi2NCl()); - histosQA.fill(HIST("Tracks/pions-from-4pi/tpcNClsFindable"), selectedPionTracks[i].tpcNClsFindable()); + histosQA.fill(HIST("Tracks/pions-from-4pi/tpcNClsCrossedRows"), selectedPionTracks[i].tpcNClsCrossedRows()); // PID for all four pions histosPID.fill(HIST("pions-from-4pi/tpcSignal"), tVector.P(), selectedPionTracks[i].tpcSignal()); histosPID.fill(HIST("pions-from-4pi/tpcNSigmaPi"), selectedPionTracks[i].tpcNSigmaPi(), tVector.Pt()); @@ -952,7 +949,7 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for 0 charge events // Selecting Events with net charge != 0 for estimation of background - if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { + if (numPionMinusTracks != two && numPiPlusTracks != two) { PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); @@ -972,40 +969,177 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 MC - void processMCgen(aod::UDMcCollisions::iterator const&, aod::UDMcParticles const& mcParticles, aod::BCs const& bcs) + void processEventCounterMC(MCCollisions::iterator const& collision) { - if (bcs.size() == 0) { + // Check if the Event has MC labels + if (!collision.has_udMcCollision()) { return; } - auto bc = bcs.begin(); - int runIndex = getRunNumberIndex(bc.runNumber()); - for (const auto& particle : mcParticles) { - PxPyPzMVector p1234; - if ((particle.pdgCode() != rhoPrime) || (particle.daughters_as().size() != numFourPionTracks)) { + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 0); + // RCT flag + if (!sgSelector.isCBTHadronZdcOk(collision)) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 1); + // UPC mode + if (collision.flags() != ifUPC) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 2); + // vtxITSTPC + if (collision.vtxITSTPC() != vtxITSTPCcut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 3); + // sbp + if (collision.sbp() != sbpCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 4); + // itsROFb + if (collision.itsROFb() != itsROFbCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 5); + // tfb + if (collision.tfb() != tfbCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 6); + // FT0A + if (collision.totalFT0AmplitudeA() > ft0aCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 7); + // FT0C + if (collision.totalFT0AmplitudeC() > ft0cCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 8); + // FV0A + if (collision.totalFV0AmplitudeA() > fv0Cut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); + // ZDC + if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); + // numContributors + if (collision.numContrib() != numPVContrib) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); + // vertexZ + if (std::abs(collision.posZ()) > vZCut) { + return; + } + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 12); + } // End of processCounter function + + void processTrackCounterMC(soa::Filtered::iterator const& collision, MCtracks const& tracks) + { + + int runIndex = getRunNumberIndex(collision.runNumber()); + + // Check if the Event is reconstructed in UPC mode + if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronZdcOk(collision))) { + return; + } + + for (const auto& track : tracks) { + + if (!track.has_udMcParticle()) { continue; } - for (const auto& daughter : particle.daughters_as()) { - PxPyPzMVector dVector(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); - if (daughter.pdgCode() == PDG_t::kPiPlus) { - histosMCtruth.fill(HIST("4-pi-pions"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); - p1234 = p1234 + dVector; - } - if (daughter.pdgCode() == PDG_t::kPiMinus) { - histosMCtruth.fill(HIST("4-pi-pions"), dVector.Pt(), dVector.Eta(), dVector.Phi(), dVector.Rapidity(), runIndex); - p1234 = p1234 + dVector; - } - } // End of loop over daughters - histosMCtruth.fill(HIST("Four-pion"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); - } // End of loop over MC particles - } // End of processMCgen function + + // total tracks + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); + + PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); + + // pt cut + if (trackVector.Pt() < pTcut) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 1); + + // eta cut + if (std::abs(trackVector.Eta()) > etaCut) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 2); + + // DCA Z cut + if (std::abs(track.dcaZ()) > dcaZcut) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 3); + + // DCA XY cut + float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); + if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + continue; + } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 4); + + // ITS Track only + if (useITStracksOnly && !track.hasITS()) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 5); + + // TPC Track only + if (useTPCtracksOnly && !track.hasTPC()) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 6); + + // ITS Chi2 N Clusters cut + if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 7); + + // TPC Chi2 N Clusters cut + if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 8); + + // TPC N Clusters Findable cut + if (track.hasTPC() && track.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); + + // Selection PID Pion + if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); + + // is PV contributor + if (track.isPVContributor() != useOnlyPVtracks) { + continue; + } + histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 11); + + } // End of loop over tracks + } // End of processCounter function PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "Data Analysis Function", true); - PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "MC generated Analysis Function", false); - PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "MC reconstructed Analysis Function", false); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounter, "Event Counter Function", true); PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounter, "Track Counter Function", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "MC generated Analysis Function", false); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "MC reconstructed Analysis Function", false); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processEventCounterMC, "MC Event Counter Function", false); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processTrackCounterMC, "MC Track Counter Function", false); double collinSoperPhi(PxPyPzMVector twoPionVector, PxPyPzMVector fourPionVector) { @@ -1049,7 +1183,7 @@ struct ExclusiveRhoTo4Pi { bool ifTPC, float itschi2nclscut, float tpcchi2nclscut, - float tpcnclsfindablecut) + float tpcNClsCrossedRowscut) { PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // pt cut @@ -1088,7 +1222,7 @@ struct ExclusiveRhoTo4Pi { return false; } // TPC N Clusters Findable cut - if (track.hasTPC() && track.tpcNClsFindable() < tpcnclsfindablecut) { + if (track.hasTPC() && track.tpcNClsCrossedRows() < tpcNClsCrossedRowscut) { return false; } // All cuts passed @@ -1133,6 +1267,7 @@ struct ExclusiveRhoTo4Pi { void setHistBinLabels() { + // Event cuts labels std::string eventLabels[13] = { "No Cuts", "isCBTHadronOk", @@ -1147,31 +1282,26 @@ struct ExclusiveRhoTo4Pi { "ZDC", "n PV Contrib = 4", "V_{z} < " + strFormat(vZCut) + " cm"}; - int numEventCuts = 13; - std::string trackLabels[14] = { + // Tracks cuts labels + std::string trackLabels[12] = { "No Cuts", - "isPVContributor", "pT>" + strFormat(pTcut) + " GeV/c", "|#eta|<" + strFormat(etaCut), "DCA Z<" + strFormat(dcaZcut) + " cm", "DCA XY cut", - "hasITS", - "hasTPC", + "hasITS = " + std::to_string(useITStracksOnly), + "hasTPC = " + std::to_string(useTPCtracksOnly), "itsChi2NCl<" + strFormat(itsChi2NClsCut), "tpcChi2NCl<" + strFormat(tpcChi2NClsCut), - "tpcNClsFindable>" + strFormat(tpcNClsFindableCut), - "#pi tracks", - "#pi^{+} tracks", - "#pi^{-} tracks"}; - - int numTrackCuts = 14; + "tpcNClsCrossedRows>" + strFormat(tpcNClsCrossedRowsCut), + "#pi tracks (TPC+TOF)", + "isPVContributor"}; + int numTrackCuts = 12; auto h1 = histosDataCounter.get(HIST("EventsCounts_vs_runNo")); auto h2 = histosDataCounter.get(HIST("TracksCounts_vs_runNo")); - auto h21 = histosDataCounter.get(HIST("LostInTrackCut_vs_runNo")); - auto h3 = histos4piKin.get(HIST("zero-charge")); auto h4 = histos4piKin.get(HIST("non-zero-charge")); auto h5 = histosMCtruth.get(HIST("Four-pion")); @@ -1181,13 +1311,11 @@ struct ExclusiveRhoTo4Pi { } for (int i = 0; i < numTrackCuts; ++i) { h2->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); - h21->GetYaxis()->SetBinLabel(i + 1, trackLabels[i].c_str()); } for (int i = 0; i < numRunNums; ++i) { std::string runLabel = std::to_string(runNos[i]); h1->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); h2->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); - h21->GetXaxis()->SetBinLabel(i + 1, runLabel.c_str()); h3->GetAxis(7)->SetBinLabel(i + 1, runLabel.c_str()); h4->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); h5->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); From 3323c5175f031ade8523efe5fe7d38e75e0d3ae0 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Mon, 3 Nov 2025 17:48:11 -0500 Subject: [PATCH 23/26] Added option for circular cuts for TPC N Sigma --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 64 +++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 5a2eaf2d67e..e55a4566f29 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -18,6 +18,8 @@ #include "PWGUD/Core/UDHelpers.h" #include "PWGUD/DataModel/UDTables.h" +#include "Common/DataModel/PIDResponse.h" + #include "CommonConstants/PhysicsConstants.h" #include "Framework/ASoA.h" #include "Framework/ASoAHelpers.h" @@ -98,6 +100,7 @@ struct ExclusiveRhoTo4Pi { Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 4.0, "TPC Chi2NCls"}; Configurable tpcNClsCrossedRowsCut{"tpcNClsCrossedRowsCut", 70, "Min TPC Findable Clusters"}; // Configurable PID parameters + Configurable ifCircularNSigmaCut{"ifCircularNSigmaCut", true, "Use circular nsigma cut for PID"}; Configurable useTOF{"useTOF", true, "if track has TOF use TOF"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 5, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 5, "TOF cut"}; @@ -153,6 +156,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/4pion/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); histosQA.add("Events/4pion/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); // QA plots: All tracks in selected events + histosQA.add("Tracks/all/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); histosQA.add("Tracks/all/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/all/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/all/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); @@ -160,6 +164,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Tracks/all/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 10}}); histosQA.add("Tracks/all/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Selected tracks in selected events + histosQA.add("Tracks/selected/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); histosQA.add("Tracks/selected/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/selected/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/selected/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); @@ -167,6 +172,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Tracks/selected/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/selected/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Pion tracks in selected events + histosQA.add("Tracks/pions/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); histosQA.add("Tracks/pions/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); @@ -174,6 +180,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Tracks/pions/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/pions/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // QA plots: Pion tracks from 4pi in selected events + histosQA.add("Tracks/pions-from-4pi/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); histosQA.add("Tracks/pions-from-4pi/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions-from-4pi/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); histosQA.add("Tracks/pions-from-4pi/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); @@ -266,10 +273,8 @@ struct ExclusiveRhoTo4Pi { Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA <= zdcCut) && (o2::aod::udzdc::energyCommonZNC <= zdcCut); Filter bcSelectionCuts = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); // Track Cuts - Filter onlyPVtracks = o2::aod::udtrack::isPVContributor == useOnlyPVtracks; Filter tpcchi2nclsFilter = o2::aod::track::tpcChi2NCl <= tpcChi2NClsCut; Filter itschi2nclsFilter = o2::aod::track::itsChi2NCl <= itsChi2NClsCut; - Filter tpcCuts = (nabs(o2::aod::pidtpc::tpcNSigmaPi) <= nSigmaTPCcut); //--------------------------------------------------------------------------------------------------------------------------------------------- using UDtracks = soa::Join; @@ -313,6 +318,7 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector tVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); // QA-Tracks before selection + histosQA.fill(HIST("Tracks/all/isPVcontributor"), t0.isPVContributor()); histosQA.fill(HIST("Tracks/all/dcaXY"), t0.dcaXY()); histosQA.fill(HIST("Tracks/all/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); @@ -343,6 +349,7 @@ struct ExclusiveRhoTo4Pi { } // QA-Tracks after selection + histosQA.fill(HIST("Tracks/selected/isPVcontributor"), t0.isPVContributor()); histosQA.fill(HIST("Tracks/selected/dcaXY"), t0.dcaXY()); histosQA.fill(HIST("Tracks/selected/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/selected/itsChi2NCl"), t0.itsChi2NCl()); @@ -367,11 +374,12 @@ struct ExclusiveRhoTo4Pi { // Kinematics for all particles after track selection before selecting pions histosKin.fill(HIST("selected"), tVector.Pt(), tVector.Eta(), tVector.Phi()); - if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut, ifCircularNSigmaCut)) { selectedPionTracks.push_back(t0); // QA-Tracks after selecting pions + histosQA.fill(HIST("Tracks/pions/isPVcontributor"), t0.isPVContributor()); histosQA.fill(HIST("Tracks/pions/dcaXY"), t0.dcaXY()); histosQA.fill(HIST("Tracks/pions/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/pions/itsChi2NCl"), t0.itsChi2NCl()); @@ -440,6 +448,7 @@ struct ExclusiveRhoTo4Pi { for (int i = 0; i < four; i++) { PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); // Tracks QA for all four pions + histosQA.fill(HIST("Tracks/pions-from-4pi/isPVcontributor"), selectedPionTracks[i].isPVContributor()); histosQA.fill(HIST("Tracks/pions-from-4pi/dcaXY"), selectedPionTracks[i].dcaXY()); histosQA.fill(HIST("Tracks/pions-from-4pi/dcaZ"), selectedPionTracks[i].dcaZ()); histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2NCl"), selectedPionTracks[i].itsChi2NCl()); @@ -667,7 +676,7 @@ struct ExclusiveRhoTo4Pi { histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); // Selection PID Pion - if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut, ifCircularNSigmaCut)) { continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); @@ -751,6 +760,7 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector tVector(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassPionCharged); // QA-Tracks before selection + histosQA.fill(HIST("Tracks/all/isPVcontributor"), t0.isPVContributor()); histosQA.fill(HIST("Tracks/all/dcaXY"), t0.tpcChi2NCl()); histosQA.fill(HIST("Tracks/all/dcaZ"), t0.tpcChi2NCl()); histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); @@ -784,6 +794,7 @@ struct ExclusiveRhoTo4Pi { } // QA-Tracks after selection + histosQA.fill(HIST("Tracks/selected/isPVcontributor"), t0.isPVContributor()); histosQA.fill(HIST("Tracks/selected/dcaXY"), t0.dcaXY()); histosQA.fill(HIST("Tracks/selected/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/selected/itsChi2NCl"), t0.itsChi2NCl()); @@ -808,11 +819,12 @@ struct ExclusiveRhoTo4Pi { // Kinematics for all particles after track selection before selecting pions histosKin.fill(HIST("selected"), tVector.Pt(), tVector.Eta(), tVector.Phi()); - if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + if (ifPion(t0, useTOF, nSigmaTPCcut, nSigmaTOFcut, ifCircularNSigmaCut)) { selectedPionTracks.push_back(t0); // QA-Tracks after selecting pions + histosQA.fill(HIST("Tracks/pions/isPVcontributor"), t0.isPVContributor()); histosQA.fill(HIST("Tracks/pions/dcaXY"), t0.dcaXY()); histosQA.fill(HIST("Tracks/pions/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/pions/itsChi2NCl"), t0.itsChi2NCl()); @@ -881,6 +893,7 @@ struct ExclusiveRhoTo4Pi { for (int i = 0; i < four; i++) { PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); // Tracks QA for all four pions + histosQA.fill(HIST("Tracks/pions-from-4pi/isPVcontributor"), selectedPionTracks[i].isPVContributor()); histosQA.fill(HIST("Tracks/pions-from-4pi/dcaXY"), selectedPionTracks[i].dcaXY()); histosQA.fill(HIST("Tracks/pions-from-4pi/dcaZ"), selectedPionTracks[i].dcaZ()); histosQA.fill(HIST("Tracks/pions-from-4pi/itsChi2NCl"), selectedPionTracks[i].itsChi2NCl()); @@ -1119,7 +1132,7 @@ struct ExclusiveRhoTo4Pi { histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 9); // Selection PID Pion - if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut)) { + if (ifPion(track, useTOF, nSigmaTPCcut, nSigmaTOFcut, ifCircularNSigmaCut)) { continue; } histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 10); @@ -1213,7 +1226,7 @@ struct ExclusiveRhoTo4Pi { if (ifTPC && !track.hasTPC()) { return false; } - // ITS Chi2 N Clusters cut + // ITS Chi2 per N Clusters cut if (track.hasITS() && track.itsChi2NCl() > itschi2nclscut) { return false; } @@ -1225,26 +1238,43 @@ struct ExclusiveRhoTo4Pi { if (track.hasTPC() && track.tpcNClsCrossedRows() < tpcNClsCrossedRowscut) { return false; } + if (useOnlyPVtracks && !track.isPVContributor()) { + return false; + } // All cuts passed return true; } // End of Track Selection function template - bool ifPion(const T& candidate, bool use_tof, float nsigmatpc_cut, float nsigmatof_cut) + bool ifPion(const T& candidate, bool use_tof, float nsigmatpc_cut, float nsigmatof_cut, bool ifCircularNSigmaCut) { + if (ifCircularNSigmaCut) { + if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < (nsigmatof_cut * nsigmatof_cut)) { + return true; + } - if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < (nsigmatof_cut * nsigmatof_cut)) { - return true; - } + if (use_tof && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } - if (use_tof && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { - return true; - } + if (!use_tof && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } + return false; + } else { + if (use_tof && candidate.hasTOF() && (std::abs(candidate.tofNSigmaPi()) < nsigmatpc_cut) && (std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut)) { + return true; + } - if (!use_tof && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { - return true; + if (use_tof && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } + + if (!use_tof && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } + return false; } - return false; } int getRunNumberIndex(int runNumber) From 90de9a898820b44d0c85961dae001c973b2a2692 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Wed, 5 Nov 2025 19:17:32 -0500 Subject: [PATCH 24/26] made the requested changes and added neutron classes --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 84 ++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index e55a4566f29..edeeade690e 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -18,8 +18,6 @@ #include "PWGUD/Core/UDHelpers.h" #include "PWGUD/DataModel/UDTables.h" -#include "Common/DataModel/PIDResponse.h" - #include "CommonConstants/PhysicsConstants.h" #include "Framework/ASoA.h" #include "Framework/ASoAHelpers.h" @@ -76,13 +74,18 @@ struct ExclusiveRhoTo4Pi { HistogramRegistry histosKin{"Kinematics", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histos4piKin{"Four-Pion-Kinematics", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCtruth{"MC-Truth", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + // Debugging + Configurable debugMode{"debugMode", false, "Enable Debug Mode"}; // Configurable Event parameters Configurable ifUPC{"ifUPC", 1, "Enable UPC reconstruction only"}; Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 50., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; - Configurable zdcCut{"zdcCut", 0., "ZDC threshold"}; + Configurable zdcCut{"zdcCut", 1e6, "ZDC threshold"}; + Configurable zdcMaxAmp{"zdcMaxAmp", 0, "ZDC max amplitude to be 0n"}; + Configurable zdcMaxTime{"zdcMaxTime", 2, "ZDC max time in ns"}; + Configurable neutronClass{"neutronClass", "XnXn", "Neutron class for ZDCs"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; Configurable sbpCut{"sbpCut", 1, "Sbp"}; Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; @@ -128,8 +131,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/selected/FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); histosQA.add("Events/selected/FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); histosQA.add("Events/selected/FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); - histosQA.add("Events/selected/ZDC_A", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); - histosQA.add("Events/selected/ZDC_C", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosQA.add("Events/selected/ZDC", "; ZDC A; ZDC C; time ZDC A [ns]; time ZDC C [ns]", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); histosQA.add("Events/selected/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosQA.add("Events/selected/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosQA.add("Events/selected/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); @@ -147,8 +149,7 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/4pion/FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); histosQA.add("Events/4pion/FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); histosQA.add("Events/4pion/FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); - histosQA.add("Events/4pion/ZDC_A", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); - histosQA.add("Events/4pion/ZDC_C", "ZDC amplitude", kTH1F, {{10000, 0.0, 10000}}); + histosQA.add("Events/4pion/ZDC", "; ZDC A; ZDC C; time ZDC A; time ZDC C", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); histosQA.add("Events/4pion/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosQA.add("Events/4pion/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosQA.add("Events/4pion/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); @@ -257,12 +258,14 @@ struct ExclusiveRhoTo4Pi { histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); //_______________________________________________________________________________________________________________________________________________ setHistBinLabels(); - histosDataCounter.print(); - histosQA.print(); - histosPID.print(); - histosKin.print(); - histos4piKin.print(); - histosMCtruth.print(); + if (debugMode) { + histosDataCounter.print(); + histosQA.print(); + histosPID.print(); + histosKin.print(); + histos4piKin.print(); + histosMCtruth.print(); + } } // End of init function //--------------------------------------------------------------------------------------------------------------------------------------------- @@ -304,8 +307,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/selected/FV0A"), collision.totalFV0AmplitudeA()); histosQA.fill(HIST("Events/selected/FT0A"), collision.totalFT0AmplitudeA()); histosQA.fill(HIST("Events/selected/FT0C"), collision.totalFT0AmplitudeC()); - histosQA.fill(HIST("Events/selected/ZDC_A"), collision.energyCommonZNA()); - histosQA.fill(HIST("Events/selected/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/selected/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); @@ -440,8 +442,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/4pion/FV0A"), collision.totalFV0AmplitudeA()); histosQA.fill(HIST("Events/4pion/FT0A"), collision.totalFT0AmplitudeA()); histosQA.fill(HIST("Events/4pion/FT0C"), collision.totalFT0AmplitudeC()); - histosQA.fill(HIST("Events/4pion/ZDC_A"), collision.energyCommonZNA()); - histosQA.fill(HIST("Events/4pion/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/4pion/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); @@ -585,7 +586,7 @@ struct ExclusiveRhoTo4Pi { } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); // ZDC - if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { + if (!neutronClassSelection(collision)) { return; } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); @@ -746,8 +747,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/selected/FV0A"), collision.totalFV0AmplitudeA()); histosQA.fill(HIST("Events/selected/FT0A"), collision.totalFT0AmplitudeA()); histosQA.fill(HIST("Events/selected/FT0C"), collision.totalFT0AmplitudeC()); - histosQA.fill(HIST("Events/selected/ZDC_A"), collision.energyCommonZNA()); - histosQA.fill(HIST("Events/selected/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/selected/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); @@ -885,8 +885,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/4pion/FV0A"), collision.totalFV0AmplitudeA()); histosQA.fill(HIST("Events/4pion/FT0A"), collision.totalFT0AmplitudeA()); histosQA.fill(HIST("Events/4pion/FT0C"), collision.totalFT0AmplitudeC()); - histosQA.fill(HIST("Events/4pion/ZDC_A"), collision.energyCommonZNA()); - histosQA.fill(HIST("Events/4pion/ZDC_C"), collision.energyCommonZNC()); + histosQA.fill(HIST("Events/4pion/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); @@ -1186,6 +1185,45 @@ struct ExclusiveRhoTo4Pi { return cosThetaCS; } + template + bool neutronClassSelection(C const& coll) + { + + bool aXn = coll.energyCommonZNA() > zdcMaxAmp && coll.timeZNA() < zdcMaxTime; + bool a0n = coll.energyCommonZNA() <= zdcMaxAmp; + bool cXn = coll.energyCommonZNC() > zdcMaxAmp && coll.timeZNC() < zdcMaxTime; + bool c0n = coll.energyCommonZNC() <= zdcMaxAmp; + + if (this->neutronClass.value == "XnXn") { + if (aXn && cXn) { + return true; + } else { + return false; + } + } else if (this->neutronClass.value == "Xn0n") { + if (aXn && c0n) { + return true; + } else { + return false; + } + } else if (this->neutronClass.value == "0nXn") { + if (a0n && cXn) { + return true; + } else { + return false; + } + } else if (this->neutronClass.value == "0n0n") { + if (a0n && c0n) { + return true; + } else { + return false; + } + } else { + // "Any" class + return true; + } + } // End of Neutron class selection function + template bool isSelectedTrack(T const& track, float ptcut, @@ -1309,7 +1347,7 @@ struct ExclusiveRhoTo4Pi { "FT0A<=" + strFormat(fv0Cut), "FT0C<=" + strFormat(ft0cCut), "FV0A<=" + strFormat(ft0aCut), - "ZDC", + "Neutron Class: " + neutronClass.value, "n PV Contrib = 4", "V_{z} < " + strFormat(vZCut) + " cm"}; int numEventCuts = 13; From eb857c7c318225a4fa2d6dfe6131fd4851df43db Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Sat, 8 Nov 2025 23:49:22 -0500 Subject: [PATCH 25/26] Added Neutron Class as THnSparse --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 289 ++++++++++++++---------------- 1 file changed, 138 insertions(+), 151 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index edeeade690e..6ad3e2e1c28 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -82,10 +82,8 @@ struct ExclusiveRhoTo4Pi { Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 50., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; - Configurable zdcCut{"zdcCut", 1e6, "ZDC threshold"}; Configurable zdcMaxAmp{"zdcMaxAmp", 0, "ZDC max amplitude to be 0n"}; Configurable zdcMaxTime{"zdcMaxTime", 2, "ZDC max time in ns"}; - Configurable neutronClass{"neutronClass", "XnXn", "Neutron class for ZDCs"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; Configurable sbpCut{"sbpCut", 1, "Sbp"}; Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; @@ -114,12 +112,18 @@ struct ExclusiveRhoTo4Pi { ConfigurableAxis invMassAxis{"invMassAxis", {1000, 1, 2.5}, "Axis for Phi histograms"}; ConfigurableAxis phiAxis{"phiAxis", {360, -1 * o2::constants::math::PI, o2::constants::math::PI}, "Axis for Phi histograms"}; ConfigurableAxis cosThetaAxis{"cosThetaAxis", {360, -1, 1}, "Axis for cos Theta histograms"}; + AxisSpec neutronClassAxis = {5, 0, 5}; + AxisSpec runNumberAxis = {113, 0, 113}; + AxisSpec fitAxis = {500, -10, 200}; + AxisSpec dcaAxis = {2000, -0.15, 0.15}; + AxisSpec nSigmaAxis = {1000, -15, 12}; + AxisSpec piPtAxis = {1000, 0, 10}; void init(InitContext const&) { // QA plots: Event and Track Counter - histosDataCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {{113, 0, 113}, {14, 0, 14}}); - histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Track", kTH2F, {{113, 0, 113}, {13, 0, 13}}); + histosDataCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {runNumberAxis, {14, 0, 14}}); + histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Track", kTH2F, {runNumberAxis, {13, 0, 13}}); // QA plots: event selection-selected events histosQA.add("Events/selected/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); histosQA.add("Events/selected/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); @@ -128,15 +132,15 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/selected/isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); histosQA.add("Events/selected/isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); histosQA.add("Events/selected/isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); - histosQA.add("Events/selected/FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); - histosQA.add("Events/selected/FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); - histosQA.add("Events/selected/FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); - histosQA.add("Events/selected/ZDC", "; ZDC A; ZDC C; time ZDC A [ns]; time ZDC C [ns]", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); + histosQA.add("Events/selected/FT0A", "T0A amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/selected/FT0C", "T0C amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/selected/FV0A", "V0A amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/selected/ZDC", ";ZDC A;ZDC C;time ZDC A [ns];time ZDC C [ns]", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); histosQA.add("Events/selected/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosQA.add("Events/selected/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosQA.add("Events/selected/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); - histosQA.add("Events/selected/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); - histosQA.add("Events/selected/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); + histosQA.add("Events/selected/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{1000, -0.04, -0.015}}); + histosQA.add("Events/selected/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{1000, -0.02, 0.02}}); + histosQA.add("Events/selected/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -11, 11}}); histosQA.add("Events/selected/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); // QA plots: event selection-4 pion events histosQA.add("Events/4pion/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); @@ -146,100 +150,100 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/4pion/isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); histosQA.add("Events/4pion/isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); histosQA.add("Events/4pion/isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); - histosQA.add("Events/4pion/FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); - histosQA.add("Events/4pion/FT0C", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); - histosQA.add("Events/4pion/FV0A", "V0A amplitude", kTH1F, {{100, 0.0, 100}}); + histosQA.add("Events/4pion/FT0A", "T0A amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/4pion/FT0C", "T0C amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/4pion/FV0A", "V0A amplitude", kTH1F, {fitAxis}); histosQA.add("Events/4pion/ZDC", "; ZDC A; ZDC C; time ZDC A; time ZDC C", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); histosQA.add("Events/4pion/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); histosQA.add("Events/4pion/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosQA.add("Events/4pion/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); - histosQA.add("Events/4pion/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.05, 0.05}}); - histosQA.add("Events/4pion/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{2000, -15, 15}}); + histosQA.add("Events/4pion/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.04, -0.015}}); + histosQA.add("Events/4pion/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.02, 0.02}}); + histosQA.add("Events/4pion/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -11, 11}}); histosQA.add("Events/4pion/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); // QA plots: All tracks in selected events - histosQA.add("Tracks/all/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); - histosQA.add("Tracks/all/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosQA.add("Tracks/all/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosQA.add("Tracks/all/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/all/isPVcontributor", "isPVcontributor; True or not; Counts", kTH1F, {{3, 0, 3}}); + histosQA.add("Tracks/all/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {dcaAxis}); + histosQA.add("Tracks/all/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {dcaAxis}); + histosQA.add("Tracks/all/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/all/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/all/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 10}}); - histosQA.add("Tracks/all/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/all/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{360, 0, 180}}); // QA plots: Selected tracks in selected events - histosQA.add("Tracks/selected/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); - histosQA.add("Tracks/selected/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosQA.add("Tracks/selected/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosQA.add("Tracks/selected/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); + histosQA.add("Tracks/selected/isPVcontributor", "isPVcontributor; True or not; Counts", kTH1F, {{3, 0, 3}}); + histosQA.add("Tracks/selected/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {dcaAxis}); + histosQA.add("Tracks/selected/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {dcaAxis}); + histosQA.add("Tracks/selected/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/selected/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/selected/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosQA.add("Tracks/selected/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/selected/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{360, 0, 180}}); // QA plots: Pion tracks in selected events - histosQA.add("Tracks/pions/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); - histosQA.add("Tracks/pions/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosQA.add("Tracks/pions/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/pions/isPVcontributor", "isPVcontributor; True or not; Counts", kTH1F, {{3, 0, 3}}); + histosQA.add("Tracks/pions/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {dcaAxis}); + histosQA.add("Tracks/pions/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {dcaAxis}); histosQA.add("Tracks/pions/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/pions/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/pions/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosQA.add("Tracks/pions/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/pions/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{360, 0, 180}}); // QA plots: Pion tracks from 4pi in selected events - histosQA.add("Tracks/pions-from-4pi/isPVcontributor", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{3, 0, 3}}); - histosQA.add("Tracks/pions-from-4pi/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); - histosQA.add("Tracks/pions-from-4pi/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{2000, -0.1, 0.1}}); + histosQA.add("Tracks/pions-from-4pi/isPVcontributor", "isPVcontributor; True or not; Counts", kTH1F, {{3, 0, 3}}); + histosQA.add("Tracks/pions-from-4pi/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {dcaAxis}); + histosQA.add("Tracks/pions-from-4pi/dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {dcaAxis}); histosQA.add("Tracks/pions-from-4pi/itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); histosQA.add("Tracks/pions-from-4pi/itsChi2", "ITS Chi2; ITS Chi2; Counts", kTH1F, {{500, 0, 50}}); histosQA.add("Tracks/pions-from-4pi/tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{250, 0, 50}}); - histosQA.add("Tracks/pions-from-4pi/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosQA.add("Tracks/pions-from-4pi/tpcNClsCrossedRows", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{360, 0, 180}}); // QA plots: PID- All tracks histosPID.add("all/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600}}); - histosPID.add("all/tpcNSigmaPi", "TPC nSigma Pion for all tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaKa", "TPC nSigma Kaon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaPr", "TPC nSigma Proton for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaEl", "TPC nSigma Electron for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tpcNSigmaMu", "TPC nSigma Muon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tpcNSigmaPi", "TPC nSigma Pion for all tracks in selected events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tpcNSigmaKa", "TPC nSigma Kaon for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tpcNSigmaPr", "TPC nSigma Proton for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tpcNSigmaEl", "TPC nSigma Electron for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tpcNSigmaMu", "TPC nSigma Muon for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); histosPID.add("all/tofBeta", "TOF beta vs p ; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {1500, 0.0, 1.5}}); - histosPID.add("all/tofNSigmaPi", "TOF nSigma Pion for all tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaKa", "TOF nSigma Kaon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaPr", "TOF nSigma Proton for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaEl", "TOF nSigma Electron for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("all/tofNSigmaMu", "TOF nSigma Muon for all tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("all/tofNSigmaPi", "TOF nSigma Pion for all tracks in selected events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tofNSigmaKa", "TOF nSigma Kaon for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tofNSigmaPr", "TOF nSigma Proton for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tofNSigmaEl", "TOF nSigma Electron for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("all/tofNSigmaMu", "TOF nSigma Muon for all tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); // QA plots: PID- Selected tracks histosPID.add("selected/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600.0}}); - histosPID.add("selected/tpcNSigmaPi", "TPC nSigma Pion for all selected tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaKa", "TPC nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaPr", "TPC nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaEl", "TPC nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tpcNSigmaMu", "TPC nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tpcNSigmaPi", "TPC nSigma Pion for all selected tracks in selected events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tpcNSigmaKa", "TPC nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tpcNSigmaPr", "TPC nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tpcNSigmaEl", "TPC nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tpcNSigmaMu", "TPC nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); histosPID.add("selected/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 2}, {1500, 0.0, 1.5}}); - histosPID.add("selected/tofNSigmaPi", "TOF nSigma Pion for all selected tracks in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaKa", "TOF nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaPr", "TOF nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaEl", "TOF nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("selected/tofNSigmaMu", "TOF nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("selected/tofNSigmaPi", "TOF nSigma Pion for all selected tracks in selected events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tofNSigmaKa", "TOF nSigma Kaon for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tofNSigmaPr", "TOF nSigma Proton for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tofNSigmaEl", "TOF nSigma Electron for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("selected/tofNSigmaMu", "TOF nSigma Muon for all selected tracks in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); // QA plots: PID- Pion tracks histosPID.add("pions/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600.0}}); - histosPID.add("pions/tpcNSigmaPi", "TPC nSigma Pion for all selected pions in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaKa", "TPC nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaPr", "TPC nSigma Proton for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaEl", "TPC nSigma Electron for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tpcNSigmaMu", "TPC nSigma Muon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tpcNSigmaPi", "TPC nSigma Pion for all selected pions in selected events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tpcNSigmaKa", "TPC nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tpcNSigmaPr", "TPC nSigma Proton for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tpcNSigmaEl", "TPC nSigma Electron for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tpcNSigmaMu", "TPC nSigma Muon for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); histosPID.add("pions/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {1500, 0.0, 1.5}}); - histosPID.add("pions/tofNSigmaPi", "TOF nSigma Pion for all selected pions in selected events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaKa", "TOF nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaPr", "TOF nSigma Proton for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaEl", "TOF nSigma Electron for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions/tofNSigmaMu", "TOF nSigma Muon for all selected pions in selected events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions/tofNSigmaPi", "TOF nSigma Pion for all selected pions in selected events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tofNSigmaKa", "TOF nSigma Kaon for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tofNSigmaPr", "TOF nSigma Proton for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tofNSigmaEl", "TOF nSigma Electron for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions/tofNSigmaMu", "TOF nSigma Muon for all selected pions in selected events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); // QA plots: PID- Pion tracks from 4pi events histosPID.add("pions-from-4pi/tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 3}, {5000, 0.0, 600.0}}); - histosPID.add("pions-from-4pi/tpcNSigmaPi", "TPC nSigma Pion for all pions from 4-pi events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaKa", "TPC nSigma Kaon for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaPr", "TPC nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaEl", "TPC nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tpcNSigmaMu", "TPC nSigma Muon for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tpcNSigmaPi", "TPC nSigma Pion for all pions from 4-pi events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tpcNSigmaKa", "TPC nSigma Kaon for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tpcNSigmaPr", "TPC nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tpcNSigmaEl", "TPC nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tpcNSigmaMu", "TPC nSigma Muon for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); histosPID.add("pions-from-4pi/tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {1500, 0.0, 1.5}}); - histosPID.add("pions-from-4pi/tofNSigmaPi", "TOF nSigma Pion for all pions from 4-pi events; Events", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaKa", "TOF nSigma Kaon for all pions from 4-pi eventsn; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaPr", "TOF nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaEl", "TOF nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); - histosPID.add("pions-from-4pi/tofNSigmaMu", "TOF nSigma for all pions from 4-pi events; Entries", kTH2F, {{1000, -15, 15}, {1000, 0, 10}}); + histosPID.add("pions-from-4pi/tofNSigmaPi", "TOF nSigma Pion for all pions from 4-pi events; Events", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tofNSigmaKa", "TOF nSigma Kaon for all pions from 4-pi eventsn; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tofNSigmaPr", "TOF nSigma Proton for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tofNSigmaEl", "TOF nSigma Electron for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); + histosPID.add("pions-from-4pi/tofNSigmaMu", "TOF nSigma for all pions from 4-pi events; Entries", kTH2F, {nSigmaAxis, piPtAxis}); // Kinematics for all particles histosKin.add("all", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); histosKin.add("selected", ";pT [GeV/c]; #eta;#varphi", kTH3F, {pTAxis, etaAxis, phiAxis}); @@ -247,15 +251,15 @@ struct ExclusiveRhoTo4Pi { histosKin.add("pions-from-4pion", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis}); // Rho Prime Kinematics histos4piKin.add("two-pion", ";p_{T}^{4#pi} [GeV/c] ;m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{#pi^{+}#pi^{-}} [GeV/c^2];m_{4#pi} [GeV/c^{2}]", kTHnSparseF, {{100, 0, 2}, {100, 0, 2}, {100, 0, 2}, {100, 0, 2}, invMassAxis}); - histos4piKin.add("zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Collin-Soper cos(#theta); Collin-Soper #varphi [rad];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, cosThetaAxis, phiAxis, {113, 0, 113}}); - histos4piKin.add("non-zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); - histos4piKin.add("3piMinus-1piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); - histos4piKin.add("3piPlus-1piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); - histos4piKin.add("4piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); - histos4piKin.add("4piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + histos4piKin.add("zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Collin-Soper cos(#theta); Collin-Soper #varphi [rad];Run Number; Neutron Class", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, cosThetaAxis, phiAxis, runNumberAxis, neutronClassAxis}); + histos4piKin.add("non-zero-charge", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number; Neutron Class", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, runNumberAxis, neutronClassAxis}); + histos4piKin.add("3piMinus-1piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number; Neutron Class", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, runNumberAxis, neutronClassAxis}); + histos4piKin.add("3piPlus-1piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number; Neutron Class", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, runNumberAxis, neutronClassAxis}); + histos4piKin.add("4piPlus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number; Neutron Class", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, runNumberAxis, neutronClassAxis}); + histos4piKin.add("4piMinus", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}]; Run Number; Neutron Class", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, runNumberAxis, neutronClassAxis}); // MC truth - histosMCtruth.add("4-pi-pions", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, {113, 0, 113}}); - histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, {113, 0, 113}}); + histosMCtruth.add("4-pi-pions", ";pT [GeV/c]; #eta;#varphi;y ", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, runNumberAxis}); + histosMCtruth.add("Four-pion", ";pT [GeV/c]; #eta; #varphi [rad];y; m_{4#pi} [GeV/c^{2}];Run Number", kTHnSparseF, {pTAxis, etaAxis, phiAxis, rapidityAxis, invMassAxis, runNumberAxis}); //_______________________________________________________________________________________________________________________________________________ setHistBinLabels(); if (debugMode) { @@ -273,7 +277,6 @@ struct ExclusiveRhoTo4Pi { Filter vertexZcut = (nabs(o2::aod::collision::posZ) <= vZCut); Filter numPVcontributorsCut = (o2::aod::collision::numContrib == numPVContrib); Filter fitcuts = (o2::aod::udcollision::totalFV0AmplitudeA <= fv0Cut) && (o2::aod::udcollision::totalFT0AmplitudeA <= ft0aCut) && (o2::aod::udcollision::totalFT0AmplitudeC <= ft0cCut); - Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA <= zdcCut) && (o2::aod::udzdc::energyCommonZNC <= zdcCut); Filter bcSelectionCuts = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); // Track Cuts Filter tpcchi2nclsFilter = o2::aod::track::tpcChi2NCl <= tpcChi2NClsCut; @@ -292,10 +295,11 @@ struct ExclusiveRhoTo4Pi { } int runIndex = getRunNumberIndex(collision.runNumber()); + int neutClass = getNeutronClass(collision); histosQA.fill(HIST("Events/selected/UPCmode"), collision.flags()); histosQA.fill(HIST("Events/selected/GapSide"), collision.gapSide()); - histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); histosQA.fill(HIST("Events/selected/isCBTOk"), sgSelector.isCBTOk(collision)); histosQA.fill(HIST("Events/selected/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); histosQA.fill(HIST("Events/selected/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); @@ -430,7 +434,7 @@ struct ExclusiveRhoTo4Pi { // QA-Events-4pion histosQA.fill(HIST("Events/4pion/UPCmode"), collision.flags()); histosQA.fill(HIST("Events/4pion/GapSide"), collision.gapSide()); - histosQA.fill(HIST("Events/4pion/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/4pion/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); histosQA.fill(HIST("Events/4pion/isCBTOk"), sgSelector.isCBTOk(collision)); histosQA.fill(HIST("Events/4pion/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); histosQA.fill(HIST("Events/4pion/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); @@ -506,13 +510,13 @@ struct ExclusiveRhoTo4Pi { double mDiff23 = std::abs((p23.M() - mRho0)); double mDiff24 = std::abs((p24.M() - mRho0)); if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex, neutClass); } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair2, fourPiPhiPair2, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair2, fourPiPhiPair2, runIndex, neutClass); } else if ((mDiff23 < mDiff13) && (mDiff23 < mDiff14) && (mDiff23 < mDiff24)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair3, fourPiPhiPair3, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair3, fourPiPhiPair3, runIndex, neutClass); } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair4, fourPiPhiPair4, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair4, fourPiPhiPair4, runIndex, neutClass); } } // End of Analysis for 0 charge events @@ -525,15 +529,15 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p1234 = p1 + p2 + p3 + p4; // Kinematics for 4 pion system from non 0 charge events if (numPionMinusTracks == three && numPiPlusTracks == one) { - histos4piKin.fill(HIST("3piMinus-1piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("3piMinus-1piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } else if (numPionMinusTracks == one && numPiPlusTracks == three) { - histos4piKin.fill(HIST("3piPlus-1piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("3piPlus-1piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } else if (numPionMinusTracks == four && numPiPlusTracks == zero) { - histos4piKin.fill(HIST("4piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("4piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } else if (numPionMinusTracks == zero && numPiPlusTracks == four) { - histos4piKin.fill(HIST("4piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("4piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } - histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 Data @@ -585,21 +589,16 @@ struct ExclusiveRhoTo4Pi { return; } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); - // ZDC - if (!neutronClassSelection(collision)) { - return; - } - histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // numContributors if (collision.numContrib() != numPVContrib) { return; } - histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // vertexZ if (std::abs(collision.posZ()) > vZCut) { return; } - histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 12); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); } // End of processCounter function void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) @@ -732,10 +731,11 @@ struct ExclusiveRhoTo4Pi { } int runIndex = getRunNumberIndex(collision.runNumber()); + int neutClass = getNeutronClass(collision); histosQA.fill(HIST("Events/selected/UPCmode"), collision.flags()); histosQA.fill(HIST("Events/selected/GapSide"), collision.gapSide()); - histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); histosQA.fill(HIST("Events/selected/isCBTOk"), sgSelector.isCBTOk(collision)); histosQA.fill(HIST("Events/selected/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); histosQA.fill(HIST("Events/selected/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); @@ -873,7 +873,7 @@ struct ExclusiveRhoTo4Pi { // QA-Events-4pion histosQA.fill(HIST("Events/4pion/UPCmode"), collision.flags()); histosQA.fill(HIST("Events/4pion/GapSide"), collision.gapSide()); - histosQA.fill(HIST("Events/4pion/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut)); + histosQA.fill(HIST("Events/4pion/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); histosQA.fill(HIST("Events/4pion/isCBTOk"), sgSelector.isCBTOk(collision)); histosQA.fill(HIST("Events/4pion/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); histosQA.fill(HIST("Events/4pion/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); @@ -950,13 +950,13 @@ struct ExclusiveRhoTo4Pi { double mDiff24 = std::abs((p24.M() - mRho0)); if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex, neutClass); } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair2, fourPiPhiPair2, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair2, fourPiPhiPair2, runIndex, neutClass); } else if ((mDiff23 < mDiff13) && (mDiff23 < mDiff14) && (mDiff23 < mDiff24)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair3, fourPiPhiPair3, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair3, fourPiPhiPair3, runIndex, neutClass); } else if ((mDiff24 < mDiff13) && (mDiff24 < mDiff14) && (mDiff24 < mDiff23)) { - histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair4, fourPiPhiPair4, runIndex); + histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair4, fourPiPhiPair4, runIndex, neutClass); } } // End of Analysis for 0 charge events @@ -969,15 +969,15 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p1234 = p1 + p2 + p3 + p4; // Kinematics for 4 pion system from non 0 charge events if (numPionMinusTracks == three && numPiPlusTracks == one) { - histos4piKin.fill(HIST("3piMinus-1piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("3piMinus-1piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } else if (numPionMinusTracks == one && numPiPlusTracks == three) { - histos4piKin.fill(HIST("3piPlus-1piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("3piPlus-1piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } else if (numPionMinusTracks == four && numPiPlusTracks == zero) { - histos4piKin.fill(HIST("4piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("4piMinus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } else if (numPionMinusTracks == zero && numPiPlusTracks == four) { - histos4piKin.fill(HIST("4piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("4piPlus"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } - histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex); + histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Pass5 MC @@ -1035,21 +1035,16 @@ struct ExclusiveRhoTo4Pi { return; } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); - // ZDC - if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) { - return; - } - histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // numContributors if (collision.numContrib() != numPVContrib) { return; } - histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); // vertexZ if (std::abs(collision.posZ()) > vZCut) { return; } - histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 12); + histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); } // End of processCounter function void processTrackCounterMC(soa::Filtered::iterator const& collision, MCtracks const& tracks) @@ -1186,7 +1181,7 @@ struct ExclusiveRhoTo4Pi { } template - bool neutronClassSelection(C const& coll) + int getNeutronClass(C const& coll) { bool aXn = coll.energyCommonZNA() > zdcMaxAmp && coll.timeZNA() < zdcMaxTime; @@ -1194,35 +1189,18 @@ struct ExclusiveRhoTo4Pi { bool cXn = coll.energyCommonZNC() > zdcMaxAmp && coll.timeZNC() < zdcMaxTime; bool c0n = coll.energyCommonZNC() <= zdcMaxAmp; - if (this->neutronClass.value == "XnXn") { - if (aXn && cXn) { - return true; - } else { - return false; - } - } else if (this->neutronClass.value == "Xn0n") { - if (aXn && c0n) { - return true; - } else { - return false; - } - } else if (this->neutronClass.value == "0nXn") { - if (a0n && cXn) { - return true; - } else { - return false; - } - } else if (this->neutronClass.value == "0n0n") { - if (a0n && c0n) { - return true; - } else { - return false; - } + if (aXn && cXn) { + return 1; // XnXn + } else if (aXn && c0n) { + return 2; // Xn0n + } else if (a0n && cXn) { + return 3; // 0nXn + } else if (a0n && c0n) { + return 4; // 0n0n } else { - // "Any" class - return true; + return 0; // undefined } - } // End of Neutron class selection function + } // End of getting neutron class template bool isSelectedTrack(T const& track, @@ -1336,7 +1314,7 @@ struct ExclusiveRhoTo4Pi { { // Event cuts labels - std::string eventLabels[13] = { + std::string eventLabels[12] = { "No Cuts", "isCBTHadronOk", "UPC or STD", @@ -1347,10 +1325,9 @@ struct ExclusiveRhoTo4Pi { "FT0A<=" + strFormat(fv0Cut), "FT0C<=" + strFormat(ft0cCut), "FV0A<=" + strFormat(ft0aCut), - "Neutron Class: " + neutronClass.value, "n PV Contrib = 4", "V_{z} < " + strFormat(vZCut) + " cm"}; - int numEventCuts = 13; + int numEventCuts = 12; // Tracks cuts labels std::string trackLabels[12] = { @@ -1389,6 +1366,16 @@ struct ExclusiveRhoTo4Pi { h5->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); } + h3->GetAxis(8)->SetBinLabel(1, "XnXn"); + h3->GetAxis(8)->SetBinLabel(2, "Xn0n"); + h3->GetAxis(8)->SetBinLabel(3, "0nXn"); + h3->GetAxis(8)->SetBinLabel(4, "0n0n"); + + h4->GetAxis(6)->SetBinLabel(1, "XnXn"); + h4->GetAxis(6)->SetBinLabel(2, "Xn0n"); + h4->GetAxis(6)->SetBinLabel(3, "0nXn"); + h4->GetAxis(6)->SetBinLabel(4, "0n0n"); + } // end of setHistBinLabels function }; // End of Struct exclusiveRhoTo4Pi From 2181ab4a1a482aa63828a937a91c7ed9bfb0ed87 Mon Sep 17 00:00:00 2001 From: ananthapadmanabhan18 Date: Mon, 10 Nov 2025 17:45:57 -0500 Subject: [PATCH 26/26] MOdified the number of PV Contributors requrements --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 272 +++++++++++++++++++----------- 1 file changed, 171 insertions(+), 101 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 6ad3e2e1c28..8cefae2262c 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -84,7 +84,7 @@ struct ExclusiveRhoTo4Pi { Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable zdcMaxAmp{"zdcMaxAmp", 0, "ZDC max amplitude to be 0n"}; Configurable zdcMaxTime{"zdcMaxTime", 2, "ZDC max time in ns"}; - Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; + Configurable maxNpvContrib{"maxNpvContrib", 4, "Max Number of PV Contributors (Must be > 4)"}; Configurable sbpCut{"sbpCut", 1, "Sbp"}; Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; Configurable vtxITSTPCcut{"vtxITSTPCcut", 1, "vtxITSTPCcut"}; @@ -112,18 +112,39 @@ struct ExclusiveRhoTo4Pi { ConfigurableAxis invMassAxis{"invMassAxis", {1000, 1, 2.5}, "Axis for Phi histograms"}; ConfigurableAxis phiAxis{"phiAxis", {360, -1 * o2::constants::math::PI, o2::constants::math::PI}, "Axis for Phi histograms"}; ConfigurableAxis cosThetaAxis{"cosThetaAxis", {360, -1, 1}, "Axis for cos Theta histograms"}; + // Fine Axis Specs AxisSpec neutronClassAxis = {5, 0, 5}; AxisSpec runNumberAxis = {113, 0, 113}; AxisSpec fitAxis = {500, -10, 200}; AxisSpec dcaAxis = {2000, -0.15, 0.15}; AxisSpec nSigmaAxis = {1000, -15, 12}; AxisSpec piPtAxis = {1000, 0, 10}; + AxisSpec pvContributorAxis = {50, 0, 50}; void init(InitContext const&) { // QA plots: Event and Track Counter histosDataCounter.add("EventsCounts_vs_runNo", "Event Counter Run by Run; Run Number; Number of Events", kTH2F, {runNumberAxis, {14, 0, 14}}); histosDataCounter.add("TracksCounts_vs_runNo", "Track Counter Run by Run; Run Number; Number of Track", kTH2F, {runNumberAxis, {13, 0, 13}}); + // QA plots: all events + histosQA.add("Events/all/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); + histosQA.add("Events/all/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/all/TrueGapSide", "True Gap Side; True Gap Side; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/all/isCBTOk", "isCBTOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/all/isCBTHadronOk", "isCBTHadronOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/all/isCBTZdcOk", "isCBTZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/all/isCBTHadronZdcOk", "isCBTHadronZdcOk; bool; Events", kTH1F, {{4, 0, 4}}); + histosQA.add("Events/all/FT0A", "T0A amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/all/FT0C", "T0C amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/all/FV0A", "V0A amplitude", kTH1F, {fitAxis}); + histosQA.add("Events/all/ZDC", ";ZDC A;ZDC C;time ZDC A [ns];time ZDC C [ns]", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); + histosQA.add("Events/all/FDDA", "FDD A signal; FDD A signal; Events", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/all/FDDC", "FDD C signal; FDD C signal; Events", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/all/vertexX", "Vertex X; Vertex X [cm]; Events", kTH1F, {{1000, -0.04, -0.015}}); + histosQA.add("Events/all/vertexY", "Vertex Y; Vertex Y [cm]; Events", kTH1F, {{1000, -0.02, 0.02}}); + histosQA.add("Events/all/vertexZ", "Vertex Z; Vertex Z [cm]; Events", kTH1F, {{1000, -11, 11}}); + histosQA.add("Events/all/occupancy", "Occupancy; Occupancy; Events", kTH1F, {{20000, 0, 20000}}); + histosQA.add("Events/all/nPVContributors", "Number of PV Contributors; Number of PV Contributors; Events", kTH1F, {pvContributorAxis}); // QA plots: event selection-selected events histosQA.add("Events/selected/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); histosQA.add("Events/selected/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); @@ -136,12 +157,13 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/selected/FT0C", "T0C amplitude", kTH1F, {fitAxis}); histosQA.add("Events/selected/FV0A", "V0A amplitude", kTH1F, {fitAxis}); histosQA.add("Events/selected/ZDC", ";ZDC A;ZDC C;time ZDC A [ns];time ZDC C [ns]", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); - histosQA.add("Events/selected/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosQA.add("Events/selected/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosQA.add("Events/selected/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{1000, -0.04, -0.015}}); - histosQA.add("Events/selected/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{1000, -0.02, 0.02}}); - histosQA.add("Events/selected/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -11, 11}}); - histosQA.add("Events/selected/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); + histosQA.add("Events/selected/FDDA", "FDD A signal; FDD A signal; Events", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/selected/FDDC", "FDD C signal; FDD C signal; Events", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/selected/vertexX", "Vertex X; Vertex X [cm]; Events", kTH1F, {{1000, -0.04, -0.015}}); + histosQA.add("Events/selected/vertexY", "Vertex Y; Vertex Y [cm]; Events", kTH1F, {{1000, -0.02, 0.02}}); + histosQA.add("Events/selected/vertexZ", "Vertex Z; Vertex Z [cm]; Events", kTH1F, {{1000, -11, 11}}); + histosQA.add("Events/selected/occupancy", "Occupancy; Occupancy; Events", kTH1F, {{20000, 0, 20000}}); + histosQA.add("Events/selected/nPVContributors", "Number of PV Contributors; Number of PV Contributors; Events", kTH1F, {pvContributorAxis}); // QA plots: event selection-4 pion events histosQA.add("Events/4pion/UPCmode", "UPC mode; Events", kTH1F, {{5, 0, 5}}); histosQA.add("Events/4pion/GapSide", "Gap Side;Gap Side; Events", kTH1F, {{4, 0, 4}}); @@ -154,12 +176,13 @@ struct ExclusiveRhoTo4Pi { histosQA.add("Events/4pion/FT0C", "T0C amplitude", kTH1F, {fitAxis}); histosQA.add("Events/4pion/FV0A", "V0A amplitude", kTH1F, {fitAxis}); histosQA.add("Events/4pion/ZDC", "; ZDC A; ZDC C; time ZDC A; time ZDC C", kTHnSparseF, {{200, -10, 1000}, {200, -10, 1000}, {400, -10, 50}, {400, -10, 10}}); - histosQA.add("Events/4pion/FDDA", "FDD A signal; FDD A signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosQA.add("Events/4pion/FDDC", "FDD C signal; FDD C signal; Counts", kTH1F, {{500, 0.0, 2000}}); - histosQA.add("Events/4pion/vertexX", "Vertex X; Vertex X [cm]; Counts", kTH1F, {{2000, -0.04, -0.015}}); - histosQA.add("Events/4pion/vertexY", "Vertex Y; Vertex Y [cm]; Counts", kTH1F, {{2000, -0.02, 0.02}}); - histosQA.add("Events/4pion/vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -11, 11}}); - histosQA.add("Events/4pion/occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{20000, 0, 20000}}); + histosQA.add("Events/4pion/FDDA", "FDD A signal; FDD A signal; Events", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/4pion/FDDC", "FDD C signal; FDD C signal; Events", kTH1F, {{500, 0.0, 2000}}); + histosQA.add("Events/4pion/vertexX", "Vertex X; Vertex X [cm]; Events", kTH1F, {{2000, -0.04, -0.015}}); + histosQA.add("Events/4pion/vertexY", "Vertex Y; Vertex Y [cm]; Events", kTH1F, {{2000, -0.02, 0.02}}); + histosQA.add("Events/4pion/vertexZ", "Vertex Z; Vertex Z [cm]; Events", kTH1F, {{1000, -11, 11}}); + histosQA.add("Events/4pion/occupancy", "Occupancy; Occupancy; Events", kTH1F, {{20000, 0, 20000}}); + histosQA.add("Events/4pion/nPVContributors", "Number of PV Contributors; Number of PV Contributors; Events", kTH1F, {pvContributorAxis}); // QA plots: All tracks in selected events histosQA.add("Tracks/all/isPVcontributor", "isPVcontributor; True or not; Counts", kTH1F, {{3, 0, 3}}); histosQA.add("Tracks/all/dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {dcaAxis}); @@ -272,31 +295,38 @@ struct ExclusiveRhoTo4Pi { } } // End of init function - //--------------------------------------------------------------------------------------------------------------------------------------------- - // Event Cuts - Filter vertexZcut = (nabs(o2::aod::collision::posZ) <= vZCut); - Filter numPVcontributorsCut = (o2::aod::collision::numContrib == numPVContrib); - Filter fitcuts = (o2::aod::udcollision::totalFV0AmplitudeA <= fv0Cut) && (o2::aod::udcollision::totalFT0AmplitudeA <= ft0aCut) && (o2::aod::udcollision::totalFT0AmplitudeC <= ft0cCut); - Filter bcSelectionCuts = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); - // Track Cuts - Filter tpcchi2nclsFilter = o2::aod::track::tpcChi2NCl <= tpcChi2NClsCut; - Filter itschi2nclsFilter = o2::aod::track::itsChi2NCl <= itsChi2NClsCut; - //--------------------------------------------------------------------------------------------------------------------------------------------- - using UDtracks = soa::Join; using UDCollisions = soa::Join; - void processData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) + void processData(UDCollisions::iterator const& collision, UDtracks const& tracks) { - // Check if the Event is reconstructed in UPC mode and RCT flag - if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronOk(collision))) { - return; - } - int runIndex = getRunNumberIndex(collision.runNumber()); int neutClass = getNeutronClass(collision); + histosQA.fill(HIST("Events/all/UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/all/GapSide"), collision.gapSide()); + histosQA.fill(HIST("Events/all/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); + histosQA.fill(HIST("Events/all/isCBTOk"), sgSelector.isCBTOk(collision)); + histosQA.fill(HIST("Events/all/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosQA.fill(HIST("Events/all/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosQA.fill(HIST("Events/all/isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); + histosQA.fill(HIST("Events/all/vertexX"), collision.posX()); + histosQA.fill(HIST("Events/all/vertexY"), collision.posY()); + histosQA.fill(HIST("Events/all/vertexZ"), collision.posZ()); + histosQA.fill(HIST("Events/all/occupancy"), collision.occupancyInTime()); + histosQA.fill(HIST("Events/all/FV0A"), collision.totalFV0AmplitudeA()); + histosQA.fill(HIST("Events/all/FT0A"), collision.totalFT0AmplitudeA()); + histosQA.fill(HIST("Events/all/FT0C"), collision.totalFT0AmplitudeC()); + histosQA.fill(HIST("Events/all/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); + histosQA.fill(HIST("Events/all/FDDA"), collision.totalFDDAmplitudeA()); + histosQA.fill(HIST("Events/all/FDDC"), collision.totalFDDAmplitudeC()); + histosQA.fill(HIST("Events/all/nPVContributors"), collision.numContrib()); + + if (!isGoodEvent(collision)) { + return; + } + histosQA.fill(HIST("Events/selected/UPCmode"), collision.flags()); histosQA.fill(HIST("Events/selected/GapSide"), collision.gapSide()); histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); @@ -314,6 +344,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/selected/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); + histosQA.fill(HIST("Events/selected/nPVContributors"), collision.numContrib()); std::vector selectedPionTracks; std::vector selectedPionPlusTracks; @@ -350,7 +381,7 @@ struct ExclusiveRhoTo4Pi { histosKin.fill(HIST("all"), tVector.Pt(), tVector.Eta(), tVector.Phi()); // Selecting good tracks - if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsCrossedRowsCut)) { + if (!isGoodTrack(t0)) { continue; } @@ -449,6 +480,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/4pion/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); + histosQA.fill(HIST("Events/4pion/nPVContributors"), collision.numContrib()); for (int i = 0; i < four; i++) { PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); @@ -590,7 +622,7 @@ struct ExclusiveRhoTo4Pi { } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); // numContributors - if (collision.numContrib() != numPVContrib) { + if (collision.numContrib() > maxNpvContrib) { return; } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); @@ -601,13 +633,12 @@ struct ExclusiveRhoTo4Pi { histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); } // End of processCounter function - void processTrackCounter(soa::Filtered::iterator const& collision, UDtracks const& tracks) + void processTrackCounter(UDCollisions::iterator const& collision, UDtracks const& tracks) { int runIndex = getRunNumberIndex(collision.runNumber()); - // Check if the Event is reconstructed in UPC mode - if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronZdcOk(collision))) { + if (!isGoodEvent(collision)) { return; } @@ -722,17 +753,35 @@ struct ExclusiveRhoTo4Pi { } // End of loop over MC particles } // End of processMCgen function - void processMCrec(soa::Filtered::iterator const& collision, soa::Filtered const& tracks) + void processMCrec(MCCollisions::iterator const& collision, MCtracks const& tracks) { - // Check if the Event is reconstructed in UPC mode and RCT flag - if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronOk(collision)) || (!collision.has_udMcCollision())) { - return; - } - int runIndex = getRunNumberIndex(collision.runNumber()); int neutClass = getNeutronClass(collision); + histosQA.fill(HIST("Events/all/UPCmode"), collision.flags()); + histosQA.fill(HIST("Events/all/GapSide"), collision.gapSide()); + histosQA.fill(HIST("Events/all/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); + histosQA.fill(HIST("Events/all/isCBTOk"), sgSelector.isCBTOk(collision)); + histosQA.fill(HIST("Events/all/isCBTHadronOk"), sgSelector.isCBTHadronOk(collision)); + histosQA.fill(HIST("Events/all/isCBTZdcOk"), sgSelector.isCBTZdcOk(collision)); + histosQA.fill(HIST("Events/all/isCBTHadronZdcOk"), sgSelector.isCBTHadronZdcOk(collision)); + histosQA.fill(HIST("Events/all/vertexX"), collision.posX()); + histosQA.fill(HIST("Events/all/vertexY"), collision.posY()); + histosQA.fill(HIST("Events/all/vertexZ"), collision.posZ()); + histosQA.fill(HIST("Events/all/occupancy"), collision.occupancyInTime()); + histosQA.fill(HIST("Events/all/FV0A"), collision.totalFV0AmplitudeA()); + histosQA.fill(HIST("Events/all/FT0A"), collision.totalFT0AmplitudeA()); + histosQA.fill(HIST("Events/all/FT0C"), collision.totalFT0AmplitudeC()); + histosQA.fill(HIST("Events/all/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); + histosQA.fill(HIST("Events/all/FDDA"), collision.totalFDDAmplitudeA()); + histosQA.fill(HIST("Events/all/FDDC"), collision.totalFDDAmplitudeC()); + histosQA.fill(HIST("Events/all/nPVContributors"), collision.numContrib()); + + if ((!isGoodEvent(collision)) || (!collision.has_udMcCollision())) { + return; + } + histosQA.fill(HIST("Events/selected/UPCmode"), collision.flags()); histosQA.fill(HIST("Events/selected/GapSide"), collision.gapSide()); histosQA.fill(HIST("Events/selected/TrueGapSide"), sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, 1e6)); @@ -750,6 +799,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/selected/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/selected/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/selected/FDDC"), collision.totalFDDAmplitudeC()); + histosQA.fill(HIST("Events/selected/nPVContributors"), collision.numContrib()); std::vector selectedPionTracks; std::vector selectedPionPlusTracks; @@ -761,8 +811,8 @@ struct ExclusiveRhoTo4Pi { // QA-Tracks before selection histosQA.fill(HIST("Tracks/all/isPVcontributor"), t0.isPVContributor()); - histosQA.fill(HIST("Tracks/all/dcaXY"), t0.tpcChi2NCl()); - histosQA.fill(HIST("Tracks/all/dcaZ"), t0.tpcChi2NCl()); + histosQA.fill(HIST("Tracks/all/dcaXY"), t0.dcaXY()); + histosQA.fill(HIST("Tracks/all/dcaZ"), t0.dcaZ()); histosQA.fill(HIST("Tracks/all/itsChi2NCl"), t0.itsChi2NCl()); histosQA.fill(HIST("Tracks/all/itsChi2"), t0.itsChi2NCl() * t0.itsNCls()); histosQA.fill(HIST("Tracks/all/tpcChi2NCl"), t0.tpcChi2NCl()); @@ -786,10 +836,7 @@ struct ExclusiveRhoTo4Pi { histosKin.fill(HIST("all"), tVector.Pt(), tVector.Eta(), tVector.Phi()); // Selecting good tracks - if (!isSelectedTrack(t0, pTcut, etaCut, dcaXYcut, dcaZcut, useITStracksOnly, useTPCtracksOnly, itsChi2NClsCut, tpcChi2NClsCut, tpcNClsCrossedRowsCut)) { - continue; - } - if (!t0.has_udMcParticle()) { + if ((!isGoodTrack(t0)) || (!t0.has_udMcParticle())) { continue; } @@ -888,6 +935,7 @@ struct ExclusiveRhoTo4Pi { histosQA.fill(HIST("Events/4pion/ZDC"), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()); histosQA.fill(HIST("Events/4pion/FDDA"), collision.totalFDDAmplitudeA()); histosQA.fill(HIST("Events/4pion/FDDC"), collision.totalFDDAmplitudeC()); + histosQA.fill(HIST("Events/4pion/nPVContributors"), collision.numContrib()); for (int i = 0; i < four; i++) { PxPyPzMVector tVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); @@ -932,7 +980,7 @@ struct ExclusiveRhoTo4Pi { PxPyPzMVector p24 = p2 + p4; // Two Pion Mass combinations - histos4piKin.fill(HIST("two-pion"), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); + histos4piKin.fill(HIST("two-pion"), p1234.Pt(), p13.M(), p14.M(), p23.M(), p24.M(), p1234.M()); double fourPiPhiPair1 = collinSoperPhi(p13, p1234); double fourPiPhiPair2 = collinSoperPhi(p14, p1234); @@ -948,7 +996,6 @@ struct ExclusiveRhoTo4Pi { double mDiff14 = std::abs((p14.M() - mRho0)); double mDiff23 = std::abs((p23.M() - mRho0)); double mDiff24 = std::abs((p24.M() - mRho0)); - if ((mDiff13 < mDiff14) && (mDiff13 < mDiff23) && (mDiff13 < mDiff24)) { histos4piKin.fill(HIST("zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiCosThetaPair1, fourPiPhiPair1, runIndex, neutClass); } else if ((mDiff14 < mDiff13) && (mDiff14 < mDiff23) && (mDiff14 < mDiff24)) { @@ -979,12 +1026,11 @@ struct ExclusiveRhoTo4Pi { } histos4piKin.fill(HIST("non-zero-charge"), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), runIndex, neutClass); } // End of Analysis for non 0 charge events - } // End of 4 Pion Analysis Process function for Pass5 MC + } // End of 4 Pion Analysis Process function for Pass5 Data void processEventCounterMC(MCCollisions::iterator const& collision) { - // Check if the Event has MC labels if (!collision.has_udMcCollision()) { return; } @@ -1036,7 +1082,7 @@ struct ExclusiveRhoTo4Pi { } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 9); // numContributors - if (collision.numContrib() != numPVContrib) { + if (collision.numContrib() > maxNpvContrib) { return; } histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 10); @@ -1047,22 +1093,23 @@ struct ExclusiveRhoTo4Pi { histosDataCounter.fill(HIST("EventsCounts_vs_runNo"), getRunNumberIndex(collision.runNumber()), 11); } // End of processCounter function - void processTrackCounterMC(soa::Filtered::iterator const& collision, MCtracks const& tracks) + void processTrackCounterMC(MCCollisions::iterator const& collision, MCtracks const& tracks) { int runIndex = getRunNumberIndex(collision.runNumber()); - // Check if the Event is reconstructed in UPC mode - if ((collision.flags() != ifUPC) || (!sgSelector.isCBTHadronZdcOk(collision))) { + if (!collision.has_udMcCollision()) { return; } - for (const auto& track : tracks) { + if (!isGoodEvent(collision)) { + return; + } + for (const auto& track : tracks) { if (!track.has_udMcParticle()) { continue; } - // total tracks histosDataCounter.fill(HIST("TracksCounts_vs_runNo"), runIndex, 0); @@ -1181,42 +1228,43 @@ struct ExclusiveRhoTo4Pi { } template - int getNeutronClass(C const& coll) + bool isGoodEvent(C const& coll) { - bool aXn = coll.energyCommonZNA() > zdcMaxAmp && coll.timeZNA() < zdcMaxTime; - bool a0n = coll.energyCommonZNA() <= zdcMaxAmp; - bool cXn = coll.energyCommonZNC() > zdcMaxAmp && coll.timeZNC() < zdcMaxTime; - bool c0n = coll.energyCommonZNC() <= zdcMaxAmp; + // Check if the Event is reconstructed in UPC mode and passes RCT + if ((coll.flags() != ifUPC) || (!sgSelector.isCBTHadronZdcOk(coll))) { + return false; + } - if (aXn && cXn) { - return 1; // XnXn - } else if (aXn && c0n) { - return 2; // Xn0n - } else if (a0n && cXn) { - return 3; // 0nXn - } else if (a0n && c0n) { - return 4; // 0n0n - } else { - return 0; // undefined + // Vertex Z cut + if (std::abs(coll.posZ()) > vZCut) { + return false; + } + + // FIT cuts + if ((coll.totalFV0AmplitudeA() > fv0Cut) || (coll.totalFT0AmplitudeA() > ft0aCut) || (coll.totalFT0AmplitudeC() > ft0cCut)) { + return false; + } + + // BC selection + if ((coll.sbp() != sbpCut) || (coll.itsROFb() != itsROFbCut) || (coll.tfb() != tfbCut) || (coll.vtxITSTPC() != vtxITSTPCcut)) { + return false; + } + + // Number of contributors to primary vertex + if (coll.numContrib() > maxNpvContrib) { + return false; } - } // End of getting neutron class + + return true; + } // End of Good Event function template - bool isSelectedTrack(T const& track, - float ptcut, - float etaCut, - float dcaxycut, - float dcazcut, - bool ifITS, - bool ifTPC, - float itschi2nclscut, - float tpcchi2nclscut, - float tpcNClsCrossedRowscut) + bool isGoodTrack(T const& track) { PxPyPzMVector trackVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // pt cut - if (trackVector.Pt() < ptcut) { + if (trackVector.Pt() < pTcut) { return false; } // eta cut @@ -1224,34 +1272,34 @@ struct ExclusiveRhoTo4Pi { return false; } // DCA Z cut - if (std::fabs(track.dcaZ()) > dcazcut) { + if (std::fabs(track.dcaZ()) > dcaZcut) { return false; } // DCA XY cut float maxDCAxy = 0.0105 + 0.035 / std::pow(trackVector.Pt(), 1.1); - if (dcaxycut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { return false; - } else if (dcaxycut != 0 && (std::fabs(track.dcaXY()) > dcaxycut)) { + } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { return false; } // ITS Track only - if (ifITS && !track.hasITS()) { + if (useITStracksOnly && !track.hasITS()) { return false; } // TPC Track only - if (ifTPC && !track.hasTPC()) { + if (useTPCtracksOnly && !track.hasTPC()) { return false; } // ITS Chi2 per N Clusters cut - if (track.hasITS() && track.itsChi2NCl() > itschi2nclscut) { + if (track.hasITS() && track.itsChi2NCl() > itsChi2NClsCut) { return false; } // TPC Chi2 N Clusters cut - if (track.hasTPC() && track.tpcChi2NCl() > tpcchi2nclscut) { + if (track.hasTPC() && track.tpcChi2NCl() > tpcChi2NClsCut) { return false; } // TPC N Clusters Findable cut - if (track.hasTPC() && track.tpcNClsCrossedRows() < tpcNClsCrossedRowscut) { + if (track.hasTPC() && track.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { return false; } if (useOnlyPVtracks && !track.isPVContributor()) { @@ -1293,6 +1341,28 @@ struct ExclusiveRhoTo4Pi { } } + template + int getNeutronClass(C const& coll) + { + + bool aXn = coll.energyCommonZNA() > zdcMaxAmp && coll.timeZNA() < zdcMaxTime; + bool a0n = coll.energyCommonZNA() <= zdcMaxAmp; + bool cXn = coll.energyCommonZNC() > zdcMaxAmp && coll.timeZNC() < zdcMaxTime; + bool c0n = coll.energyCommonZNC() <= zdcMaxAmp; + + if (aXn && cXn) { + return 1; // XnXn + } else if (aXn && c0n) { + return 2; // Xn0n + } else if (a0n && cXn) { + return 3; // 0nXn + } else if (a0n && c0n) { + return 4; // 0n0n + } else { + return 0; // undefined + } + } // End of getting neutron class + int getRunNumberIndex(int runNumber) { for (int i = 0; i < numRunNums; ++i) { @@ -1325,7 +1395,7 @@ struct ExclusiveRhoTo4Pi { "FT0A<=" + strFormat(fv0Cut), "FT0C<=" + strFormat(ft0cCut), "FV0A<=" + strFormat(ft0aCut), - "n PV Contrib = 4", + "n PV Contrib < " + std::to_string(maxNpvContrib), "V_{z} < " + strFormat(vZCut) + " cm"}; int numEventCuts = 12; @@ -1366,15 +1436,15 @@ struct ExclusiveRhoTo4Pi { h5->GetAxis(5)->SetBinLabel(i + 1, runLabel.c_str()); } - h3->GetAxis(8)->SetBinLabel(1, "XnXn"); - h3->GetAxis(8)->SetBinLabel(2, "Xn0n"); - h3->GetAxis(8)->SetBinLabel(3, "0nXn"); - h3->GetAxis(8)->SetBinLabel(4, "0n0n"); + h3->GetAxis(8)->SetBinLabel(2, "XnXn"); + h3->GetAxis(8)->SetBinLabel(3, "Xn0n"); + h3->GetAxis(8)->SetBinLabel(4, "0nXn"); + h3->GetAxis(8)->SetBinLabel(5, "0n0n"); - h4->GetAxis(6)->SetBinLabel(1, "XnXn"); - h4->GetAxis(6)->SetBinLabel(2, "Xn0n"); - h4->GetAxis(6)->SetBinLabel(3, "0nXn"); - h4->GetAxis(6)->SetBinLabel(4, "0n0n"); + h4->GetAxis(6)->SetBinLabel(2, "XnXn"); + h4->GetAxis(6)->SetBinLabel(3, "Xn0n"); + h4->GetAxis(6)->SetBinLabel(4, "0nXn"); + h4->GetAxis(6)->SetBinLabel(5, "0n0n"); } // end of setHistBinLabels function