Skip to content

Commit 59762b5

Browse files
omassenalibuild
andauthored
[PWGCF] Implementing additional event selection criteria (#11017)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 9cbfc86 commit 59762b5

File tree

1 file changed

+129
-33
lines changed

1 file changed

+129
-33
lines changed

PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx

Lines changed: 129 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,29 @@ using namespace o2::framework;
2828
using namespace o2::framework::expressions;
2929

3030
enum EventCounter { kNoSelection = 0,
31-
kQualitySelection = 1,
32-
kMaxCentralitySelection = 2,
33-
kZDCSelection = 3 };
31+
kSel8 = 1,
32+
kNoSameBunchPileUp = 2,
33+
kIsGoodZvtxFT0vsPV = 3,
34+
kNoCollInTimeRangeStandard = 4,
35+
kMaxCentralitySelection = 5,
36+
kZDCSelection = 6,
37+
kTimeDifferenceZDC = 7 };
3438

3539
struct NeutronProtonCorrZdc {
3640
// Histogram registry: an object to hold your histograms
3741
HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject};
3842

43+
Configurable<float> cfgZVertexCut{"cfgZVertexCut", 10., "Cut on Z vertex position"};
44+
Configurable<bool> cfgNoSameBunchPileupCut{"cfgNoSameBunchPileupCut", true, "kNoSameBunchPileUp Cut"};
45+
Configurable<bool> cfgIsGoodZvtxFT0vsPV{"cfgIsGoodZvtxFT0vsPV", true, "kIsGoodZvtxFT0vsPV Cut"};
46+
Configurable<bool> cfgNoCollInTimeRangeStandard{"cfgNoCollInTimeRangeStandard", true, "kNoCollInTimeRangeStandard Cut"};
47+
Configurable<double> cfgMaxCentrality{"cfgMaxCentrality", 80, "Maximum collision centrality"};
48+
Configurable<bool> cfgZDCTimingInformationCut{"cfgZDCTimingInformationCut", true, "Use timing information in ZDC event selection"};
49+
Configurable<int> cfgTimingBins{"cfgTimingBins", 200, "N bins for timing histograms"};
50+
Configurable<float> cfgTDCZNmincut{"cfgTDCZNmincut", -3.0, "Min ZN TDC cut"};
51+
Configurable<float> cfgTDCZNmaxcut{"cfgTDCZNmaxcut", 3.0, "Max ZN TDC cut"};
52+
Configurable<float> cfgTDCZPmincut{"cfgTDCZPmincut", -3.0, "Min ZP TDC cut"};
53+
Configurable<float> cfgTDCZPmaxcut{"cfgTDCZPmaxcut", 3.0, "Max ZP TDC cut"};
3954
Configurable<int> cfgNBinsZN{"cfgNBinsZN", 100, "N bins for ZNA and ZNC"};
4055
Configurable<int> cfgNBinsZP{"cfgNBinsZP", 100, "N bins for ZPA and ZPC"};
4156
Configurable<double> cfgZNmin{"cfgZNmin", -10, "Minimum value for ZN signal"};
@@ -47,13 +62,13 @@ struct NeutronProtonCorrZdc {
4762
Configurable<int> cfgNBinsAlpha{"cfgNBinsAlpha", 100, "Number of bins for ZDC asymmetry"};
4863
Configurable<double> cfgAlphaZmin{"cfgAlphaZmin", -1, "Minimum value for ZDC asymmetry"};
4964
Configurable<double> cfgAlphaZmax{"cfgAlphaZmax", 1, "Maximum value for ZDC asymmetry"};
50-
Configurable<double> cfgMaxCentrality{"cfgMaxCentrality", 80, "Maximum collision centrality"};
5165
Configurable<int> cfgCentralityEstimator{"cfgCentralityEstimator", 0, "Choice of centrality estimator"};
52-
Configurable<int> cfgNBinsMultiplicity{"cfgNBinsMultiplicity", 1000, "N bins for multiplicity histograms"};
66+
Configurable<bool> cfgFillMultiplicityQAHistograms{"cfgFillMultiplicityQAHistograms", true, "Fill multiplicity QA plots"};
67+
Configurable<int> cfgNBinsMultiplicity{"cfgNBinsMultiplicity", 500, "N bins for multiplicity histograms"};
5368

5469
ConfigurableAxis cfgAxisCent{"cfgAxisCent", {VARIABLE_WIDTH, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0}, "Centrality [%]"};
5570

56-
Filter collisionVtxZ = nabs(aod::collision::posZ) < 10.f;
71+
Filter collisionVtxZ = nabs(aod::collision::posZ) < cfgZVertexCut;
5772

5873
using CentralitiesRun3 = soa::Join<aod::CentFT0Cs, aod::CentFT0Ms, aod::CentFV0As, aod::CentFT0CVariant1s, aod::CentNGlobals>;
5974
using CentralitiesRun2 = aod::CentRun2V0Ms;
@@ -62,7 +77,8 @@ struct NeutronProtonCorrZdc {
6277
void init(InitContext const&)
6378
{
6479
// define axes you want to use
65-
const AxisSpec axisCounter{4, -0.5, 3.5, ""};
80+
const AxisSpec axisCounter{8, -0.5, 7.5, ""};
81+
const AxisSpec axisZDCTiming{cfgTimingBins, -10, 10};
6682
const AxisSpec axisZNSectorSignal{cfgNBinsZN, cfgZNmin, cfgZNmax / 3.};
6783
const AxisSpec axisZPSectorSignal{cfgNBinsZP, cfgZPmin, cfgZPmax / 3.};
6884
const AxisSpec axisZNASignal{cfgNBinsZN, cfgZNmin, cfgZNmax, "ZNA (a.u.)"};
@@ -80,13 +96,26 @@ struct NeutronProtonCorrZdc {
8096
const AxisSpec axisMultiplicityTPC{cfgNBinsMultiplicity, 0, 100000, "TPC"};
8197
const AxisSpec axisMultiplicityMultNGlobal{cfgNBinsMultiplicity, 0, 3500, "MultsNGlobal"};
8298

99+
HistogramConfigSpec defaultTimingHistogram({HistType::kTH2F, {cfgAxisCent, axisZDCTiming}});
83100
HistogramConfigSpec defaultZNSectorHist({HistType::kTH2F, {cfgAxisCent, axisZNSectorSignal}});
84101
HistogramConfigSpec defaultZPSectorHist({HistType::kTH2F, {cfgAxisCent, axisZPSectorSignal}});
85102
HistogramConfigSpec defaultZDCDiffHist({HistType::kTH2F, {cfgAxisCent, axisZDiffSignal}});
86103

87104
// create histograms
88105
histos.add("eventCounter", "eventCounter", kTH1F, {axisCounter});
106+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kSel8 + 1, "Sel8");
107+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kNoSameBunchPileUp + 1, "kNoSameBunchPileup");
108+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kIsGoodZvtxFT0vsPV + 1, "kIsGoodZvtxFT0vsPV");
109+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard");
110+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kMaxCentralitySelection + 1, "Cenrality range");
111+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kZDCSelection + 1, "isSelectedZDC");
112+
histos.get<TH1>(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kTimeDifferenceZDC + 1, "ZDC time difference");
113+
89114
histos.add("CentralityPercentile", "CentralityPercentile", kTH1F, {cfgAxisCent});
115+
histos.add("TimingZNAvsCent", "TimingZNAvsCent", defaultTimingHistogram);
116+
histos.add("TimingZNCvsCent", "TimingZNCvsCent", defaultTimingHistogram);
117+
histos.add("TimingZPAvsCent", "TimingZPAvsCent", defaultTimingHistogram);
118+
histos.add("TimingZPCvsCent", "TimingZPCvsCent", defaultTimingHistogram);
90119

