@@ -28,14 +28,29 @@ using namespace o2::framework;
2828using namespace o2 ::framework::expressions;
2929
3030enum 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
3539struct 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