Rivet analyses


title: D0_2001_I559624

Tevatron Run I differential W/Z boson cross-section analysis

Experiment: D0 (Tevatron Run 1)

Inspire ID: 559624

Status: VALIDATED

Authors: - Lars Sonnenschein

References: - Phys.Lett.B517:299-308,2001 - DOI: 10.1016/S0370-2693(01)01020-6 - arXiv: hep-ex/0107012

Beams: p- p+

Beam energies: (900.0, 900.0)GeV

Run details: - $W/Z$ events with decays to first generation leptons, in $p\bar{p}$ collisions at $\sqrt{s} = 1800~\GeV$

Measurement of differential W/Z boson cross section and ratio in $p \bar{p}$ collisions at center-of-mass energy $\sqrt{s} = 1.8~\TeV$. The data cover electrons and neutrinos in a pseudorapidity range of -2.5 to 2.5.

Source code:D0_2001_I559624.cc

```c++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/LeadingParticlesFinalState.hh"

include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {

/// @brief D0 Run I differential W/Z boson cross-section analysis /// /// @author Lars Sonnenschein /// @author Andy Buckley class D0_2001_I559624 : public Analysis { public:

RIVET_DEFAULT_ANALYSIS_CTOR(D0_2001_I559624);


/// @name Analysis methods
/// @{

void init() {
  // Final state projection
  FinalState fs((Cuts::etaIn(-5.0, 5.0))); // corrected for detector acceptance
  declare(fs, "FS");

  // Z -> e- e+
  LeadingParticlesFinalState eeFS(FinalState((Cuts::etaIn(-5.0, 5.0)))); //20.);
  eeFS.addParticleIdPair(PID::ELECTRON);
  declare(eeFS, "eeFS");

  // W- -> e- nu_e~
  LeadingParticlesFinalState enuFS(FinalState((Cuts::etaIn(-5.0, 5.0)))); //25.);
  enuFS.addParticleId(PID::ELECTRON).addParticleId(PID::NU_EBAR);
  declare(enuFS, "enuFS");

  // W+ -> e+ nu_e
  LeadingParticlesFinalState enubFS(FinalState((Cuts::etaIn(-5.0, 5.0)))); //25.);
  enubFS.addParticleId(PID::POSITRON).addParticleId(PID::NU_E);
  declare(enubFS, "enubFS");

  // Remove neutrinos for isolation of final state particles
  VetoedFinalState vfs(fs);
  vfs.vetoNeutrinos();
  declare(vfs, "VFS");

  // Counters
  book(_eventsFilledW, "eventsFilledW");
  book(_eventsFilledZ, "eventsFilledZ");

  // Histograms
  book(_h_dsigdpt_w, 1, 1, 1);
  book(_h_dsigdpt_z, 1, 1, 2);
  book(_h_dsigdpt_scaled_z, 2, 1, 1);
}


void analyze(const Event& event) {
  const LeadingParticlesFinalState& eeFS = apply<LeadingParticlesFinalState>(event, "eeFS");
  // Z boson analysis
  if (eeFS.particles().size() >= 2) {
    // If there is a Z candidate:
    // Fill Z pT distributions
    double deltaM2 = 1e30, mass2(0.);
    double pT = -1.;
    const Particles& Zdaughters = eeFS.particles();
    for (size_t ix = 0; ix < Zdaughters.size(); ++ix) {
      for (size_t iy = ix + 1; iy < Zdaughters.size(); ++iy) {
        if (Zdaughters[ix].pid() != -Zdaughters[iy].pid()) continue;
        const FourMomentum pmom = Zdaughters[ix].momentum() + Zdaughters[iy].momentum();
        double mz2 = pmom.mass2();
        double dm2 = fabs(mz2 - sqr(91.118 * GeV));
        if (dm2 < deltaM2) {
          pT = pmom.pT();
          deltaM2 = dm2;
          mass2 = mz2;
        }
      }
    }
    if (pT > 0. && mass2 > 0. && inRange(sqrt(mass2) / GeV, 75.0, 105.0)) {
      _eventsFilledZ->fill();
      MSG_DEBUG("Z pmom.pT() = " << pT / GeV << " GeV");
      _h_dsigdpt_z->fill(pT / GeV);
      // return if found a Z
      return;
    }
  }
  // There is no Z -> ee candidate... so this might be a W event
  const LeadingParticlesFinalState& enuFS = apply<LeadingParticlesFinalState>(event, "enuFS");
  const LeadingParticlesFinalState& enubFS = apply<LeadingParticlesFinalState>(event, "enubFS");

  double deltaM2 = 1e30;
  double pT = -1.;
  for (size_t iw = 0; iw < 2; ++iw) {
    Particles Wdaughters;
    Wdaughters = (iw == 0) ? enuFS.particles() : enubFS.particles();
    for (size_t ix = 0; ix < Wdaughters.size(); ++ix) {
      for (size_t iy = ix + 1; iy < Wdaughters.size(); ++iy) {
        if (Wdaughters[ix].pid() == Wdaughters[iy].pid()) continue;
        const FourMomentum pmom = Wdaughters[0].momentum() + Wdaughters[1].momentum();
        double dm2 = abs(pmom.mass2() - sqr(80.4 * GeV));
        if (dm2 < deltaM2) {
          pT = pmom.pT();
          deltaM2 = dm2;
        }
      }
    }
  }
  if (pT > 0.) {
    _eventsFilledW->fill();
    _h_dsigdpt_w->fill(pT / GeV);
  }
}


void finalize() {
  // Get cross-section per event (i.e. per unit weight) from generator
  const double xSecPerEvent = crossSectionPerEvent() / picobarn;

  // Correct W pT distribution to W cross-section
  const double xSecW = xSecPerEvent * dbl(*_eventsFilledW);

  // Correct Z pT distribution to Z cross-section
  const double xSecZ = xSecPerEvent * dbl(*_eventsFilledZ);

  // Get W and Z pT integrals
  const double wpt_integral = _h_dsigdpt_w->integral();
  const double zpt_integral = _h_dsigdpt_z->integral();

  // Divide and scale ratio histos
  if (xSecW == 0 || wpt_integral == 0 || xSecZ == 0 || zpt_integral == 0) {
    MSG_WARNING("Not filling ratio plot because input histos are empty");
  }
  else {
    // Scale factor converts event counts to cross-sections, and inverts the
    // branching ratios since only one decay channel has been analysed for each boson.
    // Oh, and we put MW/MZ in, like they do in the paper.
    const double MW_MZ = 0.8820;                   // Ratio M_W/M_Z
    const double BRZEE_BRWENU = 0.033632 / 0.1073; // Ratio of branching fractions
    const double scalefactor = (xSecW / wpt_integral) / (xSecZ / zpt_integral) * MW_MZ * BRZEE_BRWENU;
    for (size_t ibin = 1; ibin < _h_dsigdpt_w->numBins() + 1; ibin++) {
      double yval(0), yerr(0);
      if (_h_dsigdpt_w->bin(ibin).sumW() != 0 && _h_dsigdpt_z->bin(ibin).sumW() != 0) {
        yval = scalefactor * _h_dsigdpt_w->bin(ibin).sumW() / _h_dsigdpt_z->bin(ibin).sumW();
        yerr = yval * sqrt(sqr(_h_dsigdpt_w->bin(ibin).relErrW()) + sqr(_h_dsigdpt_z->bin(ibin).errW()));
      }
      _h_dsigdpt_scaled_z->bin(ibin).set(yval, yerr);
    }
  }

  // Normalize non-ratio histos
  normalize(_h_dsigdpt_w, xSecW);
  normalize(_h_dsigdpt_z, xSecZ);
}

/// @}

private:

/// @name Event counters for cross section normalizations
/// @{
CounterPtr _eventsFilledW;
CounterPtr _eventsFilledZ;
/// @}

/// @{
/// Histograms
Histo1DPtr _h_dsigdpt_w;
Histo1DPtr _h_dsigdpt_z;
Estimate1DPtr _h_dsigdpt_scaled_z;
/// @}

};

RIVET_DECLARE_ALIASED_PLUGIN(D0_2001_I559624, D0_2001_S4674421);

} ```

Aliases: - D0_2001_S4674421