91120
histos.add("ASide/CentvsZNSector0Signal", "CentvsZNASector0Signal", defaultZNSectorHist);
92121
histos.add("ASide/CentvsZNSector1Signal", "CentvsZNASector1Signal", defaultZNSectorHist);
@@ -124,18 +153,61 @@ struct NeutronProtonCorrZdc {
124153
histos.add("CentvsZNCvsZPC", "CentvsZNCvsZPC", kTH3F, {cfgAxisCent, axisZNCSignal, axisZPCSignal});
125154
histos.add("CentvsZNvsZP", "CentvsZNvsZP", kTH3F, {cfgAxisCent, axisZNSignal, axisZPSignal});
126155

127-
histos.add("MultiplicityHistograms/FV0A", "FV0A", kTH1F, {axisMultiplicityF0A});
128-
histos.add("MultiplicityHistograms/FT0A", "FT0A", kTH1F, {axisMultiplicityF0A});
129-
histos.add("MultiplicityHistograms/FT0C", "FT0C", kTH1F, {axisMultiplicityF0C});
130-
histos.add("MultiplicityHistograms/FDDA", "FDDA", kTH1F, {axisMultiplicityFDD});
131-
histos.add("MultiplicityHistograms/FDDC", "FDDC", kTH1F, {axisMultiplicityFDD});
132-
histos.add("MultiplicityHistograms/TPC", "TPC", kTH1F, {axisMultiplicityTPC});
133-
histos.add("MultiplicityHistograms/NGlobal", "NGlobal", kTH1F, {axisMultiplicityMultNGlobal});
134-
histos.add("MultiplicityHistograms/CentvsFT0C", "CentvsFT0C", kTH2F, {cfgAxisCent, axisMultiplicityF0C});
135-
histos.add("MultiplicityHistograms/CentvsFT0CVar1", "CentvsFT0CVar1", kTH2F, {cfgAxisCent, axisMultiplicityF0C});
136-
histos.add("MultiplicityHistograms/CentvsFT0M", "CentvsFT0M", kTH2F, {cfgAxisCent, axisMultiplicityF0M});
137-
histos.add("MultiplicityHistograms/CentvsFV0A", "CentvsFV0A", kTH2F, {cfgAxisCent, axisMultiplicityF0A});
138-
histos.add("MultiplicityHistograms/CentvsNGlobal", "CentvsNGlobal", kTH2F, {cfgAxisCent, axisMultiplicityMultNGlobal});
156+
if (cfgFillMultiplicityQAHistograms) {
157+
histos.add("MultiplicityHistograms/FV0A", "FV0A", kTH1F, {axisMultiplicityF0A});
158+
histos.add("MultiplicityHistograms/FT0A", "FT0A", kTH1F, {axisMultiplicityF0A});
159+
histos.add("MultiplicityHistograms/FT0C", "FT0C", kTH1F, {axisMultiplicityF0C});
160+
histos.add("MultiplicityHistograms/FDDA", "FDDA", kTH1F, {axisMultiplicityFDD});
161+
histos.add("MultiplicityHistograms/FDDC", "FDDC", kTH1F, {axisMultiplicityFDD});
162+
histos.add("MultiplicityHistograms/TPC", "TPC", kTH1F, {axisMultiplicityTPC});
163+
histos.add("MultiplicityHistograms/NGlobal", "NGlobal", kTH1F, {axisMultiplicityMultNGlobal});
164+
histos.add("MultiplicityHistograms/CentvsFT0C", "CentvsFT0C", kTH2F, {cfgAxisCent, axisMultiplicityF0C});
165+
histos.add("MultiplicityHistograms/CentvsFT0CVar1", "CentvsFT0CVar1", kTH2F, {cfgAxisCent, axisMultiplicityF0C});
166+
histos.add("MultiplicityHistograms/CentvsFT0M", "CentvsFT0M", kTH2F, {cfgAxisCent, axisMultiplicityF0M});
167+
histos.add("MultiplicityHistograms/CentvsFV0A", "CentvsFV0A", kTH2F, {cfgAxisCent, axisMultiplicityF0A});
168+
histos.add("MultiplicityHistograms/CentvsNGlobal", "CentvsNGlobal", kTH2F, {cfgAxisCent, axisMultiplicityMultNGlobal});
169+
}
170+
}
171+
172+
template <typename TCollision>
173+
bool eventSelected(TCollision coll, const float centrality)
174+
{
175+
if (!coll.sel8())
176+
return 0;
177+
histos.fill(HIST("eventCounter"), kSel8);
178+
179+
if (cfgNoSameBunchPileupCut) {
180+
if (!coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
181+
// rejects collisions which are associated with the same "found-by-T0" bunch crossing
182+
// https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof
183+
return 0;
184+
}
185+
histos.fill(HIST("eventCounter"), EventCounter::kNoSameBunchPileUp);
186+
}
187+
188+
if (cfgIsGoodZvtxFT0vsPV) {
189+
if (!coll.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) {
190+
// removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference
191+
// use this cut at low multiplicities with caution
192+
return 0;
193+
}
194+
histos.fill(HIST("eventCounter"), EventCounter::kIsGoodZvtxFT0vsPV);
195+
}
196+
197+
if (cfgNoCollInTimeRangeStandard) {
198+
if (!coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) {
199+
// Rejection of the collisions which have other events nearby
200+
return 0;
201+
}
202+
histos.fill(HIST("eventCounter"), EventCounter::kNoCollInTimeRangeStandard);
203+
}
204+
205+
if (centrality > cfgMaxCentrality) {
206+
return 0;
207+
}
208+
histos.fill(HIST("eventCounter"), EventCounter::kMaxCentralitySelection);
209+
210+
return 1;
139211
}
140212

