Rivet analyses referenceATLAS_2016_I1502620W and Z inclusive cross sections at 7 TeVExperiment: ATLAS (LHC) Inspire ID: 1502620 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
High-precision measurements by the ATLAS Collaboration are presented of inclusive $W^+\to\ell^+$, $W^-\to\ell^-$, $Z/\gamma^\ast\to\ell\ell$ ($\ell=e,\mu$) Drell-Yan production cross sections at the LHC. The data were collected in proton-proton collisions at $\sqrt{s}=7$ TeV with an integrated luminosity of 4.6 fb${}^{-1}$. Differential $W^+$ and $W^-$ cross sections are measured in a lepton pseudorapidity range $|\eta_\ell| < 2.5$. Differential $Z/\gamma^\ast$ cross sections are measured as a function of the absolute dilepton rapidity, for $|y_{\ell\ell}| < 3.6$, for three intervals of dilepton mass, $m_{\ell\ell}$, extending from 46 to 150 GeV. The integrated and differential electron- and muon-channel cross sections are combined and compared to theoretical predictions using recent sets of parton distribution functions. The data, together with the final inclusive $e^\pm p$ scattering cross-section data from H1 and ZEUS, are interpreted in a next-to-next-to-leading-order QCD analysis, and a new set of parton distribution functions, ATLAS-epWZ16, is obtained. The ratio of strange-to-light sea-quark densities in the proton is determined more accurately than in previous determinations based on collider data only, and is established to be close to unity in the sensitivity range of the data. A new measurement of the CKM matrix element $|V_{cs}|$ is also provided. N.B.: Use :LMODE to choose specify the signature decay channel directly. Default, run everything, assuming all decay modes are generated Contains Z (W): fill only Z (W) signature histograms Contains EL (MU): assume only electron (muon) decay modes are being generated. Source code: ATLAS_2016_I1502620.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/WFinder.hh"
5#include "Rivet/Projections/ZFinder.hh"
6
7namespace Rivet {
8
9 /// @brief inclusive W/Z cross sections at 7 TeV
10 class ATLAS_2016_I1502620 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_I1502620);
15 //@}
16
17
18 /// @name Analysis methods
19 //@{
20
21 /// Book histograms and initialise projections before the run
22 void init() {
23
24 // Get options from the new option system
25 // run everything
26 _mode = 0;
27 _runZ = true;
28 _runW = true;
29 if ( getOption("LMODE") == "EL" ||
30 getOption("LMODE") == "ZEL" ||
31 getOption("LMODE") == "WEL" )
32 _mode = 1;
33 if ( getOption("LMODE") == "MU" ||
34 getOption("LMODE") == "ZMU" ||
35 getOption("LMODE") == "WMU" )
36 _mode = 2;
37 if ( getOption("LMODE") == "Z" ||
38 getOption("LMODE") == "ZEL" ||
39 getOption("LMODE") == "ZMU" )
40 _runW = false;
41 if ( getOption("LMODE") == "W" ||
42 getOption("LMODE") == "WEL" ||
43 getOption("LMODE") == "WMU" )
44 _runZ = false;
45
46
47
48
49 ///Initialise and register projections here
50 const FinalState fs;
51
52 Cut Wcuts = Cuts::pT >= 25*GeV; // minimum lepton pT
53 Cut Zcuts = Cuts::pT >= 20.0*GeV;
54
55 WFinder wfinder_edressed(fs, Wcuts, PID::ELECTRON, 40*GeV, 13*TeV, 25*GeV, 0.1,
56 WFinder::ChargedLeptons::PROMPT, WFinder::ClusterPhotons::NODECAY, WFinder::AddPhotons::NO, WFinder::MassWindow::MT);
57 declare(wfinder_edressed, "WFinder_edressed");
58
59 ZFinder zfindere(fs, Zcuts, PID::ELECTRON, 46.0*GeV, 150*GeV, 0.1,
60 ZFinder::ChargedLeptons::PROMPT, ZFinder::ClusterPhotons::NODECAY, ZFinder::AddPhotons::NO);
61 declare(zfindere, "ZFindere");
62
63 WFinder wfinder_mdressed(fs, Wcuts, PID::MUON, 40*GeV, 13*TeV, 25*GeV, 0.1,
64 WFinder::ChargedLeptons::PROMPT, WFinder::ClusterPhotons::NODECAY, WFinder::AddPhotons::NO, WFinder::MassWindow::MT);
65 declare(wfinder_mdressed, "WFinder_mdressed");
66
67 ZFinder zfinderm(fs, Zcuts, PID::MUON, 46.0*GeV, 150*GeV, 0.1,
68 ZFinder::ChargedLeptons::PROMPT, ZFinder::ClusterPhotons::NODECAY, ZFinder::AddPhotons::NO);
69 declare(zfinderm, "ZFinderm");
70
71
72 /// Book histograms here
73 if (_runW) {
74 book(_h_Wp_eta, 9, 1, 1);
75 book(_h_Wm_eta, 10, 1, 1);
76 book(_h_W_asym, 35, 1, 1);
77 }
78
79 if (_runZ) {
80 book(_h_Zcenlow_y_dressed, 11, 1, 1);
81 book(_h_Zcenpeak_y_dressed, 12, 1, 1);
82 book(_h_Zcenhigh_y_dressed, 13, 1, 1);
83 book(_h_Zfwdpeak_y_dressed, 14, 1, 1);
84 book(_h_Zfwdhigh_y_dressed, 15, 1, 1);
85 }
86 }
87
88 /// Perform the per-event analysis
89 void analyze(const Event& event) {
90
91 // W stuff
92 const WFinder& wfindere = apply<WFinder>(event, "WFinder_edressed");
93 const WFinder& wfinderm = apply<WFinder>(event, "WFinder_mdressed");
94
95 if (wfindere.bosons().size()+wfinderm.bosons().size() == 1 && _runW) {
96
97 Particle lep;
98 if (_mode !=2 && wfindere.bosons().size() == 1 ) {
99 lep = wfindere.constituentLeptons()[0];
100 }
101 else if (_mode !=1 && wfinderm.bosons().size() == 1 ) {
102 lep = wfinderm.constituentLeptons()[0];
103 }
104
105 if (lep.charge3() == 3) {
106 _h_Wp_eta->fill(lep.abseta());
107 }
108 else if (lep.charge3() == -3) {
109 _h_Wm_eta->fill(lep.abseta());
110 }
111 }
112
113 // now the Z stuff.
114 const ZFinder& zfindere = apply<ZFinder>(event, "ZFindere");
115 const ZFinder& zfinderm = apply<ZFinder>(event, "ZFinderm");
116
117
118 // must be one and only one candidate.
119 if (zfindere.bosons().size()+zfinderm.bosons().size() == 1 && _runZ) {
120
121 Particle Zboson;
122 Particles leptons;
123
124 // candidate is e+e-
125 if (_mode != 2 && zfindere.bosons().size() == 1 ) {
126
127 Zboson = zfindere.boson();
128 leptons = zfindere.constituents();
129 }
130
131 // candidate is mu+mu-
132 else if (_mode !=1 && zfinderm.bosons().size() == 1 ) {
133
134 Zboson = zfinderm.boson();
135 leptons = zfinderm.constituents();
136
137 }
138
139 if (leptons.size() > 1) {
140
141 const double zrap = Zboson.absrap();
142 const double zmass = Zboson.mass();
143 const double eta1 = leptons[0].abseta();
144 const double eta2 = leptons[1].abseta();
145
146 // separation into central/forward and three mass bins
147 if (eta1 < 2.5 && eta2 < 2.5) {
148 if (zmass < 66.0*GeV) _h_Zcenlow_y_dressed->fill(zrap);
149 else if (zmass < 116.0*GeV) _h_Zcenpeak_y_dressed->fill(zrap);
150 else _h_Zcenhigh_y_dressed->fill(zrap);
151 }
152 else if ((eta1 < 2.5 && 2.5 < eta2 && eta2 < 4.9) || (eta2 < 2.5 && 2.5 < eta1 && eta1 < 4.9)) {
153 if (zmass > 66.0*GeV) {
154 if (zmass < 116.0*GeV) _h_Zfwdpeak_y_dressed->fill(zrap);
155 else _h_Zfwdhigh_y_dressed->fill(zrap);
156 }
157 }
158 }
159 }
160 }
161
162 /// Normalise histograms etc., after the run
163 void finalize() {
164
165 // Construct asymmetry: (dsig+/deta - dsig-/deta) / (dsig+/deta + dsig-/deta)
166 //divide(*_h_Wp_eta - *_h_Wm_eta, *_h_Wp_eta + *_h_Wm_eta, _h_W_asym);
167 if (_runW) {
168 for (size_t i = 0; i < _h_Wp_eta->numBins(); ++i) {
169 YODA::HistoBin1D& bp = _h_Wp_eta->bin(i);
170 YODA::HistoBin1D& bm = _h_Wm_eta->bin(i);
171 const double sum = bp.height() + bm.height();
172 //const double xerr = 0.5 * bp.xWidth();
173 double val = 0., yerr = 0.;
174
175 if (sum) {
176 const double pos2 = bp.height() * bp.height();
177 const double min2 = bm.height() * bm.height();
178 const double errp2 = bp.heightErr() * bp.heightErr();
179 const double errm2 = bm.heightErr() * bm.heightErr();
180 val = (bp.height() - bm.height()) / sum;
181 yerr = 2. * sqrt(errm2 * pos2 + errp2 * min2) / (sum * sum);
182 }
183 _h_W_asym->addPoint(bp.midpoint(), val, 0.5*bp.xWidth(), yerr);
184 }
185 }
186
187 /// Normalise, scale and otherwise manipulate histograms here
188 double lfac = 1.0;
189 // If we have been running on both electrons and muons, need to divide by two to
190 // get the xsec for one flavour
191 if (_mode == 0) lfac = 0.5;
192 const double sf = lfac * 0.5 * crossSection() /picobarn / sumOfWeights(); // 0.5 accounts for rapidity bin width
193
194 if (_runW){
195 scale(_h_Wp_eta, sf);
196 scale(_h_Wm_eta, sf);
197 }
198
199 if (_runZ){
200 scale(_h_Zcenlow_y_dressed, sf);
201 scale(_h_Zcenpeak_y_dressed, sf);
202 scale(_h_Zcenhigh_y_dressed, sf);
203 scale(_h_Zfwdpeak_y_dressed, sf);
204 scale(_h_Zfwdhigh_y_dressed, sf);
205 }
206 }
207
208 //@}
209
210
211 protected:
212 size_t _mode;
213 bool _runZ, _runW;
214
215 private:
216
217 /// @name Histograms
218 //@{
219 Histo1DPtr _h_Wp_eta, _h_Wm_eta;
220 Scatter2DPtr _h_W_asym;
221
222 Histo1DPtr _h_Zcenlow_y_dressed;
223 Histo1DPtr _h_Zcenpeak_y_dressed;
224 Histo1DPtr _h_Zcenhigh_y_dressed;
225 Histo1DPtr _h_Zfwdpeak_y_dressed;
226 Histo1DPtr _h_Zfwdhigh_y_dressed;
227 //@}
228
229 };
230
231 // The hook for the plugin system
232 RIVET_DECLARE_PLUGIN(ATLAS_2016_I1502620);
233
234
235}
236
237// END END END
|