rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CDF_2010_S8591881_DY

CDF Run 2 underlying event in Drell-Yan
Experiment: CDF (Tevatron Run 2)
Inspire ID: 849042
Status: VALIDATED
Authors:
  • Hendrik Hoeth
References:
  • Phys.Rev.D82:034001,2010
Beams: p- p+
Beam energies: (980.0, 980.0) GeV
Run details:
  • ppbar collisions at 1960 GeV. * Drell-Yan events with $Z/\gamma* -> e e$ and $Z/\gamma* -> \mu\mu$. * A mass cut $m_{ll} > 70 \text{GeV}$ can be applied on generator level. * Particles with $c \tau > 10 \text{mm}$ should be set stable.

Deepak Kar and Rick Field's measurement of the underlying event in Drell-Yan events. $Z -> ee$ and $Z -> \mu\mu$ events are selected using a $Z$ mass window cut between 70 and 110 GeV. ``Toward'', ``away'' and ``transverse'' regions are defined in the same way as in the original (2001) CDF underlying event analysis. The reconstructed $Z$ defines the $\phi$ direction of the toward region. The leptons are ignored after the $Z$ has been reconstructed. Thus the region most sensitive to the underlying event is the toward region (the recoil jet is boosted into the away region).

Source code: CDF_2010_S8591881_DY.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/ChargedFinalState.hh"
  4#include "Rivet/Projections/ChargedLeptons.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief CDF Run II underlying event in Drell-Yan
 10  ///
 11  /// @author Hendrik Hoeth
 12  ///
 13  /// Measurement of the underlying event in Drell-Yan
 14  /// \f$ Z/\gamma^* \to e^+ e^- \f$ and
 15  /// \f$ Z/\gamma^* \to \mu^+ \mu^- \f$ events. The reconstructed
 16  /// Z defines the \f$ \phi \f$ orientation. A Z mass window cut is applied.
 17  ///
 18  /// @par Run conditions
 19  ///
 20  /// @arg \f$ \sqrt{s} = \f$ 1960 GeV
 21  /// @arg produce Drell-Yan events
 22  /// @arg Set particles with c*tau > 10 mm stable
 23  /// @arg Z decay mode: Z -> e+e- and Z -> mu+mu-
 24  /// @arg gamma decay mode: gamma -> e+e- and gamma -> mu+mu-
 25  /// @arg minimum invariant mass of the fermion pair coming from the Z/gamma: 70 GeV
 26  class CDF_2010_S8591881_DY : public Analysis {
 27  public:
 28
 29    RIVET_DEFAULT_ANALYSIS_CTOR(CDF_2010_S8591881_DY);
 30
 31
 32    /// @name Analysis methods
 33    //@{
 34
 35    void init() {
 36      // Set up projections
 37      const ChargedFinalState cfs(Cuts::abseta < 1.0 && Cuts::pT >= 0.5*GeV);
 38      const ChargedFinalState clfs(Cuts::abseta < 1.0 && Cuts::pT >= 20*GeV);
 39      declare(cfs, "FS");
 40      declare(ChargedLeptons(clfs), "CL");
 41
 42      // Book histograms
 43      book(_hist_tnchg      , 1, 1, 1);
 44      book(_hist_pnchg      , 1, 1, 2);
 45      book(_hist_anchg      , 1, 1, 3);
 46      book(_hist_pmaxnchg   , 2, 1, 1);
 47      book(_hist_pminnchg   , 2, 1, 2);
 48      book(_hist_pdifnchg   , 2, 1, 3);
 49      book(_hist_tcptsum    , 3, 1, 1);
 50      book(_hist_pcptsum    , 3, 1, 2);
 51      book(_hist_acptsum    , 3, 1, 3);
 52      book(_hist_pmaxcptsum , 4, 1, 1);
 53      book(_hist_pmincptsum , 4, 1, 2);
 54      book(_hist_pdifcptsum , 4, 1, 3);
 55      book(_hist_tcptave    , 5, 1, 1);
 56      book(_hist_pcptave    , 5, 1, 2);
 57      book(_hist_tcptmax    , 6, 1, 1);
 58      book(_hist_pcptmax    , 6, 1, 2);
 59      book(_hist_zptvsnchg  , 7, 1, 1);
 60      book(_hist_cptavevsnchg , 8, 1, 1);
 61      book(_hist_cptavevsnchgsmallzpt , 9, 1, 1);
 62    }
 63
 64
 65    /// Do the analysis
 66    void analyze(const Event& e) {
 67
 68      const FinalState& fs = apply<FinalState>(e, "FS");
 69      const size_t numParticles = fs.particles().size();
 70
 71      // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
 72      if (numParticles < 1) {
 73        MSG_DEBUG("Failed multiplicity cut");
 74        vetoEvent;
 75      }
 76
 77      // Get the leptons
 78      const Particles& leptons = apply<ChargedLeptons>(e, "CL").chargedLeptons();
 79
 80      // We want exactly two leptons of the same flavour.
 81      MSG_DEBUG("lepton multiplicity = " << leptons.size());
 82      if (leptons.size() != 2 || leptons[0].pid() != -leptons[1].pid() ) vetoEvent;
 83
 84      // Lepton pT > 20 GeV
 85      if (leptons[0].pT()/GeV <= 20 || leptons[1].pT()/GeV <= 20) vetoEvent;
 86
 87      // Lepton pair should have an invariant mass between 70 and 110 and |eta| < 6
 88      const FourMomentum dilepton = leptons[0].momentum() + leptons[1].momentum();
 89      if (!inRange(dilepton.mass()/GeV, 70., 110.) || fabs(dilepton.eta()) >= 6) vetoEvent;
 90      MSG_DEBUG("Dilepton mass = " << dilepton.mass()/GeV << " GeV");
 91      MSG_DEBUG("Dilepton pT   = " << dilepton.pT()/GeV << " GeV");
 92
 93      // Calculate the observables
 94      size_t   numToward(0),     numAway(0);
 95      long int numTrans1(0),     numTrans2(0);
 96      double ptSumToward(0.0), ptSumTrans1(0.0), ptSumTrans2(0.0), ptSumAway(0.0);
 97      double ptMaxToward(0.0), ptMaxTrans1(0.0), ptMaxTrans2(0.0), ptMaxAway(0.0);
 98      const double phiZ = dilepton.azimuthalAngle();
 99      const double pTZ  = dilepton.pT();
100      /// @todo Replace with for
101      for (Particles::const_iterator p = fs.particles().begin(); p != fs.particles().end(); ++p) {
102        // Don't use the leptons
103        /// @todo Replace with PID::isLepton
104        if (abs(p->pid()) < 20) continue;
105
106        const double dPhi = deltaPhi(p->momentum().phi(), phiZ);
107        const double pT = p->pT();
108        double rotatedphi = p->momentum().phi() - phiZ;
109        while (rotatedphi < 0) rotatedphi += 2*PI;
110
111        if (dPhi < PI/3.0) {
112          ptSumToward += pT;
113          ++numToward;
114          if (pT > ptMaxToward)
115            ptMaxToward = pT;
116        } else if (dPhi < 2*PI/3.0) {
117          if (rotatedphi <= PI) {
118            ptSumTrans1 += pT;
119            ++numTrans1;
120            if (pT > ptMaxTrans1)
121              ptMaxTrans1 = pT;
122          }
123          else {
124            ptSumTrans2 += pT;
125            ++numTrans2;
126            if (pT > ptMaxTrans2)
127              ptMaxTrans2 = pT;
128          }
129        } else {
130          ptSumAway += pT;
131          ++numAway;
132          if (pT > ptMaxAway)
133            ptMaxAway = pT;
134        }
135        // We need to subtract the two leptons from the number of particles to get the correct multiplicity
136        _hist_cptavevsnchg->fill(numParticles-2, pT);
137        if (pTZ < 10)
138          _hist_cptavevsnchgsmallzpt->fill(numParticles-2, pT);
139      }
140
141      // Fill the histograms
142      _hist_tnchg->fill(pTZ, numToward/(4*PI/3));
143      _hist_pnchg->fill(pTZ, (numTrans1+numTrans2)/(4*PI/3));
144      _hist_pmaxnchg->fill(pTZ, (numTrans1>numTrans2 ? numTrans1 : numTrans2)/(2*PI/3));
145      _hist_pminnchg->fill(pTZ, (numTrans1<numTrans2 ? numTrans1 : numTrans2)/(2*PI/3));
146      _hist_pdifnchg->fill(pTZ, abs(numTrans1-numTrans2)/(2*PI/3));
147      _hist_anchg->fill(pTZ, numAway/(4*PI/3));
148
149      _hist_tcptsum->fill(pTZ, ptSumToward/(4*PI/3));
150      _hist_pcptsum->fill(pTZ, (ptSumTrans1+ptSumTrans2)/(4*PI/3));
151      _hist_pmaxcptsum->fill(pTZ, (ptSumTrans1>ptSumTrans2 ? ptSumTrans1 : ptSumTrans2)/(2*PI/3));
152      _hist_pmincptsum->fill(pTZ, (ptSumTrans1<ptSumTrans2 ? ptSumTrans1 : ptSumTrans2)/(2*PI/3));
153      _hist_pdifcptsum->fill(pTZ, fabs(ptSumTrans1-ptSumTrans2)/(2*PI/3));
154      _hist_acptsum->fill(pTZ, ptSumAway/(4*PI/3));
155
156      if (numToward > 0) {
157        _hist_tcptave->fill(pTZ, ptSumToward/numToward);
158        _hist_tcptmax->fill(pTZ, ptMaxToward);
159      }
160      if ((numTrans1+numTrans2) > 0) {
161        _hist_pcptave->fill(pTZ, (ptSumTrans1+ptSumTrans2)/(numTrans1+numTrans2));
162        _hist_pcptmax->fill(pTZ, (ptMaxTrans1 > ptMaxTrans2 ? ptMaxTrans1 : ptMaxTrans2));
163      }
164
165      // We need to subtract the two leptons from the number of particles to get the correct multiplicity
166      _hist_zptvsnchg->fill(numParticles-2, pTZ);
167    }
168
169
170    // void finalize() {    }
171
172    //@}
173
174
175  private:
176
177    Profile1DPtr _hist_tnchg;
178    Profile1DPtr _hist_pnchg;
179    Profile1DPtr _hist_pmaxnchg;
180    Profile1DPtr _hist_pminnchg;
181    Profile1DPtr _hist_pdifnchg;
182    Profile1DPtr _hist_anchg;
183    Profile1DPtr _hist_tcptsum;
184    Profile1DPtr _hist_pcptsum;
185    Profile1DPtr _hist_pmaxcptsum;
186    Profile1DPtr _hist_pmincptsum;
187    Profile1DPtr _hist_pdifcptsum;
188    Profile1DPtr _hist_acptsum;
189    Profile1DPtr _hist_tcptave;
190    Profile1DPtr _hist_pcptave;
191    Profile1DPtr _hist_tcptmax;
192    Profile1DPtr _hist_pcptmax;
193    Profile1DPtr _hist_zptvsnchg;
194    Profile1DPtr _hist_cptavevsnchg;
195    Profile1DPtr _hist_cptavevsnchgsmallzpt;
196
197  };
198
199
200
201  RIVET_DECLARE_ALIASED_PLUGIN(CDF_2010_S8591881_DY, CDF_2010_I849042_DY);
202
203}