Rivet analyses referenceLHCB_2013_I1208105LHCb measurement of energy flow from $pp$ collisions at $\sqrt{s} = 7$ TeVExperiment: LHCb (LHC) Inspire ID: 1208105 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
The energy flow created in $pp$ collisions at 7 TeV within the fiducial pseudorapidity range of the LHCb detector ($1.9 < \eta < 4.9$) is measured for inclusive minimum bias interactions, hard scattering processes and events with enhanced or suppressed diffractive contribution. Plots for these four event classes are shown separately for all and charged only final state particles, respectively. The total energy flow is measured by combining the charged energy flow and a data-constrained MC estimate of the neutral component. For the two highest eta bins the data-constrained measurements of the neutral energy were extrapolated from the more central region as the LHCb electromagnetic calorimeter has no detection coverage in that phase space domain. Source code: LHCB_2013_I1208105.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/ChargedFinalState.hh"
5
6namespace Rivet {
7
8
9 class LHCB_2013_I1208105 : public Analysis {
10 public:
11
12 LHCB_2013_I1208105()
13 : Analysis("LHCB_2013_I1208105")
14 { }
15
16
17 void init() {
18 // Projections
19 declare(FinalState((Cuts::etaIn(1.9, 4.9))), "forwardFS");
20 declare(FinalState((Cuts::etaIn(-3.5,-1.5))), "backwardFS");
21 declare(ChargedFinalState((Cuts::etaIn(1.9, 4.9))), "forwardCFS");
22 declare(ChargedFinalState((Cuts::etaIn(-3.5,-1.5))), "backwardCFS");
23
24 // Histos
25 book(_s_chEF_minbias, 1, 1, 1);
26 book(_s_chEF_hard, 2, 1, 1);
27 book(_s_chEF_diff, 3, 1, 1);
28 book(_s_chEF_nondiff, 4, 1, 1);
29 book(_s_totEF_minbias, 5, 1, 1);
30 book(_s_totEF_hard, 6, 1, 1);
31 book(_s_totEF_diff, 7, 1, 1);
32 book(_s_totEF_nondiff, 8, 1, 1);
33
34 // Temporary profiles and histos
35 /// @todo Convert to declared/registered temp histos
36 book(_tp_chEF_minbias, "TMP/chEF_minbias", refData(1,1,1));
37 book(_tp_chEF_hard, "TMP/chEF_hard", refData(2,1,1));
38 book(_tp_chEF_diff, "TMP/chEF_diff", refData(3,1,1));
39 book(_tp_chEF_nondiff, "TMP/chEF_nondiff", refData(4,1,1));
40 book(_tp_totEF_minbias, "TMP/totEF_minbias", refData(5,1,1));
41 book(_tp_totEF_hard, "TMP/totEF_hard", refData(6,1,1));
42 book(_tp_totEF_diff, "TMP/totEF_diff", refData(7,1,1));
43 book(_tp_totEF_nondiff, "TMP/totEF_nondiff", refData(8,1,1));
44
45 book(_th_chN_minbias, "TMP/chN_minbias", refData(1,1,1));
46 book(_th_chN_hard, "TMP/chN_hard", refData(2,1,1));
47 book(_th_chN_diff, "TMP/chN_diff", refData(3,1,1));
48 book(_th_chN_nondiff, "TMP/chN_nondiff", refData(4,1,1));
49 book(_th_totN_minbias, "TMP/totN_minbias", refData(5,1,1));
50 book(_th_totN_hard, "TMP/totN_hard", refData(6,1,1));
51 book(_th_totN_diff, "TMP/totN_diff", refData(7,1,1));
52 book(_th_totN_nondiff, "TMP/totN_nondiff", refData(8,1,1));
53
54 // Counters
55 book(_mbSumW, "TMP/mbSumW");
56 book(_hdSumW, "TMP/hdSumW");
57 book(_dfSumW, "TMP/dfSumW");
58 book(_ndSumW, "TMP/ndSumW");
59 book(_mbchSumW, "TMP/mbchSumW");
60 book(_hdchSumW, "TMP/hdchSumW");
61 book(_dfchSumW, "TMP/dfchSumW");
62 book(_ndchSumW, "TMP/ndchSumW");
63 }
64
65
66 /// Perform the per-event analysis
67 void analyze(const Event& event) {
68 const FinalState& ffs = apply<FinalState>(event, "forwardFS");
69 const FinalState& bfs = apply<FinalState>(event, "backwardFS");
70 const ChargedFinalState& fcfs = apply<ChargedFinalState>(event, "forwardCFS");
71 const ChargedFinalState& bcfs = apply<ChargedFinalState>(event, "backwardCFS");
72
73 // Veto this event completely if there are no forward *charged* particles
74 if (fcfs.empty()) vetoEvent;
75
76 // Charged and neutral version
77 {
78 // Decide empirically if this is a "hard" or "diffractive" event
79 bool ishardEvt = false;
80 for (const Particle& p : ffs.particles()) {
81 if (p.pT() > 3.0*GeV) { ishardEvt = true; break; }
82 }
83 // Decide empirically if this is a "diffractive" event
84 /// @todo Can be "diffractive" *and* "hard"?
85 bool isdiffEvt = (bfs.size() == 0);
86
87 // Update event-type weight counters
88 _mbSumW->fill();
89 (isdiffEvt ? _dfSumW : _ndSumW)->fill();
90 if (ishardEvt) _hdSumW->fill();
91
92 // Plot energy flow
93 for (const Particle& p : ffs.particles()) {
94 const double eta = p.eta();
95 const double energy = p.E();
96 _tp_totEF_minbias->fill(eta, energy);
97 _th_totN_minbias->fill(eta);
98 if (ishardEvt) {
99 _tp_totEF_hard->fill(eta, energy);
100 _th_totN_hard->fill(eta);
101 }
102 if (isdiffEvt) {
103 _tp_totEF_diff->fill(eta, energy);
104 _th_totN_diff->fill(eta);
105 } else {
106 _tp_totEF_nondiff->fill(eta, energy);
107 _th_totN_nondiff->fill(eta);
108 }
109 }
110 }
111
112
113 // Charged-only version
114 {
115 bool ishardEvt = false;
116 for (const Particle& p : fcfs.particles()) {
117 if (p.pT() > 3.0*GeV) { ishardEvt = true; break; }
118 }
119 // Decide empirically if this is a "diffractive" event
120 /// @todo Can be "diffractive" *and* "hard"?
121 bool isdiffEvt = (bcfs.size() == 0);
122
123 // Update event-type weight counters
124 _mbchSumW->fill();
125 (isdiffEvt ? _dfchSumW : _ndchSumW)->fill();
126 if (ishardEvt) _hdchSumW->fill();
127
128 // Plot energy flow
129 for (const Particle& p : fcfs.particles()) {
130 const double eta = p.eta();
131 const double energy = p.E();
132 _tp_chEF_minbias->fill(eta, energy);
133 _th_chN_minbias->fill(eta);
134 if (ishardEvt) {
135 _tp_chEF_hard->fill(eta, energy);
136 _th_chN_hard->fill(eta);
137 }
138 if (isdiffEvt) {
139 _tp_chEF_diff->fill(eta, energy);
140 _th_chN_diff->fill(eta);
141 } else {
142 _tp_chEF_nondiff->fill(eta, energy);
143 _th_chN_nondiff->fill(eta);
144 }
145 }
146 }
147
148 }
149
150
151 void finalize() {
152 if (_mbSumW->sumW()) {
153 for (size_t i = 1; i < _s_totEF_minbias->numBins()+1; ++i) {
154 double val = 0., err = 0.;
155 if (_tp_totEF_minbias->bin(i).effNumEntries() > 1) {
156 val = _tp_totEF_minbias->bin(i).yMean() * _th_totN_minbias->bin(i).sumW();
157 err = (_tp_totEF_minbias->bin(i).yMean() * _th_totN_minbias->bin(i).errW() +
158 _tp_totEF_minbias->bin(i).yStdErr() * _th_totN_minbias->bin(i).sumW());
159 }
160 _s_totEF_minbias->bin(i).set(val/_mbSumW->val()/_th_totN_minbias->bin(i).xWidth(),
161 err/_mbSumW->val()/_th_totN_minbias->bin(i).xWidth());
162 }
163 }
164 if (_hdSumW->sumW()) {
165 for (size_t i = 1; i < _s_totEF_hard->numBins()+1; ++i) {
166 double val = 0., err = 0.;
167 if (_tp_totEF_minbias->bin(i).effNumEntries() > 1) {
168 val = _tp_totEF_hard->bin(i).yMean() * _th_totN_hard->bin(i).sumW();
169 err = (_tp_totEF_hard->bin(i).yMean() * _th_totN_hard->bin(i).errW() +
170 _tp_totEF_hard->bin(i).yStdErr() * _th_totN_hard->bin(i).sumW());
171 }
172 _s_totEF_hard->bin(i).set(val/_hdSumW->val()/_th_totN_hard->bin(i).xWidth(),
173 err/_hdSumW->val()/_th_totN_hard->bin(i).xWidth());
174 }
175 }
176 if (_dfSumW->sumW()) {
177 for (size_t i = 1; i < _s_totEF_diff->numBins()+1; ++i) {
178 double val = 0., err = 0.;
179 if (_tp_totEF_diff->bin(i).effNumEntries() > 1) {
180 val = _tp_totEF_diff->bin(i).yMean() * _th_totN_diff->bin(i).sumW();
181 err = (_tp_totEF_diff->bin(i).yMean() * _th_totN_diff->bin(i).errW() +
182 _tp_totEF_diff->bin(i).yStdErr() * _th_totN_diff->bin(i).sumW());
183 }
184 _s_totEF_diff->bin(i).set(val/_dfSumW->val()/_th_totN_diff->bin(i).xWidth(),
185 err/_dfSumW->val()/_th_totN_diff->bin(i).xWidth());
186 }
187 }
188 if (_ndSumW->sumW()) {
189 for (size_t i = 1; i < _s_totEF_nondiff->numBins()+1; ++i) {
190 double val = 0., err = 0.;
191 if (_tp_totEF_nondiff->bin(i).effNumEntries() > 1) {
192 val = _tp_totEF_nondiff->bin(i).yMean() * _th_totN_nondiff->bin(i).sumW();
193 err = (_tp_totEF_nondiff->bin(i).yMean() * _th_totN_nondiff->bin(i).errW() +
194 _tp_totEF_nondiff->bin(i).yStdErr() * _th_totN_nondiff->bin(i).sumW());
195 _s_totEF_nondiff->bin(i).set(val/_ndSumW->val()/_th_totN_nondiff->bin(i).xWidth(),
196 err/_ndSumW->val()/_th_totN_nondiff->bin(i).xWidth());
197 }
198 }
199 }
200 if (_mbchSumW->sumW()) {
201 for (size_t i = 1; i < _s_chEF_minbias->numBins()+1; ++i) {
202 double val = 0., err = 0.;
203 if (_tp_chEF_minbias->bin(i).effNumEntries() > 1) {
204 val = _tp_chEF_minbias->bin(i).yMean() * _th_chN_minbias->bin(i).sumW();
205 err = (_tp_chEF_minbias->bin(i).yMean() * _th_chN_minbias->bin(i).errW() +
206 _tp_chEF_minbias->bin(i).yStdErr() * _th_chN_minbias->bin(i).sumW());
207 }
208 _s_chEF_minbias->bin(i).set(val/_mbchSumW->val()/_th_chN_minbias->bin(i).xWidth(),
209 err/_mbchSumW->val()/_th_chN_minbias->bin(i).xWidth());
210 }
211 }
212 if (_hdchSumW->sumW()) {
213 for (size_t i = 1; i < _s_chEF_hard->numBins()+1; ++i) {
214 double val = 0., err = 0.;
215 if (_tp_chEF_hard->bin(i).effNumEntries() > 1) {
216 val = _tp_chEF_hard->bin(i).yMean() * _th_chN_hard->bin(i).sumW();
217 err = (_tp_chEF_hard->bin(i).yMean() * _th_chN_hard->bin(i).errW() +
218 _tp_chEF_hard->bin(i).yStdErr() * _th_chN_hard->bin(i).sumW());
219 }
220 _s_chEF_hard->bin(i).set(val/_hdchSumW->val()/_th_chN_hard->bin(i).xWidth(),
221 err/_hdchSumW->val()/_th_chN_hard->bin(i).xWidth());
222 }
223 }
224 if (_dfchSumW->sumW()) {
225 for (size_t i = 1; i < _s_chEF_diff->numBins()+1; ++i) {
226 double val = 0., err = 0.;
227 if (_tp_chEF_diff->bin(i).effNumEntries() > 1) {
228 val = _tp_chEF_diff->bin(i).yMean() * _th_chN_diff->bin(i).sumW();
229 err = (_tp_chEF_diff->bin(i).yMean() * _th_chN_diff->bin(i).errW() +
230 _tp_chEF_diff->bin(i).yStdErr() * _th_chN_diff->bin(i).sumW());
231 }
232 _s_chEF_diff->bin(i).set(val/_dfchSumW->val()/_th_chN_diff->bin(i).xWidth(),
233 err/_dfchSumW->val()/_th_chN_diff->bin(i).xWidth());
234 }
235 }
236 if (_ndchSumW->sumW()) {
237 for (size_t i = 1; i < _s_chEF_nondiff->numBins()+1; ++i) {
238 double val = 0., err = 0.;
239 if (_tp_chEF_nondiff->bin(i).effNumEntries() > 1) {
240 val = _tp_chEF_nondiff->bin(i).yMean() * _th_chN_nondiff->bin(i).sumW();
241 err = (_tp_chEF_nondiff->bin(i).yMean() * _th_chN_nondiff->bin(i).errW() +
242 _tp_chEF_nondiff->bin(i).yStdErr() * _th_chN_nondiff->bin(i).sumW());
243 }
244 _s_chEF_nondiff->bin(i).set(val/_ndchSumW->val()/_th_chN_nondiff->bin(i).xWidth(),
245 err/_ndchSumW->val()/_th_chN_nondiff->bin(i).xWidth());
246 }
247 }
248 }
249
250
251 private:
252
253 /// @name Histograms and counters
254 ///
255 /// @note Histograms correspond to charged and total EF for each class of events:
256 /// minimum bias, hard scattering, diffractive enriched and non-diffractive enriched.
257 /// @{
258
259 // Scatters to be filled in finalize with 1/d_eta <N(eta)><E(eta)>
260 Estimate1DPtr _s_totEF_minbias, _s_totEF_hard, _s_totEF_diff, _s_totEF_nondiff;
261 Estimate1DPtr _s_chEF_minbias, _s_chEF_hard, _s_chEF_diff, _s_chEF_nondiff;
262
263 // Temp profiles containing <E(eta)>
264 Profile1DPtr _tp_totEF_minbias, _tp_totEF_hard, _tp_totEF_diff, _tp_totEF_nondiff;
265 Profile1DPtr _tp_chEF_minbias, _tp_chEF_hard, _tp_chEF_diff, _tp_chEF_nondiff;
266
267 // Temp profiles containing <N(eta)>
268 Histo1DPtr _th_totN_minbias, _th_totN_hard, _th_totN_diff, _th_totN_nondiff;
269 Histo1DPtr _th_chN_minbias, _th_chN_hard, _th_chN_diff, _th_chN_nondiff;
270
271 // Sums of weights (~ #events) in each event class
272 CounterPtr _mbSumW, _hdSumW, _dfSumW, _ndSumW;
273 CounterPtr _mbchSumW, _hdchSumW, _dfchSumW, _ndchSumW;
274
275 /// @}
276
277 };
278
279
280 RIVET_DECLARE_PLUGIN(LHCB_2013_I1208105);
281
282}
|