rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2016_I1502620

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

High-precision measurements by the ATLAS Collaboration are presented of inclusive $W^+\to\ell^+$, $W^-\to\ell^-$, $Z/\gamma^\ast\to\ell\ell$ ($\ell=e,\mu$) Drell-Yan production cross sections at the LHC. The data were collected in proton-proton collisions at $\sqrt{s}=7$ TeV with an integrated luminosity of 4.6 fb${}^{-1}$. Differential $W^+$ and $W^-$ cross sections are measured in a lepton pseudorapidity range $|\eta_\ell| < 2.5$. Differential $Z/\gamma^\ast$ cross sections are measured as a function of the absolute dilepton rapidity, for $|y_{\ell\ell}| < 3.6$, for three intervals of dilepton mass, $m_{\ell\ell}$, extending from 46 to 150 GeV. The integrated and differential electron- and muon-channel cross sections are combined and compared to theoretical predictions using recent sets of parton distribution functions. The data, together with the final inclusive $e^\pm p$ scattering cross-section data from H1 and ZEUS, are interpreted in a next-to-next-to-leading-order QCD analysis, and a new set of parton distribution functions, ATLAS-epWZ16, is obtained. The ratio of strange-to-light sea-quark densities in the proton is determined more accurately than in previous determinations based on collider data only, and is established to be close to unity in the sensitivity range of the data. A new measurement of the CKM matrix element $|V_{cs}|$ is also provided. N.B.: Use :LMODE to choose specify the signature decay channel directly. Default, run everything, assuming all decay modes are generated Contains Z (W): fill only Z (W) signature histograms Contains EL (MU): assume only electron (muon) decay modes are being generated.

