From b77a6ad175d6d24d917db238a27d9e05a211809d Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Mon, 10 Nov 2025 17:37:45 +0900 Subject: [PATCH 1/8] Added AC/BC histograms and changed config names --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 662 ++++++++++++------- 1 file changed, 417 insertions(+), 245 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index c1074478415..9a5861f795f 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -11,7 +11,7 @@ /// \file f0980pbpbanalysis.cxx /// \brief f0980 resonance analysis in PbPb collisions -/// \author Junlee Kim (jikim1290@gmail.com) +/// \author Junlee Kim (jikim1290@gmail.com), Sangwoo Park (sangwoo.park@cern.ch) #include #include @@ -79,75 +79,100 @@ struct F0980pbpbanalysis { Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; - Configurable cfgCutVertex{"cfgCutVertex", 10.0, "PV selection"}; - Configurable cfgQvecSel{"cfgQvecSel", true, "Reject events when no QVector"}; - Configurable cfgOccupancySel{"cfgOccupancySel", false, "Occupancy selection"}; - Configurable cfgOccupancyMax{"cfgOccupancyMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; - Configurable cfgOccupancyMin{"cfgOccupancyMin", -100, "minimum occupancy of tracks in neighbouring collisions in a given time range"}; - Configurable cfgNCollinTR{"cfgNCollinTR", false, "Additional selection for the number of coll in time range"}; - Configurable cfgPVSel{"cfgPVSel", false, "Additional PV selection flag for syst"}; - Configurable cfgPV{"cfgPV", 8.0, "Additional PV selection range for syst"}; - - Configurable cfgCentSel{"cfgCentSel", 80., "Centrality selection"}; - Configurable cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 1: FT0C, 2: FT0M"}; - - Configurable cfgMinPt{"cfgMinPt", 0.15, "Minimum transverse momentum for charged track"}; - Configurable cfgMaxEta{"cfgMaxEta", 0.8, "Maximum pseudorapidiy for charged track"}; - Configurable cfgMaxDCArToPVcut{"cfgMaxDCArToPVcut", 0.5, "Maximum transverse DCA"}; - Configurable cfgMaxDCAzToPVcut{"cfgMaxDCAzToPVcut", 2.0, "Maximum longitudinal DCA"}; - Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.8, "TPC Crossed Rows to Findable Clusters"}; - - Configurable cfgRapMin{"cfgRapMin", -0.5, "Minimum rapidity for pair"}; - Configurable cfgRapMax{"cfgRapMax", 0.5, "Maximum rapidity for pair"}; - - Configurable cfgIsPrimaryTrack{"cfgIsPrimaryTrack", true, "Primary track selection"}; - Configurable cfgIsGlobalWoDCATrack{"cfgIsGlobalWoDCATrack", true, "Global track selection without DCA"}; - Configurable cfgIsPVContributor{"cfgIsPVContributor", true, "PV contributor track selection"}; - - Configurable cMaxTOFnSigmaPion{"cMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF - Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC - Configurable cMaxTPCnSigmaPionS{"cMaxTPCnSigmaPionS", 3.0, "TPC nSigma cut for Pion as a standalone"}; - Configurable cfgUSETOF{"cfgUSETOF", false, "TPC usage"}; - Configurable cfgSelectPID{"cfgSelectPID", 0, "PID selection type"}; - Configurable cfgSelectPtl{"cfgSelectPtl", 0, "Particle selection type"}; - - Configurable cfgNMods{"cfgNMods", 1, "The number of modulations of interest starting from 2"}; - Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; + // Evnet Selection Configurables + Configurable cfgEventCutVertex{"cfgEventCutVertex", 10.0, "PV selection"}; + Configurable cfgEventQvecSel{"cfgEventQvecSel", true, "Reject events when no QVector"}; + Configurable cfgEventOccupancySel{"cfgEventOccupancySel", false, "Occupancy selection"}; + Configurable cfgEventOccupancyMax{"cfgEventOccupancyMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; + Configurable cfgEventOccupancyMin{"cfgEventOccupancyMin", -100, "minimum occupancy of tracks in neighbouring collisions in a given time range"}; + Configurable cfgEventNCollinTRSel{"cfgEventNCollinTRSel", false, "Additional selection for the number of coll in time range"}; + Configurable cfgEventPVSel{"cfgEventPVSel", false, "Additional PV selection flag for syst"}; + Configurable cfgEventPV{"cfgEventPV", 8.0, "Additional PV selection range for syst"}; + + Configurable cfgEventCentMax{"cfgEventCentMax", 80., "CentralityMax cut"}; + Configurable cfgEventCentEst{"cfgEventCentEst", 1, "Centrality estimator, 1: FT0C, 2: FT0M"}; + + // Track Selection Configurables + Configurable cfgTrackPtMin{"cfgTrackPtMin", 0.15, "Minimum transverse momentum for charged track"}; + Configurable cfgTrackEtaMax{"cfgTrackEtaMax", 0.8, "Maximum pseudorapidiy for charged track"}; + Configurable cfgTrackDCArToPVcutMax{"cfgTrackDCArToPVcutMax", 0.5, "Maximum transverse DCA"}; + Configurable cfgTrackDCAzToPVcutMax{"cfgTrackDCAzToPVcutMax", 2.0, "Maximum longitudinal DCA"}; + Configurable cfgTrackRapMin{"cfgTrackRapMin", -0.5, "Minimum rapidity for pair"}; + Configurable cfgTrackRapMax{"cfgTrackRapMax", 0.5, "Maximum rapidity for pair"}; + + Configurable cfgTrackIsPrimaryTrack{"cfgTrackIsPrimaryTrack", true, "Primary track selection"}; + Configurable cfgTrackIsGlobalWoDCATrack{"cfgTrackIsGlobalWoDCATrack", true, "Global track selection without DCA"}; + Configurable cfgTrackIsPVContributor{"cfgTrackIsPVContributor", true, "PV contributor track selection"}; + + Configurable cfgTrackNTPCCrossedRows{"cfgTrackNTPCCrossedRows", 70, "nCrossed TPC Rows"}; + Configurable cfgTrackNFindableTPCClusters{"cfgTrackNFindableTPCClusters", 50, "nFindable TPC Clusters"}; + Configurable cfgTrackNRowsOverFindable{"cfgTrackNRowsOverFindable", 1.2, "nRowsOverFindable TPC CLusters"}; + Configurable cfgTrackNTPCChi2{"cfgTrackNTPCChi2", 4.0, "nTPC Chi2 per Cluster"}; + + Configurable cfgTrackNITSChi2{"cfgTrackNITSChi2", 36.0, "nITS Chi2 per Cluster"}; + + // PID Configurables + Configurable cfgPIDUSETOF{"cfgPIDUSETOF", true, "TOF usage"}; + + Configurable cfgPIDMaxTOFnSigmaPion{"cfgPIDMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF + Configurable cfgPIDMaxTPCnSigmaPion{"cfgPIDMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC + Configurable cfgPIDMaxTPCnSigmaPionS{"cfgPIDMaxTPCnSigmaPionS", 3.0, "TPC nSigma cut for Pion as a standalone"}; + Configurable cfgPIDMaxTiednSigmaPion{"cfgPIDMaxTiednSigmaPion", 3.0, "Combined nSigma cut for Pion"}; + + // Flow Configurables + Configurable cfgQvecNMods{"cfgQvecNMods", 1, "The number of modulations of interest starting from 2"}; + Configurable cfgQvecNum{"cfgQvecNum", 7, "The number of total Qvectors for looping over the task"}; Configurable cfgQvecDetName{"cfgQvecDetName", "FT0C", "The name of detector to be analyzed"}; Configurable cfgQvecRefAName{"cfgQvecRefAName", "TPCpos", "The name of detector for reference A"}; Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; - Configurable cfgRotBkgSel{"cfgRotBkgSel", true, "flag to construct rotational backgrounds"}; - Configurable cfgRotBkgNum{"cfgRotBkgNum", 10, "the number of rotational backgrounds"}; + // Rotational Background Configurables + Configurable cfgBkgRotSel{"cfgBkgRotSel", true, "flag to construct rotational backgrounds"}; + Configurable cfgBkgRotNum{"cfgBkgRotNum", 10, "the number of rotational backgrounds"}; - // for phi test - Configurable cfgRatioTPCRowsFinableClsSel{"cfgRatioTPCRowsFinableClsSel", true, "TPC Crossed Rows to Findable Clusters selection flag"}; - Configurable cfgITSClsSel{"cfgITSClsSel", false, "ITS cluster selection flag"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; - Configurable cfgTOFBetaSel{"cfgTOFBetaSel", false, "TOF beta cut selection flag"}; - Configurable cfgTOFBetaCut{"cfgTOFBetaCut", 0.0, "cut TOF beta"}; - Configurable cfgDeepAngleSel{"cfgDeepAngleSel", true, "Deep Angle cut"}; - Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; - Configurable cfgTrackIndexSelType{"cfgTrackIndexSelType", 1, "Index selection type"}; - Configurable cMaxTiednSigmaPion{"cMaxTiednSigmaPion", 3.0, "Combined nSigma cut for Pion"}; - - ConfigurableAxis massAxis{"massAxis", {400, 0.2, 2.2}, "Invariant mass axis"}; - ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}, "Transverse momentum Binning"}; - ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 100}, "Centrality interval"}; - ConfigurableAxis epAxis{"epAxis", {6, 0.0, o2::constants::math::TwoPI}, "EP axis"}; - - // for event mixing + // Mixed Event Background Configurables SliceCache cache; - Configurable cfgNMixedEvents{"cfgNMixedEvents", 10, "Number of mixed events per event"}; - ConfigurableAxis mixingAxisVertex{"mixingAxisVertex", {10, -10, 10}, "Vertex axis for mixing bin"}; - ConfigurableAxis mixingAxisMultiplicity{"mixingAxisMultiplicity", {VARIABLE_WIDTH, 0, 10, 20, 50, 100}, "multiplicity percentile for mixing bin"}; + Configurable cfgBkgMixedNum{"cfgBkgMixedNum", 10, "Number of mixed events per event"}; + ConfigurableAxis mixAxisVertex{"mixAxisVertex", {10, -10, 10}, "Vertex axis for mixing bin"}; + ConfigurableAxis mixAxisCent{"mixAxisCent", {VARIABLE_WIDTH, 0, 10, 20, 50, 100}, "multiplicity percentile for mixing bin"}; // ConfigurableAxis mixingAxisMultiplicity{"mixingAxisMultiplicity", {2000, 0, 10000}, "TPC multiplicity for bin"}; + // List Configurables + Configurable cfgListPID{"cfgListPID", 0, "PID selection type"}; + Configurable cfgListPtl{"cfgListPtl", 0, "Particle selection type"}; + Configurable cfgListPair{"cfgListPair", 2, "Pair selection type"}; + + // Histogram QA Configurables + Configurable cfgQAEventCut{"cfgQAEventCut", true, "Enable Event QA Hists"}; + Configurable cfgQATrackCut{"cfgQATrackCut", true, "Enable Track QA Hists"}; + Configurable cfgQAPIDCut{"cfgQAPIDCut", true, "Enable PID QA Hists"}; + Configurable cfgQAEPCut{"cfgQAEPCut", true, "Enable Event Plane QA Hists"}; + + ConfigurableAxis histAxisDCAz{"histAxisDCAz", {40, -0.2, 0.2}, "DCAz axis"}; + ConfigurableAxis histAxisDCAr{"histAxisDCAr", {40, -0.2, 0.2}, "DCAxy axis"}; + ConfigurableAxis histAxisOccupancy{"histAxisOccupancy", {100, 0.0, 20000}, "Occupancy axis"}; + + // Configurable for axis + ConfigurableAxis axisMass{"axisMass", {400, 0.2, 2.2}, "Invariant mass axis"}; + ConfigurableAxis axisPT{"axisPT", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}, "Transverse momentum Binning"}; + ConfigurableAxis axisCent{"axisCent", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 100}, "Centrality interval"}; + ConfigurableAxis axisEp{"axisEp", {6, 0.0, o2::constants::math::TwoPI}, "EP axis"}; + + // for phi test + Configurable cfgPhiITSClsSel{"cfgPhiITSClsSel", false, "ITS cluster selection flag"}; + Configurable cfgPhiITScluster{"cfgPhiITScluster", 0, "Number of ITS cluster"}; + Configurable cfgPhiTOFBetaSel{"cfgPhiTOFBetaSel", false, "TOF beta cut selection flag"}; + Configurable cfgPhiTOFBetaCut{"cfgPhiTOFBetaCut", 0.0, "cut TOF beta"}; + Configurable cfgPhiDeepAngleSel{"cfgPhiDeepAngleSel", false, "Deep Angle cut"}; + Configurable cfgPhiDeepAngle{"cfgPhiDeepAngle", 0.04, "Deep Angle cut value"}; + TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; + int nmode = 2; + static constexpr double QvecAmpMin = 1e-4; + int detId; int refAId; int refBId; @@ -156,6 +181,10 @@ struct F0980pbpbanalysis { int qVecRefAInd; int qVecRefBInd; + double eventPlaneDet; + double eventPlaneRefA; + double eventPlaneRefB; + float centrality; double angle; @@ -166,6 +195,8 @@ struct F0980pbpbanalysis { // double massPi = o2::constants::physics::MassPionCharged; double massPtl; + int nTotalEvents = 0; + enum CentEstList { FT0C = 0, FT0M = 1, @@ -188,20 +219,26 @@ struct F0980pbpbanalysis { leq = 2 }; + enum QAList { + QAEvent = 1, + QAEP = 2, + QATrack = 3, + QAPID = 4, + QAPIDS = 5 + }; + TRandom* rn = new TRandom(); // float theta2; - Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - Filter acceptanceFilter = (nabs(aod::track::eta) < cfgMaxEta && nabs(aod::track::pt) > cfgMinPt); - Filter cutDCAFilter = (nabs(aod::track::dcaXY) < cfgMaxDCArToPVcut) && (nabs(aod::track::dcaZ) < cfgMaxDCAzToPVcut); - // from phi - // Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCentSel; - // Filter PIDcutFilter = nabs(aod::pidtpc::tpcNSigmaKa) < cMaxTPCnSigmaPion; - // Filter PIDcutFilter = nabs(aod::pidTPCFullKa::tpcNSigmaKa) < cMaxTPCnSigmaPion; + using EventCandidatesOrigin = soa::Join; + using TrackCandidatesOrigin = soa::Join; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgEventCutVertex; + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgTrackEtaMax && nabs(aod::track::pt) > cfgTrackPtMin); + Filter cutDCAFilter = (nabs(aod::track::dcaXY) < cfgTrackDCArToPVcutMax) && (nabs(aod::track::dcaZ) < cfgTrackDCAzToPVcutMax); - using EventCandidates = soa::Filtered>; - using TrackCandidates = soa::Filtered>; - // aod::pidTOFbeta 추가됨 + using EventCandidates = soa::Filtered; + using TrackCandidates = soa::Filtered; using BinningTypeVertexContributor = ColumnBinningPolicy; @@ -225,130 +262,233 @@ struct F0980pbpbanalysis { } } - template - bool eventSelected(TCollision collision) + template + void fillQA(const bool pass, const objType& obj, const int objecttype = 0) { - constexpr double QvecAmpMin = 1e-4; - if (!collision.sel8()) { - return 0; - } - - if (cfgCentSel < centrality) { - return 0; - } - /* - auto multNTracksPV = collision.multNTracksPV(); - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) { - return 0; + if constexpr (requires { obj.posZ(); }) { + if (objecttype == QAEvent) { + if (!pass) { + histos.fill(HIST("EventQA/Vz_BC"), obj.posZ(), 1.0); + histos.fill(HIST("EventQA/CentDist_BC"), centrality, 1.0); + histos.fill(HIST("EventQA/Occupancy_BC"), obj.trackOccupancyInTimeRange(), 1.0); + } else { + histos.fill(HIST("EventQA/Vz_AC"), obj.posZ(), 1.0); + histos.fill(HIST("EventQA/CentDist_AC"), centrality, 1.0); + histos.fill(HIST("EventQA/Occupancy_AC"), obj.trackOccupancyInTimeRange(), 1.0); } - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) { - return 0; + } + if (objecttype == QAEP) { + if (!pass) { + histos.fill(HIST("EventQA/EPhist_BC"), centrality, eventPlaneDet); + histos.fill(HIST("EventQA/EPhistAB_BC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefA))); + histos.fill(HIST("EventQA/EPhistAC_BC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefB))); + histos.fill(HIST("EventQA/EPhistBC_BC"), centrality, std::cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); + } else { + histos.fill(HIST("EventQA/EPhist_AC"), centrality, eventPlaneDet); + histos.fill(HIST("EventQA/EPhistAB_AC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefA))); + histos.fill(HIST("EventQA/EPhistAC_AC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefB))); + histos.fill(HIST("EventQA/EPhistBC_AC"), centrality, std::cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); } - */ - if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { - return 0; - } - if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { - return 0; - } - if (cfgQvecSel && (collision.qvecAmp()[detId] < QvecAmpMin || collision.qvecAmp()[refAId] < QvecAmpMin || collision.qvecAmp()[refBId] < QvecAmpMin)) { - return 0; - } - if (cfgOccupancySel && (collision.trackOccupancyInTimeRange() > cfgOccupancyMax || collision.trackOccupancyInTimeRange() < cfgOccupancyMin)) { - return 0; - } - if (cfgNCollinTR && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - return 0; + } } - if (cfgPVSel && std::abs(collision.posZ()) > cfgPV) { - return 0; + if constexpr (requires { obj.tpcCrossedRowsOverFindableCls(); }) { + if (objecttype == QATrack) { + if (!pass) { + histos.fill(HIST("TrackQA/DCArToPv_BC"), obj.dcaXY()); + histos.fill(HIST("TrackQA/DCAzToPv_BC"), obj.dcaZ()); + histos.fill(HIST("TrackQA/IsPrim_BC"), obj.isPrimaryTrack()); + histos.fill(HIST("TrackQA/IsGood_BC"), obj.isGlobalTrackWoDCA()); + histos.fill(HIST("TrackQA/IsPrimCont_BC"), obj.isPVContributor()); + histos.fill(HIST("TrackQA/FindableTPCClusters_BC"), obj.tpcNClsFindable()); + histos.fill(HIST("TrackQA/FindableTPCRows_BC"), obj.tpcNClsCrossedRows()); + histos.fill(HIST("TrackQA/ClustersVsRows_BC"), obj.tpcCrossedRowsOverFindableCls()); + histos.fill(HIST("TrackQA/TPCChi2_BC"), obj.tpcChi2NCl()); + } else { + histos.fill(HIST("TrackQA/DCArToPv_AC"), obj.dcaXY()); + histos.fill(HIST("TrackQA/DCAzToPv_AC"), obj.dcaZ()); + histos.fill(HIST("TrackQA/IsPrim_AC"), obj.isPrimaryTrack()); + histos.fill(HIST("TrackQA/IsGood_AC"), obj.isGlobalTrackWoDCA()); + histos.fill(HIST("TrackQA/IsPrimCont_AC"), obj.isPVContributor()); + histos.fill(HIST("TrackQA/FindableTPCClusters_AC"), obj.tpcNClsFindable()); + histos.fill(HIST("TrackQA/FindableTPCRows_AC"), obj.tpcNClsCrossedRows()); + histos.fill(HIST("TrackQA/ClustersVsRows_AC"), obj.tpcCrossedRowsOverFindableCls()); + histos.fill(HIST("TrackQA/TPCChi2_AC"), obj.tpcChi2NCl()); + } + } + if (objecttype == QAPID) { + if (!pass) { + histos.fill(HIST("PIDQA/Nsigma_TPC_BC"), obj.pt(), getTpcNSigma(obj)); + histos.fill(HIST("PIDQA/Nsigma_TOF_BC"), obj.pt(), getTofNSigma(obj)); + histos.fill(HIST("PIDQA/TPC_TOF_BC"), getTpcNSigma(obj), getTofNSigma(obj)); + } else { + histos.fill(HIST("PIDQA/Nsigma_TPC_AC"), obj.pt(), getTpcNSigma(obj)); + histos.fill(HIST("PIDQA/Nsigma_TOF_AC"), obj.pt(), getTofNSigma(obj)); + histos.fill(HIST("PIDQA/TPC_TOF_AC"), getTpcNSigma(obj), getTofNSigma(obj)); + } + } + if (objecttype == QAPIDS) { + if (pass) { + histos.fill(HIST("PIDQA/Nsigma_TPC_selected"), obj.pt(), getTpcNSigma(obj)); + histos.fill(HIST("PIDQA/Nsigma_TOF_selected"), obj.pt(), getTofNSigma(obj)); + histos.fill(HIST("PIDQA/TPC_TOF_selected"), getTpcNSigma(obj), getTofNSigma(obj)); + } + } } - return 1; - } // event selection + } - template - bool trackSelected(const TrackType track) + template + bool eventSelected(TCollision collision, const bool QA) { - if (std::abs(track.pt()) < cfgMinPt) { + if (cfgQAEventCut && QA) + fillQA(false, collision, 1); + if (cfgQAEPCut && QA) + fillQA(false, collision, 2); + // + // histos.fill(HIST("EventQA/hnEvents"), 0); + if (std::abs(collision.posZ()) > cfgEventCutVertex) { return 0; } - if (std::fabs(track.eta()) > cfgMaxEta) { - return 0; - } - if (std::fabs(track.dcaXY()) > cfgMaxDCArToPVcut) { + histos.fill(HIST("EventQA/hnEvents"), 1); + if (!collision.sel8()) { return 0; } - if (std::fabs(track.dcaZ()) > cfgMaxDCAzToPVcut) { + histos.fill(HIST("EventQA/hnEvents"), 2); + if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return 0; } - if (cfgIsPVContributor && !track.isPVContributor()) { + histos.fill(HIST("EventQA/hnEvents"), 3); + if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return 0; } - if (cfgIsPrimaryTrack && !track.isPrimaryTrack()) { + histos.fill(HIST("EventQA/hnEvents"), 4); + if (cfgEventNCollinTRSel && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return 0; } - if (cfgIsGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { + histos.fill(HIST("EventQA/hnEvents"), 5); + if (cfgEventQvecSel && (collision.qvecAmp()[detId] < QvecAmpMin || collision.qvecAmp()[refAId] < QvecAmpMin || collision.qvecAmp()[refBId] < QvecAmpMin)) { return 0; } - if (track.tpcNClsFound() < cfgTPCcluster) { + histos.fill(HIST("EventQA/hnEvents"), 6); + if (cfgEventOccupancySel && (collision.trackOccupancyInTimeRange() > cfgEventOccupancyMax || collision.trackOccupancyInTimeRange() < cfgEventOccupancyMin)) { return 0; } - if (cfgRatioTPCRowsFinableClsSel && track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) { + histos.fill(HIST("EventQA/hnEvents"), 7); + if (cfgEventCentMax < centrality) { return 0; } - if (cfgITSClsSel && track.itsNCls() < cfgITScluster) { + /* + auto multNTracksPV = collision.multNTracksPV(); + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) { + return 0; + } + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) { + return 0; + } + */ + histos.fill(HIST("EventQA/hnEvents"), 8); + if (cfgEventPVSel && std::abs(collision.posZ()) > cfgEventPV) { return 0; } + histos.fill(HIST("EventQA/hnEvents"), 9); + histos.fill(HIST("EventQA/hnEvents"), 10); + return 1; + } // event selection + + template + bool trackSelected(const TrackType track, const bool QA) + { + if (cfgQATrackCut && QA) + fillQA(false, track, 3); + // + if (std::abs(track.pt()) < cfgTrackPtMin) { + return 0; + } + if (std::abs(track.eta()) > cfgTrackEtaMax) { + return 0; + } + if (std::abs(track.dcaXY()) > cfgTrackDCArToPVcutMax) { + return 0; + } + if (std::abs(track.dcaZ()) > cfgTrackDCAzToPVcutMax) { + return 0; + } + if (cfgTrackIsPVContributor && !track.isPVContributor()) { + return 0; + } + if (cfgTrackIsPrimaryTrack && !track.isPrimaryTrack()) { + return 0; + } + if (cfgTrackIsGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { + return 0; + } + if (cfgTrackNTPCCrossedRows > 0 && track.tpcNClsCrossedRows() < cfgTrackNTPCCrossedRows) { + return 0; + } + if (cfgTrackNFindableTPCClusters > 0 && track.tpcNClsFindable() < cfgTrackNFindableTPCClusters) { + return 0; + } + if (cfgTrackNRowsOverFindable > 0 && track.tpcCrossedRowsOverFindableCls() > cfgTrackNRowsOverFindable) { + return 0; + } + if (cfgTrackNTPCChi2 > 0 && track.tpcChi2NCl() > cfgTrackNTPCChi2) { + return 0; + } + if (cfgTrackNITSChi2 > 0 && track.itsChi2NCl() > cfgTrackNITSChi2) { + return 0; + } return 1; } template - bool selectionPID(const TrackType track) + bool selectionPID(const TrackType track, const bool QA) { - if (cfgSelectPID == PIDList::PIDRun3) { - if (cfgUSETOF) { - if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { + if (cfgQAPIDCut && QA) + fillQA(false, track, 4); + // + if (cfgListPID == PIDList::PIDRun3) { + if (cfgPIDUSETOF) { + if (std::fabs(track.tofNSigmaPi()) > cfgPIDMaxTOFnSigmaPion) { return 0; } - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPion) { + if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPion) { return 0; } } - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { + if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { return 0; } - } else if (cfgSelectPID == PIDList::PIDRun2) { - if (cfgUSETOF) { + } else if (cfgListPID == PIDList::PIDRun2) { + if (cfgPIDUSETOF) { if (track.hasTOF()) { - if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { + if (std::fabs(track.tofNSigmaPi()) > cfgPIDMaxTOFnSigmaPion) { return 0; } - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPion) { + if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPion) { return 0; } } else { - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { + if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } } else { - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { + if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } - } else if (cfgSelectPID == PIDList::PIDTest) { - if (cfgUSETOF) { + } else if (cfgListPID == PIDList::PIDTest) { + if (cfgPIDUSETOF) { if (track.hasTOF()) { - if ((getTpcNSigma(track) * getTpcNSigma(track) + getTofNSigma(track) * getTofNSigma(track)) > (cMaxTiednSigmaPion * cMaxTiednSigmaPion)) { + if ((getTpcNSigma(track) * getTpcNSigma(track) + getTofNSigma(track) * getTofNSigma(track)) > (cfgPIDMaxTiednSigmaPion * cfgPIDMaxTiednSigmaPion)) { return 0; } } else { - if (std::fabs(getTpcNSigma(track)) > cMaxTPCnSigmaPionS) { + if (std::fabs(getTpcNSigma(track)) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } } else { - if (std::fabs(getTpcNSigma(track)) > cMaxTPCnSigmaPionS) { + if (std::fabs(getTpcNSigma(track)) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } @@ -359,11 +499,11 @@ struct F0980pbpbanalysis { template bool indexSelection(const TrackType1 track1, const TrackType2 track2) { - if (cfgTrackIndexSelType == IndexSelList::woSame) { + if (cfgListPair == IndexSelList::woSame) { if (track2.globalIndex() == track1.globalIndex()) { return 0; } - } else if (cfgTrackIndexSelType == IndexSelList::leq) { + } else if (cfgListPair == IndexSelList::leq) { if (track2.globalIndex() <= track1.globalIndex()) { return 0; } @@ -372,7 +512,7 @@ struct F0980pbpbanalysis { } template - bool selectionPair(const TrackType1 track1, const TrackType2 track2) + bool pairAngleSelection(const TrackType1 track1, const TrackType2 track2) { double pt1, pt2, pz1, pz2, p1, p2, angle; pt1 = track1.pt(); @@ -382,7 +522,7 @@ struct F0980pbpbanalysis { p1 = track1.p(); p2 = track2.p(); angle = std::acos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); - if (cfgDeepAngleSel && angle < cfgDeepAngle) { + if (cfgPhiDeepAngleSel && angle < cfgPhiDeepAngle) { return 0; } return 1; @@ -391,7 +531,7 @@ struct F0980pbpbanalysis { template float getTpcNSigma(const TrackType track) { - if (cfgSelectPtl == PtlList::PtlPion) { + if (cfgListPtl == PtlList::PtlPion) { return track.tpcNSigmaPi(); } else { return track.tpcNSigmaKa(); @@ -401,7 +541,7 @@ struct F0980pbpbanalysis { template float getTofNSigma(const TrackType track) { - if (cfgSelectPtl == PtlList::PtlPion) { + if (cfgListPtl == PtlList::PtlPion) { return track.tofNSigmaPi(); } else { return track.tofNSigmaKa(); @@ -409,57 +549,49 @@ struct F0980pbpbanalysis { } template - void fillHistograms(const CollisionType& collision, - const TracksType& dTracks, int nmode) + void fillHistograms(const CollisionType& collision, const TracksType& dTracks) { - qVecDetInd = detId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - qVecRefAInd = refAId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - qVecRefBInd = refBId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; + qVecDetInd = detId * 4 + 3 + (nmode - 2) * cfgQvecNum * 4; + qVecRefAInd = refAId * 4 + 3 + (nmode - 2) * cfgQvecNum * 4; + qVecRefBInd = refBId * 4 + 3 + (nmode - 2) * cfgQvecNum * 4; - double eventPlaneDet = std::atan2(collision.qvecIm()[qVecDetInd], collision.qvecRe()[qVecDetInd]) / static_cast(nmode); - double eventPlaneRefA = std::atan2(collision.qvecIm()[qVecRefAInd], collision.qvecRe()[qVecRefAInd]) / static_cast(nmode); - double eventPlaneRefB = std::atan2(collision.qvecIm()[qVecRefBInd], collision.qvecRe()[qVecRefBInd]) / static_cast(nmode); + eventPlaneDet = std::atan2(collision.qvecIm()[qVecDetInd], collision.qvecRe()[qVecDetInd]) / static_cast(nmode); + eventPlaneRefA = std::atan2(collision.qvecIm()[qVecRefAInd], collision.qvecRe()[qVecRefAInd]) / static_cast(nmode); + eventPlaneRefB = std::atan2(collision.qvecIm()[qVecRefBInd], collision.qvecRe()[qVecRefBInd]) / static_cast(nmode); - histos.fill(HIST("QA/EPhist"), centrality, eventPlaneDet); - histos.fill(HIST("QA/EPResAB"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefA))); - histos.fill(HIST("QA/EPResAC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefB))); - histos.fill(HIST("QA/EPResBC"), centrality, std::cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); + fillQA(true, collision, 2); // EP QA ROOT::Math::PxPyPzMVector pion1, pion2, pion2Rot, reco, recoRot; for (const auto& trk1 : dTracks) { - if (!trackSelected(trk1)) { + if (!trackSelected(trk1, true)) { continue; } + fillQA(true, trk1, 3); - if (!selectionPID(trk1)) { + if (!selectionPID(trk1, true)) { continue; } - - histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), getTpcNSigma(trk1)); - histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), getTofNSigma(trk1)); - histos.fill(HIST("QA/TPC_TOF"), getTpcNSigma(trk1), getTofNSigma(trk1)); + fillQA(true, trk1, 4); for (const auto& trk2 : dTracks) { - if (!trackSelected(trk2)) { + if (!trackSelected(trk2, false)) { continue; } // PID - if (!selectionPID(trk2)) { + if (!selectionPID(trk2, false)) { continue; } if (trk1.index() == trk2.index()) { - histos.fill(HIST("QA/Nsigma_TPC_selected"), trk1.pt(), getTpcNSigma(trk2)); - histos.fill(HIST("QA/Nsigma_TOF_selected"), trk1.pt(), getTofNSigma(trk2)); - histos.fill(HIST("QA/TPC_TOF_selected"), getTpcNSigma(trk2), getTofNSigma(trk2)); + fillQA(true, trk1, 5); } if (!indexSelection(trk1, trk2)) { continue; } - if (!selectionPair(trk1, trk2)) { + if (cfgPhiDeepAngleSel && !pairAngleSelection(trk1, trk2)) { continue; } @@ -467,7 +599,7 @@ struct F0980pbpbanalysis { pion2 = ROOT::Math::PxPyPzMVector(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; - if (reco.Rapidity() > cfgRapMax || reco.Rapidity() < cfgRapMin) { + if (reco.Rapidity() > cfgTrackRapMax || reco.Rapidity() < cfgTrackRapMin) { continue; } @@ -481,8 +613,8 @@ struct F0980pbpbanalysis { histos.fill(HIST("hInvMass_f0980_LSmm_EPA"), reco.M(), reco.Pt(), centrality, relPhi); } - if (cfgRotBkgSel && trk1.sign() * trk2.sign() < 0) { - for (int nr = 0; nr < cfgRotBkgNum; nr++) { + if (cfgBkgRotSel && trk1.sign() * trk2.sign() < 0) { + for (int nr = 0; nr < cfgBkgRotNum; nr++) { auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); randomPhi += pion2.Phi(); pion2Rot = ROOT::Math::PxPyPzMVector(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPtl); @@ -497,20 +629,20 @@ struct F0980pbpbanalysis { void processEventMixing(EventCandidates const& collisions, TrackCandidates const& tracks) { - int nmode = 2; // second order - qVecDetInd = detId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; + // int nmode = 2; // second order + qVecDetInd = detId * 4 + 3 + (nmode - 2) * cfgQvecNum * 4; auto trackTuple = std::make_tuple(tracks); - BinningTypeVertexContributor binningOnPositions{{mixingAxisVertex, mixingAxisMultiplicity}, true}; - SameKindPair pair{binningOnPositions, cfgNMixedEvents, -1, collisions, trackTuple, &cache}; + BinningTypeVertexContributor binningOnPositions{{mixAxisVertex, mixAxisCent}, true}; + SameKindPair pair{binningOnPositions, cfgBkgMixedNum, -1, collisions, trackTuple, &cache}; ROOT::Math::PxPyPzMVector ptl1, ptl2, recoPtl; for (const auto& [c1, t1, c2, t2] : pair) { - if (cfgCentEst == CentEstList::FT0C) { + if (cfgEventCentEst == CentEstList::FT0C) { centrality = c1.centFT0C(); - } else if (cfgCentEst == CentEstList::FT0M) { + } else if (cfgEventCentEst == CentEstList::FT0M) { centrality = c1.centFT0M(); } - if (!eventSelected(c1) || !eventSelected(c2)) { + if (!eventSelected(c1, false) || !eventSelected(c2, false)) { continue; } if (c1.bcId() == c2.bcId()) { @@ -519,30 +651,30 @@ struct F0980pbpbanalysis { double eventPlaneDet = std::atan2(c1.qvecIm()[qVecDetInd], c1.qvecRe()[qVecDetInd]) / static_cast(nmode); for (const auto& trk1 : t1) { - if (!trackSelected(trk1)) { + if (!trackSelected(trk1, false)) { continue; } - if (!selectionPID(trk1)) { + if (!selectionPID(trk1, false)) { continue; } for (const auto& trk2 : t2) { - if (!trackSelected(trk2)) { + if (!trackSelected(trk2, false)) { continue; } - if (!selectionPID(trk2)) { + if (!selectionPID(trk2, false)) { continue; } - if (!indexSelection(trk1, trk2)) { - continue; - } - if (!selectionPair(trk1, trk2)) { + // if (!indexSelection(trk1, trk2)) { + // continue; + // } + if (cfgPhiDeepAngleSel && !pairAngleSelection(trk1, trk2)) { continue; } ptl1 = ROOT::Math::PxPyPzMVector(trk1.px(), trk1.py(), trk1.pz(), massPtl); ptl2 = ROOT::Math::PxPyPzMVector(trk2.px(), trk2.py(), trk2.pz(), massPtl); recoPtl = ptl1 + ptl2; - if (recoPtl.Rapidity() > cfgRapMax || recoPtl.Rapidity() < cfgRapMin) { + if (recoPtl.Rapidity() > cfgTrackRapMax || recoPtl.Rapidity() < cfgTrackRapMin) { continue; } @@ -550,47 +682,22 @@ struct F0980pbpbanalysis { if (trk1.sign() * trk2.sign() < 0) { histos.fill(HIST("hInvMass_f0980_MixedUS_EPA"), recoPtl.M(), recoPtl.Pt(), centrality, relPhiMix); - } // else if (trk1.sign() > 0 && trk2.sign() > 0) { - // histos.fill(HIST("hInvMass_f0980_MixedLSpp_EPA"), recoPtl.M(), recoPtl.Pt(), centrality, relPhiMix); - // } else if (trk1.sign() < 0 && trk2.sign() < 0) { - // histos.fill(HIST("hInvMass_f0980_MixedLSmm_EPA"), recoPtl.M(), recoPtl.Pt(), centrality, relPhiMix); - // } + } } } - // for (auto& [trk1, trk2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(t1, t2))) { - // if (!trackSelected(trk1) || !trackSelected(trk2)) { - // continue; - // } - // if (!selectionPID(trk1) || !selectionPID(trk2)) { - // continue; - // } - // if (!indexSelection(trk1, trk2)) { - // continue; - // } - // if (!selectionPair(trk1, trk2)) { - // continue; - // } - // ptl1 = ROOT::Math::PxPyPzMVector(trk1.px(), trk1.py(), trk1.pz(), massPtl); - // ptl2 = ROOT::Math::PxPyPzMVector(trk2.px(), trk2.py(), trk2.pz(), massPtl); - // recoPtl = ptl1 + ptl2; - // if (recoPtl.Rapidity() > cfgRapMax || recoPtl.Rapidity() < cfgRapMin) { - // continue; - // } - - // relPhiMix = TVector2::Phi_0_2pi((recoPtl.Phi() - eventPlaneDet) * static_cast(nmode)); - - // if (trk1.sign() * trk2.sign() < 0) { - // histos.fill(HIST("hInvMass_f0980_MixedUS_EPA"), recoPtl.M(), recoPtl.Pt(), centrality, relPhiMix); - // } else if (trk1.sign() > 0 && trk2.sign() > 0) { - // histos.fill(HIST("hInvMass_f0980_MixedLSpp_EPA"), recoPtl.M(), recoPtl.Pt(), centrality, relPhiMix); - // } else if (trk1.sign() < 0 && trk2.sign() < 0) { - // histos.fill(HIST("hInvMass_f0980_MixedLSmm_EPA"), recoPtl.M(), recoPtl.Pt(), centrality, relPhiMix); - // } - // } } } PROCESS_SWITCH(F0980pbpbanalysis, processEventMixing, "Process Event mixing", true); + void processOnce (EventCandidatesOrigin const& events) + { + nTotalEvents += events.size(); + auto hTotalEvents = histos.get(HIST("EventQA/hnEvents")); + if (hTotalEvents) hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); + // std::cout << "Total number of events processed: " << nTotalEvents << std::endl; + } + PROCESS_SWITCH(F0980pbpbanalysis, processOnce, "fill Total nEvents once", true); + void init(o2::framework::InitContext&) { AxisSpec qaCentAxis = {110, 0, 110}; @@ -600,37 +707,103 @@ struct F0980pbpbanalysis { AxisSpec qaEpAxis = {100, -1.0 * o2::constants::math::PI, o2::constants::math::PI}; AxisSpec epresAxis = {102, -1.02, 1.02}; - histos.add("QA/CentDist", "", {HistType::kTH1F, {qaCentAxis}}); - histos.add("QA/Vz", "", {HistType::kTH1F, {qaVzAxis}}); - - histos.add("QA/Nsigma_TPC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("QA/Nsigma_TOF", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("QA/TPC_TOF", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); - - histos.add("QA/Nsigma_TPC_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("QA/Nsigma_TOF_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("QA/TPC_TOF_selected", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); + //Event QA + if (cfgQAEventCut) { + histos.add("EventQA/CentDist_BC", "", {HistType::kTH1F, {qaCentAxis}}); + histos.add("EventQA/Vz_BC", "", {HistType::kTH1F, {qaVzAxis}}); + histos.add("EventQA/Occupancy_BC", "", kTH1F, {{histAxisOccupancy}}); + } + histos.add("EventQA/CentDist_AC", "", {HistType::kTH1F, {qaCentAxis}}); + histos.add("EventQA/Vz_AC", "", {HistType::kTH1F, {qaVzAxis}}); + histos.add("EventQA/Occupancy_AC", "", kTH1F, {{histAxisOccupancy}}); + + // Track QA + if (cfgQATrackCut) { + histos.add("TrackQA/DCArToPv_BC", "", {HistType::kTH1F, {histAxisDCAz}}); + histos.add("TrackQA/DCAzToPv_BC", "", {HistType::kTH1F, {histAxisDCAz}}); + histos.add("TrackQA/IsPrim_BC", "", kTH1F, {{2, -0.5, 1.5}}); + histos.add("TrackQA/IsGood_BC", "", kTH1F, {{2, -0.5, 1.5}}); + histos.add("TrackQA/IsPrimCont_BC", "", kTH1F, {{2, -0.5, 1.5}}); + histos.add("TrackQA/FindableTPCClusters_BC", "", kTH1F, {{200, 0, 200}}); + histos.add("TrackQA/FindableTPCRows_BC", "", kTH1F, {{200, 0, 200}}); + histos.add("TrackQA/ClustersVsRows_BC", "", kTH1F, {{200, 0, 2}}); + histos.add("TrackQA/TPCChi2_BC", "", kTH1F, {{200, 0, 100}}); + histos.add("TrackQA/ITSChi2_BC", "", kTH1F, {{200, 0, 100}}); + // + histos.add("TrackQA/DCArToPv_AC", "", {HistType::kTH1F, {histAxisDCAz}}); + histos.add("TrackQA/DCAzToPv_AC", "", {HistType::kTH1F, {histAxisDCAz}}); + histos.add("TrackQA/IsPrim_AC", "", kTH1F, {{2, -0.5, 1.5}}); + histos.add("TrackQA/IsGood_AC", "", kTH1F, {{2, -0.5, 1.5}}); + histos.add("TrackQA/IsPrimCont_AC", "", kTH1F, {{2, -0.5, 1.5}}); + histos.add("TrackQA/FindableTPCClusters_AC", "", kTH1F, {{200, 0, 200}}); + histos.add("TrackQA/FindableTPCRows_AC", "", kTH1F, {{200, 0, 200}}); + histos.add("TrackQA/ClustersVsRows_AC", "", kTH1F, {{200, 0, 2}}); + histos.add("TrackQA/TPCChi2_AC", "", kTH1F, {{200, 0, 100}}); + histos.add("TrackQA/ITSChi2_AC", "", kTH1F, {{200, 0, 100}}); + } - histos.add("QA/EPhist", "", {HistType::kTH2F, {qaCentAxis, qaEpAxis}}); - histos.add("QA/EPResAB", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); - histos.add("QA/EPResAC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); - histos.add("QA/EPResBC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + // PID QA + if (cfgQAPIDCut) { + histos.add("PIDQA/Nsigma_TPC_BC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/Nsigma_TOF_BC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/TPC_TOF_BC", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); + } + histos.add("PIDQA/Nsigma_TPC_AC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/Nsigma_TOF_AC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/TPC_TOF_AC", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); + // + histos.add("PIDQA/Nsigma_TPC_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/Nsigma_TOF_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/TPC_TOF_selected", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); + + // Event Plane QA + if (cfgQAEPCut) { + histos.add("EventQA/EPhist_BC", "", {HistType::kTH2F, {qaCentAxis, qaEpAxis}}); + histos.add("EventQA/EPhistAB_BC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + histos.add("EventQA/EPhistAC_BC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + histos.add("EventQA/EPhistBC_BC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + } + // + histos.add("EventQA/EPhist_AC", "", {HistType::kTH2F, {qaCentAxis, qaEpAxis}}); + histos.add("EventQA/EPhistAB_AC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + histos.add("EventQA/EPhistAC_AC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + histos.add("EventQA/EPhistBC_AC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); histos.add("hInvMass_f0980_US_EPA", "unlike invariant mass", - {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); + {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); histos.add("hInvMass_f0980_LSpp_EPA", "++ invariant mass", - {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); + {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); histos.add("hInvMass_f0980_LSmm_EPA", "-- invariant mass", - {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); + {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); histos.add("hInvMass_f0980_USRot_EPA", "unlike invariant mass Rotation", - {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); + {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); histos.add("hInvMass_f0980_MixedUS_EPA", "unlike invariant mass EventMixing", - {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); + {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); // if (doprocessMCLight) { // histos.add("MCL/hpT_f0980_GEN", "generated f0 signals", HistType::kTH1F, {qaPtAxis}); // histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", HistType::kTH3F, {massAxis, qaPtAxis, centAxis}); // } + // Event Histograms + histos.add("EventQA/hnEvents", "Event selection steps", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + std::shared_ptr hEventsCutFlow = histos.get(HIST("EventQA/hnEvents")); + std::vector eventCutLabels = { + "All Events", + "Zvtx", + "sel8", + "GoodZvtxFT0vsPV", + "NoSameBunchPileup", + "NoCollInTimeRangeStandard", + "Qvec Amplitude", + "Occupancy", + "Centrality", + "Additional PV cut", + "Passed Events" + }; + for (size_t i = 0; i < eventCutLabels.size(); ++i) { + hEventsCutFlow->GetXaxis()->SetBinLabel(i + 1, eventCutLabels[i].c_str()); + } + detId = getDetId(cfgQvecDetName); refAId = getDetId(cfgQvecRefAName); refBId = getDetId(cfgQvecRefBName); @@ -642,9 +815,9 @@ struct F0980pbpbanalysis { refBId = 5; } - if (cfgSelectPtl == PtlList::PtlPion) { + if (cfgListPtl == PtlList::PtlPion) { massPtl = o2::constants::physics::MassPionCharged; - } else if (cfgSelectPtl == PtlList::PtlKaon) { + } else if (cfgListPtl == PtlList::PtlKaon) { massPtl = o2::constants::physics::MassKaonCharged; } @@ -663,18 +836,17 @@ struct F0980pbpbanalysis { void processData(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { - if (cfgCentEst == CentEstList::FT0C) { + if (cfgEventCentEst == CentEstList::FT0C) { centrality = collision.centFT0C(); - } else if (cfgCentEst == CentEstList::FT0M) { + } else if (cfgEventCentEst == CentEstList::FT0M) { centrality = collision.centFT0M(); } - if (!eventSelected(collision)) { + if (!eventSelected(collision, true)) { return; } - histos.fill(HIST("QA/CentDist"), centrality, 1.0); - histos.fill(HIST("QA/Vz"), collision.posZ(), 1.0); + fillQA(true, collision, 1); // Event QA - fillHistograms(collision, tracks, 2); // second order + fillHistograms(collision, tracks); // second order }; PROCESS_SWITCH(F0980pbpbanalysis, processData, "Process Event for data", true); }; From 437a1d8227380bcc5cc37d29aff395ba33357de3 Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:59:07 +0900 Subject: [PATCH 2/8] Added AC/BC histograms and changed config names --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 133 ++++++++++--------- 1 file changed, 67 insertions(+), 66 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index 9a5861f795f..ade0ef3084a 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -85,10 +85,12 @@ struct F0980pbpbanalysis { Configurable cfgEventOccupancySel{"cfgEventOccupancySel", false, "Occupancy selection"}; Configurable cfgEventOccupancyMax{"cfgEventOccupancyMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable cfgEventOccupancyMin{"cfgEventOccupancyMin", -100, "minimum occupancy of tracks in neighbouring collisions in a given time range"}; - Configurable cfgEventNCollinTRSel{"cfgEventNCollinTRSel", false, "Additional selection for the number of coll in time range"}; + Configurable cfgEventGoodZvtxSel{"cfgEventGoodZvtxSel", true, "kIsGoodZvtxFT0vsPV selection"}; + Configurable cfgEventNSamePileupSel{"cfgEventNSamePileupSel", true, "kNoSameBunchPileup selection"}; + Configurable cfgEventNCollinTRSel{"cfgEventNCollinTRSel", true, "kNoCollInTimeRangeStandard selection"}; Configurable cfgEventPVSel{"cfgEventPVSel", false, "Additional PV selection flag for syst"}; Configurable cfgEventPV{"cfgEventPV", 8.0, "Additional PV selection range for syst"}; - + Configurable cfgEventCentMax{"cfgEventCentMax", 80., "CentralityMax cut"}; Configurable cfgEventCentEst{"cfgEventCentEst", 1, "Centrality estimator, 1: FT0C, 2: FT0M"}; @@ -118,7 +120,7 @@ struct F0980pbpbanalysis { Configurable cfgPIDMaxTPCnSigmaPion{"cfgPIDMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC Configurable cfgPIDMaxTPCnSigmaPionS{"cfgPIDMaxTPCnSigmaPionS", 3.0, "TPC nSigma cut for Pion as a standalone"}; Configurable cfgPIDMaxTiednSigmaPion{"cfgPIDMaxTiednSigmaPion", 3.0, "Combined nSigma cut for Pion"}; - + // Flow Configurables Configurable cfgQvecNMods{"cfgQvecNMods", 1, "The number of modulations of interest starting from 2"}; Configurable cfgQvecNum{"cfgQvecNum", 7, "The number of total Qvectors for looping over the task"}; @@ -228,10 +230,9 @@ struct F0980pbpbanalysis { }; TRandom* rn = new TRandom(); - // float theta2; using EventCandidatesOrigin = soa::Join; - using TrackCandidatesOrigin = soa::Join; + using TrackCandidatesOrigin = soa::Join; Filter collisionFilter = nabs(aod::collision::posZ) < cfgEventCutVertex; Filter acceptanceFilter = (nabs(aod::track::eta) < cfgTrackEtaMax && nabs(aod::track::pt) > cfgTrackPtMin); @@ -353,11 +354,11 @@ struct F0980pbpbanalysis { return 0; } histos.fill(HIST("EventQA/hnEvents"), 2); - if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (cfgEventGoodZvtxSel && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return 0; } histos.fill(HIST("EventQA/hnEvents"), 3); - if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + if (cfgEventNSamePileupSel && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return 0; } histos.fill(HIST("EventQA/hnEvents"), 4); @@ -369,7 +370,7 @@ struct F0980pbpbanalysis { return 0; } histos.fill(HIST("EventQA/hnEvents"), 6); - if (cfgEventOccupancySel && (collision.trackOccupancyInTimeRange() > cfgEventOccupancyMax || collision.trackOccupancyInTimeRange() < cfgEventOccupancyMin)) { + if (cfgEventOccupancySel && (collision.trackOccupancyInTimeRange() > cfgEventOccupancyMax || collision.trackOccupancyInTimeRange() < cfgEventOccupancyMin)) { return 0; } histos.fill(HIST("EventQA/hnEvents"), 7); @@ -398,44 +399,44 @@ struct F0980pbpbanalysis { bool trackSelected(const TrackType track, const bool QA) { if (cfgQATrackCut && QA) - fillQA(false, track, 3); - // - if (std::abs(track.pt()) < cfgTrackPtMin) { - return 0; - } - if (std::abs(track.eta()) > cfgTrackEtaMax) { - return 0; - } - if (std::abs(track.dcaXY()) > cfgTrackDCArToPVcutMax) { - return 0; - } - if (std::abs(track.dcaZ()) > cfgTrackDCAzToPVcutMax) { - return 0; - } - if (cfgTrackIsPVContributor && !track.isPVContributor()) { - return 0; - } - if (cfgTrackIsPrimaryTrack && !track.isPrimaryTrack()) { - return 0; - } - if (cfgTrackIsGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { - return 0; - } - if (cfgTrackNTPCCrossedRows > 0 && track.tpcNClsCrossedRows() < cfgTrackNTPCCrossedRows) { - return 0; - } - if (cfgTrackNFindableTPCClusters > 0 && track.tpcNClsFindable() < cfgTrackNFindableTPCClusters) { - return 0; - } - if (cfgTrackNRowsOverFindable > 0 && track.tpcCrossedRowsOverFindableCls() > cfgTrackNRowsOverFindable) { - return 0; - } - if (cfgTrackNTPCChi2 > 0 && track.tpcChi2NCl() > cfgTrackNTPCChi2) { - return 0; - } - if (cfgTrackNITSChi2 > 0 && track.itsChi2NCl() > cfgTrackNITSChi2) { - return 0; - } + fillQA(false, track, 3); + // + if (std::abs(track.pt()) < cfgTrackPtMin) { + return 0; + } + if (std::abs(track.eta()) > cfgTrackEtaMax) { + return 0; + } + if (std::abs(track.dcaXY()) > cfgTrackDCArToPVcutMax) { + return 0; + } + if (std::abs(track.dcaZ()) > cfgTrackDCAzToPVcutMax) { + return 0; + } + if (cfgTrackIsPVContributor && !track.isPVContributor()) { + return 0; + } + if (cfgTrackIsPrimaryTrack && !track.isPrimaryTrack()) { + return 0; + } + if (cfgTrackIsGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { + return 0; + } + if (cfgTrackNTPCCrossedRows > 0 && track.tpcNClsCrossedRows() < cfgTrackNTPCCrossedRows) { + return 0; + } + if (cfgTrackNFindableTPCClusters > 0 && track.tpcNClsFindable() < cfgTrackNFindableTPCClusters) { + return 0; + } + if (cfgTrackNRowsOverFindable > 0 && track.tpcCrossedRowsOverFindableCls() > cfgTrackNRowsOverFindable) { + return 0; + } + if (cfgTrackNTPCChi2 > 0 && track.tpcChi2NCl() > cfgTrackNTPCChi2) { + return 0; + } + if (cfgTrackNITSChi2 > 0 && track.itsChi2NCl() > cfgTrackNITSChi2) { + return 0; + } return 1; } @@ -447,32 +448,32 @@ struct F0980pbpbanalysis { // if (cfgListPID == PIDList::PIDRun3) { if (cfgPIDUSETOF) { - if (std::fabs(track.tofNSigmaPi()) > cfgPIDMaxTOFnSigmaPion) { + if (std::abs(track.tofNSigmaPi()) > cfgPIDMaxTOFnSigmaPion) { return 0; } - if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPion) { + if (std::abs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPion) { return 0; } } - if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { + if (std::abs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } else if (cfgListPID == PIDList::PIDRun2) { if (cfgPIDUSETOF) { if (track.hasTOF()) { - if (std::fabs(track.tofNSigmaPi()) > cfgPIDMaxTOFnSigmaPion) { + if (std::abs(track.tofNSigmaPi()) > cfgPIDMaxTOFnSigmaPion) { return 0; } - if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPion) { + if (std::abs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPion) { return 0; } } else { - if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { + if (std::abs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } } else { - if (std::fabs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { + if (std::abs(track.tpcNSigmaPi()) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } @@ -483,12 +484,12 @@ struct F0980pbpbanalysis { return 0; } } else { - if (std::fabs(getTpcNSigma(track)) > cfgPIDMaxTPCnSigmaPionS) { + if (std::abs(getTpcNSigma(track)) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } } else { - if (std::fabs(getTpcNSigma(track)) > cfgPIDMaxTPCnSigmaPionS) { + if (std::abs(getTpcNSigma(track)) > cfgPIDMaxTPCnSigmaPionS) { return 0; } } @@ -497,7 +498,7 @@ struct F0980pbpbanalysis { } template - bool indexSelection(const TrackType1 track1, const TrackType2 track2) + bool pairIndexSelection(const TrackType1 track1, const TrackType2 track2) { if (cfgListPair == IndexSelList::woSame) { if (track2.globalIndex() == track1.globalIndex()) { @@ -587,7 +588,7 @@ struct F0980pbpbanalysis { fillQA(true, trk1, 5); } - if (!indexSelection(trk1, trk2)) { + if (!pairIndexSelection(trk1, trk2)) { continue; } @@ -629,7 +630,7 @@ struct F0980pbpbanalysis { void processEventMixing(EventCandidates const& collisions, TrackCandidates const& tracks) { - // int nmode = 2; // second order + // nmode = 2; // second order qVecDetInd = detId * 4 + 3 + (nmode - 2) * cfgQvecNum * 4; auto trackTuple = std::make_tuple(tracks); @@ -665,7 +666,7 @@ struct F0980pbpbanalysis { if (!selectionPID(trk2, false)) { continue; } - // if (!indexSelection(trk1, trk2)) { + // if (!pairIndexSelection(trk1, trk2)) { // continue; // } if (cfgPhiDeepAngleSel && !pairAngleSelection(trk1, trk2)) { @@ -689,11 +690,12 @@ struct F0980pbpbanalysis { } PROCESS_SWITCH(F0980pbpbanalysis, processEventMixing, "Process Event mixing", true); - void processOnce (EventCandidatesOrigin const& events) + void processOnce(EventCandidatesOrigin const& events) { nTotalEvents += events.size(); auto hTotalEvents = histos.get(HIST("EventQA/hnEvents")); - if (hTotalEvents) hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); + if (hTotalEvents) + hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); // std::cout << "Total number of events processed: " << nTotalEvents << std::endl; } PROCESS_SWITCH(F0980pbpbanalysis, processOnce, "fill Total nEvents once", true); @@ -707,7 +709,7 @@ struct F0980pbpbanalysis { AxisSpec qaEpAxis = {100, -1.0 * o2::constants::math::PI, o2::constants::math::PI}; AxisSpec epresAxis = {102, -1.02, 1.02}; - //Event QA + // Event QA if (cfgQAEventCut) { histos.add("EventQA/CentDist_BC", "", {HistType::kTH1F, {qaCentAxis}}); histos.add("EventQA/Vz_BC", "", {HistType::kTH1F, {qaVzAxis}}); @@ -781,7 +783,7 @@ struct F0980pbpbanalysis { {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); // if (doprocessMCLight) { // histos.add("MCL/hpT_f0980_GEN", "generated f0 signals", HistType::kTH1F, {qaPtAxis}); - // histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", HistType::kTH3F, {massAxis, qaPtAxis, centAxis}); + // histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", HistType::kTH3F, {axisMass, qaPtAxis, axisCent}); // } // Event Histograms @@ -798,8 +800,7 @@ struct F0980pbpbanalysis { "Occupancy", "Centrality", "Additional PV cut", - "Passed Events" - }; + "Passed Events"}; for (size_t i = 0; i < eventCutLabels.size(); ++i) { hEventsCutFlow->GetXaxis()->SetBinLabel(i + 1, eventCutLabels[i].c_str()); } @@ -846,7 +847,7 @@ struct F0980pbpbanalysis { } fillQA(true, collision, 1); // Event QA - fillHistograms(collision, tracks); // second order + fillHistograms(collision, tracks); }; PROCESS_SWITCH(F0980pbpbanalysis, processData, "Process Event for data", true); }; From 0a4a6b8203cbd8c5e53c26f0b846bf88f5ef12c8 Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Mon, 10 Nov 2025 21:23:30 +0900 Subject: [PATCH 3/8] Added BC/AC histograms and changed config names --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index ade0ef3084a..dece759ebbb 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -22,6 +22,8 @@ #include // #include #include +#include +#include // #include "TLorentzVector.h" #include "Common/Core/TrackSelection.h" From a950537ffd6cc59179a435d5848d689ee82e0522 Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Mon, 10 Nov 2025 21:27:02 +0900 Subject: [PATCH 4/8] Added BC/AC histograms and changed config names --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index dece759ebbb..edded346cdf 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -21,9 +21,9 @@ #include #include // #include +#include #include #include -#include // #include "TLorentzVector.h" #include "Common/Core/TrackSelection.h" From d2c9eede97c5365561af1ad02a9231c0e6e7d70b Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Tue, 11 Nov 2025 16:03:56 +0900 Subject: [PATCH 5/8] Added BC/AC histograms and changed config names --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index edded346cdf..36ab56a89b9 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -21,6 +21,7 @@ #include #include // #include +#include #include #include #include @@ -597,7 +598,7 @@ struct F0980pbpbanalysis { if (cfgPhiDeepAngleSel && !pairAngleSelection(trk1, trk2)) { continue; } - + pion1 = ROOT::Math::PxPyPzMVector(trk1.px(), trk1.py(), trk1.pz(), massPtl); pion2 = ROOT::Math::PxPyPzMVector(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; @@ -694,12 +695,14 @@ struct F0980pbpbanalysis { void processOnce(EventCandidatesOrigin const& events) { - nTotalEvents += events.size(); - auto hTotalEvents = histos.get(HIST("EventQA/hnEvents")); - if (hTotalEvents) - hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); - // std::cout << "Total number of events processed: " << nTotalEvents << std::endl; - } + if (cfgQAEventCut) { + nTotalEvents += events.size(); + auto hTotalEvents = histos.get(HIST("EventQA/hnEvents")); + if (hTotalEvents) + hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); + // std::cout << "Total number of events processed: " << nTotalEvents << std::endl; + } + } PROCESS_SWITCH(F0980pbpbanalysis, processOnce, "fill Total nEvents once", true); void init(o2::framework::InitContext&) From d9ec523ff12b37e4c73ecf63fec361b6969cb958 Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Tue, 11 Nov 2025 16:10:51 +0900 Subject: [PATCH 6/8] Added BC/AC histograms and changed config names --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index 36ab56a89b9..4bb23079435 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -21,7 +21,6 @@ #include #include // #include -#include #include #include #include @@ -598,7 +597,7 @@ struct F0980pbpbanalysis { if (cfgPhiDeepAngleSel && !pairAngleSelection(trk1, trk2)) { continue; } - + pion1 = ROOT::Math::PxPyPzMVector(trk1.px(), trk1.py(), trk1.pz(), massPtl); pion2 = ROOT::Math::PxPyPzMVector(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; @@ -701,8 +700,8 @@ struct F0980pbpbanalysis { if (hTotalEvents) hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); // std::cout << "Total number of events processed: " << nTotalEvents << std::endl; - } } + } PROCESS_SWITCH(F0980pbpbanalysis, processOnce, "fill Total nEvents once", true); void init(o2::framework::InitContext&) From 967617175eb3596dbd4806b55a8d75a935aae39a Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Thu, 20 Nov 2025 00:46:39 +0900 Subject: [PATCH 7/8] fix QAEventFlowCut --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 163 +++++++++---------- 1 file changed, 78 insertions(+), 85 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index 4bb23079435..a749302b0e2 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -21,6 +21,7 @@ #include #include // #include +#include #include #include #include @@ -132,12 +133,12 @@ struct F0980pbpbanalysis { Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; // Rotational Background Configurables - Configurable cfgBkgRotSel{"cfgBkgRotSel", true, "flag to construct rotational backgrounds"}; - Configurable cfgBkgRotNum{"cfgBkgRotNum", 10, "the number of rotational backgrounds"}; + Configurable cfgBkgRotSel{"cfgBkgRotSel", false, "flag to construct rotational backgrounds"}; + Configurable cfgBkgRotNum{"cfgBkgRotNum", 5, "the number of rotational backgrounds"}; // Mixed Event Background Configurables SliceCache cache; - Configurable cfgBkgMixedNum{"cfgBkgMixedNum", 10, "Number of mixed events per event"}; + Configurable cfgBkgMixedNum{"cfgBkgMixedNum", 5, "Number of mixed events per event"}; ConfigurableAxis mixAxisVertex{"mixAxisVertex", {10, -10, 10}, "Vertex axis for mixing bin"}; ConfigurableAxis mixAxisCent{"mixAxisCent", {VARIABLE_WIDTH, 0, 10, 20, 50, 100}, "multiplicity percentile for mixing bin"}; // ConfigurableAxis mixingAxisMultiplicity{"mixingAxisMultiplicity", {2000, 0, 10000}, "TPC multiplicity for bin"}; @@ -145,18 +146,20 @@ struct F0980pbpbanalysis { // List Configurables Configurable cfgListPID{"cfgListPID", 0, "PID selection type"}; Configurable cfgListPtl{"cfgListPtl", 0, "Particle selection type"}; - Configurable cfgListPair{"cfgListPair", 2, "Pair selection type"}; // Histogram QA Configurables Configurable cfgQAEventCut{"cfgQAEventCut", true, "Enable Event QA Hists"}; Configurable cfgQATrackCut{"cfgQATrackCut", true, "Enable Track QA Hists"}; Configurable cfgQAPIDCut{"cfgQAPIDCut", true, "Enable PID QA Hists"}; Configurable cfgQAEPCut{"cfgQAEPCut", true, "Enable Event Plane QA Hists"}; + Configurable cfgQAEventFlowCut{"cfgQAEventFlowCut", true, "Enable Event Flow QA Hists"}; ConfigurableAxis histAxisDCAz{"histAxisDCAz", {40, -0.2, 0.2}, "DCAz axis"}; ConfigurableAxis histAxisDCAr{"histAxisDCAr", {40, -0.2, 0.2}, "DCAxy axis"}; ConfigurableAxis histAxisOccupancy{"histAxisOccupancy", {100, 0.0, 20000}, "Occupancy axis"}; + Configurable cfgAnalysisMethod{"cfgAnalysisMethod", true, "true: Two for-loop, false: Combination"}; + // Configurable for axis ConfigurableAxis axisMass{"axisMass", {400, 0.2, 2.2}, "Invariant mass axis"}; ConfigurableAxis axisPT{"axisPT", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}, "Transverse momentum Binning"}; @@ -217,18 +220,11 @@ struct F0980pbpbanalysis { PtlKaon = 1, }; - enum IndexSelList { - None = 0, - woSame = 1, - leq = 2 - }; - enum QAList { QAEvent = 1, QAEP = 2, QATrack = 3, QAPID = 4, - QAPIDS = 5 }; TRandom* rn = new TRandom(); @@ -329,13 +325,6 @@ struct F0980pbpbanalysis { histos.fill(HIST("PIDQA/TPC_TOF_AC"), getTpcNSigma(obj), getTofNSigma(obj)); } } - if (objecttype == QAPIDS) { - if (pass) { - histos.fill(HIST("PIDQA/Nsigma_TPC_selected"), obj.pt(), getTpcNSigma(obj)); - histos.fill(HIST("PIDQA/Nsigma_TOF_selected"), obj.pt(), getTofNSigma(obj)); - histos.fill(HIST("PIDQA/TPC_TOF_selected"), getTpcNSigma(obj), getTofNSigma(obj)); - } - } } } @@ -346,36 +335,50 @@ struct F0980pbpbanalysis { fillQA(false, collision, 1); if (cfgQAEPCut && QA) fillQA(false, collision, 2); + // if (cfgQAEventFlowCut) histos.fill(HIST("EventQA/hnEvents"), 0); // - // histos.fill(HIST("EventQA/hnEvents"), 0); if (std::abs(collision.posZ()) > cfgEventCutVertex) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 1); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 1); + if (!collision.sel8()) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 2); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 2); + if (cfgEventGoodZvtxSel && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 3); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 3); + if (cfgEventNSamePileupSel && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 4); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 4); + if (cfgEventNCollinTRSel && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 5); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 5); + if (cfgEventQvecSel && (collision.qvecAmp()[detId] < QvecAmpMin || collision.qvecAmp()[refAId] < QvecAmpMin || collision.qvecAmp()[refBId] < QvecAmpMin)) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 6); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 6); + if (cfgEventOccupancySel && (collision.trackOccupancyInTimeRange() > cfgEventOccupancyMax || collision.trackOccupancyInTimeRange() < cfgEventOccupancyMin)) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 7); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 7); + if (cfgEventCentMax < centrality) { return 0; } @@ -388,12 +391,18 @@ struct F0980pbpbanalysis { return 0; } */ - histos.fill(HIST("EventQA/hnEvents"), 8); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 8); + if (cfgEventPVSel && std::abs(collision.posZ()) > cfgEventPV) { return 0; } - histos.fill(HIST("EventQA/hnEvents"), 9); - histos.fill(HIST("EventQA/hnEvents"), 10); + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 9); + + // All passed + if (cfgQAEventFlowCut && QA) + histos.fill(HIST("EventQA/hnEvents"), 10); return 1; } // event selection @@ -445,7 +454,7 @@ struct F0980pbpbanalysis { template bool selectionPID(const TrackType track, const bool QA) { - if (cfgQAPIDCut && QA) + if (QA) fillQA(false, track, 4); // if (cfgListPID == PIDList::PIDRun3) { @@ -499,21 +508,6 @@ struct F0980pbpbanalysis { return 1; } - template - bool pairIndexSelection(const TrackType1 track1, const TrackType2 track2) - { - if (cfgListPair == IndexSelList::woSame) { - if (track2.globalIndex() == track1.globalIndex()) { - return 0; - } - } else if (cfgListPair == IndexSelList::leq) { - if (track2.globalIndex() <= track1.globalIndex()) { - return 0; - } - } - return 1; - } - template bool pairAngleSelection(const TrackType1 track1, const TrackType2 track2) { @@ -569,7 +563,8 @@ struct F0980pbpbanalysis { if (!trackSelected(trk1, true)) { continue; } - fillQA(true, trk1, 3); + if (cfgQATrackCut) + fillQA(true, trk1, 3); if (!selectionPID(trk1, true)) { continue; @@ -577,20 +572,16 @@ struct F0980pbpbanalysis { fillQA(true, trk1, 4); for (const auto& trk2 : dTracks) { - if (!trackSelected(trk2, false)) { + if (trk1.globalIndex() >= trk2.globalIndex()) { continue; } - // PID - if (!selectionPID(trk2, false)) { + if (!trackSelected(trk2, false)) { continue; } - if (trk1.index() == trk2.index()) { - fillQA(true, trk1, 5); - } - - if (!pairIndexSelection(trk1, trk2)) { + // PID + if (!selectionPID(trk2, false)) { continue; } @@ -690,19 +681,19 @@ struct F0980pbpbanalysis { } } } - PROCESS_SWITCH(F0980pbpbanalysis, processEventMixing, "Process Event mixing", true); + PROCESS_SWITCH(F0980pbpbanalysis, processEventMixing, "Process Event mixing", false); - void processOnce(EventCandidatesOrigin const& events) + void processTotalEvent(EventCandidatesOrigin const& events) { - if (cfgQAEventCut) { + if (cfgQAEventFlowCut) { nTotalEvents += events.size(); auto hTotalEvents = histos.get(HIST("EventQA/hnEvents")); - if (hTotalEvents) + if (hTotalEvents) { hTotalEvents->SetBinContent(1, static_cast(nTotalEvents)); - // std::cout << "Total number of events processed: " << nTotalEvents << std::endl; + } } } - PROCESS_SWITCH(F0980pbpbanalysis, processOnce, "fill Total nEvents once", true); + PROCESS_SWITCH(F0980pbpbanalysis, processTotalEvent, "fill Total nEvents once", false); void init(o2::framework::InitContext&) { @@ -749,18 +740,17 @@ struct F0980pbpbanalysis { } // PID QA - if (cfgQAPIDCut) { - histos.add("PIDQA/Nsigma_TPC_BC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("PIDQA/Nsigma_TOF_BC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("PIDQA/TPC_TOF_BC", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); - } + histos.add("PIDQA/Nsigma_TPC_BC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/Nsigma_TOF_BC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("PIDQA/TPC_TOF_BC", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); + // histos.add("PIDQA/Nsigma_TPC_AC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); histos.add("PIDQA/Nsigma_TOF_AC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); histos.add("PIDQA/TPC_TOF_AC", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); // - histos.add("PIDQA/Nsigma_TPC_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("PIDQA/Nsigma_TOF_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); - histos.add("PIDQA/TPC_TOF_selected", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); + // histos.add("PIDQA/Nsigma_TPC_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + // histos.add("PIDQA/Nsigma_TOF_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + // histos.add("PIDQA/TPC_TOF_selected", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); // Event Plane QA if (cfgQAEPCut) { @@ -775,6 +765,7 @@ struct F0980pbpbanalysis { histos.add("EventQA/EPhistAC_AC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); histos.add("EventQA/EPhistBC_AC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + // Invariant Mass Histograms histos.add("hInvMass_f0980_US_EPA", "unlike invariant mass", {HistType::kTHnSparseF, {axisMass, axisPT, axisCent, axisEp}}); histos.add("hInvMass_f0980_LSpp_EPA", "++ invariant mass", @@ -791,22 +782,24 @@ struct F0980pbpbanalysis { // } // Event Histograms - histos.add("EventQA/hnEvents", "Event selection steps", {HistType::kTH1F, {{11, -0.5, 10.5}}}); - std::shared_ptr hEventsCutFlow = histos.get(HIST("EventQA/hnEvents")); - std::vector eventCutLabels = { - "All Events", - "Zvtx", - "sel8", - "GoodZvtxFT0vsPV", - "NoSameBunchPileup", - "NoCollInTimeRangeStandard", - "Qvec Amplitude", - "Occupancy", - "Centrality", - "Additional PV cut", - "Passed Events"}; - for (size_t i = 0; i < eventCutLabels.size(); ++i) { - hEventsCutFlow->GetXaxis()->SetBinLabel(i + 1, eventCutLabels[i].c_str()); + if (cfgQAEventFlowCut) { + histos.add("EventQA/hnEvents", "Event selection steps", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + std::shared_ptr hEventsCutFlow = histos.get(HIST("EventQA/hnEvents")); + std::vector eventCutLabels = { + "All Events", + "Zvtx", + "sel8", + "GoodZvtxFT0vsPV", + "NoSameBunchPileup", + "NoCollInTimeRangeStandard", + "Qvec Amplitude", + "Occupancy", + "Centrality", + "Additional PV cut", + "Passed Events"}; + for (size_t i = 0; i < eventCutLabels.size(); ++i) { + hEventsCutFlow->GetXaxis()->SetBinLabel(i + 1, eventCutLabels[i].c_str()); + } } detId = getDetId(cfgQvecDetName); @@ -853,7 +846,7 @@ struct F0980pbpbanalysis { fillHistograms(collision, tracks); }; - PROCESS_SWITCH(F0980pbpbanalysis, processData, "Process Event for data", true); + PROCESS_SWITCH(F0980pbpbanalysis, processData, "Process Event for data", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 00c26ca0839105f45d9792af63f99c63b2a868fe Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Thu, 20 Nov 2025 00:51:32 +0900 Subject: [PATCH 8/8] fixed QAEventFlowCut --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index a749302b0e2..6cf4b2b176c 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -21,7 +21,6 @@ #include #include // #include -#include #include #include #include