Rivet analyses referenceATLAS_2013_I1190187Measurement of the $W^+ W^-$ production cross-section at 7 TeVExperiment: ATLAS (LHC) Inspire ID: 1190187 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
Measurement of the fiducial cross section for $W^+ W^-$ production in proton proton collisions at a centre-of mass energy of 7 TeV, is presented, using data corresponding to an integrated luminosity of 4.6/fb collected by the ATLAS experiment at the Large Hadron Collider. The cross section is measured in the leptonic decay channels, using electron+MET and muon+MET $W$ decays. $W \to \tau$ processes with the tau decaying into electron + MET or muon + MET are also included in the measurement. The fiducial region contains dressed leptons in restricted $p_T$ and $\eta$ ranges. The selection has specific requirements for each production channel. A measurement of the normalized fiducial cross section as a function of the leading lepton transverse momentum is also presented. Source code: ATLAS_2013_I1190187.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/IdentifiedFinalState.hh"
5#include "Rivet/Projections/VetoedFinalState.hh"
6#include "Rivet/Projections/FastJets.hh"
7#include "Rivet/Projections/DressedLeptons.hh"
8#include "Rivet/Projections/MissingMomentum.hh"
9
10namespace Rivet {
11
12
13 /// ATLAS Wee Wemu Wmumu analysis at Z TeV
14 class ATLAS_2013_I1190187 : public Analysis {
15 public:
16
17 /// Default constructor
18 ATLAS_2013_I1190187()
19 : Analysis("ATLAS_2013_I1190187")
20 { }
21
22
23 void init() {
24 FinalState fs;
25
26 Cut etaRanges_EL = (Cuts::abseta < 1.37 || Cuts::absetaIn(1.52, 2.47)) && Cuts::pT > 20*GeV;
27 Cut etaRanges_MU = Cuts::abseta < 2.4 && Cuts::pT > 20*GeV;
28
29 MissingMomentum met(fs);
30 declare(met, "MET");
31
32 IdentifiedFinalState Photon(fs);
33 Photon.acceptIdPair(PID::PHOTON);
34
35 IdentifiedFinalState bare_EL(fs);
36 bare_EL.acceptIdPair(PID::ELECTRON);
37
38 IdentifiedFinalState bare_MU(fs);
39 bare_MU.acceptIdPair(PID::MUON);
40
41 IdentifiedFinalState neutrinoFS(fs);
42 neutrinoFS.acceptNeutrinos();
43 declare(neutrinoFS, "Neutrinos");
44
45 ////////////////////////////////////////////////////////
46 // DRESSED LEPTONS
47 // 3.arg: 0.1 = dR(lep,phot)
48 // 4.arg: true = do clustering
49 // 7.arg: false = ignore photons from hadron or tau
50 //
51 //////////////////////////////////////////////////////////
52 DressedLeptons electronFS(Photon, bare_EL, 0.1, etaRanges_EL);
53 declare(electronFS, "ELECTRON_FS");
54
55 DressedLeptons muonFS(Photon, bare_MU, 0.1, etaRanges_MU);
56 declare(muonFS, "MUON_FS");
57
58 VetoedFinalState jetinput;
59 jetinput.addVetoOnThisFinalState(bare_MU);
60 jetinput.addVetoOnThisFinalState(neutrinoFS);
61
62 FastJets jetpro(jetinput, FastJets::ANTIKT, 0.4);
63 declare(jetpro, "jet");
64
65 // Book histograms
66 book(_h_Wl1_pT_mumu ,1, 1, 2);
67 book(_h_Wl1_pT_ee ,1, 1, 1);
68 book(_h_Wl1_pT_emu ,1, 1, 3);
69 book(_h_Wl1_pT_inclusive ,4, 1, 1);
70 }
71
72
73 /// Do the analysis
74 void analyze(const Event& e) {
75
76 const vector<DressedLepton>& muonFS = apply<DressedLeptons>(e, "MUON_FS").dressedLeptons();
77 const vector<DressedLepton>& electronFS = apply<DressedLeptons>(e, "ELECTRON_FS").dressedLeptons();
78 const MissingMomentum& met = apply<MissingMomentum>(e, "MET");
79
80 vector<DressedLepton> dressed_lepton, isolated_lepton, fiducial_lepton;
81 dressed_lepton.insert(dressed_lepton.end(), muonFS.begin(), muonFS.end());
82 dressed_lepton.insert(dressed_lepton.end(), electronFS.begin(), electronFS.end());
83
84 ////////////////////////////////////////////////////////////////////////////
85 // OVERLAP REMOVAL
86 // -electrons with dR(e,mu)<0.1 are removed
87 // -lower pT electrons with dR(e,e)<0.1 are removed
88 //
89 ////////////////////////////////////////////////////////////////////////////
90 for (DressedLepton& l1 : dressed_lepton) {
91 bool l_isolated = true;
92 for (DressedLepton& l2 : dressed_lepton) {
93 if (!isSame(l1, l2) && l2.constituentLepton().abspid() == PID::ELECTRON) {
94 double overlapControl_ll= deltaR(l1.constituentLepton(),l2.constituentLepton());
95 if (overlapControl_ll < 0.1) {
96 l_isolated = false;
97 // e/e overlap removal
98 if (l1.constituentLepton().abspid() == PID::ELECTRON) {
99 if (l1.constituentLepton().pT()>l2.constituentLepton().pT()) {
100 isolated_lepton.push_back(l1);//keep e with highest pT
101 } else {
102 isolated_lepton.push_back(l2);//keep e with highest pT
103 }
104 }
105 // e/mu overlap removal
106 if (l1.constituentLepton().abspid() == PID::MUON) isolated_lepton.push_back(l1); //keep mu
107 }
108 }
109 }
110 if (l_isolated) isolated_lepton.push_back(l1);
111 }
112
113
114 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
115 // PRESELECTION:
116 // "isolated_lepton:"
117 // * electron: pt>20 GeV, |eta|<1.37, 1.52<|eta|<2.47, dR(electron,muon)>0.1
118 // * muon: pt>20 GeV, |eta|<2.4
119 // * dR(l,l)>0.1
120 //
121 // "fiducial_lepton"= isolated_lepton with
122 // * 2 leptons (e or mu)
123 // * leading lepton pt (pT_l1) >25 GeV
124 // * opposite charged leptons
125 //
126 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
127 if (isolated_lepton.size() != 2) vetoEvent;
128 sort(isolated_lepton.begin(), isolated_lepton.end(), cmpMomByPt);
129 if (isolated_lepton[0].pT() > 25*GeV && charge3(isolated_lepton[0]) != charge3(isolated_lepton[1])) {
130 fiducial_lepton.insert(fiducial_lepton.end(), isolated_lepton.begin(), isolated_lepton.end());
131 }
132 if (fiducial_lepton.size() == 0) vetoEvent;
133 double pT_l1 = fiducial_lepton[0].pT();
134 double M_l1l2 = (fiducial_lepton[0].momentum() + fiducial_lepton[1].momentum()).mass();
135 double pT_l1l2 = (fiducial_lepton[0].momentum() + fiducial_lepton[1].momentum()).pT();
136
137
138 /////////////////////////////////////////////////////////////////////////
139 // JETS
140 // -"alljets": found by "jetpro" projection && pT()>25 GeV && |y|<4.5
141 // -"vetojets": "alljets" && dR(electron,jet)>0.3
142 //
143 /////////////////////////////////////////////////////////////////////////
144 Jets alljets, vetojets;
145 for (const Jet& j : apply<FastJets>(e, "jet").jetsByPt(25)) {
146 if (j.absrap() > 4.5 ) continue;
147 alljets.push_back(j);
148 bool deltaRcontrol = true;
149 for (DressedLepton& fl : fiducial_lepton) {
150 if (fl.constituentLepton().abspid() == PID::ELECTRON) { //electrons
151 double deltaRjets = deltaR(fl.constituentLepton().momentum(), j.momentum(), RAPIDITY);
152 if (deltaRjets <= 0.3) deltaRcontrol = false; //false if at least one electron is in the overlap region
153 }
154 }
155 if (deltaRcontrol) vetojets.push_back(j);
156 }
157
158
159 /////////////////////////////////////////////////////////////////////////////////////////////////
160 // MISSING ETrel
161 // -"mismom": fourvector of invisible momentum found by "met" projection
162 // -"delta_phi": delta phi between mismom and the nearest "fiducial_lepton" or "vetojet"
163 // -"MET_rel": missing transverse energy defined as:
164 // *"mismom" for "delta_phi" >= (0.5*pi)
165 // *"mismom.pT()*sin(delta_phi)" for "delta_phi" < (0.5*pi)
166 //
167 /////////////////////////////////////////////////////////////////////////////////////////////////
168 FourMomentum mismom;
169 double MET_rel = 0, delta_phi = 0;
170 mismom = -met.visibleMomentum();
171 vector<double> vL_MET_angle, vJet_MET_angle;
172 vL_MET_angle.push_back(fabs(deltaPhi(fiducial_lepton[0].momentum(), mismom)));
173 vL_MET_angle.push_back(fabs(deltaPhi(fiducial_lepton[1].momentum(), mismom)));
174 for (double& lM : vL_MET_angle) if (lM > M_PI) lM = 2*M_PI - lM;
175
176 std::sort(vL_MET_angle.begin(), vL_MET_angle.end());
177 if (vetojets.size() == 0) delta_phi = vL_MET_angle[0];
178 if (vetojets.size() > 0) {
179 for (Jet& vj : vetojets) {
180 double jet_MET_angle = fabs(deltaPhi(vj.momentum(), mismom));
181 if (jet_MET_angle > M_PI) jet_MET_angle = 2*M_PI - jet_MET_angle;
182 vJet_MET_angle.push_back(jet_MET_angle);
183 }
184 std::sort(vJet_MET_angle.begin(), vJet_MET_angle.end());
185 if (vL_MET_angle[0] <= vJet_MET_angle[0]) delta_phi = vL_MET_angle[0];
186 if (vL_MET_angle[0] > vJet_MET_angle[0]) delta_phi = vJet_MET_angle[0];
187 }
188
189 if (delta_phi >= (0.5*M_PI)) delta_phi = 0.5*M_PI;
190 MET_rel = mismom.pT()*sin(delta_phi);
191
192
193 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
194 // CUTS
195 // -jetveto: event with at least one vetojet is vetoed
196 // -M_Z: Z mass M_Z=91.1876*GeV
197 //
198 // * ee channel: MET_rel > 45 GeV, M_l1l2 > 15 GeV, |M_l1l2-M_Z| > 15 GeV, jetveto, pT_l1l2 > 30 GeV
199 // * mumu channel: MET_rel > 45 GeV, M_l1l2 > 15 GeV, |M_l1l2-M_Z| > 15 GeV, jetveto, pT_l1l2 > 30 GeV
200 // * emu channel: MET_rel > 25 GeV, M_l1l2 > 10 GeV, |M_l1l2-M_Z| > 0 GeV, jetveto, pT_l1l2 > 30 GeV
201 //
202 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
203
204 // ee channel
205 if (fiducial_lepton[0].abspid() == PID::ELECTRON && fiducial_lepton[1].abspid() == PID::ELECTRON) {
206 if (MET_rel <= 45*GeV) vetoEvent;
207 if (M_l1l2 <= 15*GeV) vetoEvent;
208 if (fabs(M_l1l2 - 91.1876*GeV) <= 15*GeV) vetoEvent;
209 if (vetojets.size() != 0) vetoEvent;
210 if (pT_l1l2 <= 30*GeV) vetoEvent;
211 _h_Wl1_pT_ee->fill(sqrtS()*GeV);
212 _h_Wl1_pT_inclusive->fill(pT_l1);
213 }
214
215 // mumu channel
216 else if (fiducial_lepton[0].abspid() == PID::MUON && fiducial_lepton[1].abspid() == PID::MUON) {
217 if (MET_rel <= 45*GeV) vetoEvent;
218 if (M_l1l2 <= 15*GeV) vetoEvent;
219 if (fabs(M_l1l2-91.1876*GeV) <= 15*GeV) vetoEvent;
220 if (vetojets.size() != 0) vetoEvent;
221 if (pT_l1l2 <= 30*GeV) vetoEvent;
222 _h_Wl1_pT_mumu->fill(sqrtS()*GeV);
223 _h_Wl1_pT_inclusive->fill(pT_l1);
224 }
225
226 // emu channel
227 else if (fiducial_lepton[0].abspid() != fiducial_lepton[1].abspid()) {
228 if (MET_rel <= 25*GeV) vetoEvent;
229 if (M_l1l2 <= 10*GeV) vetoEvent;
230 if (vetojets.size() != 0) vetoEvent;
231 if (pT_l1l2 <= 30*GeV) vetoEvent;
232 _h_Wl1_pT_emu->fill(sqrtS()*GeV);
233 _h_Wl1_pT_inclusive->fill(pT_l1);
234 }
235 }
236
237
238 /// Finalize
239 void finalize() {
240 const double norm = crossSection()/sumOfWeights()/femtobarn;
241 scale(_h_Wl1_pT_ee, norm);
242 scale(_h_Wl1_pT_mumu, norm);
243 scale(_h_Wl1_pT_emu, norm);
244 normalize(_h_Wl1_pT_inclusive, 1);
245 }
246
247
248 private:
249
250 Histo1DPtr _h_Wl1_pT_ee, _h_Wl1_pT_mumu, _h_Wl1_pT_emu, _h_Wl1_pT_inclusive;
251
252 };
253
254
255 // The hook for the plugin system
256 RIVET_DECLARE_PLUGIN(ATLAS_2013_I1190187);
257
258}
|