rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

LHCB_2013_I1208105

LHCb measurement of energy flow from $pp$ collisions at $\sqrt{s} = 7$ TeV
Experiment: LHCb (LHC)
Inspire ID: 1208105
Status: VALIDATED
Authors:
  • Alex Grecu
  • Dmytro Volyanskyy
  • Michael Schmelling
References:
  • arXiv: 1212.4755
  • Eur. Phys. J. C 73 (2012) 2421
Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • Minimum bias events from $pp$ collisions at sqrt(s) = 7 TeV.

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}