Rivet analyses referenceATLAS_2011_I928289inclusive W and Z cross-sections at 7 TeVExperiment: ATLAS (LHC) Inspire ID: 928289 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
The production cross sections of the inclusive Drell-Yan process $W^\pm \rightarrow \ell\nu$ and $Z/\gamma^\ast \rightarrow \ell\ell$ ($\ell = e, \mu$) are measured in proton-proton collisions at $\sqrt{s} = 7$ TeV with the ATLAS detector. The cross sections are evaluated differentially as a function of the boson rapidity based on an integrated luminosity of about 35 $\text{pb}^{-1}$ collected in 2010. The cross sections are measured separately for $W^+$ and $W^-$ production, and then used to construct the $W$ charge asymmetry as well. Source code: ATLAS_2011_I928289.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/PromptFinalState.hh"
5#include "Rivet/Projections/DileptonFinder.hh"
6#include "Rivet/Projections/MissingMomentum.hh"
7#include "Rivet/Projections/LeptonFinder.hh"
8
9namespace Rivet {
10
11
12 /// W inclusive cross-sections at 7 TeV
13 class ATLAS_2011_I928289 : public Analysis {
14 public:
15
16 /// Constructor
17 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2011_I928289);
18
19 /// @name Analysis methods
20 /// @{
21
22 /// Book histograms and initialise projections before the run
23 void init() {
24
25 _mode = 0;
26 if ( getOption("MODE") == "Z" ) _mode = 1;
27 else if ( getOption("MODE") == "W" ) _mode = 2;
28
29 // Initialise and register projections
30
31 Cut cut = Cuts::pT >= 20.0*GeV;
32 DileptonFinder zfinder_ee_bare( 91.2*GeV, 0.0, cut && Cuts::abspid == PID::ELECTRON, Cuts::massIn(66*GeV, 116*GeV));
33 DileptonFinder zfinder_ee_dressed(91.2*GeV, 0.1, cut && Cuts::abspid == PID::ELECTRON, Cuts::massIn(66*GeV, 116*GeV));
34 DileptonFinder zfinder_mm_bare( 91.2*GeV, 0.0, cut && Cuts::abspid == PID::MUON , Cuts::massIn(66*GeV, 116*GeV));
35 DileptonFinder zfinder_mm_dressed(91.2*GeV, 0.1, cut && Cuts::abspid == PID::MUON , Cuts::massIn(66*GeV, 116*GeV));
36
37 declare(zfinder_ee_bare , "ee_bare" );
38 declare(zfinder_ee_dressed, "ee_dressed");
39 declare(zfinder_mm_bare , "mm_bare" );
40 declare(zfinder_mm_dressed, "mm_dressed");
41
42 declare("MET", MissingMomentum());
43 LeptonFinder ef_bare(0.0, Cuts::pT > 20*GeV && Cuts::abspid == PID::ELECTRON);
44 LeptonFinder ef_dressed(0.1, Cuts::pT > 20*GeV && Cuts::abspid == PID::ELECTRON);
45 LeptonFinder mf_bare(0.0, Cuts::pT > 20*GeV && Cuts::abspid == PID::MUON);
46 LeptonFinder mf_dressed(0.1, Cuts::pT > 20*GeV && Cuts::abspid == PID::MUON);
47 declare(ef_bare, "elecs_bare");
48 declare(ef_dressed, "elecs_dressed");
49 declare(mf_bare, "muons_bare");
50 declare(mf_dressed, "muons_dressed");
51
52 /// Book histograms here
53 if (_mode == 0 || _mode == 1) {
54 book(_h["ee_bare"], 1, 1, 1);
55 book(_h["ee_dressed"], 1, 1, 2);
56 book(_h["mm_bare"], 1, 1, 3);
57 book(_h["mm_dressed"], 1, 1, 4);
58 }
59 if (_mode == 0 || _mode == 2) {
60 book(_h["minus_el_bare"], 3, 1, 1);
61 book(_h["minus_el_dressed"], 3, 1, 2);
62 book(_h["minus_mu_bare"], 3, 1, 3);
63 book(_h["minus_mu_dressed"], 3, 1, 4);
64 book(_h["plus_el_bare"], 5, 1, 1);
65 book(_h["plus_el_dressed"], 5, 1, 2);
66 book(_h["plus_mu_bare"], 5, 1, 3);
67 book(_h["plus_mu_dressed"], 5, 1, 4);
68 book(_e["el_bare"], 7, 1, 1);
69 book(_e["el_dressed"], 7, 1, 2);
70 book(_e["mu_bare"], 7, 1, 3);
71 book(_e["mu_dressed"], 7, 1, 4);
72 }
73 }
74
75
76 /// Perform the per-event analysis
77 void analyze(const Event& event) {
78
79 if (_mode == 0 || _mode == 1) {
80 fillHistosZ(event);
81 }
82 if (_mode == 0 || _mode == 2) {
83 fillHistosW(event);
84 }
85
86 }
87
88 void fillHistosW(const Event& event) {
89 // W reco, starting with MET
90 const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
91 if (pmiss.Et() < 25*GeV) return;
92
93 const Particles& esb = apply<LeptonFinder>(event, "elecs_bare").particles();
94 const Particles esb_mtfilt = select(esb, [&](const Particle& e){ return mT(e, pmiss) > 40*GeV; });
95 const int iebfound = closestMatchIndex(esb_mtfilt, pmiss, Kin::mass, 80.4*GeV, 40*GeV);
96 if (iebfound >= 0) {
97 const Particle& l = esb_mtfilt[iebfound];
98 (l.charge3() > 0 ? _h["plus_el_bare"] : _h["minus_el_bare"])->fill(l.abseta());
99 }
100
101 const Particles& esd = apply<LeptonFinder>(event, "elecs_dressed").particles();
102 const Particles esd_mtfilt = select(esd, [&](const Particle& e){ return mT(e, pmiss) > 40*GeV; });
103 const int iedfound = closestMatchIndex(esd_mtfilt, pmiss, Kin::mass, 80.4*GeV, 40*GeV);
104 if (iedfound >= 0) {
105 const Particle& l = esd_mtfilt[iedfound];
106 (l.charge3() > 0 ? _h["plus_el_dressed"] : _h["minus_el_dressed"])->fill(l.abseta());
107 }
108
109 const Particles& musb = apply<LeptonFinder>(event, "muons_bare").particles();
110 const Particles musb_mtfilt = select(musb, [&](const Particle& m){ return mT(m, pmiss) > 40*GeV; });
111 const int imbfound = closestMatchIndex(musb_mtfilt, pmiss, Kin::mass, 80.4*GeV, 40*GeV);
112 if (imbfound >= 0) {
113 const Particle& l = musb_mtfilt[imbfound];
114 (l.charge3() > 0 ? _h["plus_mu_bare"] : _h["minus_mu_bare"])->fill(l.abseta());
115 }
116
117 const Particles& musd = apply<LeptonFinder>(event, "muons_dressed").particles();
118 const Particles musd_mtfilt = select(musd, [&](const Particle& m){ return mT(m, pmiss) > 40*GeV; });
119 const int imdfound = closestMatchIndex(musd_mtfilt, pmiss, Kin::mass, 80.4*GeV, 40*GeV);
120 if (imdfound >= 0) {
121 const Particle& l = musd_mtfilt[imdfound];
122 (l.charge3() > 0 ? _h["plus_mu_dressed"] : _h["minus_mu_dressed"])->fill(l.abseta());
123 }
124 }
125
126
127 void fillHistosZ(const Event& event) {
128
129 const DileptonFinder& zfinder_ee_bare = apply<DileptonFinder>(event, "ee_bare" );
130 const DileptonFinder& zfinder_ee_dressed = apply<DileptonFinder>(event, "ee_dressed");
131 const DileptonFinder& zfinder_mm_bare = apply<DileptonFinder>(event, "mm_bare" );
132 const DileptonFinder& zfinder_mm_dressed = apply<DileptonFinder>(event, "mm_dressed");
133
134 fillPlots1D(zfinder_ee_bare, "ee_bare");
135 fillPlots1D(zfinder_ee_dressed, "ee_dressed");
136 fillPlots1D(zfinder_mm_bare, "mm_bare");
137 fillPlots1D(zfinder_mm_dressed, "mm_dressed");
138
139 }
140
141
142 void fillPlots1D(const DileptonFinder& zfinder, const string& label) {
143 if (zfinder.bosons().size() != 1) return;
144 const FourMomentum zmom = zfinder.bosons()[0].momentum();
145 _h[label]->fill(zmom.absrap());
146 }
147
148
149 /// Normalise histograms etc., after the run
150 void finalize() {
151
152 // Print summary info
153 const double xs_pb = crossSection() / picobarn;
154 const double sumw = sumOfWeights();
155 const double sf = 0.5 * xs_pb / sumw; // 0.5 accounts for rapidity bin width
156
157 scale(_h, sf);
158 if (_mode == 0 || _mode == 2) {
159 // Construct asymmetry: (dsig+/deta - dsig-/deta) / (dsig+/deta + dsig-/deta)
160 for (const string& type : vector<string>{"el_bare", "el_dressed", "mu_bare", "mu_dressed"}) {
161 asymm(_h["plus_"+type], _h["minus_"+type], _e[type]);
162 }
163 }
164 }
165
166 /// @}
167
168
169 private:
170
171 size_t _mode;
172
173 /// @name Histograms
174 /// @{
175 map<string, Histo1DPtr> _h;
176 map<string, Estimate1DPtr> _e;
177 /// @}
178
179 };
180
181
182 RIVET_DECLARE_PLUGIN(ATLAS_2011_I928289);
183
184}
|