@@ -85,7 +85,8 @@ enum : std::size_t {
8585 kC24 = 1 ,
8686 kC22Full = 2 ,
8787 kC32Gap = 3 ,
88- kC34Gap = 4
88+ kC34Gap = 4 ,
89+ kC24Gap = 52
8990};
9091} // namespace charged
9192
@@ -103,7 +104,8 @@ enum : std::size_t {
103104 kC22Pure = 29 ,
104105 kC32Pure = 32 ,
105106 kC22FullA = 35 ,
106- kC22FullB = 36
107+ kC22FullB = 36 ,
108+ kC24PIDChargedGap = 48
107109};
108110} // namespace pion
109111
@@ -121,7 +123,8 @@ enum : std::size_t {
121123 kC22Pure = 30 ,
122124 kC32Pure = 33 ,
123125 kC22FullA = 37 ,
124- kC22FullB = 38
126+ kC22FullB = 38 ,
127+ kC24PIDChargedGap = 49
125128};
126129} // namespace kaon
127130
@@ -139,7 +142,8 @@ enum : std::size_t {
139142 kC22Pure = 31 ,
140143 kC32Pure = 34 ,
141144 kC22FullA = 39 ,
142- kC22FullB = 40
145+ kC22FullB = 40 ,
146+ kC24PIDChargedGap = 50
143147};
144148} // namespace proton
145149
@@ -154,12 +158,13 @@ enum : std::size_t {
154158 kC24B = 44 ,
155159 kC22Pure = 45 ,
156160 kC22FullA = 46 ,
157- kC22FullB = 47
161+ kC22FullB = 47 ,
162+ kC24PIDChargedGap = 51
158163};
159164} // namespace unidentified
160165
161166enum : std::size_t {
162- kCount = 48
167+ kCount = 53
163168};
164169} // namespace corrConfigIndex
165170
@@ -369,6 +374,7 @@ struct PidFlowPtCorr {
369374 ConfigurableAxis cfgaxisPt{" cfgaxisPt" , {VARIABLE_WIDTH , 0.20 , 0.25 , 0.30 , 0.35 , 0.40 , 0.45 , 0.50 , 0.55 , 0.60 , 0.65 , 0.70 , 0.75 , 0.80 , 0.85 , 0.90 , 0.95 , 1.00 , 1.10 , 1.20 , 1.30 , 1.40 , 1.50 , 1.60 , 1.70 , 1.80 , 1.90 , 2.00 , 2.20 , 2.40 , 2.60 , 2.80 , 3.00 , 3.50 , 4.00 , 4.50 , 5.00 , 5.50 , 6.00 , 10.0 }, " pt (GeV)" };
370375 ConfigurableAxis cfgaxisTPCDedx{" cfgaxisTPCDedx" , {500 , 0 .0f , 1000 .0f }, " d#it{E}/d#it{x} axis for detector-PID QA" };
371376 ConfigurableAxis cfgaxisTOFDelta{" cfgaxisTOFDelta" , {200 , -1000 .0f , 1000 .0f }, " TOF #it{t} - #it{t}_{ev} - #it{t}_{exp} axis for detector-PID QA" };
377+ ConfigurableAxis cfgaxisTOFTime{" cfgaxisTOFTime" , {10000 , 0 .0f , 2 .0e6f}, " TOF #it{t} - #it{t}_{ev} (ps) axis for detector-PID QA" };
372378 ConfigurableAxis cfgaxisMeanPt{" cfgaxisMeanPt" , {300 , 0 , 3 }, " pt (GeV)" };
373379 ConfigurableAxis cfgaxisNch{" cfgaxisNch" , {3000 , 0.5 , 3000.5 }, " Nch" };
374380 ConfigurableAxis cfgaxisLocalDensity{" cfgaxisLocalDensity" , {200 , 0 , 600 }, " local density" };
@@ -398,7 +404,7 @@ struct PidFlowPtCorr {
398404 using TracksPIDForDetectorPidQA = soa::Join<aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>;
399405 // data tracks filter
400406 using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, o2::aod::TrackSelectionExtension, aod::TracksExtra, TracksPID, aod::TracksIU, aod::TracksDCA>>;
401- using AodTracksForDetectorPidQA = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, o2::aod::TrackSelectionExtension, aod::TracksExtra, TracksPIDForDetectorPidQA, aod::TracksIU, aod::TracksDCA>>;
407+ using AodTracksForDetectorPidQA = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, o2::aod::TrackSelectionExtension, aod::TracksExtra, aod::TOFSignal, aod::TOFEvTime, TracksPIDForDetectorPidQA, aod::TracksIU, aod::TracksDCA>>;
402408 // data collisions filter
403409 using AodCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::CentNTPVs, aod::CentNGlobals, aod::CentMFTs, aod::MultsRun3>>;
404410
@@ -618,10 +624,12 @@ struct PidFlowPtCorr {
618624 registry.add (" DetectorPidQA/TPC/dEdxPi" , " TPC d#it{E}/d#it{x} (pion)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTPCDedx}});
619625 registry.add (" DetectorPidQA/TPC/dEdxKa" , " TPC d#it{E}/d#it{x} (kaon)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTPCDedx}});
620626 registry.add (" DetectorPidQA/TPC/dEdxPr" , " TPC d#it{E}/d#it{x} (proton)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTPCDedx}});
627+ registry.add (" DetectorPidQA/TPC/dEdxAll" , " TPC d#it{E}/d#it{x} (all particles)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTPCDedx}});
621628
622629 registry.add (" DetectorPidQA/TOF/deltaPi" , " TOF #it{t} - #it{t}_{ev} - #it{t}_{exp} (pion)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTOFDelta}});
623630 registry.add (" DetectorPidQA/TOF/deltaKa" , " TOF #it{t} - #it{t}_{ev} - #it{t}_{exp} (kaon)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTOFDelta}});
624631 registry.add (" DetectorPidQA/TOF/deltaPr" , " TOF #it{t} - #it{t}_{ev} - #it{t}_{exp} (proton)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTOFDelta}});
632+ registry.add (" DetectorPidQA/TOF/tofTimeAll" , " TOF #it{t} - #it{t}_{ev} (all particles)" , {HistType::kTH2F , {cfgaxisPt, cfgaxisTOFTime}});
625633
626634 // run by run QA hists
627635 /* *
@@ -868,6 +876,10 @@ struct PidFlowPtCorr {
868876 oba4Ch->Add (new TNamed (" hMeanPtWeightFull" , " hMeanPtWeightFull" ));
869877 // end fill TObjArray for charged
870878
879+ // Clone the shared profiles before appending the charged-only SC baseline.
880+ auto * oba4PID = dynamic_cast <TObjArray*>(oba4Ch->Clone ());
881+ oba4Ch->Add (new TNamed (" c24Gap" , " c24Gap" ));
882+
871883 // init fFCCh
872884 if (switchsOpts.cfgOutputCharged .value ) {
873885 fFCCh ->SetName (" FlowContainerCharged" );
@@ -877,13 +889,14 @@ struct PidFlowPtCorr {
877889
878890 // init fFCPID
879891 // note that need to add c22pure and c32pure
880- auto * oba4PID = dynamic_cast <TObjArray*>(oba4Ch->Clone ());
881892 oba4PID->Add (new TNamed (" c22pure" , " c22pure" ));
882893 oba4PID->Add (new TNamed (" c32pure" , " c32pure" ));
883894 oba4PID->Add (new TNamed (" covV2PtPID" , " covV2PtPID" ));
884895 oba4PID->Add (new TNamed (" c22TrackWeightPID" , " c22TrackWeightPID" ));
885896
886897 oba4PID->Add (new TNamed (" hMeanPtWeightCharged" , " hMeanPtWeightCharged" ));
898+ // Raw mixed <4> for SC/NSC; reuse PID c22pure and charged c22 as <2>.
899+ oba4PID->Add (new TNamed (" c24PIDChargedGap" , " c24PIDChargedGap" ));
887900
888901 if (switchsOpts.cfgOutputPion .value ) {
889902 fFCPi ->SetName (" FlowContainerPi" );
@@ -1006,6 +1019,8 @@ struct PidFlowPtCorr {
10061019
10071020 fGFW ->AddRegion (" olPiN" , -etaMax, 0 , 1 , gfwBitMask::pion::kOverlap );
10081021 fGFW ->AddRegion (" olPiP" , 0 , etaMax, 1 , gfwBitMask::pion::kOverlap );
1022+ fGFW ->AddRegion (" olPiN08" , -etaMax, -etaGap, 1 , gfwBitMask::pion::kOverlap );
1023+ fGFW ->AddRegion (" olPiP08" , etaGap, etaMax, 1 , gfwBitMask::pion::kOverlap );
10091024
10101025 // Kaon POI and overlap regions.
10111026 fGFW ->AddRegion (" poiKaN08" , -etaMax, -etaGap, 1 , gfwBitMask::kaon::kPOI );
@@ -1015,6 +1030,8 @@ struct PidFlowPtCorr {
10151030
10161031 fGFW ->AddRegion (" olKaN" , -etaMax, 0 , 1 , gfwBitMask::kaon::kOverlap );
10171032 fGFW ->AddRegion (" olKaP" , 0 , etaMax, 1 , gfwBitMask::kaon::kOverlap );
1033+ fGFW ->AddRegion (" olKaN08" , -etaMax, -etaGap, 1 , gfwBitMask::kaon::kOverlap );
1034+ fGFW ->AddRegion (" olKaP08" , etaGap, etaMax, 1 , gfwBitMask::kaon::kOverlap );
10181035
10191036 // Proton POI and overlap regions.
10201037 fGFW ->AddRegion (" poiPrN08" , -etaMax, -etaGap, 1 , gfwBitMask::proton::kPOI );
@@ -1024,6 +1041,8 @@ struct PidFlowPtCorr {
10241041
10251042 fGFW ->AddRegion (" olPrN" , -etaMax, 0 , 1 , gfwBitMask::proton::kOverlap );
10261043 fGFW ->AddRegion (" olPrP" , 0 , etaMax, 1 , gfwBitMask::proton::kOverlap );
1044+ fGFW ->AddRegion (" olPrN08" , -etaMax, -etaGap, 1 , gfwBitMask::proton::kOverlap );
1045+ fGFW ->AddRegion (" olPrP08" , etaGap, etaMax, 1 , gfwBitMask::proton::kOverlap );
10271046
10281047 // Tracks for which the PID selection returns -1. They use the charged
10291048 // pT range and corrections, but have independent POI and overlap masks.
@@ -1033,6 +1052,8 @@ struct PidFlowPtCorr {
10331052 fGFW ->AddRegion (" poiUnidentifiedP" , 0 , etaMax, 1 , gfwBitMask::unidentified::kPOI );
10341053 fGFW ->AddRegion (" olUnidentifiedN" , -etaMax, 0 , 1 , gfwBitMask::unidentified::kOverlap );
10351054 fGFW ->AddRegion (" olUnidentifiedP" , 0 , etaMax, 1 , gfwBitMask::unidentified::kOverlap );
1055+ fGFW ->AddRegion (" olUnidentifiedN08" , -etaMax, -etaGap, 1 , gfwBitMask::unidentified::kOverlap );
1056+ fGFW ->AddRegion (" olUnidentifiedP08" , etaGap, etaMax, 1 , gfwBitMask::unidentified::kOverlap );
10361057 // end data region add
10371058
10381059 // pushback
@@ -1090,6 +1111,16 @@ struct PidFlowPtCorr {
10901111 corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" poiUnidentifiedN reffull | olUnidentifiedN {2 -2}" , " UnidentifiedFull22a" , false ));
10911112 corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" poiUnidentifiedP reffull | olUnidentifiedP {2 -2}" , " UnidentifiedFull22b" , false )); // 47
10921113
1114+ // One POI and one reference on each eta side, with distinct tracks.
1115+ // Each overlap region has the same eta range as its POI/reference pair.
1116+ corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" poiPiN08 refN08 | olPiN08 {2 2} poiPiP08 refP08 | olPiP08 {-2 -2}" , " PionPIDChargedGap24" , false )); // 48
1117+ corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" poiKaN08 refN08 | olKaN08 {2 2} poiKaP08 refP08 | olKaP08 {-2 -2}" , " KaonPIDChargedGap24" , false ));
1118+ corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" poiPrN08 refN08 | olPrN08 {2 2} poiPrP08 refP08 | olPrP08 {-2 -2}" , " ProtonPIDChargedGap24" , false ));
1119+ corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" poiUnidentifiedN08 refN08 | olUnidentifiedN08 {2 2} poiUnidentifiedP08 refP08 | olUnidentifiedP08 {-2 -2}" , " UnidentifiedPIDChargedGap24" , false )); // 51
1120+
1121+ // Charged-charged SC baseline: two distinct reference tracks per eta side.
1122+ corrconfigs.push_back (fGFW ->GetCorrelatorConfig (" refN08 {2 2} refP08 {-2 -2}" , " Ref08Gap24" , false )); // 52
1123+
10931124 if (corrconfigs.size () != corrConfigIndex::kCount ) {
10941125 LOGF (fatal, " Correlation index table expects %zu configurations, but %zu were created" , static_cast <std::size_t >(corrConfigIndex::kCount ), corrconfigs.size ());
10951126 }
@@ -2767,7 +2798,10 @@ struct PidFlowPtCorr {
27672798 // Fill GFW and counters using the same species-specific POI pT range.
27682799 if (pid == MyParticleType::kPion ) {
27692800 fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::pion::kPOI );
2770- fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::pion::kOverlap , wacc * weff);
2801+ // Only tracks in both pT selections contribute to POI-ref overlap.
2802+ if (withinPtRefGlobal) {
2803+ fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::pion::kOverlap , wacc * weff);
2804+ }
27712805 registry.fill (HIST (" hPhiPi" ), track.phi ());
27722806 registry.fill (HIST (" hPhicorrPi" ), track.phi (), waccPid);
27732807 registry.fill (HIST (" hPhiCorrNUANUEPi" ), track.phi (), waccPid * weffPid);
@@ -2776,7 +2810,9 @@ struct PidFlowPtCorr {
27762810 numOfPi++;
27772811 } else if (pid == MyParticleType::kKaon ) {
27782812 fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::kaon::kPOI );
2779- fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::kaon::kOverlap , wacc * weff);
2813+ if (withinPtRefGlobal) {
2814+ fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::kaon::kOverlap , wacc * weff);
2815+ }
27802816 registry.fill (HIST (" hPhiKa" ), track.phi ());
27812817 registry.fill (HIST (" hPhicorrKa" ), track.phi (), waccPid);
27822818 registry.fill (HIST (" hPhiCorrNUANUEKa" ), track.phi (), waccPid * weffPid);
@@ -2785,7 +2821,9 @@ struct PidFlowPtCorr {
27852821 numOfKa++;
27862822 } else if (pid == MyParticleType::kProton ) {
27872823 fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::proton::kPOI );
2788- fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::proton::kOverlap , wacc * weff);
2824+ if (withinPtRefGlobal) {
2825+ fGFW ->Fill (track.eta (), 0 , track.phi (), waccPid * weffPid, gfwBitMask::proton::kOverlap , wacc * weff);
2826+ }
27892827 registry.fill (HIST (" hPhiPr" ), track.phi ());
27902828 registry.fill (HIST (" hPhicorrPr" ), track.phi (), waccPid);
27912829 registry.fill (HIST (" hPhiCorrNUANUEPr" ), track.phi (), waccPid * weffPid);
@@ -2813,6 +2851,8 @@ struct PidFlowPtCorr {
28132851 if (nch > 0 ) {
28142852 fillFC (MyParticleType::kCharged , corrconfigs.at (corrConfigIndex::charged::kC22Gap ), cent, rndm, " c22" );
28152853 fillFC (MyParticleType::kCharged , corrconfigs.at (corrConfigIndex::charged::kC24 ), cent, rndm, " c24" );
2854+ // Raw gap <4> for SC(ch,ch); reuse c22 for both two-particle factors.
2855+ fillFC (MyParticleType::kCharged , corrconfigs.at (corrConfigIndex::charged::kC24Gap ), cent, rndm, " c24Gap" );
28162856 fillFC (MyParticleType::kCharged , corrconfigs.at (corrConfigIndex::charged::kC22Full ), cent, rndm, " c22Full" );
28172857 fillFC (MyParticleType::kCharged , corrconfigs.at (corrConfigIndex::charged::kC32Gap ), cent, rndm, " c32" );
28182858 fillFC (MyParticleType::kCharged , corrconfigs.at (corrConfigIndex::charged::kC34Gap ), cent, rndm, " c34" );
@@ -2854,6 +2894,14 @@ struct PidFlowPtCorr {
28542894 bool filledPr = fillFC (MyParticleType::kProton , corrconfigs.at (corrConfigIndex::proton::kC22Pure ), cent, rndm, " c22pure" );
28552895 bool filledUnidentified = fillFC (MyParticleType::kUnidentified , corrconfigs.at (corrConfigIndex::unidentified::kC22Pure ), cent, rndm, " c22pure" );
28562896
2897+ // SC/NSC components only: the mixed raw <4> uses its GFW tuple weight
2898+ // and the same bootstrap draw as the existing c22pure and charged c22.
2899+ // Existing <2> profiles retain their own valid-event samples/weights.
2900+ fillFC (MyParticleType::kPion , corrconfigs.at (corrConfigIndex::pion::kC24PIDChargedGap ), cent, rndm, " c24PIDChargedGap" );
2901+ fillFC (MyParticleType::kKaon , corrconfigs.at (corrConfigIndex::kaon::kC24PIDChargedGap ), cent, rndm, " c24PIDChargedGap" );
2902+ fillFC (MyParticleType::kProton , corrconfigs.at (corrConfigIndex::proton::kC24PIDChargedGap ), cent, rndm, " c24PIDChargedGap" );
2903+ fillFC (MyParticleType::kUnidentified , corrconfigs.at (corrConfigIndex::unidentified::kC24PIDChargedGap ), cent, rndm, " c24PIDChargedGap" );
2904+
28572905 fillFC (MyParticleType::kPion , corrconfigs.at (corrConfigIndex::pion::kC32Pure ), cent, rndm, " c32pure" );
28582906 fillFC (MyParticleType::kKaon , corrconfigs.at (corrConfigIndex::kaon::kC32Pure ), cent, rndm, " c32pure" );
28592907 fillFC (MyParticleType::kProton , corrconfigs.at (corrConfigIndex::proton::kC32Pure ), cent, rndm, " c32pure" );
@@ -3987,32 +4035,43 @@ struct PidFlowPtCorr {
39874035
39884036 // start filling graphs
39894037 for (const auto & track : tracks) {
3990- // Use the same track-quality, PID and species pT selection as processData.
4038+ // Use the same track-quality selection as processData, but do not
4039+ // require a PID hypothesis for the all-particle QA histograms.
39914040 if (!trackSelectedForFlow (track)) {
39924041 continue ;
39934042 }
4043+ const float pt = track.pt ();
4044+ if (std::abs (track.sign ()) == 1 ) {
4045+ registry.fill (HIST (" DetectorPidQA/TPC/dEdxAll" ), pt, track.tpcSignal ());
4046+ if (track.hasTOF ()) {
4047+ registry.fill (HIST (" DetectorPidQA/TOF/tofTimeAll" ), pt, track.tofSignal () - track.tofEvTime ());
4048+ }
4049+ }
4050+
4051+ // The species-dependent histograms additionally require an identified
4052+ // PID and the corresponding POI pT range.
39944053 const int pid = getPidConfigurable (track);
3995- if (!isWithinPOIPtRange (pid, track. pt () )) {
4054+ if (!isWithinPOIPtRange (pid, pt )) {
39964055 continue ;
39974056 }
39984057
39994058 switch (pid) {
40004059 case MyParticleType::kPion :
4001- registry.fill (HIST (" DetectorPidQA/TPC/dEdxPi" ), track. tpcInnerParam () , track.tpcSignal ());
4060+ registry.fill (HIST (" DetectorPidQA/TPC/dEdxPi" ), pt , track.tpcSignal ());
40024061 if (track.hasTOF ()) {
4003- registry.fill (HIST (" DetectorPidQA/TOF/deltaPi" ), track. p () , o2::aod::pidutils::tofExpSignalDiff<o2::track::PID ::Pion>(track));
4062+ registry.fill (HIST (" DetectorPidQA/TOF/deltaPi" ), pt , o2::aod::pidutils::tofExpSignalDiff<o2::track::PID ::Pion>(track));
40044063 }
40054064 break ;
40064065 case MyParticleType::kKaon :
4007- registry.fill (HIST (" DetectorPidQA/TPC/dEdxKa" ), track. tpcInnerParam () , track.tpcSignal ());
4066+ registry.fill (HIST (" DetectorPidQA/TPC/dEdxKa" ), pt , track.tpcSignal ());
40084067 if (track.hasTOF ()) {
4009- registry.fill (HIST (" DetectorPidQA/TOF/deltaKa" ), track. p () , o2::aod::pidutils::tofExpSignalDiff<o2::track::PID ::Kaon>(track));
4068+ registry.fill (HIST (" DetectorPidQA/TOF/deltaKa" ), pt , o2::aod::pidutils::tofExpSignalDiff<o2::track::PID ::Kaon>(track));
40104069 }
40114070 break ;
40124071 case MyParticleType::kProton :
4013- registry.fill (HIST (" DetectorPidQA/TPC/dEdxPr" ), track. tpcInnerParam () , track.tpcSignal ());
4072+ registry.fill (HIST (" DetectorPidQA/TPC/dEdxPr" ), pt , track.tpcSignal ());
40144073 if (track.hasTOF ()) {
4015- registry.fill (HIST (" DetectorPidQA/TOF/deltaPr" ), track. p () , o2::aod::pidutils::tofExpSignalDiff<o2::track::PID ::Proton>(track));
4074+ registry.fill (HIST (" DetectorPidQA/TOF/deltaPr" ), pt , o2::aod::pidutils::tofExpSignalDiff<o2::track::PID ::Proton>(track));
40164075 }
40174076 break ;
40184077 default :
0 commit comments