Rivet analyses referenceALICE_2012_I1127497Centrality dependence of charged particle production at large transverse momentum in Pb-Pb collisions at $\sqrt{s_{\mathrm{NN}}} = 2.76$ TeVExperiment: ALICE (LHC) Inspire ID: 1127497 Status: VALIDATED Authors:
Beam energies: (1380.0, 1380.0); (287040.0, 287040.0) GeV
The inclusive transverse momentum ($p_T$) distributions of primary charged particles are measured in the pseudo-rapidity range $|\eta| < 0.8$ as a function of event centrality in Pb--Pb collisions at $\sqrt{s_{nn}} = 2.76$ TeV with ALICE at the LHC. The data are presented in the $p_T$ range $0.15<p_T<50$ GeV/c for nine centrality intervals from 70-80% to 0-5%. The Pb-Pb spectra are presented in terms of the nuclear modification factor RAA using a pp reference spectrum measured at the same collision energy. We observe that the suppression of high-pT particles strongly depends on event centrality. In central collisions (0-5%) the yield is most suppressed with $R_{AA} \approx 0.13$ at $p_T= 6-7$ GeV/c. Above $p_T = 7$ GeV/c, there is a significant rise in the nuclear modification factor, which reaches $R_{AA} \approx 0.4$ for $p_T > 30$ GeV/c. In peripheral collisions (70-80%), the suppression is weaker with $R_{AA} \approx 0.7$ almost independently of $p_T$. The measured nuclear modification factors are compared to other measurements and model calculations. Source code: ALICE_2012_I1127497.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/Beam.hh"
4#include "Rivet/Projections/ChargedFinalState.hh"
5#include "Rivet/Tools/Cuts.hh"
6#include "Rivet/Projections/SingleValueProjection.hh"
7#include "Rivet/Analyses/AliceCommon.hh"
8#include "Rivet/Projections/HepMCHeavyIon.hh"
9
10namespace Rivet {
11
12 /// @brief ALICE PbPb at 2.76 TeV R_AA analysis.
13 class ALICE_2012_I1127497 : public Analysis {
14
15 public:
16
17 /// Constructor
18 RIVET_DEFAULT_ANALYSIS_CTOR(ALICE_2012_I1127497);
19
20 /// @name Analysis methods
21 /// @{
22
23 /// Book histograms and initialise projections before the run
24 void init() {
25
26 // Access the HepMC heavy ion info
27 declare(HepMCHeavyIon(), "HepMC");
28
29 // Declare centrality projection
30 declareCentrality(ALICE::V0MMultiplicity(),
31 "ALICE_2015_CENT_PBPB", "V0M", "V0M");
32
33 // Charged, primary particles with |eta| < 0.5 and pT > 150 MeV
34 declare(ALICE::PrimaryParticles(Cuts::abseta < 0.5 &&
35 Cuts::pT > 150*MeV && Cuts::abscharge > 0), "APRIM");
36
37 // Loop over all histograms
38 for (size_t ihist = 0; ihist < NHISTOS; ++ihist) {
39
40 // Initialize PbPb objects
41 book(_histNch[PBPB][ihist], ihist+1, 1, 1);
42
43 std::string nameCounterPbPb = "counter.pbpb." + std::to_string(ihist);
44 book(_counterSOW[PBPB][ihist], nameCounterPbPb); // Sum of weights counter for PbPb
45
46 std::string nameCounterNcoll = "counter.ncoll." + std::to_string(ihist);
47 book(_counterNcoll[ihist], nameCounterNcoll); // Ncoll counter for PbPb
48
49 // Initialize pp objects. In principle, only one pp histogram would be
50 // needed since centrality does not make any difference here. However,
51 // in some cases in this analysis the binning differ from each other,
52 // so this is easy-to-implement way to account for that.
53 std::string namePP = mkAxisCode(ihist+1,1,1) + "-pp";
54
55 // The binning is taken from the reference data
56 book(_histNch[PP][ihist], namePP, refData(ihist+1, 1, 1));
57
58 std::string nameCounterpp = "counter.pp." + std::to_string(ihist);
59 book(_counterSOW[PP][ihist], nameCounterpp); // Sum of weights counter for pp
60
61 // Book ratios, to be used in finalize
62 book(_histRAA[ihist], ihist+16, 1, 1);
63 }
64
65 // Centrality regions keeping boundaries for a certain region.
66 // Note, that some regions overlap with other regions.
67 _centrRegions.clear();
68 _centrRegions = {{0., 5.}, {5., 10.}, {10., 20.},
69 {20., 30.}, {30., 40.}, {40., 50.},
70 {50., 60.}, {60., 70.}, {70., 80.},
71 {0., 10.}, {0., 20.}, {20., 40.},
72 {40., 60.}, {40., 80.}, {60., 80.}};
73
74 // Find out the beam type, also specified from option.
75 string beamOpt = getOption<string>("beam","NONE");
76 if (beamOpt != "NONE") {
77 MSG_WARNING("You are using a specified beam type, instead of using what"
78 "is provided by the generator. "
79 "Only do this if you are completely sure what you are doing.");
80 if (beamOpt=="PP") isHI = false;
81 else if (beamOpt=="HI") isHI = true;
82 else {
83 MSG_ERROR("Beam error (option)!");
84 return;
85 }
86 }
87 else {
88 const ParticlePair& beam = beams();
89 if (beam.first.pid() == PID::PROTON && beam.second.pid() == PID::PROTON) isHI = false;
90 else if (beam.first.pid() == PID::LEAD && beam.second.pid() == PID::LEAD)
91 isHI = true;
92 else {
93 MSG_ERROR("Beam error (found)!");
94 return;
95 }
96 }
97 }
98
99 /// Perform the per-event analysis
100 void analyze(const Event& event) {
101
102 // Charged, primary particles with at least pT = 150 MeV
103 // in eta range of |eta| < 0.5
104 Particles chargedParticles =
105 apply<ALICE::PrimaryParticles>(event,"APRIM").particlesByPt();
106
107 // Check type of event.
108 if ( isHI ) {
109
110 const HepMCHeavyIon & hi = apply<HepMCHeavyIon>(event, "HepMC");
111 if (!hi.ok()) {
112 MSG_WARNING("HEPMC Heavy ion container needed for this analysis, but not "
113 "found for this event. Skipping.");
114 vetoEvent;
115 }
116 // Prepare centrality projection and value
117 const CentralityProjection& centrProj =
118 apply<CentralityProjection>(event, "V0M");
119 double centr = centrProj();
120 // Veto event for too large centralities since those are not used
121 // in the analysis at all
122 if ((centr < 0.) || (centr > 80.)) vetoEvent;
123
124 // Fill PbPb histograms and add weights based on centrality value
125 for (size_t ihist = 0; ihist < NHISTOS; ++ihist) {
126 if (inRange(centr, _centrRegions[ihist].first, _centrRegions[ihist].second)) {
127 _counterSOW[PBPB][ihist]->fill();
128 _counterNcoll[ihist]->fill(hi.Ncoll());
129 for (const Particle& p : chargedParticles) {
130 double pT = p.pT()/GeV;
131 if (pT < 50.) {
132 const double pTAtBinCenter = _histNch[PBPB][ihist]->binAt(pT).xMid();
133 _histNch[PBPB][ihist]->fill(pT, 1/pTAtBinCenter);
134 }
135 }
136 }
137 }
138
139 }
140 else {
141
142 // Fill all pp histograms and add weights
143 for (size_t ihist = 0; ihist < NHISTOS; ++ihist) {
144 _counterSOW[PP][ihist]->fill();
145 for (const Particle& p : chargedParticles) {
146 double pT = p.pT()/GeV;
147 if (pT < 50.) {
148 const double pTAtBinCenter = _histNch[PP][ihist]->binAt(pT).xMid();
149 _histNch[PP][ihist]->fill(pT, 1/pTAtBinCenter);
150 }
151 }
152 }
153
154 }
155
156 }
157
158
159 /// Normalise histograms etc., after the run
160 void finalize() {
161
162 // Right scaling of the histograms with their individual weights.
163 for (size_t itype = 0; itype < EVENT_TYPES; ++itype ) {
164 for (size_t ihist = 0; ihist < NHISTOS; ++ihist) {
165 if (_counterSOW[itype][ihist]->sumW() > 0.) {
166 scale(_histNch[itype][ihist],
167 (1. / _counterSOW[itype][ihist]->sumW() / 2. / M_PI));
168 }
169 }
170 }
171
172 // Postprocessing of the histograms
173 for (size_t ihist = 0; ihist < NHISTOS; ++ihist) {
174 // If there are entires in histograms for both beam types
175 if (_histNch[PP][ihist]->numEntries() > 0 && _histNch[PBPB][ihist]->numEntries() > 0) {
176 // Initialize and fill R_AA histograms
177 divide(_histNch[PBPB][ihist], _histNch[PP][ihist], _histRAA[ihist]);
178 // Scale by Ncoll. Unfortunately some generators does not provide
179 // Ncoll value (eg. JEWEL), so the following scaling will be done
180 // only if there are entries in the counters
181 double ncoll = _counterNcoll[ihist]->sumW();
182 double sow = _counterSOW[PBPB][ihist]->sumW();
183 if (ncoll > 1e-6 && sow > 1e-6)
184 _histRAA[ihist]->scale(1. / (ncoll / sow));
185
186 }
187 }
188
189 }
190
191 /// @}
192
193 private:
194
195 bool isHI;
196 static const int NHISTOS = 15;
197 static const int EVENT_TYPES = 2;
198 static const int PP = 0;
199 static const int PBPB = 1;
200
201 /// @name Histograms
202 /// @{
203 Histo1DPtr _histNch[EVENT_TYPES][NHISTOS];
204 CounterPtr _counterSOW[EVENT_TYPES][NHISTOS];
205 CounterPtr _counterNcoll[NHISTOS];
206 Estimate1DPtr _histRAA[NHISTOS];
207 /// @}
208
209 std::vector<std::pair<double, double>> _centrRegions;
210
211 };
212
213 RIVET_DECLARE_PLUGIN(ALICE_2012_I1127497);
214
215
216}
|