rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

MC_WINC

Monte Carlo validation observables for inclusive $W[\ell \, \nu]$ production
Experiment: ()
Status: VALIDATED
Authors:
  • Frank Siegert
  • Christian Gutschow
No references listed
Beams: * *
Beam energies: ANY
Run details:
  • $\ell \, \nu$ + jets analysis.

Monte Carlo validation observables for inclusive $W[\ell \, \nu]$ production. 60 GeV $<m_W<$ 100 GeV cut applied.

Source code: MC_WINC.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/PromptFinalState.hh"
  4#include "Rivet/Projections/LeptonFinder.hh"
  5#include "Rivet/Projections/MissingMomentum.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// @brief MC validation analysis for inclusive W events
 11  class MC_WINC : public Analysis {
 12  public:
 13
 14    /// Default constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(MC_WINC);
 16
 17
 18    /// @name Analysis methods
 19    /// @{
 20
 21    /// Book histograms
 22    void init() {
 23
 24      // Use analysis options
 25      _dR = (getOption("SCHEME") == "BARE") ? 0.0 : 0.2;
 26      _lepton = (getOption("LMODE") == "MU") ? PID::MUON : PID::ELECTRON;
 27      const double ETACUT = getOption<double>("ABSETALMAX", 3.5);
 28      const double PTCUT = getOption<double>("PTLMIN", 25.);
 29      const Cut cut = Cuts::abseta < ETACUT && Cuts::pT > PTCUT*GeV;
 30
 31      // Define projections
 32      declare("MET", MissingMomentum());
 33      LeptonFinder lf(_dR, cut && Cuts::abspid == _lepton);
 34      declare(lf, "Leptons");
 35
 36      double sqrts = sqrtS() > 0.0 ? sqrtS() : 14000.;
 37      book(_h_W_mass ,"W_mass", 50, 55.0, 105.0);
 38      book(_h_W_mT ,"W_mT", 40, 60.0, 100.0);
 39      book(_h_W_pT ,"W_pT", logspace(100, 1.0, 0.5*sqrts));
 40      book(_h_W_pT_peak ,"W_pT_peak", 25, 0.0, 125.0);
 41      book(_h_W_y ,"W_y", 40, -4.0, 4.0);
 42      book(_h_W_phi ,"W_phi", 25, 0.0, TWOPI);
 43      book(_h_Wplus_pT ,"Wplus_pT", logspace(25, 10.0, 0.5*sqrts));
 44      book(_h_Wminus_pT ,"Wminus_pT", logspace(25, 10.0, 0.5*sqrts));
 45      book(_h_lepton_pT ,"lepton_pT", logspace(100, 10.0, 0.25*sqrts));
 46      book(_h_lepton_eta ,"lepton_eta", 40, -4.0, 4.0);
 47      book(_htmp_dsigminus_deta ,"lepton_dsigminus_deta", 20, 0.0, 4.0);
 48      book(_htmp_dsigplus_deta  ,"lepton_dsigplus_deta", 20, 0.0, 4.0);
 49
 50      book(_h_asym, "W_chargeasymm_eta");
 51      book(_h_asym_pT, "W_chargeasymm_pT");
 52    }
 53
 54
 55
 56    /// Do the analysis
 57    void analyze(const Event & event) {
 58
 59      // MET cut
 60      const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
 61      if (pmiss.pT() < 25*GeV) vetoEvent;
 62
 63      // Identify the closest-matching l+MET to m == mW
 64      const Particles& ls = apply<LeptonFinder>(event, "Leptons").particles();
 65      const int ifound = closestMatchIndex(ls, pmiss, Kin::mass, 80.4*GeV, 60*GeV, 100*GeV);
 66      if (ifound < 0) vetoEvent;
 67      const Particle& l = ls[ifound];
 68
 69      double charge3_x_eta = 0;
 70      int charge3 = 0;
 71      FourMomentum wmom = l.mom() + pmiss;
 72      _h_W_mass->fill(wmom.mass()/GeV);
 73      _h_W_mT->fill(mT(l, pmiss)/GeV);
 74      _h_W_pT->fill(wmom.pT()/GeV);
 75      _h_W_pT_peak->fill(wmom.pT()/GeV);
 76      _h_W_y->fill(wmom.rapidity());
 77      _h_W_phi->fill(wmom.phi());
 78      _h_lepton_pT->fill(l.pT()/GeV);
 79      _h_lepton_eta->fill(l.eta());
 80      FourMomentum emom;
 81      if (l.charge3() != 0) {
 82        emom = l.momentum();
 83        charge3_x_eta = l.charge3() * emom.eta();
 84        charge3 = l.charge3();
 85      }
 86      assert(charge3_x_eta != 0);
 87      assert(charge3!=0);
 88      if (emom.Et() > 30/GeV) {
 89        if (charge3_x_eta < 0) {
 90          _htmp_dsigminus_deta->fill(emom.eta());
 91        } else {
 92          _htmp_dsigplus_deta->fill(emom.eta());
 93        }
 94      }
 95      if (charge3 < 0) {
 96        _h_Wminus_pT->fill(wmom.pT()/GeV);
 97      } else {
 98        _h_Wplus_pT->fill(wmom.pT()/GeV);
 99      }
100    }
101
102
103    /// Finalize
104    void finalize() {
105      scale(_h_W_mass, crossSection()/picobarn/sumOfWeights());
106      scale(_h_W_mT, crossSection()/picobarn/sumOfWeights());
107      scale(_h_W_pT, crossSection()/picobarn/sumOfWeights());
108      scale(_h_W_pT_peak, crossSection()/picobarn/sumOfWeights());
109      scale(_h_W_y, crossSection()/picobarn/sumOfWeights());
110      scale(_h_W_phi, crossSection()/picobarn/sumOfWeights());
111      scale(_h_lepton_pT, crossSection()/picobarn/sumOfWeights());
112      scale(_h_lepton_eta, crossSection()/picobarn/sumOfWeights());
113
114      // Construct asymmetry: (dsig+/deta - dsig-/deta) / (dsig+/deta + dsig-/deta) for each Et region
115      divide(*_htmp_dsigplus_deta - *_htmp_dsigminus_deta,
116             *_htmp_dsigplus_deta + *_htmp_dsigminus_deta,
117             _h_asym);
118
119      // // W charge asymmetry vs. pTW: dsig+/dpT / dsig-/dpT
120      divide(_h_Wplus_pT, _h_Wminus_pT,
121             _h_asym_pT);
122
123      scale(_h_Wplus_pT, crossSection()/picobarn/picobarn/sumOfWeights());
124      scale(_h_Wminus_pT, crossSection()/picobarn/picobarn/sumOfWeights());
125    }
126
127    /// @}
128
129
130  protected:
131
132    /// @name Parameters for specialised e/mu and dressed/bare subclassing
133    /// @{
134    double _dR;
135    PdgId _lepton;
136    /// @}
137
138
139  private:
140
141    /// @name Histograms
142    /// @{
143    Histo1DPtr _h_W_mass;
144    Histo1DPtr _h_W_mT;
145    Histo1DPtr _h_W_pT;
146    Histo1DPtr _h_W_pT_peak;
147    Histo1DPtr _h_W_y;
148    Histo1DPtr _h_W_phi;
149    Histo1DPtr _h_Wplus_pT;
150    Histo1DPtr _h_Wminus_pT;
151    Histo1DPtr _h_lepton_pT;
152    Histo1DPtr _h_lepton_eta;
153
154    Histo1DPtr _htmp_dsigminus_deta;
155    Histo1DPtr _htmp_dsigplus_deta;
156
157    Estimate1DPtr _h_asym;
158    Estimate1DPtr _h_asym_pT;
159    /// @}
160
161  };
162
163
164  RIVET_DECLARE_PLUGIN(MC_WINC);
165
166}