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 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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)