1212// / \file flowZdcEnergy.cxx
1313// / \author Kegang Xiong
1414// / \since 03/2026
15- // / \brief Study ZDC energy observables versus centrality for Run 2 / Run 3.
15+ // / \brief Study ZDC energy observables versus multiplicity for Run 2 / Run 3.
1616
1717#include " Common/DataModel/Centrality.h"
1818#include " Common/DataModel/EventSelection.h"
@@ -44,23 +44,18 @@ using namespace o2::framework::expressions;
4444
4545#define O2_DEFINE_CONFIGURABLE (NAME, TYPE, DEFAULT, HELP ) Configurable<TYPE> NAME{#NAME, DEFAULT, HELP};
4646
47- struct flowZdcEnergy {
48-
49- struct : ConfigurableGroup{
50- O2_DEFINE_CONFIGURABLE (cfgUseEvsel, bool , true , " whether to enable event selection" )
51- O2_DEFINE_CONFIGURABLE (cfgCentMin, float , 0 .f, " Minimum centrality for selected events" )
52- O2_DEFINE_CONFIGURABLE (cfgCentMax, float , 90 .f, " Maximum centrality for selected events" )
53- O2_DEFINE_CONFIGURABLE (cfgVtxZ, float , 10 .f, " Accepted z-vertex range" )} evsel;
47+ struct FlowZdcEnergy {
5448
49+ O2_DEFINE_CONFIGURABLE (cfgVtxZ, float , 10 .f, " Event cut: accepted z-vertex range" )
5550 O2_DEFINE_CONFIGURABLE (cfgEtaMax, float , 0 .8f , " Maximum track #eta" )
5651 O2_DEFINE_CONFIGURABLE (cfgPtMin, float , 0 .2f , " Minimum track #P_{t}" )
5752 O2_DEFINE_CONFIGURABLE (cfgPtMax, float , 10 .0f , " Maximum track #P_{t}" )
5853 O2_DEFINE_CONFIGURABLE (cfgDcaXYMax, float , 0 .2f , " Maximum DCAxy" )
5954 O2_DEFINE_CONFIGURABLE (cfgDcaZMax, float , 2 .0f , " Maximum DCAz" )
6055
6156 ConfigurableAxis axisCent{" axisCent" , {90 , 0 , 90 }, " Centrality (%)" };
62- ConfigurableAxis axisMult{" axisMult" , {100 , 0 , 100000 }, " Multiplicity" };
63- ConfigurableAxis axisMultDivided{" axisMultDivided" , {30 , 0 , 15000 }, " Multiplicity bins for ZN energy" };
57+ ConfigurableAxis axisMult{" axisMult" , {500 , 0 , 15000 }, " Multiplicity" };
58+ ConfigurableAxis axisMultDivided{" axisMultDivided" , {500 , 0 , 10000 }, " Multiplicity bins for ZN energy" };
6459 ConfigurableAxis axisPt{" axisPt" , {100 , 0 , 15 }, " #P_{t}" };
6560 ConfigurableAxis axisEta{" axisEta" , {64 , -1.6 , 1.6 }, " #eta" };
6661 ConfigurableAxis axisEnergy{" axisEnergy" , {300 , 0 , 300 }, " Energy" };
@@ -71,7 +66,6 @@ struct flowZdcEnergy {
7166 kAllEvents = 0 ,
7267 kSeln ,
7368 kZvtx ,
74- kCentrality ,
7569 kBCHasZDC ,
7670 kSelectedZDC ,
7771 kNSelections
@@ -105,13 +99,17 @@ struct flowZdcEnergy {
10599 hCount->GetXaxis ()->SetBinLabel (kAllEvents + 1 , " All events" );
106100 hCount->GetXaxis ()->SetBinLabel (kSeln + 1 , " Sel7/8" );
107101 hCount->GetXaxis ()->SetBinLabel (kZvtx + 1 , " Zvtx" );
108- hCount->GetXaxis ()->SetBinLabel (kCentrality + 1 , " Centrality" );
109102 hCount->GetXaxis ()->SetBinLabel (kBCHasZDC + 1 , " BC has ZDC" );
110103 hCount->GetXaxis ()->SetBinLabel (kSelectedZDC + 1 , " Selected ZDC" );
111104
112- registry.add (" QA/hCentrality" , " " , {HistType::kTH1D , {axisCent}});
113- registry.add (" QA/hMultiplicity" , " " , {HistType::kTH1D , {axisMult}});
114- registry.add (" QA/hMultiplicity_TPC" , " " , {HistType::kTH1D , {axisMult}});
105+ registry.add (" QA/hCentrality_beforeCut" , " " , {HistType::kTH1D , {axisCent}});
106+ registry.add (" QA/hMultiplicity_beforeCut" , " " , {HistType::kTH1D , {axisMult}});
107+ registry.add (" QA/hMultiplicity_TPC_beforeCut" , " " , {HistType::kTH1D , {axisMult}});
108+
109+ registry.add (" QA/hCentrality_afterCut" , " " , {HistType::kTH1D , {axisCent}});
110+ registry.add (" QA/hMultiplicity_afterCut" , " " , {HistType::kTH1D , {axisMult}});
111+ registry.add (" QA/hMultiplicity_TPC_afterCut" , " " , {HistType::kTH1D , {axisMult}});
112+
115113 registry.add (" QA/hPt" , " " , {HistType::kTH1D , {axisPt}});
116114 registry.add (" QA/hEta" , " " , {HistType::kTH1D , {axisEta}});
117115
@@ -148,28 +146,34 @@ struct flowZdcEnergy {
148146
149147 // Helper: event selection
150148 template <typename TCollision>
151- bool acceptEvent (TCollision const & collision, bool UseEvsel, float centrality, const int runmode )
149+ bool acceptEventRun2 (TCollision const & collision)
152150 {
153- if (!UseEvsel) {
154- registry.fill (HIST (" QA/hEventCount" ), kAllEvents );
155- } else {
156- registry.fill (HIST (" QA/hEventCount" ), kAllEvents );
157- if (runmode == 2 && !collision.sel7 ()) {
158- return false ;
159- }
160- if (runmode == 3 && !collision.sel8 ()) {
161- return false ;
162- }
163- registry.fill (HIST (" QA/hEventCount" ), kSeln );
164- if (std::abs (collision.posZ ()) > evsel.cfgVtxZ ) {
165- return false ;
166- }
167- registry.fill (HIST (" QA/hEventCount" ), kZvtx );
168- if (centrality < evsel.cfgCentMin || centrality > evsel.cfgCentMax ) {
169- return false ;
170- }
171- registry.fill (HIST (" QA/hEventCount" ), kCentrality );
151+ registry.fill (HIST (" QA/hEventCount" ), kAllEvents );
152+ if (!collision.sel7 ()) {
153+ return false ;
154+ }
155+ registry.fill (HIST (" QA/hEventCount" ), kSeln );
156+ if (std::abs (collision.posZ ()) > cfgVtxZ) {
157+ return false ;
172158 }
159+ registry.fill (HIST (" QA/hEventCount" ), kZvtx );
160+
161+ return true ;
162+ }
163+
164+ template <typename TCollision>
165+ bool acceptEventRun3 (TCollision const & collision)
166+ {
167+ registry.fill (HIST (" QA/hEventCount" ), kAllEvents );
168+ if (!collision.sel8 ()) {
169+ return false ;
170+ }
171+ registry.fill (HIST (" QA/hEventCount" ), kSeln );
172+ if (std::abs (collision.posZ ()) > cfgVtxZ) {
173+ return false ;
174+ }
175+ registry.fill (HIST (" QA/hEventCount" ), kZvtx );
176+
173177 return true ;
174178 }
175179
@@ -232,11 +236,12 @@ struct flowZdcEnergy {
232236 registry.fill (HIST (" hEnergyWithMult_ZNA_SumSectors" ), sumEnergyZNA, multiTPC);
233237 registry.fill (HIST (" hEnergyWithMult_ZNC_SumSectors" ), sumEnergyZNC, multiTPC);
234238
235- if (commonDen > 1 .e -6f ) {
239+ const float nonZero = 1 .e -6f ;
240+ if (commonDen > nonZero) {
236241 registry.fill (HIST (" hEnergyWithCent_RescaledDiff" ), (energyCommonZNA - energyCommonZNC) / commonDen, centrality);
237242 registry.fill (HIST (" hEnergyWithMult_RescaledDiff" ), (energyCommonZNA - energyCommonZNC) / commonDen, multiTPC);
238243 }
239- if (sumDen > 1 . e - 6f ) {
244+ if (sumDen > nonZero ) {
240245 registry.fill (HIST (" hEnergyWithCent_RescaledSumDiff" ), (sumEnergyZNA - sumEnergyZNC) / sumDen, centrality);
241246 registry.fill (HIST (" hEnergyWithMult_RescaledSumDiff" ), (sumEnergyZNA - sumEnergyZNC) / sumDen, multiTPC);
242247 }
@@ -252,12 +257,16 @@ struct flowZdcEnergy {
252257 const float multi = collision.multFT0C ();
253258 const float multiTPC = collision.multTPC ();
254259
255- if (!acceptEvent (collision, evsel.cfgUseEvsel , centrality, 3 )) {
260+ registry.fill (HIST (" QA/hCentrality_beforeCut" ), centrality);
261+ registry.fill (HIST (" QA/hMultiplicity_beforeCut" ), multi);
262+ registry.fill (HIST (" QA/hMultiplicity_TPC_beforeCut" ), multiTPC);
263+
264+ if (!acceptEventRun3 (collision)) {
256265 return ;
257266 }
258- registry.fill (HIST (" QA/hCentrality " ), centrality);
259- registry.fill (HIST (" QA/hMultiplicity " ), multi);
260- registry.fill (HIST (" QA/hMultiplicity_TPC " ), multiTPC);
267+ registry.fill (HIST (" QA/hCentrality_afterCut " ), centrality);
268+ registry.fill (HIST (" QA/hMultiplicity_afterCut " ), multi);
269+ registry.fill (HIST (" QA/hMultiplicity_TPC_afterCut " ), multiTPC);
261270 fillZDCObservables<CollisionsRun3::iterator, BCsRun3>(collision, centrality, multiTPC);
262271
263272 for (const auto & track : tracks) {
@@ -276,12 +285,16 @@ struct flowZdcEnergy {
276285 const float multi = collision.multFV0M ();
277286 const float multiTPC = collision.multTPC ();
278287
279- if (!acceptEvent (collision, evsel.cfgUseEvsel , centrality, 2 )) {
288+ registry.fill (HIST (" QA/hCentrality_beforeCut" ), centrality);
289+ registry.fill (HIST (" QA/hMultiplicity_beforeCut" ), multi);
290+ registry.fill (HIST (" QA/hMultiplicity_TPC_beforeCut" ), multiTPC);
291+
292+ if (!acceptEventRun2 (collision)) {
280293 return ;
281294 }
282- registry.fill (HIST (" QA/hCentrality " ), centrality);
283- registry.fill (HIST (" QA/hMultiplicity " ), multi);
284- registry.fill (HIST (" QA/hMultiplicity_TPC " ), multiTPC);
295+ registry.fill (HIST (" QA/hCentrality_afterCut " ), centrality);
296+ registry.fill (HIST (" QA/hMultiplicity_afterCut " ), multi);
297+ registry.fill (HIST (" QA/hMultiplicity_TPC_afterCut " ), multiTPC);
285298 fillZDCObservables<CollisionsRun2::iterator, BCsRun2>(collision, centrality, multiTPC);
286299
287300 for (const auto & track : tracks) {
@@ -291,12 +304,12 @@ struct flowZdcEnergy {
291304 }
292305
293306 // Process switches
294- PROCESS_SWITCH (flowZdcEnergy , processRun3, " Process Run 3 data" , true );
295- PROCESS_SWITCH (flowZdcEnergy , processRun2, " Process Run 2 data" , false );
307+ PROCESS_SWITCH (FlowZdcEnergy , processRun3, " Process Run 3 data" , true );
308+ PROCESS_SWITCH (FlowZdcEnergy , processRun2, " Process Run 2 data" , false );
296309};
297310
298311WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
299312{
300313 return WorkflowSpec{
301- adaptAnalysisTask<flowZdcEnergy >(cfgc)};
314+ adaptAnalysisTask<FlowZdcEnergy >(cfgc)};
302315}
0 commit comments