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/LeptonFinder.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 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2013_I1190187);
19
20 void init() {
21 Cut etaRanges_EL = (Cuts::abseta < 1.37 || Cuts::absetaIn(1.52, 2.47)) && Cuts::pT > 20*GeV;
22 Cut etaRanges_MU = Cuts::abseta < 2.4 && Cuts::pT > 20*GeV;
23
24 declare(MissingMomentum(), "MET");
25
26 IdentifiedFinalState neutrinoFS;
27 neutrinoFS.acceptNeutrinos();
28 declare(neutrinoFS, "Neutrinos");
29
30 ////////////////////////////////////////////////////////
31 // DRESSED LEPTONS
32 // 3.arg: 0.1 = dR(lep,phot)
33 // 4.arg: true = do clustering
34 // 7.arg: false = ignore photons from hadron or tau
35 //
36 //////////////////////////////////////////////////////////
37 LeptonFinder electronFS(0.1, Cuts::abspid == PID::ELECTRON && etaRanges_EL);
38 declare(electronFS, "ELECTRON_FS");
39
40 LeptonFinder muonFS(0.1, Cuts::abspid == PID::MUON && etaRanges_MU);
41 declare(muonFS, "MUON_FS");
42
43 VetoedFinalState jetinput;
44 jetinput.addVetoOnThisFinalState(neutrinoFS);
45
46 FastJets jetpro(jetinput, JetAlg::ANTIKT, 0.4, JetMuons::NONE);
47 declare(jetpro, "jet");
48
49 // Book histograms
50 book(_h_Wl1_pT_mumu, 1, 1, 2);
51 book(_h_Wl1_pT_ee, 1, 1, 1);
52 book(_h_Wl1_pT_emu, 1, 1, 3);
53 book(_h_Wl1_pT_inclusive,4, 1, 1);
54 }
55
56
57 /// Do the analysis
58 void analyze(const Event& e) {
59
60 const DressedLeptons& muonFS = apply<LeptonFinder>(e, "MUON_FS").dressedLeptons();
61 const DressedLeptons& electronFS = apply<LeptonFinder>(e, "ELECTRON_FS").dressedLeptons();
62 const MissingMomentum& met = apply<MissingMomentum>(e, "MET");
63
64 DressedLeptons dressed_lepton, isolated_lepton, fiducial_lepton;
65 dressed_lepton.insert(dressed_lepton.end(), muonFS.begin(), muonFS.end());
66 dressed_lepton.insert(dressed_lepton.end(), electronFS.begin(), electronFS.end());
67
68 ////////////////////////////////////////////////////////////////////////////
69 // OVERLAP REMOVAL
70 // -electrons with dR(e,mu)<0.1 are removed
71 // -lower pT electrons with dR(e,e)<0.1 are removed
72 //
73 ////////////////////////////////////////////////////////////////////////////
74 for (DressedLepton& l1 : dressed_lepton) {
75 bool l_isolated = true;
76 for (DressedLepton& l2 : dressed_lepton) {
77 if (!isSame(l1, l2) && l2.bareLepton().abspid() == PID::ELECTRON) {
78 double overlapControl_ll= deltaR(l1.bareLepton(), l2.bareLepton());
79 if (overlapControl_ll < 0.1) {
80 l_isolated = false;
81 // e/e overlap removal
82 if (l1.bareLepton().abspid() == PID::ELECTRON) {
83 if (l1.bareLepton().pT() > l2.bareLepton().pT()) {
84 isolated_lepton.push_back(l1);//keep e with highest pT
85 } else {
86 isolated_lepton.push_back(l2);//keep e with highest pT
87 }
88 }
89 // e/mu overlap removal
90 if (l1.bareLepton().abspid() == PID::MUON) isolated_lepton.push_back(l1); //keep mu
91 }
92 }
93 }
94 if (l_isolated) isolated_lepton.push_back(l1);
95 }
96
97
98 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
99 // PRESELECTION:
100 // "isolated_lepton:"
101 // * electron: pt>20 GeV, |eta|<1.37, 1.52<|eta|<2.47, dR(electron,muon)>0.1
102 // * muon: pt>20 GeV, |eta|<2.4
103 // * dR(l,l)>0.1
104 //
105 // "fiducial_lepton"= isolated_lepton with
106 // * 2 leptons (e or mu)
107 // * leading lepton pt (pT_l1) >25 GeV
108 // * opposite charged leptons
109 //
110 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
111 if (isolated_lepton.size() != 2) vetoEvent;
112 sort(isolated_lepton.begin(), isolated_lepton.end(), cmpMomByPt);
113 if (isolated_lepton[0].pT() > 25*GeV && charge3(isolated_lepton[0]) != charge3(isolated_lepton[1])) {
114 fiducial_lepton.insert(fiducial_lepton.end(), isolated_lepton.begin(), isolated_lepton.end());
115 }
116 if (fiducial_lepton.size() == 0) vetoEvent;
117 double pT_l1 = fiducial_lepton[0].pT();
118 double M_l1l2 = (fiducial_lepton[0].momentum() + fiducial_lepton[1].momentum()).mass();
119 double pT_l1l2 = (fiducial_lepton[0].momentum() + fiducial_lepton[1].momentum()).pT();
120
121
122 /////////////////////////////////////////////////////////////////////////
123 // JETS
124 // -"alljets": found by "jetpro" projection && pT()>25 GeV && |y|<4.5
125 // -"vetojets": "alljets" && dR(electron,jet)>0.3
126 //
127 /////////////////////////////////////////////////////////////////////////
128 Jets alljets, vetojets;
129 for (const Jet& j : apply<FastJets>(e, "jet").jetsByPt(Cuts::pT > 25 && Cuts::absrap < 4.5)) {
130 alljets.push_back(j);
131 bool deltaRcontrol = true;
132 for (DressedLepton& fl : fiducial_lepton) {
133 if (fl.bareLepton().abspid() == PID::ELECTRON) { //electrons
134 double deltaRjets = deltaR(fl.bareLepton().momentum(), j.momentum(), RAPIDITY);
135 if (deltaRjets <= 0.3) deltaRcontrol = false; //false if at least one electron is in the overlap region
136 }
137 }
138 if (deltaRcontrol) vetojets.push_back(j);
139 }
140
141
142 /////////////////////////////////////////////////////////////////////////////////////////////////
143 // MISSING ETrel
144 // -"mismom": fourvector of invisible momentum found by "met" projection
145 // -"delta_phi": delta phi between mismom and the nearest "fiducial_lepton" or "vetojet"
146 // -"MET_rel": missing transverse energy defined as:
147 // *"mismom" for "delta_phi" >= (0.5*pi)
148 // *"mismom.pT()*sin(delta_phi)" for "delta_phi" < (0.5*pi)
149 //
150 /////////////////////////////////////////////////////////////////////////////////////////////////
151 FourMomentum mismom;
152 double MET_rel = 0, delta_phi = 0;
153 mismom = -met.visibleMomentum();
154 vector<double> vL_MET_angle, vJet_MET_angle;
155 vL_MET_angle.push_back(fabs(deltaPhi(fiducial_lepton[0].momentum(), mismom)));
156 vL_MET_angle.push_back(fabs(deltaPhi(fiducial_lepton[1].momentum(), mismom)));
157 for (double& lM : vL_MET_angle) if (lM > M_PI) lM = 2*M_PI - lM;
158
159 std::sort(vL_MET_angle.begin(), vL_MET_angle.end());
160 if (vetojets.size() == 0) delta_phi = vL_MET_angle[0];
161 if (vetojets.size() > 0) {
162 for (Jet& vj : vetojets) {
163 double jet_MET_angle = fabs(deltaPhi(vj.momentum(), mismom));
164 if (jet_MET_angle > M_PI) jet_MET_angle = 2*M_PI - jet_MET_angle;
165 vJet_MET_angle.push_back(jet_MET_angle);
166 }
167 std::sort(vJet_MET_angle.begin(), vJet_MET_angle.end());
168 if (vL_MET_angle[0] <= vJet_MET_angle[0]) delta_phi = vL_MET_angle[0];
169 if (vL_MET_angle[0] > vJet_MET_angle[0]) delta_phi = vJet_MET_angle[0];
170 }
171
172 if (delta_phi >= (0.5*M_PI)) delta_phi = 0.5*M_PI;
173 MET_rel = mismom.pT()*sin(delta_phi);
174
175
176 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
177 // CUTS
178 // -jetveto: event with at least one vetojet is vetoed
179 // -M_Z: Z mass M_Z=91.1876*GeV
180 //
181 // * ee channel: MET_rel > 45 GeV, M_l1l2 > 15 GeV, |M_l1l2-M_Z| > 15 GeV, jetveto, pT_l1l2 > 30 GeV
182 // * mumu channel: MET_rel > 45 GeV, M_l1l2 > 15 GeV, |M_l1l2-M_Z| > 15 GeV, jetveto, pT_l1l2 > 30 GeV
183 // * emu channel: MET_rel > 25 GeV, M_l1l2 > 10 GeV, |M_l1l2-M_Z| > 0 GeV, jetveto, pT_l1l2 > 30 GeV
184 //
185 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
186
187 // ee channel
188 if (fiducial_lepton[0].abspid() == PID::ELECTRON && fiducial_lepton[1].abspid() == PID::ELECTRON) {
189 if (MET_rel <= 45*GeV) vetoEvent;
190 if (M_l1l2 <= 15*GeV) vetoEvent;
191 if (fabs(M_l1l2 - 91.1876*GeV) <= 15*GeV) vetoEvent;
192 if (vetojets.size() != 0) vetoEvent;
193 if (pT_l1l2 <= 30*GeV) vetoEvent;
194 _h_Wl1_pT_ee->fill(7000);
195 _h_Wl1_pT_inclusive->fill(pT_l1);
196 }
197
198 // mumu channel
199 else if (fiducial_lepton[0].abspid() == PID::MUON && fiducial_lepton[1].abspid() == PID::MUON) {
200 if (MET_rel <= 45*GeV) vetoEvent;
201 if (M_l1l2 <= 15*GeV) vetoEvent;
202 if (fabs(M_l1l2-91.1876*GeV) <= 15*GeV) vetoEvent;
203 if (vetojets.size() != 0) vetoEvent;
204 if (pT_l1l2 <= 30*GeV) vetoEvent;
205 _h_Wl1_pT_mumu->fill(7000);
206 _h_Wl1_pT_inclusive->fill(pT_l1);
207 }
208
209 // emu channel
210 else if (fiducial_lepton[0].abspid() != fiducial_lepton[1].abspid()) {
211 if (MET_rel <= 25*GeV) vetoEvent;
212 if (M_l1l2 <= 10*GeV) vetoEvent;
213 if (vetojets.size() != 0) vetoEvent;
214 if (pT_l1l2 <= 30*GeV) vetoEvent;
215 _h_Wl1_pT_emu->fill(7000);
216 _h_Wl1_pT_inclusive->fill(pT_l1);
217 }
218 }
219
220
221 /// Finalize
222 void finalize() {
223 const double norm = crossSection()/sumOfWeights()/femtobarn;
224 scale(_h_Wl1_pT_ee, norm);
225 scale(_h_Wl1_pT_mumu, norm);
226 scale(_h_Wl1_pT_emu, norm);
227 normalize(_h_Wl1_pT_inclusive, 1);
228 }
229
230
231 private:
232
233 BinnedHistoPtr<int> _h_Wl1_pT_ee, _h_Wl1_pT_mumu, _h_Wl1_pT_emu;
234 Histo1DPtr _h_Wl1_pT_inclusive;
235
236 };
237
238
239 RIVET_DECLARE_PLUGIN(ATLAS_2013_I1190187);
240
241}
|