rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

D0_2008_S7837160

Measurement of W charge asymmetry from D0 Run II
Experiment: D0 (Tevatron Run 2)
Inspire ID: 791230
Status: VALIDATED
Authors:
  • Andy Buckley
  • Gavin Hesketh
References: Beams: p- p+
Beam energies: (980.0, 980.0) GeV
Run details:
  • Event type: W production with decay to $e \, \nu_e$ only * for Pythia 6: MSEL = 12, MDME(206,1) = 1 * Energy: 1.96 TeV

Measurement of the electron charge asymmetry in $p \bar p \to W + X \to e \nu_e + X$ events at a center of mass energy of 1.96 TeV. The asymmetry is measured as a function of the electron transverse momentum and pseudorapidity in the interval (-3.2, 3.2). This data is sensitive to proton parton distribution functions due to the valence asymmetry in the incoming quarks which produce the W. Initial state radiation should also affect the pT distribution.

Source code: D0_2008_S7837160.cc
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/WFinder.hh"
#include "Rivet/Projections/LeadingParticlesFinalState.hh"
#include "Rivet/Projections/IdentifiedFinalState.hh"

namespace Rivet {


  /// @brief D0 Run II measurement of W charge asymmetry
  /// @author Andy Buckley
  /// @author Gavin Hesketh
  class D0_2008_S7837160 : public Analysis {
  public:

    /// Default constructor.
    D0_2008_S7837160()
      : Analysis("D0_2008_S7837160")
    {    }


    /// @name Analysis methods
    //@{

    // Book histograms and set up projections
    void init() {
      // Projections
      FinalState fs;
      /// @todo Use separate pT and ETmiss cuts in WFinder
      const WFinder wfe(fs, Cuts::abseta < 5 && Cuts::pT > 25*GeV, PID::ELECTRON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
      declare(wfe, "WFe");

      // Histograms (temporary +- charge histos and scatters to store the calculated asymmetries)
      for (size_t pmindex = 0; pmindex < 2; ++pmindex) {
        const string suffix = (pmindex == 0) ? "plus" : "minus";
        _hs_dsigpm_deta_25_35[pmindex] = bookHisto1D("TMP/dsigpm_deta_25_35_" + suffix, refData(1, 1, 1));
        _hs_dsigpm_deta_35[pmindex] = bookHisto1D("TMP/dsigpm_deta_35_" + suffix, refData(1, 1, 2));
        _hs_dsigpm_deta_25[pmindex] = bookHisto1D("TMP/dsigpm_deta_25_" + suffix, refData(1, 1, 3));
      }
      _h_asym1 = bookScatter2D(1, 1, 1);
      _h_asym2 = bookScatter2D(1, 1, 2);
      _h_asym3 = bookScatter2D(1, 1, 3);
    }


    /// Do the analysis
    void analyze(const Event & event) {
      const WFinder& wf = apply<WFinder>(event, "WFe");
      if (wf.bosons().size() == 0) {
        MSG_DEBUG("No W candidates found: vetoing");
        vetoEvent;
      }

      // Get the e+- momentum, and an effective charge including the eta sign
      /// @todo Is it correct to multiply the eta sign into the charge to "fold" the plot?
      const FourMomentum p_e = wf.constituentLeptons()[0].momentum();
      const int chg_e = sign(p_e.eta()) * sign(charge(wf.constituentLeptons()[0]));
      assert(chg_e == 1 || chg_e == -1);
      MSG_TRACE("Charged lepton sign = " << chg_e);

      // Fill histos with appropriate +- indexing
      const double weight = event.weight();
      const size_t pmindex = (chg_e > 0) ? 0 : 1;
      if (p_e.Et() < 35*GeV) _hs_dsigpm_deta_25_35[pmindex]->fill(fabs(p_e.eta()), weight);
      else _hs_dsigpm_deta_35[pmindex]->fill(fabs(p_e.eta()), weight);
      _hs_dsigpm_deta_25[pmindex]->fill(fabs(p_e.eta()), weight);
    }


    /// @name Helper functions for constructing asymmetry histograms in finalize()
    //@{
    void calc_asymm(const Histo1DPtr plus, const Histo1DPtr minus, Scatter2DPtr target) {
      divide(*plus - *minus, *plus + *minus, target);
    }
    void calc_asymm(const Histo1DPtr histos[2], Scatter2DPtr target) {
      calc_asymm(histos[0], histos[1], target);
    }
    //@}


    /// @brief Finalize
    ///
    /// Construct asymmetry: (dsig+/deta - dsig-/deta) / (dsig+/deta + dsig-/deta) for each ET region
    void finalize() {
      calc_asymm(_hs_dsigpm_deta_25_35, _h_asym1);
      calc_asymm(_hs_dsigpm_deta_35, _h_asym2);
      calc_asymm(_hs_dsigpm_deta_25, _h_asym3);
      _h_asym1->scale(1.,100.);
      _h_asym2->scale(1.,100.);
      _h_asym3->scale(1.,100.);
    }

    //@}


  private:

    /// @name Histograms
    //@{
    Histo1DPtr _hs_dsigpm_deta_25_35[2], _hs_dsigpm_deta_35[2], _hs_dsigpm_deta_25[2];
    Scatter2DPtr _h_asym1, _h_asym2, _h_asym3;
    //@}

  };



  // The hook for the plugin system
  DECLARE_RIVET_PLUGIN(D0_2008_S7837160);

}