rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2013_I1190187

Measurement of the $W^+ W^-$ production cross-section at 7 TeV
Experiment: ATLAS (LHC)
Inspire ID: 1190187
Status: VALIDATED
Authors:
  • Oldrich Kepka
  • Katerina Moudra
References: Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • Run with inclusive $W^+ W^-$ events, with $W$ decays to electron + MET, muon + MET, or tau + MET.

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}