rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2011_I928289

inclusive W and Z cross-sections at 7 TeV
Experiment: ATLAS (LHC)
Inspire ID: 928289
Status: VALIDATED
Authors:
  • Roman Lysak
  • Christian Gutschow
References: Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • p + p -> W + X ( W -> mu nu or e nu ) p + p -> Z + X ( Z -> mu mu or e e )

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}