141213
template <int mult, typename C>
@@ -195,31 +267,55 @@ struct NeutronProtonCorrZdc {
195267
void processRun3(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::MultsGlobal, CentralitiesRun3>>::iterator const& collision, BCsRun3 const&, aod::Zdcs const&)
196268
{
197269
histos.fill(HIST("eventCounter"), EventCounter::kNoSelection);
198-
if (!collision.sel8()) {
199-
return;
200-
}
201-
histos.fill(HIST("eventCounter"), EventCounter::kQualitySelection);
202270

203271
const float centArray[] = {collision.centFT0C(), collision.centFT0CVariant1(), collision.centFT0M(), collision.centFV0A(), collision.centNGlobal()};
204272
const auto cent = centArray[cfgCentralityEstimator];
205-
if (cent > cfgMaxCentrality) {
273+
274+
if (!eventSelected(collision, cent))
206275
return;
207-
}
208-
histos.fill(HIST("eventCounter"), EventCounter::kMaxCentralitySelection);
209276

210277
const auto& foundBC = collision.foundBC_as<BCsRun3>();
211278
if (foundBC.has_zdc()) {
212279
const auto& zdcread = foundBC.zdc();
213280
histos.fill(HIST("eventCounter"), EventCounter::kZDCSelection);
281+
282+
auto tZNA = zdcread.timeZNA();
283+
auto tZNC = zdcread.timeZNC();
284+
auto tZPA = zdcread.timeZPA();
285+
auto tZPC = zdcread.timeZPC();
286+
287+
histos.fill(HIST("TimingZNAvsCent"), cent, tZNA);
288+
histos.fill(HIST("TimingZNCvsCent"), cent, tZNC);
289+
histos.fill(HIST("TimingZPAvsCent"), cent, tZPA);
290+
histos.fill(HIST("TimingZPCvsCent"), cent, tZPC);
291+
292+
// Selection on timing for the ZDC
293+
if (cfgZDCTimingInformationCut) {
294+
if (tZNA <= cfgTDCZNmincut || tZNA >= cfgTDCZNmaxcut) {
295+
return;
296+
}
297+
if (tZNC <= cfgTDCZNmincut || tZNC >= cfgTDCZNmaxcut) {
298+
return;
299+
}
300+
if (tZPA <= cfgTDCZPmincut || tZPA >= cfgTDCZPmaxcut) {
301+
return;
302+
}
303+
if (tZPC <= cfgTDCZPmincut || tZPC >= cfgTDCZPmaxcut) {
304+
return;
305+
}
306+
}
307+
histos.fill(HIST("eventCounter"), EventCounter::kTimeDifferenceZDC);
214308
histos.fill(HIST("CentralityPercentile"), cent);
215309

216-
static_for<0, 6>([&](auto i) {
217-
fillMultHistosRun3<i>(collision); // Fill multiplicity histograms
218-
});
310+
if (cfgFillMultiplicityQAHistograms) {
311+
static_for<0, 6>([&](auto i) {
312+
fillMultHistosRun3<i>(collision); // Fill multiplicity histograms
313+
});
219314

220-
static_for<0, 4>([&](auto i) {
221-
fillCentHistosRun3<i>(collision); // Fill centrality histograms
222-
});
315+
static_for<0, 4>([&](auto i) {
316+
fillCentHistosRun3<i>(collision); // Fill centrality vs multiplicity histograms
317+
});
318+
}
223319

224320
static_for<0, 1>([&](auto i) {
225321
fillZDCSideCommonHistos<i>(cent, zdcread); // Fill i-side common histograms
@@ -264,7 +360,7 @@ struct NeutronProtonCorrZdc {
264360
if (!collision.alias_bit(kINT7)) {
265361
return;
266362
}
267-
histos.fill(HIST("eventCounter"), EventCounter::kQualitySelection);
363+
histos.fill(HIST("eventCounter"), EventCounter::kSel8);
268364
if (collision.centRun2V0M() > cfgMaxCentrality) {
269365
return;
270366
}

0 commit comments

Comments
 (0)