1919#include " Framework/ASoAHelpers.h"
2020#include " Common/DataModel/TrackSelectionTables.h"
2121#include " Common/DataModel/EventSelection.h"
22- #include " Common/DataModel/PIDResponse.h"
2322#include " Common/DataModel/Centrality.h"
2423#include " Common/DataModel/Multiplicity.h"
2524#include " Framework/StaticFor.h"
@@ -49,12 +48,14 @@ struct NeutronProtonCorrZdc {
4948 Configurable<double > cfgAlphaZmin{" cfgAlphaZmin" , -1 , " Minimum value for ZDC asymmetry" };
5049 Configurable<double > cfgAlphaZmax{" cfgAlphaZmax" , 1 , " Maximum value for ZDC asymmetry" };
5150 Configurable<double > cfgMaxCentrality{" cfgMaxCentrality" , 80 , " Maximum collision centrality" };
51+ Configurable<int > cfgCentralityEstimator{" cfgCentralityEstimator" , 0 , " Choice of centrality estimator" };
52+ Configurable<int > cfgNBinsMultiplicity{" cfgNBinsMultiplicity" , 1000 , " N bins for multiplicity histograms" };
5253
5354 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 [%]" };
5455
5556 Filter collisionVtxZ = nabs(aod::collision::posZ) < 10 .f;
5657
57- using CentralitiesRun3 = aod::CentFT0Cs;
58+ using CentralitiesRun3 = soa::Join< aod::CentFT0Cs, aod::CentFT0Ms, aod::CentFV0As, aod::CentFT0CVariant1s, aod::CentNGlobals> ;
5859 using CentralitiesRun2 = aod::CentRun2V0Ms;
5960 using BCsRun3 = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
6061
@@ -72,6 +73,12 @@ struct NeutronProtonCorrZdc {
7273 const AxisSpec axisZPSignal{2 * cfgNBinsZP, cfgZPmin, 1.5 * cfgZPmax, " ZP (a.u.)" };
7374 const AxisSpec axisAlphaZ{cfgNBinsAlpha, cfgAlphaZmin, cfgAlphaZmax, " #alpha_{spec}" };
7475 const AxisSpec axisZDiffSignal{cfgNBinsZN, cfgDiffZmin, cfgDiffZmax, " #Delta E" };
76+ const AxisSpec axisMultiplicityF0A{cfgNBinsMultiplicity, 0 , 200000 , " F0A" };
77+ const AxisSpec axisMultiplicityF0C{cfgNBinsMultiplicity, 0 , 100000 , " F0C" };
78+ const AxisSpec axisMultiplicityF0M{cfgNBinsMultiplicity, 0 , 300000 , " F0M" };
79+ const AxisSpec axisMultiplicityFDD{cfgNBinsMultiplicity, 0 , 50000 , " FDD" };
80+ const AxisSpec axisMultiplicityTPC{cfgNBinsMultiplicity, 0 , 100000 , " TPC" };
81+ const AxisSpec axisMultiplicityMultNGlobal{cfgNBinsMultiplicity, 0 , 3500 , " MultsNGlobal" };
7582
7683 HistogramConfigSpec defaultZNSectorHist ({HistType::kTH2F , {cfgAxisCent, axisZNSectorSignal}});
7784 HistogramConfigSpec defaultZPSectorHist ({HistType::kTH2F , {cfgAxisCent, axisZPSectorSignal}});
@@ -107,9 +114,49 @@ struct NeutronProtonCorrZdc {
107114 histos.add (" CentvsAlphaZP" , " CentvsAlphaZP" , kTH2F , {cfgAxisCent, axisAlphaZ});
108115 histos.add (" CentvsDiffZNSignal" , " CentvsDiffZNSignal" , defaultZDCDiffHist);
109116 histos.add (" CentvsDiffZPSignal" , " CentvsDiffZPSignal" , defaultZDCDiffHist);
117+ histos.add (" CentvsZNAvsZNC" , " CentvsZNAvsZNC" , kTH3F , {cfgAxisCent, axisZNASignal, axisZNCSignal});
118+ histos.add (" CentvsZNAvsZPA" , " CentvsZNAvsZPA" , kTH3F , {cfgAxisCent, axisZNASignal, axisZPASignal});
119+ histos.add (" CentvsZNAvsZPC" , " CentvsZNAvsZPC" , kTH3F , {cfgAxisCent, axisZNASignal, axisZPCSignal});
120+ histos.add (" CentvsZPAvsZNC" , " CentvsZPAvsZNC" , kTH3F , {cfgAxisCent, axisZPASignal, axisZNCSignal});
121+ histos.add (" CentvsZPAvsZPC" , " CentvsZNAvsZPC" , kTH3F , {cfgAxisCent, axisZPASignal, axisZPCSignal});
122+ histos.add (" CentvsZNCvsZPC" , " CentvsZNCvsZPC" , kTH3F , {cfgAxisCent, axisZNCSignal, axisZPCSignal});
123+ histos.add (" CentvsZNvsZP" , " CentvsZNvsZP" , kTH3F , {cfgAxisCent, axisZNSignal, axisZPSignal});
124+
125+ histos.add (" MultiplicityHistograms/FV0A" , " FV0A" , kTH1F , {axisMultiplicityF0A});
126+ histos.add (" MultiplicityHistograms/FT0A" , " FT0A" , kTH1F , {axisMultiplicityF0A});
127+ histos.add (" MultiplicityHistograms/FT0C" , " FT0C" , kTH1F , {axisMultiplicityF0C});
128+ histos.add (" MultiplicityHistograms/FDDA" , " FDDA" , kTH1F , {axisMultiplicityFDD});
129+ histos.add (" MultiplicityHistograms/FDDC" , " FDDC" , kTH1F , {axisMultiplicityFDD});
130+ histos.add (" MultiplicityHistograms/TPC" , " TPC" , kTH1F , {axisMultiplicityTPC});
131+ histos.add (" MultiplicityHistograms/NGlobal" , " NGlobal" , kTH1F , {axisMultiplicityMultNGlobal});
132+ histos.add (" MultiplicityHistograms/CentvsFT0C" , " CentvsFT0C" , kTH2F , {cfgAxisCent, axisMultiplicityF0C});
133+ histos.add (" MultiplicityHistograms/CentvsFT0CVar1" , " CentvsFT0CVar1" , kTH2F , {cfgAxisCent, axisMultiplicityF0C});
134+ histos.add (" MultiplicityHistograms/CentvsFT0M" , " CentvsFT0M" , kTH2F , {cfgAxisCent, axisMultiplicityF0M});
135+ histos.add (" MultiplicityHistograms/CentvsFV0A" , " CentvsFV0A" , kTH2F , {cfgAxisCent, axisMultiplicityF0A});
136+ histos.add (" MultiplicityHistograms/CentvsNGlobal" , " CentvsNGlobal" , kTH2F , {cfgAxisCent, axisMultiplicityMultNGlobal});
110137 }
138+
139+ template <int mult, typename C>
140+ void fillMultHistosRun3 (const C& col)
141+ {
142+ static constexpr std::string_view MultLabels[] = {" FT0C" , " FT0A" , " FV0A" , " FDDC" , " FDDA" , " TPC" , " NGlobal" };
143+ std::array<float , 7 > multarray = {col.multFT0C (), col.multFT0A (), col.multFV0A (), col.multFDDC (), col.multFDDA (), static_cast <float >(col.multTPC ()), static_cast <float >(col.multNTracksGlobal ())};
144+
145+ histos.fill (HIST (" MultiplicityHistograms/" ) + HIST (MultLabels[mult]), multarray[mult]);
146+ }
147+
148+ template <int cent, typename C>
149+ void fillCentHistosRun3 (const C& col)
150+ {
151+ static constexpr std::string_view CentLabels[] = {" CentvsFT0C" , " CentvsFT0CVar1" , " CentvsFT0M" , " CentvsFV0A" , " CentvsNGlobal" };
152+ std::array<float , 5 > centarray = {col.centFT0C (), col.centFT0CVariant1 (), col.centFT0M (), col.centFV0A (), col.centNGlobal ()};
153+ std::array<float , 5 > multarray = {col.multFT0C (), col.multFT0C (), col.multFT0C () + col.multFT0A (), col.multFV0A (), static_cast <float >(col.multNTracksGlobal ())};
154+
155+ histos.fill (HIST (" MultiplicityHistograms/" ) + HIST (CentLabels[cent]), centarray[cent], multarray[cent]);
156+ }
157+
111158 template <int side, typename Z>
112- void fillZDCHistos (const float centr, const Z& zdc)
159+ void fillZDCSideCommonHistos (const float centr, const Z& zdc)
113160 {
114161 static constexpr std::string_view SubDir[] = {" ASide/" , " CSide/" };
115162
@@ -118,52 +165,66 @@ struct NeutronProtonCorrZdc {
118165 std::array<float , 2 > znEnergyResponseCommon = {zdc.energyCommonZNA (), zdc.energyCommonZNC ()};
119166 std::array<float , 2 > zpEnergyResponseCommon = {zdc.energyCommonZPA (), zdc.energyCommonZPC ()};
120167
121- // Fill Neutron ZDC historgrams
122- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZNSector0Signal" ), centr, znEnergyResponse[side][0 ]);
123- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZNSector1Signal" ), centr, znEnergyResponse[side][1 ]);
124- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZNSector2Signal" ), centr, znEnergyResponse[side][2 ]);
125- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZNSector3Signal" ), centr, znEnergyResponse[side][3 ]);
126-
127168 float sumZN = znEnergyResponse[side][0 ] + znEnergyResponse[side][1 ] + znEnergyResponse[side][2 ] + znEnergyResponse[side][3 ];
169+ float sumZP = zpEnergyResponse[side][0 ] + zpEnergyResponse[side][1 ] + zpEnergyResponse[side][2 ] + zpEnergyResponse[side][3 ];
128170
129171 histos.fill (HIST (SubDir[side]) + HIST (" CentvsZNSignalSum" ), centr, sumZN);
130172 histos.fill (HIST (SubDir[side]) + HIST (" CentvsZNSignalCommon" ), centr, znEnergyResponseCommon[side]);
131173 histos.fill (HIST (SubDir[side]) + HIST (" CentvsdiffZNSignal" ), centr, sumZN - znEnergyResponseCommon[side]);
132-
133- // Fill Proton ZDC histograms
134- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZPSector0Signal" ), centr, zpEnergyResponse[side][0 ]);
135- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZPSector1Signal" ), centr, zpEnergyResponse[side][1 ]);
136- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZPSector2Signal" ), centr, zpEnergyResponse[side][2 ]);
137- histos.fill (HIST (SubDir[side]) + HIST (" CentvsZPSector3Signal" ), centr, zpEnergyResponse[side][3 ]);
138-
139- float sumZP = zpEnergyResponse[side][0 ] + zpEnergyResponse[side][1 ] + zpEnergyResponse[side][2 ] + zpEnergyResponse[side][3 ];
140-
141174 histos.fill (HIST (SubDir[side]) + HIST (" CentvsZPSignalSum" ), centr, sumZP);
142175 histos.fill (HIST (SubDir[side]) + HIST (" CentvsZPSignalCommon" ), centr, zpEnergyResponseCommon[side]);
143176 histos.fill (HIST (SubDir[side]) + HIST (" CentvsdiffZPSignal" ), centr, sumZP - zpEnergyResponseCommon[side]);
144177 }
145178
146- void processRun3 (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, CentralitiesRun3>>::iterator const & collision, BCsRun3 const &, aod::Zdcs const &)
179+ template <int side, int sector, typename Z>
180+ void fillZDCSideSectorHistos (const float centr, const Z& zdc)
181+ {
182+ static constexpr std::string_view SubDir[] = {" ASide/" , " CSide/" };
183+ static constexpr std::string_view ZNSector[] = {" CentvsZNSector0Signal" , " CentvsZNSector1Signal" , " CentvsZNSector2Signal" , " CentvsZNSector3Signal" };
184+ static constexpr std::string_view ZPSector[] = {" CentvsZPSector0Signal" , " CentvsZPSector1Signal" , " CentvsZPSector2Signal" , " CentvsZPSector3Signal" };
185+
186+ std::array<std::array<float , 4 >, 2 > znEnergyResponse = {zdc.energySectorZNA (), zdc.energySectorZNC ()};
187+ std::array<std::array<float , 4 >, 2 > zpEnergyResponse = {zdc.energySectorZPA (), zdc.energySectorZPC ()};
188+
189+ histos.fill (HIST (SubDir[side]) + HIST (ZNSector[sector]), centr, znEnergyResponse[side][sector]);
190+ histos.fill (HIST (SubDir[side]) + HIST (ZPSector[sector]), centr, zpEnergyResponse[side][sector]);
191+ }
192+
193+ void processRun3 (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::MultsGlobal, CentralitiesRun3>>::iterator const & collision, BCsRun3 const &, aod::Zdcs const &)
147194 {
148195 histos.fill (HIST (" eventCounter" ), EventCounter::kNoSelection );
149196 if (!collision.sel8 ()) {
150197 return ;
151198 }
152199 histos.fill (HIST (" eventCounter" ), EventCounter::kQualitySelection );
153- if (collision.centFT0C () > cfgMaxCentrality) {
200+
201+ const float centArray[] = {collision.centFT0C (), collision.centFT0CVariant1 (), collision.centFT0M (), collision.centFV0A (), collision.centNGlobal ()};
202+ const auto cent = centArray[cfgCentralityEstimator];
203+ if (cent > cfgMaxCentrality) {
154204 return ;
155205 }
156206 histos.fill (HIST (" eventCounter" ), EventCounter::kMaxCentralitySelection );
207+
157208 const auto & foundBC = collision.foundBC_as <BCsRun3>();
158209 if (foundBC.has_zdc ()) {
159210 const auto & zdcread = foundBC.zdc ();
160- const auto cent = collision.centFT0C ();
161-
162211 histos.fill (HIST (" eventCounter" ), EventCounter::kZDCSelection );
163212 histos.fill (HIST (" CentralityPercentile" ), cent);
164213
165- fillZDCHistos<0 >(cent, zdcread); // Fill A-side
166- fillZDCHistos<1 >(cent, zdcread); // Fill C-side
214+ static_for<0 , 6 >([&](auto i) {
215+ fillMultHistosRun3<i>(collision); // Fill multiplicity histograms
216+ });
217+
218+ static_for<0 , 4 >([&](auto i) {
219+ fillCentHistosRun3<i>(collision); // Fill centrality histograms
220+ });
221+
222+ static_for<0 , 1 >([&](auto i) {
223+ fillZDCSideCommonHistos<i>(cent, zdcread); // Fill i-side common histograms
224+ static_for<0 , 3 >([&](auto j) {
225+ fillZDCSideSectorHistos<i, j>(cent, zdcread); // Fill i-side sector j histograms
226+ });
227+ });
167228
168229 float sumZNC = (zdcread.energySectorZNC ())[0 ] + (zdcread.energySectorZNC ())[1 ] + (zdcread.energySectorZNC ())[2 ] + (zdcread.energySectorZNC ())[3 ];
169230 float sumZNA = (zdcread.energySectorZNA ())[0 ] + (zdcread.energySectorZNA ())[1 ] + (zdcread.energySectorZNA ())[2 ] + (zdcread.energySectorZNA ())[3 ];
@@ -181,6 +242,14 @@ struct NeutronProtonCorrZdc {
181242 histos.fill (HIST (" CentvsZPSignalCommon" ), cent, (zdcread.energyCommonZPA () + zdcread.energyCommonZPC ()));
182243 histos.fill (HIST (" CentvsAlphaZN" ), cent, alphaZN);
183244 histos.fill (HIST (" CentvsAlphaZP" ), cent, alphaZP);
245+
246+ histos.fill (HIST (" CentvsZNAvsZNC" ), cent, sumZNA, sumZNC);
247+ histos.fill (HIST (" CentvsZNAvsZPA" ), cent, sumZNA, sumZPA);
248+ histos.fill (HIST (" CentvsZNAvsZPC" ), cent, sumZNA, sumZPC);
249+ histos.fill (HIST (" CentvsZPAvsZNC" ), cent, sumZPA, sumZNC);
250+ histos.fill (HIST (" CentvsZPAvsZPC" ), cent, sumZPA, sumZPC);
251+ histos.fill (HIST (" CentvsZNCvsZPC" ), cent, sumZNC, sumZPC);
252+ histos.fill (HIST (" CentvsZNvsZP" ), cent, sumZNA + sumZNC, sumZPA + sumZPC);
184253 }
185254 }
186255 PROCESS_SWITCH (NeutronProtonCorrZdc, processRun3, " Process analysis for Run 3 data" , true );
@@ -204,8 +273,12 @@ struct NeutronProtonCorrZdc {
204273 histos.fill (HIST (" eventCounter" ), EventCounter::kZDCSelection );
205274 histos.fill (HIST (" CentralityPercentile" ), cent);
206275
207- fillZDCHistos<0 >(cent, zdcread); // Fill A-side
208- fillZDCHistos<1 >(cent, zdcread); // Fill C-side
276+ static_for<0 , 1 >([&](auto i) {
277+ fillZDCSideCommonHistos<i>(cent, zdcread); // Fill i-side common channels
278+ static_for<0 , 3 >([&](auto j) {
279+ fillZDCSideSectorHistos<i, j>(cent, zdcread); // Fill i-side sector j
280+ });
281+ });
209282
210283 float sumZNC = (zdcread.energySectorZNC ())[0 ] + (zdcread.energySectorZNC ())[1 ] + (zdcread.energySectorZNC ())[2 ] + (zdcread.energySectorZNC ())[3 ];
211284 float sumZNA = (zdcread.energySectorZNA ())[0 ] + (zdcread.energySectorZNA ())[1 ] + (zdcread.energySectorZNA ())[2 ] + (zdcread.energySectorZNA ())[3 ];
@@ -223,6 +296,14 @@ struct NeutronProtonCorrZdc {
223296 histos.fill (HIST (" CentvsZPSignalCommon" ), cent, (zdcread.energyCommonZPA () + zdcread.energyCommonZPC ()));
224297 histos.fill (HIST (" CentvsAlphaZN" ), cent, alphaZN);
225298 histos.fill (HIST (" CentvsAlphaZP" ), cent, alphaZP);
299+
300+ histos.fill (HIST (" CentvsZNAvsZNC" ), cent, sumZNA, sumZNC);
301+ histos.fill (HIST (" CentvsZNAvsZPA" ), cent, sumZNA, sumZPA);
302+ histos.fill (HIST (" CentvsZNAvsZPC" ), cent, sumZNA, sumZPC);
303+ histos.fill (HIST (" CentvsZPAvsZNC" ), cent, sumZPA, sumZNC);
304+ histos.fill (HIST (" CentvsZPAvsZPC" ), cent, sumZPA, sumZPC);
305+ histos.fill (HIST (" CentvsZNCvsZPC" ), cent, sumZNC, sumZPC);
306+ histos.fill (HIST (" CentvsZNvsZP" ), cent, sumZNA + sumZNC, sumZPA + sumZPC);
226307 }
227308 }
228309 PROCESS_SWITCH (NeutronProtonCorrZdc, processRun2, " Process analysis for Run 2 converted data" , false );
0 commit comments