@@ -35,7 +35,7 @@ using namespace o2::framework::expressions;
3535using namespace o2 ::aod::evsel;
3636
3737using BCsRun3 = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
38- using ColEvSels = soa::Join<aod::Collisions, aod::EvSels>;
38+ using ColEvSels = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs >;
3939
4040struct ZDCCalibTower {
4141
@@ -48,9 +48,32 @@ struct ZDCCalibTower {
4848 Configurable<bool > tdcCut{" tdcCut" , false , " Flag for TDC cut" };
4949 Configurable<float > tdcZNmincut{" tdcZNmincut" , -2.5 , " Min ZN TDC cut" };
5050 Configurable<float > tdcZNmaxcut{" tdcZNmaxcut" , -2.5 , " Max ZN TDC cut" };
51+ // Event selections
52+ Configurable<bool > cfgEvSelSel8{" cfgEvSelSel8" , true , " Event selection: sel8" };
53+ Configurable<float > cfgEvSelVtxZ{" cfgEvSelVtxZ" , 10 , " Event selection: zVtx" };
54+ Configurable<bool > cfgEvSelsDoOccupancySel{" cfgEvSelsDoOccupancySel" , true , " Event selection: do occupancy selection" };
55+ Configurable<float > cfgEvSelsMaxOccupancy{" cfgEvSelsMaxOccupancy" , 10000 , " Event selection: set max occupancy" };
56+ Configurable<bool > cfgEvSelsNoSameBunchPileupCut{" cfgEvSelsNoSameBunchPileupCut" , true , " Event selection: no same bunch pileup cut" };
57+ Configurable<bool > cfgEvSelsIsGoodZvtxFT0vsPV{" cfgEvSelsIsGoodZvtxFT0vsPV" , true , " Event selection: is good ZVTX FT0 vs PV" };
58+ Configurable<bool > cfgEvSelsNoCollInTimeRangeStandard{" cfgEvSelsNoCollInTimeRangeStandard" , true , " Event selection: no collision in time range standard" };
59+ Configurable<bool > cfgEvSelsIsVertexITSTPC{" cfgEvSelsIsVertexITSTPC" , true , " Event selection: is vertex ITSTPC" };
60+ Configurable<bool > cfgEvSelsIsGoodITSLayersAll{" cfgEvSelsIsGoodITSLayersAll" , true , " Event selection: is good ITS layers all" };
5161 //
5262 HistogramRegistry registry{" Histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
5363
64+ enum SelectionCriteria {
65+ evSel_zvtx,
66+ evSel_sel8,
67+ evSel_occupancy,
68+ evSel_kNoSameBunchPileup,
69+ evSel_kIsGoodZvtxFT0vsPV,
70+ evSel_kNoCollInTimeRangeStandard,
71+ evSel_kIsVertexITSTPC,
72+ evSel_kIsGoodITSLayersAll,
73+ evSel_allEvents,
74+ nEventSelections
75+ };
76+
5477 void init (InitContext const &)
5578 {
5679 registry.add (" ZNApmc" , " ZNApmc; ZNA PMC; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
@@ -65,6 +88,78 @@ struct ZDCCalibTower {
6588 registry.add (" ZNCpm4" , " ZNCpm4; ZNC PM4; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
6689 registry.add (" ZNAsumq" , " ZNAsumq; ZNA uncalib. sum PMQ; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
6790 registry.add (" ZNCsumq" , " ZNCsumq; ZNC uncalib. sum PMQ; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
91+
92+ registry.add (" hEventCount" , " Number of Event; Cut; #Events Passed Cut" , {HistType::kTH1D , {{nEventSelections, 0 , nEventSelections}}});
93+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_allEvents + 1 , " All events" );
94+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_zvtx + 1 , " vtxZ" );
95+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_sel8 + 1 , " Sel8" );
96+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_occupancy + 1 , " kOccupancy" );
97+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kNoSameBunchPileup + 1 , " kNoSameBunchPileup" );
98+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsGoodZvtxFT0vsPV + 1 , " kIsGoodZvtxFT0vsPV" );
99+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kNoCollInTimeRangeStandard + 1 , " kNoCollInTimeRangeStandard" );
100+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsVertexITSTPC + 1 , " kIsVertexITSTPC" );
101+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsGoodITSLayersAll + 1 , " kkIsGoodITSLayersAll" );
102+ }
103+
104+
105+ template <typename TCollision>
106+ uint8_t eventSelected (TCollision collision)
107+ {
108+ uint8_t selectionBits = 0 ;
109+ bool selected;
110+
111+ registry.fill (HIST (" hEventCount" ), evSel_allEvents);
112+
113+ selected = std::fabs (collision.posZ ()) < cfgEvSelVtxZ;
114+ if (selected) {
115+ selectionBits |= (uint8_t )(0x1u << evSel_zvtx);
116+ registry.fill (HIST (" hEventCount" ), evSel_zvtx);
117+ }
118+
119+ selected = collision.sel8 ();
120+ if (selected) {
121+ selectionBits |= (uint8_t )(0x1u << evSel_sel8);
122+ registry.fill (HIST (" hEventCount" ), evSel_sel8);
123+ }
124+
125+ auto occupancy = collision.trackOccupancyInTimeRange ();
126+ selected = occupancy <= cfgEvSelsMaxOccupancy;
127+ if (selected) {
128+ selectionBits |= (uint8_t )(0x1u << evSel_occupancy);
129+ registry.fill (HIST (" hEventCount" ), evSel_occupancy);
130+ }
131+
132+ selected = collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup );
133+ if (selected) {
134+ selectionBits |= (uint8_t )(0x1u << evSel_kNoSameBunchPileup);
135+ registry.fill (HIST (" hEventCount" ), evSel_kNoSameBunchPileup);
136+ }
137+
138+ selected = collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV );
139+ if (selected) {
140+ selectionBits |= (uint8_t )(0x1u << evSel_kIsGoodZvtxFT0vsPV);
141+ registry.fill (HIST (" hEventCount" ), evSel_kIsGoodZvtxFT0vsPV);
142+ }
143+
144+ selected = collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard );
145+ if (selected) {
146+ selectionBits |= (uint8_t )(0x1u << evSel_kNoCollInTimeRangeStandard);
147+ registry.fill (HIST (" hEventCount" ), evSel_kNoCollInTimeRangeStandard);
148+ }
149+
150+ selected = collision.selection_bit (o2::aod::evsel::kIsVertexITSTPC );
151+ if (selected) {
152+ selectionBits |= (uint8_t )(0x1u << evSel_kIsVertexITSTPC);
153+ registry.fill (HIST (" hEventCount" ), evSel_kIsVertexITSTPC);
154+ }
155+
156+ selected = collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll );
157+ if (selected) {
158+ selectionBits |= (uint8_t )(0x1u << evSel_kIsGoodITSLayersAll);
159+ registry.fill (HIST (" hEventCount" ), evSel_kIsGoodITSLayersAll);
160+ }
161+
162+ return selectionBits;
68163 }
69164
70165 void process (ColEvSels const & cols, BCsRun3 const & /* bcs*/ , aod::Zdcs const & /* zdcs*/ )
@@ -75,6 +170,10 @@ struct ZDCCalibTower {
75170 if (foundBC.has_zdc ()) {
76171 const auto & zdc = foundBC.zdc ();
77172
173+ uint8_t evSelection = eventSelected (collision);
174+
175+ float centrality = collision.centFT0C ();
176+
78177 // To assure that ZN have a genuine signal (tagged by the relative TDC)
79178 // we can check that the amplitude is >0 or that ADC is NOT very negative (-inf)
80179
@@ -127,7 +226,7 @@ struct ZDCCalibTower {
127226 registry.get <TH1 >(HIST (" ZNCpm3" ))->Fill (pmqZNC[2 ]);
128227 registry.get <TH1 >(HIST (" ZNCpm4" ))->Fill (pmqZNC[3 ]);
129228 registry.get <TH1 >(HIST (" ZNCsumq" ))->Fill (sumZNC);
130- }
229+ }
131230 if (isZNAhit) {
132231 for (int it = 0 ; it < 4 ; it++) {
133232 pmqZNA[it] = (zdc.energySectorZNA ())[it];
@@ -142,7 +241,7 @@ struct ZDCCalibTower {
142241 registry.get <TH1 >(HIST (" ZNAsumq" ))->Fill (sumZNA);
143242 }
144243 if (isZNAhit || isZNChit)
145- zTab (pmcZNA, pmqZNA[0 ], pmqZNA[1 ], pmqZNA[2 ], pmqZNA[3 ], tdcZNC, pmcZNC, pmqZNC[0 ], pmqZNC[1 ], pmqZNC[2 ], pmqZNC[3 ], tdcZNA);
244+ zTab (pmcZNA, pmqZNA[0 ], pmqZNA[1 ], pmqZNA[2 ], pmqZNA[3 ], tdcZNC, pmcZNC, pmqZNC[0 ], pmqZNC[1 ], pmqZNC[2 ], pmqZNC[3 ], tdcZNA, centrality, foundBC. timestamp (), evSelection );
146245 }
147246 }
148247 }
@@ -152,4 +251,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) // o2-linter: disab
152251{
153252 return WorkflowSpec{
154253 adaptAnalysisTask<ZDCCalibTower>(cfgc)};
155- }
254+ }
0 commit comments