Skip to content

Commit f03effc

Browse files
authored
[PWGCF] Add pid-ch v2^2 correlation (#18312)
1 parent 68526b1 commit f03effc

1 file changed

Lines changed: 78 additions & 19 deletions

File tree

‎PWGCF/Flow/Tasks/pidFlowPtCorr.cxx‎

Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

161166
enum : 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

Comments
 (0)