Source code: ATLAS_2016_I1502620.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/WFinder.hh"
  5#include "Rivet/Projections/ZFinder.hh"
  6
  7namespace Rivet {
  8
  9  /// @brief inclusive W/Z cross sections at 7 TeV
 10  class ATLAS_2016_I1502620 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_I1502620);
 15    //@}
 16
 17
 18    /// @name Analysis methods
 19    //@{
 20
 21    /// Book histograms and initialise projections before the run
 22    void init() {
 23
 24      // Get options from the new option system
 25      // run everything
 26      _mode = 0;
 27      _runZ = true;
 28      _runW = true;
 29      if ( getOption("LMODE") == "EL" || 
 30           getOption("LMODE") == "ZEL" ||
 31           getOption("LMODE") == "WEL" ) 
 32        _mode = 1;
 33      if ( getOption("LMODE") == "MU" || 
 34           getOption("LMODE") == "ZMU" ||
 35           getOption("LMODE") == "WMU" ) 
 36        _mode = 2;
 37      if ( getOption("LMODE") == "Z" || 
 38           getOption("LMODE") == "ZEL" || 
 39           getOption("LMODE") == "ZMU" ) 
 40        _runW = false;
 41      if ( getOption("LMODE") == "W" || 
 42           getOption("LMODE") == "WEL" || 
 43           getOption("LMODE") == "WMU" ) 
 44        _runZ = false;
 45
 46
 47
 48
 49      ///Initialise and register projections here
 50      const FinalState fs;
 51
 52      Cut Wcuts = Cuts::pT >= 25*GeV; // minimum lepton pT
 53      Cut Zcuts = Cuts::pT >= 20.0*GeV;
 54
 55      WFinder wfinder_edressed(fs, Wcuts, PID::ELECTRON, 40*GeV, 13*TeV, 25*GeV, 0.1, 
 56				 WFinder::ChargedLeptons::PROMPT, WFinder::ClusterPhotons::NODECAY, WFinder::AddPhotons::NO, WFinder::MassWindow::MT);
 57      declare(wfinder_edressed, "WFinder_edressed");
 58
 59      ZFinder zfindere(fs, Zcuts, PID::ELECTRON, 46.0*GeV, 150*GeV, 0.1, 
 60                       ZFinder::ChargedLeptons::PROMPT, ZFinder::ClusterPhotons::NODECAY, ZFinder::AddPhotons::NO);
 61      declare(zfindere, "ZFindere");
 62
 63      WFinder wfinder_mdressed(fs, Wcuts, PID::MUON, 40*GeV, 13*TeV, 25*GeV, 0.1, 
 64				 WFinder::ChargedLeptons::PROMPT, WFinder::ClusterPhotons::NODECAY, WFinder::AddPhotons::NO, WFinder::MassWindow::MT);
 65      declare(wfinder_mdressed, "WFinder_mdressed");
 66
 67      ZFinder zfinderm(fs, Zcuts, PID::MUON, 46.0*GeV, 150*GeV, 0.1,
 68                       ZFinder::ChargedLeptons::PROMPT, ZFinder::ClusterPhotons::NODECAY, ZFinder::AddPhotons::NO);
 69      declare(zfinderm, "ZFinderm");
 70
 71
 72      /// Book histograms here      
 73      if (_runW) {
 74        book(_h_Wp_eta,  9, 1, 1);
 75        book(_h_Wm_eta, 10, 1, 1);
 76        book(_h_W_asym, 35, 1, 1);
 77      }
 78
 79      if (_runZ) {
 80        book(_h_Zcenlow_y_dressed,  11, 1, 1);
 81        book(_h_Zcenpeak_y_dressed, 12, 1, 1);
 82        book(_h_Zcenhigh_y_dressed, 13, 1, 1);
 83        book(_h_Zfwdpeak_y_dressed, 14, 1, 1);
 84        book(_h_Zfwdhigh_y_dressed, 15, 1, 1);
 85      }
 86    }
 87
 88    /// Perform the per-event analysis
 89    void analyze(const Event& event) {
 90      
 91      // W stuff 
 92      const WFinder& wfindere = apply<WFinder>(event, "WFinder_edressed");	     
 93      const WFinder& wfinderm = apply<WFinder>(event, "WFinder_mdressed");	     
 94      
 95      if (wfindere.bosons().size()+wfinderm.bosons().size() == 1 && _runW) {
 96
 97	Particle lep;
 98	if (_mode !=2 && wfindere.bosons().size() == 1 ) {
 99	  lep = wfindere.constituentLeptons()[0];
100	}
101	else if (_mode !=1 && wfinderm.bosons().size() == 1 ) {
102	  lep = wfinderm.constituentLeptons()[0];
103	}
104
105	if (lep.charge3() == 3) {
106	  _h_Wp_eta->fill(lep.abseta()); 
107	}
108	else if (lep.charge3() == -3) {
109	  _h_Wm_eta->fill(lep.abseta());
110	}
111      }
112
113      // now the Z stuff. 
114      const ZFinder& zfindere = apply<ZFinder>(event, "ZFindere");
115      const ZFinder& zfinderm = apply<ZFinder>(event, "ZFinderm");
116      
117
118      // must be one and only one candidate.
119      if (zfindere.bosons().size()+zfinderm.bosons().size() == 1 && _runZ) {
120
121	Particle Zboson;
122	Particles leptons;
123	
124	// candidate is e+e-
125	if (_mode != 2 && zfindere.bosons().size() == 1 ) {
126	  
127	  Zboson = zfindere.boson();
128	  leptons = zfindere.constituents();
129	}  
130
131	// candidate is mu+mu-
132        else if (_mode !=1 && zfinderm.bosons().size() == 1 ) {
133	  
134	  Zboson = zfinderm.boson();
135	  leptons = zfinderm.constituents();
136	  
137	}
138
139	if (leptons.size() > 1) {
140
141	  const double zrap  = Zboson.absrap();
142	  const double zmass = Zboson.mass();
143	  const double eta1 = leptons[0].abseta();
144	  const double eta2 = leptons[1].abseta();
145		
146	  // separation into central/forward and three mass bins
147	  if (eta1 < 2.5 && eta2 < 2.5) {
148	    if (zmass < 66.0*GeV)        _h_Zcenlow_y_dressed->fill(zrap);
149	    else if (zmass < 116.0*GeV)  _h_Zcenpeak_y_dressed->fill(zrap);
150	    else                         _h_Zcenhigh_y_dressed->fill(zrap);
151	  } 
152	  else if ((eta1 < 2.5 && 2.5 < eta2 && eta2 < 4.9) || (eta2 < 2.5 && 2.5 < eta1 && eta1 < 4.9)) {
153	    if (zmass > 66.0*GeV) {   
154	      if (zmass < 116.0*GeV)  _h_Zfwdpeak_y_dressed->fill(zrap);
155	      else                    _h_Zfwdhigh_y_dressed->fill(zrap);
156	    }
157	  }
158	}
159      }
160    }
161
162    /// Normalise histograms etc., after the run
163    void finalize() {
164
165      // Construct asymmetry: (dsig+/deta - dsig-/deta) / (dsig+/deta + dsig-/deta)
166      //divide(*_h_Wp_eta - *_h_Wm_eta, *_h_Wp_eta + *_h_Wm_eta, _h_W_asym);
167      if (_runW) {
168	for (size_t i = 0; i < _h_Wp_eta->numBins(); ++i) {
169	  YODA::HistoBin1D& bp = _h_Wp_eta->bin(i);
170	  YODA::HistoBin1D& bm = _h_Wm_eta->bin(i);
171	  const double sum  = bp.height() + bm.height();
172	  //const double xerr = 0.5 * bp.xWidth();
173	  double val = 0., yerr = 0.;
174
175	  if (sum) {
176	    const double pos2  = bp.height() * bp.height();
177	    const double min2  = bm.height() * bm.height();
178	    const double errp2 = bp.heightErr() * bp.heightErr();
179	    const double errm2 = bm.heightErr() * bm.heightErr();
180	    val = (bp.height() - bm.height()) / sum;
181	    yerr = 2. * sqrt(errm2 * pos2 + errp2 * min2) / (sum * sum);
182	  }
183	  _h_W_asym->addPoint(bp.midpoint(), val, 0.5*bp.xWidth(), yerr);
184	}
185      }
186
187      ///  Normalise, scale and otherwise manipulate histograms here
188      double lfac = 1.0;
189      // If we have been running on both electrons and muons, need to divide by two to
190      // get the xsec for one flavour
191      if (_mode == 0) lfac = 0.5;
192      const double sf = lfac * 0.5 * crossSection() /picobarn / sumOfWeights(); // 0.5 accounts for rapidity bin width
193
194      if (_runW){
195	scale(_h_Wp_eta, sf);
196	scale(_h_Wm_eta, sf);
197      }
198
199      if (_runZ){
200	scale(_h_Zcenlow_y_dressed, sf);
201	scale(_h_Zcenpeak_y_dressed, sf);
202	scale(_h_Zcenhigh_y_dressed, sf);
203	scale(_h_Zfwdpeak_y_dressed, sf);
204	scale(_h_Zfwdhigh_y_dressed, sf);
205      }
206    }
207
208    //@}
209
210
211  protected:
212    size_t _mode;
213    bool _runZ, _runW;
214
215  private:
216
217    /// @name Histograms
218    //@{
219    Histo1DPtr _h_Wp_eta, _h_Wm_eta;
220    Scatter2DPtr _h_W_asym;
221
222    Histo1DPtr _h_Zcenlow_y_dressed;
223    Histo1DPtr _h_Zcenpeak_y_dressed;
224    Histo1DPtr _h_Zcenhigh_y_dressed;
225    Histo1DPtr _h_Zfwdpeak_y_dressed;
226    Histo1DPtr _h_Zfwdhigh_y_dressed;
227    //@}
228
229  };
230
231  // The hook for the plugin system
232  RIVET_DECLARE_PLUGIN(ATLAS_2016_I1502620);
233
234
235}
236
237// END END END