Skip to content

Commit 7c18588

Browse files
omassenalibuild
andauthored
[PWGCF] Addition of proton-neutron ZDC correlation task in TwoParticleCorrelations (#8879)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 10255a0 commit 7c18588

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed

PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ o2physics_add_dpl_workflow(corr-sparse
5353
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore
5454
COMPONENT_NAME Analysis)
5555

56+
o2physics_add_dpl_workflow(neutronprotoncorrzdc
57+
SOURCES neutronProtonCorrZdc.cxx
58+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
59+
COMPONENT_NAME Analysis)
60+
5661

5762

5863

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
///
12+
/// \file neutronProtonCorrZdc.cxx
13+
/// \brief Correlations between protons and neutrons in the ZDC
14+
/// \author Olaf Massen <olaf.massen@cern.ch>
15+
16+
#include "Framework/runDataProcessing.h"
17+
#include "Framework/AnalysisTask.h"
18+
#include "Framework/ASoAHelpers.h"
19+
20+
#include "Common/DataModel/TrackSelectionTables.h"
21+
#include "Common/DataModel/EventSelection.h"
22+
#include "Common/DataModel/PIDResponse.h"
23+
#include "Common/DataModel/Centrality.h"
24+
#include "Common/DataModel/Multiplicity.h"
25+
26+
using namespace o2;
27+
using namespace o2::framework;
28+
using namespace o2::framework::expressions;
29+
30+
struct NeutronProtonCorrZdc {
31+
// Histogram registry: an object to hold your histograms
32+
HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject};
33+
34+
Configurable<int> cfgNBinsZN{"cfgNBinsZN", 100, "N bins for ZNA and ZNC"};
35+
Configurable<int> cfgNBinsZP{"cfgNBinsZP", 100, "N bins for ZPA and ZPC"};
36+
Configurable<double> cfgZNmin{"cfgZNmin", -10, "Minimum value for ZN signal"};
37+
Configurable<double> cfgZNmax{"cfgZNmax", 350, "Maximum value for ZN signal"};
38+
Configurable<double> cfgZPmin{"cfgZPmin", -10, "Minimum value for ZP signal"};
39+
Configurable<double> cfgZPmax{"cfgZPmax", 200, "Maximum value for ZP signal"};
40+
Configurable<double> cfgDiffZmin{"cfgDiffZmin", -50, "Minimum value for the diffZ signal"};
41+
Configurable<double> cfgDiffZmax{"cfgDiffZmax", 50, "Maximum value for the diffZ signal"};
42+
Configurable<int> cfgNBinsAlpha{"cfgNBinsAlpha", 100, "Number of bins for ZDC asymmetry"};
43+
Configurable<double> cfgAlphaZmin{"cfgAlphaZmin", -1, "Minimum value for ZDC asymmetry"};
44+
Configurable<double> cfgAlphaZmax{"cfgAlphaZmax", 1, "Maximum value for ZDC asymmetry"};
45+
Configurable<bool> cfgProcessRun2{"cfgProcessRun2", false, "Analyse Run 2 converted data"};
46+
// Configurable<int> cfgCentralityEstimator{"cfgCentralityEstimator", 0, "Choice of centrality estimator"};//0 for FTOC, 1 for FTOA, 2 for FTOM, 3 for FVOA. //To be included at a later stage
47+
48+
ConfigurableAxis cfgAxisCent{"cfgAxisCent", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.2f, 4.4f, 4.6f, 4.8f, 5.0f, 5.5f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 8.5f, 9.0f, 9.5f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f, 40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f, 48.0f, 49.0f, 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f, 56.0f, 57.0f, 58.0f, 59.0f, 60.0f, 61.0f, 62.0f, 63.0f, 64.0f, 65.0f, 66.0f, 67.0f, 68.0f, 69.0f, 70.0f, 71.0f, 72.0f, 73.0f, 74.0f, 75.0f, 76.0f, 77.0f, 78.0f, 79.0f, 80.0f, 81.0f, 82.0f, 83.0f, 84.0f, 85.0f, 86.0f, 87.0f, 88.0f, 89.0f, 90.0f, 91.0f, 92.0f, 93.0f, 94.0f, 95.0f, 96.0f, 97.0f, 98.0f, 99.0f, 100.0f}, "Centrality [%]"};
49+
50+
Filter collisionVtxZ = nabs(aod::collision::posZ) < 10.f;
51+
52+
using CentralitiesRun3 = aod::CentFT0Cs;
53+
using CentralitiesRun2 = aod::CentRun2V0Ms;
54+
using BCsRun3 = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
55+
56+
void init(InitContext const&)
57+
{
58+
// define axes you want to use
59+
const AxisSpec axisCounter{4, 0, +2, ""};
60+
const AxisSpec axisZNSectorSignal{cfgNBinsZN, cfgZNmin, cfgZNmax / 3.};
61+
const AxisSpec axisZPSectorSignal{cfgNBinsZP, cfgZPmin, cfgZPmax / 3.};
62+
const AxisSpec axisZNASignal{cfgNBinsZN, cfgZNmin, cfgZNmax, "ZNA (a.u.)"};
63+
const AxisSpec axisZNCSignal{cfgNBinsZN, cfgZNmin, cfgZNmax, "ZNC (a.u.)"};
64+
const AxisSpec axisZPASignal{cfgNBinsZP, cfgZPmin, cfgZPmax, "ZPA (a.u.)"};
65+
const AxisSpec axisZPCSignal{cfgNBinsZP, cfgZPmin, cfgZPmax, "ZPC (a.u.)"};
66+
const AxisSpec axisZNSignal{2 * cfgNBinsZN, cfgZNmin, 1.5 * cfgZNmax, "ZN (a.u.)"};
67+
const AxisSpec axisZPSignal{2 * cfgNBinsZP, cfgZPmin, 1.5 * cfgZPmax, "ZP (a.u.)"};
68+
const AxisSpec axisAlphaZ{cfgNBinsAlpha, cfgAlphaZmin, cfgAlphaZmax, "#alpha_{spec}"};
69+
const AxisSpec axisZDiffSignal{cfgNBinsZN, cfgDiffZmin, cfgDiffZmax, "#Delta E"};
70+
71+
// create histograms
72+
histos.add("eventCounter", "eventCounter", kTH1F, {axisCounter});
73+
74+
histos.add("ZNASector0Signal", "ZNASector0Signal", kTH1F, {axisZNSectorSignal});
75+
histos.add("ZNASector1Signal", "ZNASector1Signal", kTH1F, {axisZNSectorSignal});
76+
histos.add("ZNASector2Signal", "ZNASector2Signal", kTH1F, {axisZNSectorSignal});
77+
histos.add("ZNASector3Signal", "ZNASector3Signal", kTH1F, {axisZNSectorSignal});
78+
79+
histos.add("ZNCSector0Signal", "ZNCSector0Signal", kTH1F, {axisZNSectorSignal});
80+
histos.add("ZNCSector1Signal", "ZNCSector1Signal", kTH1F, {axisZNSectorSignal});
81+
histos.add("ZNCSector2Signal", "ZNCSector2Signal", kTH1F, {axisZNSectorSignal});
82+
histos.add("ZNCSector3Signal", "ZNCSector3Signal", kTH1F, {axisZNSectorSignal});
83+
84+
histos.add("ZPASector0Signal", "ZPASector0Signal", kTH1F, {axisZPSectorSignal});
85+
histos.add("ZPASector1Signal", "ZPASector1Signal", kTH1F, {axisZPSectorSignal});
86+
histos.add("ZPASector2Signal", "ZPASector2Signal", kTH1F, {axisZPSectorSignal});
87+
histos.add("ZPASector3Signal", "ZPASector3Signal", kTH1F, {axisZPSectorSignal});
88+
89+
histos.add("ZPCSector0Signal", "ZPCSector0Signal", kTH1F, {axisZPSectorSignal});
90+
histos.add("ZPCSector1Signal", "ZPCSector1Signal", kTH1F, {axisZPSectorSignal});
91+
histos.add("ZPCSector2Signal", "ZPCSector2Signal", kTH1F, {axisZPSectorSignal});
92+
histos.add("ZPCSector3Signal", "ZPCSector3Signal", kTH1F, {axisZPSectorSignal});
93+
94+
histos.add("ZNASignal", "ZNASignal", kTH1F, {axisZNASignal});
95+
histos.add("ZNCSignal", "ZNCSignal", kTH1F, {axisZNCSignal});
96+
histos.add("ZNSignal", "ZNSignal", kTH1F, {axisZNSignal});
97+
histos.add("ZPASignal", "ZPASignal", kTH1F, {axisZPASignal});
98+
histos.add("ZPCSignal", "ZPCSignal", kTH1F, {axisZPCSignal});
99+
histos.add("ZPSignal", "ZPSignal", kTH1F, {axisZPSignal});
100+
101+
histos.add("alphaZN", "alphaZN", kTH1F, {axisAlphaZ});
102+
histos.add("alphaZP", "alphaZP", kTH1F, {axisAlphaZ});
103+
104+
histos.add("diffZNASignal", "diffZNASignal", kTH1F, {axisZDiffSignal});
105+
histos.add("diffZNCSignal", "diffZNCSignal", kTH1F, {axisZDiffSignal});
106+
histos.add("diffZPASignal", "diffZPASignal", kTH1F, {axisZDiffSignal});
107+
histos.add("diffZPCSignal", "diffZPCSignal", kTH1F, {axisZDiffSignal});
108+
histos.add("diffZNSignal", "diffZNSignal", kTH1F, {axisZDiffSignal});
109+
histos.add("diffZPSignal", "diffZPSignal", kTH1F, {axisZDiffSignal});
110+
111+
histos.add("CentralityPercentile", "CentralityPercentile", kTH1F, {cfgAxisCent});
112+
113+
histos.add("CentvsZNASignal", "FT0CvsZNASignal", kTH2F, {cfgAxisCent, axisZNASignal});
114+
histos.add("CentvsZNCSignal", "FT0CvsZNCSignal", kTH2F, {cfgAxisCent, axisZNCSignal});
115+
histos.add("CentvsZPASignal", "FT0CvsZPASignal", kTH2F, {cfgAxisCent, axisZPASignal});
116+
histos.add("CentvsZPCSignal", "FT0CvsZPCSignal", kTH2F, {cfgAxisCent, axisZPCSignal});
117+
histos.add("CentvsZNSignal", "FT0CvsZNSignal", kTH2F, {cfgAxisCent, axisZNSignal});
118+
histos.add("CentvsZPSignal", "FT0CvsZPSignal", kTH2F, {cfgAxisCent, axisZPSignal});
119+
}
120+
121+
void processRun3(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, CentralitiesRun3>>::iterator const& collision, BCsRun3 const&, aod::Zdcs const&)
122+
{
123+
if (!collision.sel8()) {
124+
histos.fill(HIST("eventCounter"), 0.25);
125+
return;
126+
}
127+
const auto& foundBC = collision.foundBC_as<BCsRun3>();
128+
if (foundBC.has_zdc()) {
129+
const auto& zdcread = foundBC.zdc();
130+
const auto cent = collision.centFT0C();
131+
132+
histos.fill(HIST("eventCounter"), 1.25);
133+
histos.fill(HIST("ZNASignal"), zdcread.energyCommonZNA());
134+
histos.fill(HIST("ZNCSignal"), zdcread.energyCommonZNC());
135+
histos.fill(HIST("ZPASignal"), zdcread.energyCommonZPA());
136+
histos.fill(HIST("ZPCSignal"), zdcread.energyCommonZPC());
137+
histos.fill(HIST("ZNASector0Signal"), (zdcread.energySectorZNA())[0]);
138+
histos.fill(HIST("ZNASector1Signal"), (zdcread.energySectorZNA())[1]);
139+
histos.fill(HIST("ZNASector2Signal"), (zdcread.energySectorZNA())[2]);
140+
histos.fill(HIST("ZNASector3Signal"), (zdcread.energySectorZNA())[3]);
141+
histos.fill(HIST("ZNCSector0Signal"), (zdcread.energySectorZNC())[0]);
142+
histos.fill(HIST("ZNCSector1Signal"), (zdcread.energySectorZNC())[1]);
143+
histos.fill(HIST("ZNCSector2Signal"), (zdcread.energySectorZNC())[2]);
144+
histos.fill(HIST("ZNCSector3Signal"), (zdcread.energySectorZNC())[3]);
145+
histos.fill(HIST("ZPASector0Signal"), (zdcread.energySectorZPA())[0]);
146+
histos.fill(HIST("ZPASector1Signal"), (zdcread.energySectorZPA())[1]);
147+
histos.fill(HIST("ZPASector2Signal"), (zdcread.energySectorZPA())[2]);
148+
histos.fill(HIST("ZPASector3Signal"), (zdcread.energySectorZPA())[3]);
149+
histos.fill(HIST("ZPCSector0Signal"), (zdcread.energySectorZPC())[0]);
150+
histos.fill(HIST("ZPCSector1Signal"), (zdcread.energySectorZPC())[1]);
151+
histos.fill(HIST("ZPCSector2Signal"), (zdcread.energySectorZPC())[2]);
152+
histos.fill(HIST("ZPCSector3Signal"), (zdcread.energySectorZPC())[3]);
153+
154+
float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3];
155+
float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3];
156+
float sumZPC = (zdcread.energySectorZPC())[0] + (zdcread.energySectorZPC())[1] + (zdcread.energySectorZPC())[2] + (zdcread.energySectorZPC())[3];
157+
float sumZPA = (zdcread.energySectorZPA())[0] + (zdcread.energySectorZPA())[1] + (zdcread.energySectorZPA())[2] + (zdcread.energySectorZPA())[3];
158+
float alphaZN = (sumZNA - sumZNC) / (sumZNA + sumZNC);
159+
float alphaZP = (sumZPA - sumZPC) / (sumZPA + sumZPC);
160+
161+
histos.fill(HIST("alphaZN"), alphaZN);
162+
histos.fill(HIST("alphaZP"), alphaZP);
163+
164+
histos.fill(HIST("diffZNASignal"), sumZNA - zdcread.energyCommonZNA());
165+
histos.fill(HIST("diffZNCSignal"), sumZNC - zdcread.energyCommonZNC());
166+
histos.fill(HIST("diffZPASignal"), sumZPA - zdcread.energyCommonZPA());
167+
histos.fill(HIST("diffZPCSignal"), sumZPC - zdcread.energyCommonZPC());
168+
histos.fill(HIST("ZNSignal"), sumZNA + sumZNC);
169+
histos.fill(HIST("ZPSignal"), sumZPA + sumZPC);
170+
histos.fill(HIST("diffZNSignal"), (sumZNA + sumZNC) - (zdcread.energyCommonZNA() + zdcread.energyCommonZNC()));
171+
histos.fill(HIST("diffZPSignal"), (sumZPA + sumZPC) - (zdcread.energyCommonZPA() + zdcread.energyCommonZPC()));
172+
histos.fill(HIST("CentralityPercentile"), cent);
173+
histos.fill(HIST("CentvsZNASignal"), cent, sumZNA);
174+
histos.fill(HIST("CentvsZNCSignal"), cent, sumZNC);
175+
histos.fill(HIST("CentvsZPASignal"), cent, sumZPA);
176+
histos.fill(HIST("CentvsZPCSignal"), cent, sumZPC);
177+
histos.fill(HIST("CentvsZNSignal"), cent, sumZNA + sumZNC);
178+
histos.fill(HIST("CentvsZPSignal"), cent, sumZPA + sumZPC);
179+
}
180+
}
181+
PROCESS_SWITCH(NeutronProtonCorrZdc, processRun3, "Process analysis for Run 3 data", true);
182+
183+
void processRun2(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Run2MatchedSparse, CentralitiesRun2>>::iterator const& collision, aod::BCsWithTimestamps const&, aod::Zdcs const&)
184+
{
185+
if (!collision.alias_bit(kINT7)) {
186+
histos.fill(HIST("eventCounter"), 0.25);
187+
return;
188+
}
189+
190+
if (collision.has_zdc()) {
191+
const auto& zdcread = collision.zdc();
192+
const auto cent = collision.centRun2V0M();
193+
histos.fill(HIST("eventCounter"), 1.25);
194+
histos.fill(HIST("ZNASignal"), zdcread.energyCommonZNA());
195+
histos.fill(HIST("ZNCSignal"), zdcread.energyCommonZNC());
196+
histos.fill(HIST("ZPASignal"), zdcread.energyCommonZPA());
197+
histos.fill(HIST("ZPCSignal"), zdcread.energyCommonZPC());
198+
histos.fill(HIST("ZNASector0Signal"), (zdcread.energySectorZNA())[0]);
199+
histos.fill(HIST("ZNASector1Signal"), (zdcread.energySectorZNA())[1]);
200+
histos.fill(HIST("ZNASector2Signal"), (zdcread.energySectorZNA())[2]);
201+
histos.fill(HIST("ZNASector3Signal"), (zdcread.energySectorZNA())[3]);
202+
histos.fill(HIST("ZNCSector0Signal"), (zdcread.energySectorZNC())[0]);
203+
histos.fill(HIST("ZNCSector1Signal"), (zdcread.energySectorZNC())[1]);
204+
histos.fill(HIST("ZNCSector2Signal"), (zdcread.energySectorZNC())[2]);
205+
histos.fill(HIST("ZNCSector3Signal"), (zdcread.energySectorZNC())[3]);
206+
histos.fill(HIST("ZPASector0Signal"), (zdcread.energySectorZPA())[0]);
207+
histos.fill(HIST("ZPASector1Signal"), (zdcread.energySectorZPA())[1]);
208+
histos.fill(HIST("ZPASector2Signal"), (zdcread.energySectorZPA())[2]);
209+
histos.fill(HIST("ZPASector3Signal"), (zdcread.energySectorZPA())[3]);
210+
histos.fill(HIST("ZPCSector0Signal"), (zdcread.energySectorZPC())[0]);
211+
histos.fill(HIST("ZPCSector1Signal"), (zdcread.energySectorZPC())[1]);
212+
histos.fill(HIST("ZPCSector2Signal"), (zdcread.energySectorZPC())[2]);
213+
histos.fill(HIST("ZPCSector3Signal"), (zdcread.energySectorZPC())[3]);
214+
float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3];
215+
float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3];
216+
float sumZPC = (zdcread.energySectorZPC())[0] + (zdcread.energySectorZPC())[1] + (zdcread.energySectorZPC())[2] + (zdcread.energySectorZPC())[3];
217+
float sumZPA = (zdcread.energySectorZPA())[0] + (zdcread.energySectorZPA())[1] + (zdcread.energySectorZPA())[2] + (zdcread.energySectorZPA())[3];
218+
float alphaZN = (sumZNA - sumZNC) / (sumZNA + sumZNC);
219+
float alphaZP = (sumZPA - sumZPC) / (sumZPA + sumZPC);
220+
histos.fill(HIST("alphaZN"), alphaZN);
221+
histos.fill(HIST("alphaZP"), alphaZP);
222+
223+
histos.fill(HIST("diffZNASignal"), sumZNA - zdcread.energyCommonZNA());
224+
histos.fill(HIST("diffZNCSignal"), sumZNC - zdcread.energyCommonZNC());
225+
histos.fill(HIST("diffZPASignal"), sumZPA - zdcread.energyCommonZPA());
226+
histos.fill(HIST("diffZPCSignal"), sumZPC - zdcread.energyCommonZPC());
227+
histos.fill(HIST("ZNSignal"), sumZNA + sumZNC);
228+
histos.fill(HIST("ZPSignal"), sumZPA + sumZPC);
229+
histos.fill(HIST("diffZNSignal"), (sumZNA + sumZNC) - (zdcread.energyCommonZNA() + zdcread.energyCommonZNC()));
230+
histos.fill(HIST("diffZPSignal"), (sumZPA + sumZPC) - (zdcread.energyCommonZPA() + zdcread.energyCommonZPC()));
231+
histos.fill(HIST("CentralityPercentile"), cent);
232+
histos.fill(HIST("CentvsZNASignal"), cent, sumZNA);
233+
histos.fill(HIST("CentvsZNCSignal"), cent, sumZNC);
234+
histos.fill(HIST("CentvsZPASignal"), cent, sumZPA);
235+
histos.fill(HIST("CentvsZPCSignal"), cent, sumZPC);
236+
histos.fill(HIST("CentvsZNSignal"), cent, sumZNA + sumZNC);
237+
histos.fill(HIST("CentvsZPSignal"), cent, sumZPA + sumZPC);
238+
}
239+
}
240+
PROCESS_SWITCH(NeutronProtonCorrZdc, processRun2, "Process analysis for Run 2 converted data", false);
241+
};
242+
243+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
244+
{
245+
return WorkflowSpec{
246+
adaptAnalysisTask<NeutronProtonCorrZdc>(cfgc)};
247+
}

0 commit comments

Comments
 (0)