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/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}