99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
1111
12- // / \file zdc-task-intercalib .cxx
12+ // / \file zdcTaskInterCalib .cxx
1313// / \brief Task for ZDC tower inter-calibration
1414// / \author chiara.oppedisano@cern.ch
1515
16- // o2-linter: disable=name/workflow-file
17- // o2-linter: disable=name/file-cpp
1816#include " Framework/AnalysisTask.h"
1917#include " Framework/AnalysisDataModel.h"
2018#include " Framework/HistogramRegistry.h"
@@ -35,9 +33,9 @@ using namespace o2::framework::expressions;
3533using namespace o2 ::aod::evsel;
3634
3735using BCsRun3 = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
38- using ColEvSels = soa::Join<aod::Collisions, aod::EvSels>;
36+ using ColEvSels = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs >;
3937
40- struct ZDCCalibTower {
38+ struct ZdcTaskInterCalib {
4139
4240 Produces<aod::ZDCInterCalib> zTab;
4341
@@ -48,9 +46,32 @@ struct ZDCCalibTower {
4846 Configurable<bool > tdcCut{" tdcCut" , false , " Flag for TDC cut" };
4947 Configurable<float > tdcZNmincut{" tdcZNmincut" , -2.5 , " Min ZN TDC cut" };
5048 Configurable<float > tdcZNmaxcut{" tdcZNmaxcut" , -2.5 , " Max ZN TDC cut" };
49+ // Event selections
50+ Configurable<bool > cfgEvSelSel8{" cfgEvSelSel8" , true , " Event selection: sel8" };
51+ Configurable<float > cfgEvSelVtxZ{" cfgEvSelVtxZ" , 10 , " Event selection: zVtx" };
52+ Configurable<bool > cfgEvSelsDoOccupancySel{" cfgEvSelsDoOccupancySel" , true , " Event selection: do occupancy selection" };
53+ Configurable<float > cfgEvSelsMaxOccupancy{" cfgEvSelsMaxOccupancy" , 10000 , " Event selection: set max occupancy" };
54+ Configurable<bool > cfgEvSelsNoSameBunchPileupCut{" cfgEvSelsNoSameBunchPileupCut" , true , " Event selection: no same bunch pileup cut" };
55+ Configurable<bool > cfgEvSelsIsGoodZvtxFT0vsPV{" cfgEvSelsIsGoodZvtxFT0vsPV" , true , " Event selection: is good ZVTX FT0 vs PV" };
56+ Configurable<bool > cfgEvSelsNoCollInTimeRangeStandard{" cfgEvSelsNoCollInTimeRangeStandard" , true , " Event selection: no collision in time range standard" };
57+ Configurable<bool > cfgEvSelsIsVertexITSTPC{" cfgEvSelsIsVertexITSTPC" , true , " Event selection: is vertex ITSTPC" };
58+ Configurable<bool > cfgEvSelsIsGoodITSLayersAll{" cfgEvSelsIsGoodITSLayersAll" , true , " Event selection: is good ITS layers all" };
5159 //
5260 HistogramRegistry registry{" Histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
5361
62+ enum SelectionCriteria {
63+ evSel_zvtx,
64+ evSel_sel8,
65+ evSel_occupancy,
66+ evSel_kNoSameBunchPileup,
67+ evSel_kIsGoodZvtxFT0vsPV,
68+ evSel_kNoCollInTimeRangeStandard,
69+ evSel_kIsVertexITSTPC,
70+ evSel_kIsGoodITSLayersAll,
71+ evSel_allEvents,
72+ nEventSelections
73+ };
74+
5475 void init (InitContext const &)
5576 {
5677 registry.add (" ZNApmc" , " ZNApmc; ZNA PMC; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
@@ -65,16 +86,93 @@ struct ZDCCalibTower {
6586 registry.add (" ZNCpm4" , " ZNCpm4; ZNC PM4; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
6687 registry.add (" ZNAsumq" , " ZNAsumq; ZNA uncalib. sum PMQ; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
6788 registry.add (" ZNCsumq" , " ZNCsumq; ZNC uncalib. sum PMQ; Entries" , {HistType::kTH1F , {{nBins, -0.5 , maxZN}}});
89+
90+ registry.add (" hEventCount" , " Number of Event; Cut; #Events Passed Cut" , {HistType::kTH1D , {{nEventSelections, 0 , nEventSelections}}});
91+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_allEvents + 1 , " All events" );
92+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_zvtx + 1 , " vtxZ" );
93+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_sel8 + 1 , " Sel8" );
94+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_occupancy + 1 , " kOccupancy" );
95+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kNoSameBunchPileup + 1 , " kNoSameBunchPileup" );
96+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsGoodZvtxFT0vsPV + 1 , " kIsGoodZvtxFT0vsPV" );
97+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kNoCollInTimeRangeStandard + 1 , " kNoCollInTimeRangeStandard" );
98+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsVertexITSTPC + 1 , " kIsVertexITSTPC" );
99+ registry.get <TH1>(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsGoodITSLayersAll + 1 , " kkIsGoodITSLayersAll" );
100+ }
101+
102+ template <typename TCollision>
103+ uint8_t eventSelected (TCollision collision)
104+ {
105+ uint8_t selectionBits = 0 ;
106+ bool selected;
107+
108+ registry.fill (HIST (" hEventCount" ), evSel_allEvents);
109+
110+ selected = std::fabs (collision.posZ ()) < cfgEvSelVtxZ;
111+ if (selected) {
112+ selectionBits |= (uint8_t )(0x1u << evSel_zvtx);
113+ registry.fill (HIST (" hEventCount" ), evSel_zvtx);
114+ }
115+
116+ selected = collision.sel8 ();
117+ if (selected) {
118+ selectionBits |= (uint8_t )(0x1u << evSel_sel8);
119+ registry.fill (HIST (" hEventCount" ), evSel_sel8);
120+ }
121+
122+ auto occupancy = collision.trackOccupancyInTimeRange ();
123+ selected = occupancy <= cfgEvSelsMaxOccupancy;
124+ if (selected) {
125+ selectionBits |= (uint8_t )(0x1u << evSel_occupancy);
126+ registry.fill (HIST (" hEventCount" ), evSel_occupancy);
127+ }
128+
129+ selected = collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup );
130+ if (selected) {
131+ selectionBits |= (uint8_t )(0x1u << evSel_kNoSameBunchPileup);
132+ registry.fill (HIST (" hEventCount" ), evSel_kNoSameBunchPileup);
133+ }
134+
135+ selected = collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV );
136+ if (selected) {
137+ selectionBits |= (uint8_t )(0x1u << evSel_kIsGoodZvtxFT0vsPV);
138+ registry.fill (HIST (" hEventCount" ), evSel_kIsGoodZvtxFT0vsPV);
139+ }
140+
141+ selected = collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard );
142+ if (selected) {
143+ selectionBits |= (uint8_t )(0x1u << evSel_kNoCollInTimeRangeStandard);
144+ registry.fill (HIST (" hEventCount" ), evSel_kNoCollInTimeRangeStandard);
145+ }
146+
147+ selected = collision.selection_bit (o2::aod::evsel::kIsVertexITSTPC );
148+ if (selected) {
149+ selectionBits |= (uint8_t )(0x1u << evSel_kIsVertexITSTPC);
150+ registry.fill (HIST (" hEventCount" ), evSel_kIsVertexITSTPC);
151+ }
152+
153+ selected = collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll );
154+ if (selected) {
155+ selectionBits |= (uint8_t )(0x1u << evSel_kIsGoodITSLayersAll);
156+ registry.fill (HIST (" hEventCount" ), evSel_kIsGoodITSLayersAll);
157+ }
158+
159+ return selectionBits;
68160 }
69161
70162 void process (ColEvSels const & cols, BCsRun3 const & /* bcs*/ , aod::Zdcs const & /* zdcs*/ )
71163 {
72164 // collision-based event selection
165+ int nTowers = 4 ; // number of ZDC towers
166+
73167 for (auto const & collision : cols) {
74168 const auto & foundBC = collision.foundBC_as <BCsRun3>();
75169 if (foundBC.has_zdc ()) {
76170 const auto & zdc = foundBC.zdc ();
77171
172+ uint8_t evSelection = eventSelected (collision);
173+
174+ float centrality = collision.centFT0C ();
175+
78176 // To assure that ZN have a genuine signal (tagged by the relative TDC)
79177 // we can check that the amplitude is >0 or that ADC is NOT very negative (-inf)
80178
@@ -117,7 +215,7 @@ struct ZDCCalibTower {
117215 };
118216 //
119217 if (isZNChit) {
120- for (int it = 0 ; it < 4 ; it++) {
218+ for (int it = 0 ; it < nTowers ; it++) {
121219 pmqZNC[it] = (zdc.energySectorZNC ())[it];
122220 sumZNC += pmqZNC[it];
123221 }
@@ -129,7 +227,7 @@ struct ZDCCalibTower {
129227 registry.get <TH1>(HIST (" ZNCsumq" ))->Fill (sumZNC);
130228 }
131229 if (isZNAhit) {
132- for (int it = 0 ; it < 4 ; it++) {
230+ for (int it = 0 ; it < nTowers ; it++) {
133231 pmqZNA[it] = (zdc.energySectorZNA ())[it];
134232 sumZNA += pmqZNA[it];
135233 }
@@ -142,7 +240,7 @@ struct ZDCCalibTower {
142240 registry.get <TH1>(HIST (" ZNAsumq" ))->Fill (sumZNA);
143241 }
144242 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);
243+ 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 );
146244 }
147245 }
148246 }
@@ -151,5 +249,5 @@ struct ZDCCalibTower {
151249WorkflowSpec defineDataProcessing (ConfigContext const & cfgc) // o2-linter: disable=name/file-cpp
152250{
153251 return WorkflowSpec{
154- adaptAnalysisTask<ZDCCalibTower >(cfgc)};
252+ adaptAnalysisTask<ZdcTaskInterCalib >(cfgc)};
155253}
0 commit comments