Skip to content

Commit 609d1b9

Browse files
omassenalibuild
andauthored
[PWGCF] Implement new Run3 centrality estimators and expand analysis (#9786)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent e2f5668 commit 609d1b9

File tree

1 file changed

+107
-26
lines changed

1 file changed

+107
-26
lines changed

PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx

Lines changed: 107 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
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

Comments
 (0)