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, true);
26 book(_s_chEF_hard, 2, 1, 1, true);
27 book(_s_chEF_diff, 3, 1, 1, true);
28 book(_s_chEF_nondiff, 4, 1, 1, true);
29 book(_s_totEF_minbias, 5, 1, 1, true);
30 book(_s_totEF_hard, 6, 1, 1, true);
31 book(_s_totEF_diff, 7, 1, 1, true);
32 book(_s_totEF_nondiff, 8, 1, 1, true);
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 = 0; i < _s_totEF_minbias->numPoints(); ++i) {
154 double val = 0., err = 0.;
155 if (_tp_totEF_minbias->bin(i).effNumEntries() > 1) {
156 val = _tp_totEF_minbias->bin(i).mean() * _th_totN_minbias->bin(i).height();
157 err = (_tp_totEF_minbias->bin(i).mean() * _th_totN_minbias->bin(i).heightErr() +
158 _tp_totEF_minbias->bin(i).stdErr() * _th_totN_minbias->bin(i).height());
159 }
160 _s_totEF_minbias->point(i).setY(val/_mbSumW->val(), err/_mbSumW->val());
161 }
162 }
163 if (_hdSumW->sumW()) {
164 for (size_t i = 0; i < _s_totEF_hard->numPoints(); ++i) {
165 double val = 0., err = 0.;
166 if (_tp_totEF_minbias->bin(i).effNumEntries() > 1) {
167 val = _tp_totEF_hard->bin(i).mean() * _th_totN_hard->bin(i).height();
168 err = (_tp_totEF_hard->bin(i).mean() * _th_totN_hard->bin(i).heightErr() +
169 _tp_totEF_hard->bin(i).stdErr() * _th_totN_hard->bin(i).height());
170 }
171 _s_totEF_hard->point(i).setY(val/_hdSumW->val(), err/_hdSumW->val());
172 }
173 }
174 if (_dfSumW->sumW()) {
175 for (size_t i = 0; i < _s_totEF_diff->numPoints(); ++i) {
176 double val = 0., err = 0.;
177 if (_tp_totEF_diff->bin(i).effNumEntries() > 1) {
178 val = _tp_totEF_diff->bin(i).mean() * _th_totN_diff->bin(i).height();
179 err = (_tp_totEF_diff->bin(i).mean() * _th_totN_diff->bin(i).heightErr() +
180 _tp_totEF_diff->bin(i).stdErr() * _th_totN_diff->bin(i).height());
181 }
182 _s_totEF_diff->point(i).setY(val/_dfSumW->val(), err/_dfSumW->val());
183 }
184 }
185 if (_ndSumW->sumW()) {
186 for (size_t i = 0; i < _s_totEF_nondiff->numPoints(); ++i) {
187 double val = 0., err = 0.;
188 if (_tp_totEF_nondiff->bin(i).effNumEntries() > 1) {
189 val = _tp_totEF_nondiff->bin(i).mean() * _th_totN_nondiff->bin(i).height();
190 err = (_tp_totEF_nondiff->bin(i).mean() * _th_totN_nondiff->bin(i).heightErr() +
191 _tp_totEF_nondiff->bin(i).stdErr() * _th_totN_nondiff->bin(i).height());
192 _s_totEF_nondiff->point(i).setY(val/_ndSumW->val(), err/_ndSumW->val());
193 }
194 }
195 }
196 if (_mbchSumW->sumW()) {
197 for (size_t i = 0; i < _s_chEF_minbias->numPoints(); ++i) {
198 double val = 0., err = 0.;
199 if (_tp_chEF_minbias->bin(i).effNumEntries() > 1) {
200 val = _tp_chEF_minbias->bin(i).mean() * _th_chN_minbias->bin(i).height();
201 err = (_tp_chEF_minbias->bin(i).mean() * _th_chN_minbias->bin(i).heightErr() +
202 _tp_chEF_minbias->bin(i).stdErr() * _th_chN_minbias->bin(i).height());
203 }
204 _s_chEF_minbias->point(i).setY(val/_mbchSumW->val(), err/_mbchSumW->val());
205 }
206 }
207 if (_hdchSumW->sumW()) {
208 for (size_t i = 0; i < _s_chEF_hard->numPoints(); ++i) {
209 double val = 0., err = 0.;
210 if (_tp_chEF_hard->bin(i).effNumEntries() > 1) {
211 val = _tp_chEF_hard->bin(i).mean() * _th_chN_hard->bin(i).height();
212 err = (_tp_chEF_hard->bin(i).mean() * _th_chN_hard->bin(i).heightErr() +
213 _tp_chEF_hard->bin(i).stdErr() * _th_chN_hard->bin(i).height());
214 }
215 _s_chEF_hard->point(i).setY(val/_hdchSumW->val(), err/_hdchSumW->val());
216 }
217 }
218 if (_dfchSumW->sumW()) {
219 for (size_t i = 0; i < _s_chEF_diff->numPoints(); ++i) {
220 double val = 0., err = 0.;
221 if (_tp_chEF_diff->bin(i).effNumEntries() > 1) {
222 val = _tp_chEF_diff->bin(i).mean() * _th_chN_diff->bin(i).height();
223 err = (_tp_chEF_diff->bin(i).mean() * _th_chN_diff->bin(i).heightErr() +
224 _tp_chEF_diff->bin(i).stdErr() * _th_chN_diff->bin(i).height());
225 }
226 _s_chEF_diff->point(i).setY(val/_dfchSumW->val(), err/_dfchSumW->val());
227 }
228 }
229 if (_ndchSumW->sumW()) {
230 for (size_t i = 0; i < _s_chEF_nondiff->numPoints(); ++i) {
231 double val = 0., err = 0.;
232 if (_tp_chEF_nondiff->bin(i).effNumEntries() > 1) {
233 val = _tp_chEF_nondiff->bin(i).mean() * _th_chN_nondiff->bin(i).height();
234 err = (_tp_chEF_nondiff->bin(i).mean() * _th_chN_nondiff->bin(i).heightErr() +
235 _tp_chEF_nondiff->bin(i).stdErr() * _th_chN_nondiff->bin(i).height());
236 }
237 _s_chEF_nondiff->point(i).setY(val/_ndchSumW->val(), err/_ndchSumW->val());
238 }
239 }
240 }
241
242
243 private:
244
245 /// @name Histograms and counters
246 ///
247 /// @note Histograms correspond to charged and total EF for each class of events:
248 /// minimum bias, hard scattering, diffractive enriched and non-diffractive enriched.
249 //@{
250
251 // Scatters to be filled in finalize with 1/d_eta <N(eta)><E(eta)>
252 Scatter2DPtr _s_totEF_minbias, _s_totEF_hard, _s_totEF_diff, _s_totEF_nondiff;
253 Scatter2DPtr _s_chEF_minbias, _s_chEF_hard, _s_chEF_diff, _s_chEF_nondiff;
254
255 // Temp profiles containing <E(eta)>
256 Profile1DPtr _tp_totEF_minbias, _tp_totEF_hard, _tp_totEF_diff, _tp_totEF_nondiff;
257 Profile1DPtr _tp_chEF_minbias, _tp_chEF_hard, _tp_chEF_diff, _tp_chEF_nondiff;
258
259 // Temp profiles containing <N(eta)>
260 Histo1DPtr _th_totN_minbias, _th_totN_hard, _th_totN_diff, _th_totN_nondiff;
261 Histo1DPtr _th_chN_minbias, _th_chN_hard, _th_chN_diff, _th_chN_nondiff;
262
263 // Sums of weights (~ #events) in each event class
264 CounterPtr _mbSumW, _hdSumW, _dfSumW, _ndSumW;
265 CounterPtr _mbchSumW, _hdchSumW, _dfchSumW, _ndchSumW;
266
267 //@}
268
269 };
270
271
272 // Hook for the plugin system
273 RIVET_DECLARE_PLUGIN(LHCB_2013_I1208105);
274
275}
|