rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2010_S8918562

Track-based minimum bias at 900 GeV and 2.36 and 7 TeV in ATLAS
Experiment: ATLAS (LHC)
Inspire ID: 882098
Status: VALIDATED
Authors:
  • Thomas Burgess
  • Andy Buckley
References: Beams: p+ p+
Beam energies: (450.0, 450.0); (1180.0, 1180.0); (3500.0, 3500.0) GeV
Run details:
  • $pp$ QCD interactions at 0.9, 2.36, and 7 TeV. Diffractive events should be included. Multiple kinematic cuts should not be required. Beam energy must be specified as analysis option "ENERGY" when rivet-merge'ing samples.

Measurements from proton-proton collisions at centre-of-mass energies of $\sqrt{s} = 0.9$, 2.36, and 7 TeV recorded with the ATLAS detector at the LHC. Events were collected using a single-arm minimum-bias trigger. The charged-particle multiplicity, its dependence on transverse momentum and pseudorapidity and the relationship between the mean transverse momentum and charged-particle multiplicity are measured. Measurements in different regions of phase-space are shown, providing diffraction-reduced measurements as well as more inclusive ones. The observed distributions are corrected to well-defined phase-space regions, using model-independent corrections. Beam energy must be specified (in GeV) as analysis option "ENERGY" when rivet-merging samples.

