rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2013_I1217863

W/Z + gamma production at 7 TeV
Experiment: ATLAS (LHC)
Inspire ID: 1217863
Status: VALIDATED
Authors:
  • Chritian Gutschow
References: Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • W/Z+gamma in the electron channel

Measurements of the differential fiducial cross sections for the production of a W or Z boson in association with a high-energy photon are measured using pp collisions at $\sqrt{s}=7 \text{TeV}$. The analysis uses a data sample with an integrated luminosity of 4.6/fb collected by the ATLAS detector during the 2011 LHC data-taking period. Events are selected using leptonic decays of the W or Z bosons with the requirement of an associated isolated photon. The default routine will consider the electron decay channel of the Z boson. Use LMODE to specify the decay channel directly.

Source code: ATLAS_2013_I1217863.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/PromptFinalState.hh"
  5#include "Rivet/Projections/MissingMomentum.hh"
  6#include "Rivet/Projections/LeptonFinder.hh"
  7#include "Rivet/Projections/DileptonFinder.hh"
  8#include "Rivet/Projections/VetoedFinalState.hh"
  9#include "Rivet/Projections/LeadingParticlesFinalState.hh"
 10#include "Rivet/Projections/FastJets.hh"
 11
 12namespace Rivet {
 13
 14
 15  /// Electroweak Wjj production at 8 TeV
 16  class ATLAS_2013_I1217863 : public Analysis {
 17  public:
 18
 19    /// Constructor
 20    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2013_I1217863);
 21
 22
 23    /// @name Analysis methods
 24    /// @{
 25
 26    /// Book histograms and initialise projections before the run
 27    void init() {
 28
 29      // Get modes from the option system
 30      _mode = 2;
 31      _doZ  = true;
 32      _doW  = true;
 33      if ( getOption("LMODE") == "EL" ) { _mode = 2;}
 34      if ( getOption("LMODE") == "MU" ) _mode = 3;
 35      if ( getOption("LMODE") == "ZEL" ) {
 36        _mode = 2;
 37        _doW  = false;
 38      }
 39      if ( getOption("LMODE") == "ZMU" ) {
 40        _mode = 3;
 41        _doW  = false;
 42      }
 43      if ( getOption("LMODE") == "WEL" ) {
 44        _mode = 2;
 45        _doZ  = false;
 46      }
 47      if ( getOption("LMODE") == "WMU" ) {
 48        _mode = 3;
 49        _doZ  = false;
 50      }
 51
 52      Cut cuts = Cuts::abseta < 2.47 && Cuts::pT > 25*GeV;
 53      VetoedFinalState jet_fs;
 54
 55      // Z finder
 56      if (_doZ) {
 57        DileptonFinder zf(91.2*GeV, 0.1, cuts && Cuts::abspid == (_mode == 3 ? PID::MUON : PID::ELECTRON), Cuts::massIn(40.0*GeV, 1000.0*GeV));
 58        declare(zf, "ZF");
 59        jet_fs.addVetoOnThisFinalState(zf);
 60      }
 61
 62      if (_doW) {
 63        // W finder
 64        declare("MET", MissingMomentum());
 65        LeptonFinder lf(0.1, cuts && Cuts::abspid == (_mode==3? PID::MUON : PID::ELECTRON));
 66        declare(lf, "Leptons");
 67        jet_fs.addVetoOnThisFinalState(lf);
 68      }
 69
 70      // Leading photon
 71      LeadingParticlesFinalState photonfs(FinalState(Cuts::abseta < 2.37 && Cuts::pT > 15*GeV));
 72      photonfs.addParticleId(PID::PHOTON);
 73      declare(photonfs, "LeadingPhoton");
 74      jet_fs.addVetoOnThisFinalState(photonfs);
 75
 76      // Jets
 77      FastJets jets(jet_fs, JetAlg::ANTIKT, 0.4, JetMuons::ALL, JetInvisibles::NONE);
 78      declare(jets, "Jets");
 79
 80      // FS excluding only the leading photon
 81      VetoedFinalState vfs;
 82      vfs.addVetoOnThisFinalState(photonfs);
 83      declare(vfs, "isolatedFS");
 84
 85
 86      // Book histograms
 87      if (_doZ) {
 88        book(_hist_EgammaT_inclZ   ,11, 1, _mode); // dSigma / dE^gamma_T for Njet >= 0
 89        book(_hist_EgammaT_exclZ   ,12, 1, _mode); // dSigma / dE^gamma_T for Njet = 0
 90        book(_hist_Njet_EgammaT15Z ,17, 1, _mode); // dSigma / dNjet for E^gamma_T >= 15
 91        book(_hist_Njet_EgammaT60Z ,18, 1, _mode); // dSigma / dNjet for E^gamma_T >= 60
 92        book(_hist_mZgamma         ,20, 1, _mode); // dSigma / dm^{Zgamma}
 93      }
 94      if (_doW){
 95        book(_hist_EgammaT_inclW   , 7, 1, _mode); // dSigma / dE^gamma_T for Njet >= 0
 96        book(_hist_EgammaT_exclW   , 8, 1, _mode); // dSigma / dE^gamma_T for Njet = 0
 97        book(_hist_Njet_EgammaT15W ,15, 1, _mode); // dSigma / dNjet for E^gamma_T >= 15
 98        book(_hist_Njet_EgammaT60W ,16, 1, _mode); // dSigma / dNjet for E^gamma_T >= 60
 99        book(_hist_mWgammaT        ,19, 1, _mode); // dSigma / dm^{Zgamma}
100      }
101    }
102
103
104    /// Perform the per-event analysis
105    void analyze(const Event& event) {
106
107      // Retrieve leading photon
108      Particles photons = apply<LeadingParticlesFinalState>(event, "LeadingPhoton").particles();
109      if (photons.size() != 1)  vetoEvent;
110      const Particle& leadingPhoton = photons[0];
111      if (leadingPhoton.Et() < 15.0*GeV) vetoEvent;
112      if (leadingPhoton.abseta() > 2.37) vetoEvent;
113
114      // Check photon isolation
115      double coneEnergy(0.0);
116      Particles fs = apply<VetoedFinalState>(event, "isolatedFS").particles();
117      for (const Particle& p : fs) {
118        if ( deltaR(leadingPhoton, p) < 0.4 )  coneEnergy += p.E();
119      }
120      if (coneEnergy / leadingPhoton.E() >= 0.5 )  vetoEvent;
121
122      if (_doW) {
123	// Retrieve W boson candidate
124	const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
125	if (pmiss.pT() > 35*GeV) {
126
127	  const Particles& ls = apply<LeptonFinder>(event, "Leptons").particles();
128	  const int ifound = closestMatchIndex(ls, pmiss, Kin::mass, 80.4*GeV);
129	  if (ifound >= 0) {
130
131	    // Retrieve constituent lepton
132	    const Particle& lepton = ls[ifound];
133	    if ( lepton.pT() > 25.0*GeV && lepton.abseta() < 2.47 ) { //< redundant cut
134
135	      // Check photon-lepton overlap
136	      if ( deltaR(leadingPhoton, lepton) > 0.7 ) {
137
138		// Count jets
139		const FastJets& jetfs = apply<FastJets>(event, "Jets");
140		Jets jets = jetfs.jets(cmpMomByEt);
141		int goodJets = 0;
142		for (const Jet& j : jets) {
143		  if ( !(j.Et() > 30.0*GeV) )  break;
144		  if ( (j.abseta() < 4.4) &&				\
145		       (deltaR(leadingPhoton, j) > 0.3) &&		\
146		       (deltaR(lepton,        j) > 0.3) )  ++goodJets;
147		}
148
149		double Njets = double(goodJets) + 0.5;
150		double photonEt = leadingPhoton.Et()*GeV;
151
152		const FourMomentum& lep_gamma = lepton.momentum() + leadingPhoton.momentum();
153		double term1 = sqrt(lep_gamma.mass2() + lep_gamma.pT2()) + pmiss.Et();
154		double term2 = (lep_gamma + pmiss).pT2();
155		double mWgammaT = sqrt(term1 * term1 - term2) * GeV;
156
157		_hist_EgammaT_inclW->fill(photonEt);
158
159		_hist_Njet_EgammaT15W->fill(Njets);
160
161		if ( !goodJets )  _hist_EgammaT_exclW->fill(photonEt);
162
163		if (photonEt > 40.0*GeV) {
164		  _hist_mWgammaT->fill(mWgammaT);
165		  if (photonEt > 60.0*GeV)  _hist_Njet_EgammaT60W->fill(Njets);
166		}
167	      }
168	    }
169	  }
170	}
171      }
172
173      if (_doZ ){
174
175	// Retrieve Z boson candidate
176	const DileptonFinder& zf = apply<DileptonFinder>(event, "ZF");
177	if ( zf.bosons().size() == 1 ) {
178	  const Particle& Zboson  = zf.boson();
179	  if ( (Zboson.mass() > 40.0*GeV) ) {
180
181	    // Check charge of constituent leptons
182	    const Particles& leptons = zf.constituents();
183	    if (leptons.size() == 2 && leptons[0].charge() * leptons[1].charge() < 0.) {
184
185	      bool lpass = true;
186	      // Check photon-lepton overlap
187	      for (const Particle& p : leptons) {
188		if ( !(p.pT() > 25.0*GeV && p.abseta() < 2.47 && deltaR(leadingPhoton, p) > 0.7) )  lpass = false;
189	      }
190	      if ( lpass ) {
191
192		// Count jets
193		const FastJets& jetfs = apply<FastJets>(event, "Jets");
194		Jets jets = jetfs.jets(cmpMomByEt);
195		int goodJets = 0;
196		for (const Jet& j : jets) {
197		  if ( !(j.Et() > 30.0*GeV) )  break;
198		  if ( (j.abseta() < 4.4) &&		    \
199		       (deltaR(leadingPhoton, j) > 0.3) &&  \
200		       (deltaR(leptons[0],    j) > 0.3) &&		\
201		       (deltaR(leptons[1],    j) > 0.3) )  ++goodJets;
202		}
203
204		double Njets = double(goodJets) + 0.5;
205		double photonEt = leadingPhoton.Et()*GeV;
206		double mZgamma = (Zboson.momentum() + leadingPhoton.momentum()).mass() * GeV;
207
208		_hist_EgammaT_inclZ->fill(photonEt);
209
210		_hist_Njet_EgammaT15Z->fill(Njets);
211
212		if ( !goodJets )   _hist_EgammaT_exclZ->fill(photonEt);
213
214		if (photonEt >= 40.0*GeV) {
215		  _hist_mZgamma->fill(mZgamma);
216		  if (photonEt >= 60.0*GeV)  _hist_Njet_EgammaT60Z->fill(Njets);
217		}
218	      }
219	    }
220	  }
221	}
222      }
223
224    }
225
226
227    /// Normalise histograms etc., after the run
228    void finalize() {
229
230      const double xs_fb = crossSection()/femtobarn;
231      const double sumw = sumOfWeights();
232      const double sf = xs_fb / sumw;
233
234      if (_doZ) {
235	scale(_hist_EgammaT_exclZ, sf);
236	scale(_hist_EgammaT_inclZ, sf);
237	normalize(_hist_Njet_EgammaT15Z);
238	normalize(_hist_Njet_EgammaT60Z);
239	normalize(_hist_mZgamma);
240      }
241
242      if (_doW) {
243	scale(_hist_EgammaT_exclW, sf);
244	scale(_hist_EgammaT_inclW, sf);
245	normalize(_hist_Njet_EgammaT15W);
246	normalize(_hist_Njet_EgammaT60W);
247	normalize(_hist_mWgammaT);
248      }
249
250    }
251
252    /// @}
253
254  protected:
255
256    size_t _mode;
257    bool _doW;
258    bool _doZ;
259
260  private:
261
262    /// @name Histograms
263    /// @{
264    Histo1DPtr _hist_EgammaT_inclZ;
265    Histo1DPtr _hist_EgammaT_exclZ;
266    Histo1DPtr _hist_Njet_EgammaT15Z;
267    Histo1DPtr _hist_Njet_EgammaT60Z;
268    Histo1DPtr _hist_mZgamma;
269    //
270    Histo1DPtr _hist_EgammaT_inclW;
271    Histo1DPtr _hist_EgammaT_exclW;
272    Histo1DPtr _hist_Njet_EgammaT15W;
273    Histo1DPtr _hist_Njet_EgammaT60W;
274    Histo1DPtr _hist_mWgammaT;
275    /// @}
276
277  };
278
279
280  RIVET_DECLARE_PLUGIN(ATLAS_2013_I1217863);
281
282}