Rivet analyses referenceATLAS_2015_I1408516$Z$ $p_T$ and $Z$ $\phi^*$Experiment: ATLAS (LHC) Inspire ID: 1408516 Status: VALIDATED Authors:
Beam energies: (4000.0, 4000.0) GeV Run details:
Distributions of transverse momentum $p_\text{T}^{\ell\ell}$ and the angular variable $\phi^\ast_\eta$ of Drell-Yan lepton pairs are measured in $20.3\,\text{fb}^{-1}$ of proton-proton collisions at $\sqrt{s}=8$\,TeV with the ATLAS detector at the LHC. Measurements in electron-pair and muon-pair final states are corrected for detector effects. Compared to previous measurements in proton--proton collisions at $\sqrt{s}=7$ TeV, these new measurements benefit from a larger data sample and improved control of systematic uncertainties. Measurements are performed in bins of lepton-pair mass above, around and below the $Z$-boson mass peak. Specify the lepton channel (default is Z->ee) by using the LMODE variable. Only individual channels are available as particle-level measurements. Source code: ATLAS_2015_I1408516.cc 1#include "Rivet/Analysis.hh"
2#include "Rivet/Projections/FinalState.hh"
3#include "Rivet/Projections/DileptonFinder.hh"
4
5namespace Rivet {
6
7
8 class ATLAS_2015_I1408516 : public Analysis {
9 public:
10
11 /// Constructor
12 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2015_I1408516);
13
14 /// @name Analysis methods
15 /// @{
16
17 /// Book histograms and initialise projections before the run
18 void init() {
19
20 // Get options
21 _mode = 0;
22 if ( getOption("LMODE") == "EL" ) _mode = 0;
23 if ( getOption("LMODE") == "MU" ) _mode = 1;
24
25 // Configure projections
26 Cut cuts = Cuts::abseta < 2.4 && Cuts::pT > 20*GeV;
27 DileptonFinder zfinder(91.2*GeV, 0.1, cuts && Cuts::abspid == (_mode ? PID::MUON : PID::ELECTRON), Cuts::massIn(12*GeV, 150*GeV));
28 declare(zfinder, _mode ? "DileptonFinder_mu" : "DileptonFinder_el");
29
30 // Book histograms
31 const size_t offset = _mode ? 4 : 1;
32
33 book(_h["phistar_lo_00_08"] , 2, 1, offset);
34 book(_h["phistar_lo_08_16"] , 3, 1, offset);
35 book(_h["phistar_lo_16_24"] , 4, 1, offset);
36
37 book(_h["phistar_me_00_04"] , 5, 1, offset);
38 book(_h["phistar_me_04_08"] , 6, 1, offset);
39 book(_h["phistar_me_08_12"] , 7, 1, offset);
40 book(_h["phistar_me_12_16"] , 8, 1, offset);
41 book(_h["phistar_me_16_20"] , 9, 1, offset);
42 book(_h["phistar_me_20_24"] ,10, 1, offset);
43
44 book(_h["phistar_hi_00_08"] ,11, 1, offset);
45 book(_h["phistar_hi_08_16"] ,12, 1, offset);
46 book(_h["phistar_hi_16_24"] ,13, 1, offset);
47
48 book(_h["phistar_mll_46_66" ] ,14, 1, offset);
49 book(_h["phistar_mll_66_116" ] ,15, 1, offset);
50 book(_h["phistar_mll_116_150"] ,16, 1, offset);
51
52 book(_h["zpt_00_04"] ,17, 1, offset);
53 book(_h["zpt_04_08"] ,18, 1, offset);
54 book(_h["zpt_08_12"] ,19, 1, offset);
55 book(_h["zpt_12_16"] ,20, 1, offset);
56 book(_h["zpt_16_20"] ,21, 1, offset);
57 book(_h["zpt_20_24"] ,22, 1, offset);
58
59 book(_h["zpt_mll_12_20" ] ,23, 1, offset);
60 book(_h["zpt_mll_20_30" ] ,24, 1, offset);
61 book(_h["zpt_mll_30_46" ] ,25, 1, offset);
62 book(_h["zpt_mll_46_66" ] ,26, 1, offset);
63 book(_h["zpt_mll_66_116" ] ,27, 1, offset);
64 book(_h["zpt_mll_116_150"] ,28, 1, offset);
65
66 book(_h["zpt_00_04_xsec"] ,29, 1, offset);
67 book(_h["zpt_04_08_xsec"] ,30, 1, offset);
68 book(_h["zpt_08_12_xsec"] ,31, 1, offset);
69 book(_h["zpt_12_16_xsec"] ,32, 1, offset);
70 book(_h["zpt_16_20_xsec"] ,33, 1, offset);
71 book(_h["zpt_20_24_xsec"] ,34, 1, offset);
72
73 book(_h["zpt_mll_12_20_xsec" ] ,35, 1, offset);
74 book(_h["zpt_mll_20_30_xsec" ] ,36, 1, offset);
75 book(_h["zpt_mll_30_46_xsec" ] ,37, 1, offset);
76 book(_h["zpt_mll_46_66_xsec" ] ,38, 1, offset);
77 book(_h["zpt_mll_66_116_xsec" ] ,39, 1, offset);
78 book(_h["zpt_mll_116_150_xsec"] ,40, 1, offset);
79
80 book(_h["mll_xsec"] ,41, 1, 1 + _mode);
81 }
82
83
84 /// Perform the per-event analysis
85 void analyze(const Event& event) {
86
87 // Get leptonic Z boson
88 const DileptonFinder& zfinder = apply<DileptonFinder>(event, _mode ? "DileptonFinder_mu" : "DileptonFinder_el");
89 if (zfinder.bosons().size() != 1 ) vetoEvent;
90 const Particle& Zboson = zfinder.boson();
91
92 // Get/cut on heavily used Z boson properties
93 const double zpt = Zboson.pT();
94 const double zrap = Zboson.absrap();
95 const double zmass = Zboson.mass();
96 if (zrap > 2.4) vetoEvent;
97
98 // Get/cut on Z boson leptons
99 const Particles& leptons = zfinder.constituents();
100 if (leptons.size() != 2 || leptons[0].charge3() * leptons[1].charge3() > 0) vetoEvent;
101 const Particle& lminus = leptons[0].charge() < 0 ? leptons[0] : leptons[1];
102 const Particle& lplus = leptons[0].charge() < 0 ? leptons[1] : leptons[0];
103
104 // Compute phi*
105 const double phi_acop = M_PI - deltaPhi(lminus, lplus);
106 const double costhetastar = tanh( 0.5 * (lminus.eta() - lplus.eta()) );
107 const double sin2thetastar = (costhetastar > 1) ? 0.0 : (1.0 - sqr(costhetastar));
108 const double phistar = tan(0.5 * phi_acop) * sqrt(sin2thetastar);
109
110 // Inclusive mll
111 if (zmass > 46*GeV || zpt > 45*GeV) {
112 // 46 GeV < mll < 150 GeV OR (12 GeV < mll < 46 GeV AND ZpT >45 GeV)
113 _h["mll_xsec"]->fill(zmass);
114 }
115
116 // 12 GeV < mll < 150 GeV observables
117 if (zmass < 20*GeV) {
118 // 12 GeV < mll < 20 GeV
119 if (zpt > 45*GeV) { // ZpT cut only for low-mass regions
120 _h["zpt_mll_12_20_xsec"]->fill(zpt);
121 _h["zpt_mll_12_20" ]->fill(zpt);
122 }
123 } else if (zmass < 30*GeV) {
124 // 20 GeV < mll < 30 GeV
125 if (zpt > 45*GeV) { // ZpT cut only for low-mass regions
126 _h["zpt_mll_20_30_xsec"]->fill(zpt);
127 _h["zpt_mll_20_30" ]->fill(zpt);
128 }
129 } else if (zmass < 46*GeV) {
130 // 30 GeV < mll < 46 GeV
131 if (zpt > 45*GeV) { // ZpT cut only for low-mass regions
132 _h["zpt_mll_30_46_xsec"]->fill(zpt);
133 _h["zpt_mll_30_46" ]->fill(zpt);
134 }
135 } else if (zmass < 66*GeV) {
136 // 46 GeV < mll < 66 GeV
137 _h["zpt_mll_46_66_xsec"]->fill(zpt);
138 _h["zpt_mll_46_66" ]->fill(zpt);
139
140 _h["phistar_mll_46_66"]->fill(phistar);
141 if (zrap < 0.8) _h["phistar_lo_00_08"]->fill(phistar);
142 else if (zrap < 1.6) _h["phistar_lo_08_16"]->fill(phistar);
143 else _h["phistar_lo_16_24"]->fill(phistar);
144
145 } else if (zmass < 116*GeV) {
146 // 66 GeV < mll < 116 GeV
147 _h["zpt_mll_66_116_xsec"]->fill(zpt);
148 _h["zpt_mll_66_116" ]->fill(zpt);
149
150 if (zrap < 0.4) {
151 _h["zpt_00_04_xsec"]->fill(zpt);
152 _h["zpt_00_04"]->fill(zpt);
153 } else if (zrap < 0.8) {
154 _h["zpt_04_08_xsec"]->fill(zpt);
155 _h["zpt_04_08"]->fill(zpt);
156 } else if (zrap < 1.2) {
157 _h["zpt_08_12_xsec"]->fill(zpt);
158 _h["zpt_08_12"]->fill(zpt);
159 } else if (zrap < 1.6) {
160 _h["zpt_12_16_xsec"]->fill(zpt);
161 _h["zpt_12_16"]->fill(zpt);
162 } else if (zrap < 2.0) {
163 _h["zpt_16_20_xsec"]->fill(zpt);
164 _h["zpt_16_20"]->fill(zpt);
165 } else {
166 _h["zpt_20_24_xsec"]->fill(zpt);
167 _h["zpt_20_24"]->fill(zpt);
168 }
169
170 _h["phistar_mll_66_116"]->fill(phistar);
171 if (zrap < 0.4) _h["phistar_me_00_04"]->fill(phistar);
172 else if (zrap < 0.8) _h["phistar_me_04_08"]->fill(phistar);
173 else if (zrap < 1.2) _h["phistar_me_08_12"]->fill(phistar);
174 else if (zrap < 1.6) _h["phistar_me_12_16"]->fill(phistar);
175 else if (zrap < 2.0) _h["phistar_me_16_20"]->fill(phistar);
176 else _h["phistar_me_20_24"]->fill(phistar);
177
178 } else {
179
180 // 116 GeV < mll < 150 GeV
181 _h["zpt_mll_116_150_xsec"]->fill(zpt);
182 _h["zpt_mll_116_150" ]->fill(zpt);
183
184 _h["phistar_mll_116_150"]->fill(phistar);
185 if (zrap < 0.8) _h["phistar_hi_00_08"]->fill(phistar);
186 else if (zrap < 1.6) _h["phistar_hi_08_16"]->fill(phistar);
187 else _h["phistar_hi_16_24"]->fill(phistar);
188
189 }
190 }
191
192
193 /// Normalise histograms etc., after the run
194 void finalize() {
195 // Scale non-xsec plots to cross-section
196 const double sf = crossSection() / picobarn / sumOfWeights();
197 for (auto& key_hist : _h) {
198 scale(key_hist.second, sf);
199 if (!contains(key_hist.first, "_xsec")) normalize(key_hist.second);
200 }
201
202 // M(ll) plot isn't a differential cross section so shouldn't be divided by bin width
203 for (size_t i = 1; i < 7; ++i) {
204 double bw = _h["mll_xsec"]->bin(i).xWidth();
205 _h["mll_xsec"]->bin(i).scaleW(bw);
206 }
207 }
208 /// @}
209
210
211 protected:
212
213 size_t _mode;
214
215
216 private:
217
218 /// @name Histograms
219 /// @{
220 map<string, Histo1DPtr> _h;
221 /// @}
222
223 };
224
225
226 RIVET_DECLARE_PLUGIN(ATLAS_2015_I1408516);
227
228}
|