rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2010_I882098

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_I882098.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_I882098 : public Analysis {
 10  public:
 11
 12    /// Default constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2010_I882098);
 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      for (double eVal : allowedEnergies()) {
 28
 29        const string en = toString(int(eVal));
 30        if (isCompatibleWithSqrtS(eVal))  _sqs = en;
 31
 32        if (en == "2360") {
 33          book(_h[en+"pt500_nch1_eta"],  2, 1, 1);
 34          book(_h[en+"pt500_nch1_pt"],   9, 1, 1);
 35          book(_h[en+"pt500_nch1_nch"], 16, 1, 1);
 36          continue;
 37        }
 38        bool is7TeV(en  == "7000"s);
 39        book(_h[en+"pt100_nch2_nch"],   18+is7TeV, 1, 1);
 40        book(_h[en+"pt100_nch2_pt"],    11+is7TeV, 1, 1);
 41        book(_h[en+"pt100_nch2_eta"],    4+is7TeV, 1, 1);
 42        book(_p[en+"pt100_nch2_ptnch"], 24+is7TeV, 1, 1);
 43
 44        book(_h[en+"pt100_nch20_nch"], 34+is7TeV, 1, 1);
 45        book(_h[en+"pt100_nch20_pt"],  30+is7TeV, 1, 1);
 46        book(_h[en+"pt100_nch20_eta"], 26+is7TeV, 1, 1);
 47
 48        book(_h[en+"pt500_nch1_nch"],   15+(is7TeV? 2 : 0), 1, 1);
 49        book(_h[en+"pt500_nch1_pt"],     8+(is7TeV? 2 : 0), 1, 1);
 50        book(_h[en+"pt500_nch1_eta"],    1+(is7TeV? 2 : 0), 1, 1);
 51        book(_p[en+"pt500_nch1_ptnch"], 22+is7TeV, 1, 1);
 52
 53        book(_h[en+"pt500_nch6_nch"], 20+is7TeV, 1, 1);
 54        book(_h[en+"pt500_nch6_pt"],  13+is7TeV, 1, 1);
 55        book(_h[en+"pt500_nch6_eta"],  6+is7TeV, 1, 1);
 56
 57        book(_h[en+"pt2500_nch1_nch"],   36+is7TeV, 1, 1);
 58        book(_h[en+"pt2500_nch1_pt"],    32+is7TeV, 1, 1);
 59        book(_h[en+"pt2500_nch1_eta"],   28+is7TeV, 1, 1);
 60        book(_p[en+"pt2500_nch1_ptnch"], 38+is7TeV, 1, 1);
 61      }
 62      if (_sqs == "" && !merging()) {
 63        throw BeamError("Invalid beam energy for " + name() + "\n");
 64      }
 65    }
 66
 67
 68    void analyze(const Event& event) {
 69      // 100 GeV final states
 70      if (_sqs != "2360"s) {
 71        const ChargedFinalState& cfs100 = apply<ChargedFinalState>(event, "CFS100");
 72        fillPtEtaNch(cfs100, 2, "pt100_nch2"); // nch>=2
 73        fillPtEtaNch(cfs100, 20, "pt100_nch20"); // nch>=20
 74      }
 75
 76      // 500 GeV final states
 77      const ChargedFinalState& cfs500 = apply<ChargedFinalState>(event, "CFS500");
 78      fillPtEtaNch(cfs500, 1, "pt500_nch1"); // nch>=1
 79      if (_sqs != "2360"s) {
 80        fillPtEtaNch(cfs500, 6, "pt500_nch6"); // nch>=6
 81      }
 82
 83      // 2500 GeV final states
 84      if (_sqs != "2360"s) {
 85        const ChargedFinalState& cfs2500 = apply<ChargedFinalState>(event, "CFS2500");
 86        fillPtEtaNch(cfs2500, 1, "pt2500_nch1"); // nch>=1
 87      }
 88
 89    }
 90
 91
 92    void finalize() {
 93
 94      for (double eVal : allowedEnergies()) {
 95
 96        const string en = toString(int(eVal));
 97
 98        double sf = safediv(1.0, _h[en+"pt500_nch1_nch"]->integral(true), 1.0);
 99        scale(_h[en+"pt500_nch1_nch"], sf);
100        scale(_h[en+"pt500_nch1_pt"],  sf/TWOPI/5);
101        scale(_h[en+"pt500_nch1_eta"], sf);
102        if (en != "2360"s) {
103          sf = safediv(1.0, _h[en+"pt100_nch2_nch"]->integral(true), 1.0);
104          scale(_h[en+"pt100_nch2_nch"], sf);
105          scale(_h[en+"pt100_nch2_pt"],  sf/TWOPI/5);
106          scale(_h[en+"pt100_nch2_eta"], sf);
107
108          sf = safediv(1.0, _h[en+"pt100_nch20_nch"]->integral(true), 1.0);
109          scale(_h[en+"pt100_nch20_nch"], sf);
110          scale(_h[en+"pt100_nch20_pt"],  sf/TWOPI/5);
111          scale(_h[en+"pt100_nch20_eta"], sf);
112
113          sf = safediv(1.0, _h[en+"pt500_nch6_nch"]->integral(true), 1.0);
114          scale(_h[en+"pt500_nch6_nch"], sf);
115          scale(_h[en+"pt500_nch6_pt"],  sf/TWOPI/5);
116          scale(_h[en+"pt500_nch6_eta"], sf);
117
118          sf = safediv(1.0, _h[en+"pt2500_nch1_nch"]->integral(true), 1.0);
119          scale(_h[en+"pt2500_nch1_nch"], sf);
120          scale(_h[en+"pt2500_nch1_pt"],  sf/TWOPI/5);
121          scale(_h[en+"pt2500_nch1_eta"], sf);
122        }
123      }
124    }
125
126
127    /// Helper for collectively filling Nch, pT, eta, and pT vs. Nch histograms
128    void fillPtEtaNch(const ChargedFinalState& cfs, const int nchcut, const string& label) {
129      // Get number of particles and skip if event fails cut
130      const int nch = cfs.size();
131      if (nch < nchcut) return;
132
133      // Fill nch
134      _h[_sqs+label+"_nch"]->fill(nch);
135      // Loop over particles, fill pT, eta and ptnch
136      for (const Particle& p : cfs.particles()) {
137        const double pt = p.pT();
138        _h[_sqs+label+"_pt"]->fill(pt/GeV, 1.0/pt);
139        _h[_sqs+label+"_eta"]->fill(p.eta());
140        if (_sqs != "2360"s)  _p[_sqs+label+"_ptnch"]->fill(nch, pt/GeV);
141      }
142    }
143
144  private:
145
146    map<string, Histo1DPtr> _h;
147    map<string, Profile1DPtr> _p;
148
149    string _sqs = "";
150
151  };
152
153
154  RIVET_DECLARE_ALIASED_PLUGIN(ATLAS_2010_I882098, ATLAS_2010_S8918562);
155
156}