Rivet analyses referenceATLAS_2010_I882098Track-based minimum bias at 900 GeV and 2.36 and 7 TeV in ATLASExperiment: ATLAS (LHC) Inspire ID: 882098 Status: VALIDATED Authors:
Beam energies: (450.0, 450.0); (1180.0, 1180.0); (3500.0, 3500.0) GeV Run details:
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}
|