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 if (isCompatibleWithSqrtS(900*GeV)) {
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*GeV)) {
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*GeV)) {
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_I882098 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*GeV)) {
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*GeV)) {
106 fillPtEtaNch(cfs500, 6, "pt500_nch6");
107 }
108
109 // 2500 GeV final states
110 if (!isCompatibleWithSqrtS(2360*GeV)) {
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*GeV)) {
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_I882098, ATLAS_2010_S8918562);
176
177}
|