Source code: ATLAS_2010_S8918562.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/ChargedFinalState.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// Rivet analysis class for ATLAS 2010 minimum bias analysis
  9  class ATLAS_2010_S8918562 : public Analysis {
 10  public:
 11
 12    /// Default constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2010_S8918562);
 14
 15
 16    /// Initialization, called once before running
 17    void init() {
 18      // Projections
 19      const ChargedFinalState cfs100(Cuts::abseta < 2.5 && Cuts::pT > 100*MeV);
 20      declare(cfs100, "CFS100");
 21      const ChargedFinalState cfs500(Cuts::abseta < 2.5 && Cuts::pT > 500*MeV);
 22      declare(cfs500, "CFS500");
 23      const ChargedFinalState cfs2500(Cuts::abseta < 2.5 && Cuts::pT > 2500*MeV);
 24      declare(cfs2500, "CFS2500");
 25
 26      // Book histograms
 27      if (isCompatibleWithSqrtS(900)) {
 28        book(_h["pt100_nch2_nch"],   18, 1, 1);
 29        book(_h["pt100_nch2_pt"],    11, 1, 1);
 30        book(_h["pt100_nch2_eta"],    4, 1, 1);
 31        book(_p["pt100_nch2_ptnch"], 24, 1, 1);
 32
 33        book(_h["pt100_nch20_nch"], 34, 1, 1);
 34        book(_h["pt100_nch20_pt"],  30, 1, 1);
 35        book(_h["pt100_nch20_eta"], 26, 1, 1);
 36
 37        book(_h["pt500_nch1_nch"],   15, 1, 1);
 38        book(_h["pt500_nch1_pt"],     8, 1, 1);
 39        book(_h["pt500_nch1_eta"],    1, 1, 1);
 40        book(_p["pt500_nch1_ptnch"], 22, 1, 1);
 41
 42        book(_h["pt500_nch6_nch"], 20, 1, 1);
 43        book(_h["pt500_nch6_pt"],  13, 1, 1);
 44        book(_h["pt500_nch6_eta"],  6, 1, 1);
 45
 46        book(_h["pt2500_nch1_nch"],   36, 1, 1);
 47        book(_h["pt2500_nch1_pt"],    32, 1, 1);
 48        book(_h["pt2500_nch1_eta"],   28, 1, 1);
 49        book(_p["pt2500_nch1_ptnch"], 38, 1, 1);
 50
 51      } else if (isCompatibleWithSqrtS(2360)) {
 52
 53        book(_h["pt500_nch1_nch"], 16, 1, 1);
 54        book(_h["pt500_nch1_pt"],   9, 1, 1);
 55        book(_h["pt500_nch1_eta"],  2, 1, 1);
 56        _p["pt500_nch1_ptnch"] = nullptr;
 57
 58      } else if (isCompatibleWithSqrtS(7000)) {
 59
 60        book(_h["pt100_nch2_nch"],   19, 1, 1);
 61        book(_h["pt100_nch2_pt"],    12, 1, 1);
 62        book(_h["pt100_nch2_eta"],    5, 1, 1);
 63        book(_p["pt100_nch2_ptnch"], 25, 1, 1);
 64
 65        book(_h["pt100_nch20_nch"], 35, 1, 1);
 66        book(_h["pt100_nch20_pt"],  31, 1, 1);
 67        book(_h["pt100_nch20_eta"], 27, 1, 1);
 68
 69        book(_h["pt500_nch1_nch"],   17, 1, 1);
 70        book(_h["pt500_nch1_pt"],    10, 1, 1);
 71        book(_h["pt500_nch1_eta"],    3, 1, 1);
 72        book(_p["pt500_nch1_ptnch"], 23, 1, 1);
 73
 74        book(_h["pt500_nch6_nch"], 21, 1, 1);
 75        book(_h["pt500_nch6_pt"],  14, 1, 1);
 76        book(_h["pt500_nch6_eta"],  7, 1, 1);
 77
 78        book(_h["pt2500_nch1_nch"],   37, 1, 1);
 79        book(_h["pt2500_nch1_pt"],    33, 1, 1);
 80        book(_h["pt2500_nch1_eta"],   29, 1, 1);
 81        book(_p["pt2500_nch1_ptnch"], 39, 1, 1);
 82
 83      } else {
 84        throw LogicError("The ATLAS_2010_S8918562 analysis is only valid for sqrt(s) = 900, 2360 and 7000 GeV!");
 85      }
 86
 87    }
 88
 89
 90    void analyze(const Event& event) {
 91      // 100 GeV final states
 92      if (!isCompatibleWithSqrtS(2360)) {
 93        const ChargedFinalState& cfs100 = apply<ChargedFinalState>(event, "CFS100");
 94        // nch>=2
 95        fillPtEtaNch(cfs100, 2, "pt100_nch2");
 96        // nch>=20
 97        fillPtEtaNch(cfs100, 20, "pt100_nch20");
 98      }
 99
100      // 500 GeV final states
101      const ChargedFinalState& cfs500 = apply<ChargedFinalState>(event, "CFS500");
102      // nch>=1
103      fillPtEtaNch(cfs500, 1, "pt500_nch1");
104      // nch>=6
105      if (!isCompatibleWithSqrtS(2360)) {
106        fillPtEtaNch(cfs500, 6, "pt500_nch6");
107      }
108
109      // 2500 GeV final states
110      if (!isCompatibleWithSqrtS(2360)) {
111        const ChargedFinalState& cfs2500 = apply<ChargedFinalState>(event, "CFS2500");
112        // nch>=1
113        fillPtEtaNch(cfs2500, 1, "pt2500_nch1");
114      }
115
116    }
117
118
119    void finalize() {
120
121      double sf = safediv(1.0, _h["pt500_nch1_nch"]->integral(true), 1.0);
122      scale(_h["pt500_nch1_nch"], sf);
123      scale(_h["pt500_nch1_pt"],  sf/TWOPI/5);
124      scale(_h["pt500_nch1_eta"], sf);
125
126      if (!isCompatibleWithSqrtS(2360)) {
127        sf = safediv(1.0, _h["pt100_nch2_nch"]->integral(true), 1.0);
128        scale(_h["pt100_nch2_nch"], sf);
129        scale(_h["pt100_nch2_pt"],  sf/TWOPI/5);
130        scale(_h["pt100_nch2_eta"], sf);
131
132        sf = safediv(1.0, _h["pt100_nch20_nch"]->integral(true), 1.0);
133        scale(_h["pt100_nch20_nch"], sf);
134        scale(_h["pt100_nch20_pt"],  sf/TWOPI/5);
135        scale(_h["pt100_nch20_eta"], sf);
136
137        sf = safediv(1.0, _h["pt500_nch6_nch"]->integral(true), 1.0);
138        scale(_h["pt500_nch6_nch"], sf);
139        scale(_h["pt500_nch6_pt"],  sf/TWOPI/5);
140        scale(_h["pt500_nch6_eta"], sf);
141
142        sf = safediv(1.0, _h["pt2500_nch1_nch"]->integral(true), 1.0);
143        scale(_h["pt2500_nch1_nch"], sf);
144        scale(_h["pt2500_nch1_pt"],  sf/TWOPI/5);
145        scale(_h["pt2500_nch1_eta"], sf);
146      }
147    }
148
149
150  private:
151
152    /// Helper for collectively filling Nch, pT, eta, and pT vs. Nch histograms
153    void fillPtEtaNch(const ChargedFinalState& cfs, const int nchcut, const string& label) {
154      // Get number of particles and skip if event fails cut
155      const int nch = cfs.size();
156      if (nch < nchcut) return;
157
158      // Fill nch
159      _h[label + "_nch"]->fill(nch);
160      // Loop over particles, fill pT, eta and ptnch
161      for (const Particle& p : cfs.particles()) {
162        const double pt = p.pT();
163        _h[label + "_pt"]->fill(pt/GeV, 1.0/pt);
164        _h[label + "_eta"]->fill(p.eta());
165        if (_p[label + "_ptnch"])  _p[label + "_ptnch"]->fill(nch, pt/GeV);
166      }
167    }
168
169    map<string, Histo1DPtr> _h;
170    map<string, Profile1DPtr> _p;
171
172  };
173
174
175  RIVET_DECLARE_ALIASED_PLUGIN(ATLAS_2010_S8918562, ATLAS_2010_I882098);
176
177}