Rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CDF_2008_S8095620

CDF Run II Z+b-jet cross section paper, 2 fb-1
Experiment: CDF (Tevatron Run 2)
Inspire ID: 806082
Status: VALIDATED
Authors:
  • Emily Nurse
  • Steffen Schumann <s.schumann(at)thphys.uni-heidelberg.de>
References: Beams: p- p+
Beam energies: (980.0, 980.0) GeV
Run details:
  • Requires the process $p\bar{p} \rightarrow {Z} \rightarrow{\ell}\ell$, where $\ell$ is $e$ or $\mu$. Additional hard jets will also have to be included to get a good description.

Measurement of the b-jet production cross section for events containing a $Z$ boson produced in $p\bar{p}$ collisions at $\sqrt{s}=1.96$ TeV, using data corresponding to an integrated luminosity of 2 fb$^{-1}$ collected by the CDF II detector at the Tevatron. $Z$ bosons are selected in the electron and muon decay modes. Jets are considered with transverse energy $E_T>20$ GeV and pseudorapidity $|\eta|<1.5$. The ratio of the integrated $Z$ + b-jet cross section to the inclusive $Z$ production cross section is measured differentially in jet $E_T$, jet $\eta$, $Z$-boson transverse momentum, number of jets, and number of b-jets. The first two measurements have an entry for each b-jet in the event, the last three measurements have one entry per event.

Source code: CDF_2008_S8095620.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "Rivet/Projections/InvMassFinalState.hh"

namespace Rivet {


  /// @brief CDF Run II Z + b-jet cross-section measurement
  class CDF_2008_S8095620 : public Analysis {
  public:

    /// Constructor.
    /// jet cuts: |eta| <= 1.5
    CDF_2008_S8095620()
      : Analysis("CDF_2008_S8095620"),
        _Rjet(0.7), _JetPtCut(20.), _JetEtaCut(1.5), _Lep1PtCut(18.), _Lep2PtCut(10.), _LepEtaCut(3.2),
        _sumWeightSelected(0.0)
    {
    }


    /// @name Analysis methods
    //@{

    void init() {
      // Set up projections
      const FinalState fs(-3.2, 3.2);
      declare(fs, "FS");
      // Create a final state with any e+e- or mu+mu- pair with
      // invariant mass 76 -> 106 GeV and ET > 18 (Z decay products)
      vector<pair<PdgId,PdgId> > vids;
      vids.push_back(make_pair(PID::ELECTRON, PID::POSITRON));
      vids.push_back(make_pair(PID::MUON, PID::ANTIMUON));
      FinalState fs2(-3.2, 3.2);
      InvMassFinalState invfs(fs2, vids, 76*GeV, 106*GeV);
      declare(invfs, "INVFS");
      // Make a final state without the Z decay products for jet clustering
      VetoedFinalState vfs(fs);
      vfs.addVetoOnThisFinalState(invfs);
      declare(vfs, "VFS");
      declare(FastJets(vfs, FastJets::CDFMIDPOINT, 0.7), "Jets");

      // Book histograms
      _dStot    = bookHisto1D(1, 1, 1);
      _dSdET    = bookHisto1D(2, 1, 1);
      _dSdETA   = bookHisto1D(3, 1, 1);
      _dSdZpT   = bookHisto1D(4, 1, 1);
      _dSdNJet  = bookHisto1D(5, 1, 1);
      _dSdNbJet = bookHisto1D(6, 1, 1);
     }


    // Do the analysis
    void analyze(const Event& event) {
      // Check we have an l+l- pair that passes the kinematic cuts
      // Get the Z decay products (mu+mu- or e+e- pair)
      const InvMassFinalState& invMassFinalState = apply<InvMassFinalState>(event, "INVFS");
      const Particles&  ZDecayProducts =  invMassFinalState.particles();

      // make sure we have 2 Z decay products (mumu or ee)
      if (ZDecayProducts.size() < 2) vetoEvent;
      //new cuts
      double Lep1Pt = ZDecayProducts[0].perp();
      double Lep2Pt = ZDecayProducts[1].perp();
      double Lep1Eta = fabs(ZDecayProducts[0].rapidity());
      double Lep2Eta = fabs(ZDecayProducts[1].rapidity());

      if (Lep1Eta > _LepEtaCut || Lep2Eta > _LepEtaCut) vetoEvent;

      if (ZDecayProducts[0].abspid()==13 &&
          ((Lep1Eta > 1.5 || Lep2Eta > 1.5) || (Lep1Eta > 1.0 && Lep2Eta > 1.0))) {
        vetoEvent;
      }

      if (Lep1Pt > Lep2Pt) {
        if (Lep1Pt < _Lep1PtCut || Lep2Pt < _Lep2PtCut) vetoEvent;
      }
      else {
        if (Lep1Pt < _Lep2PtCut || Lep2Pt < _Lep1PtCut) vetoEvent;
      }

      _sumWeightSelected += event.weight();
      /// @todo: write out a warning if there are more than two decay products
      FourMomentum Zmom = ZDecayProducts[0].momentum() +  ZDecayProducts[1].momentum();

      // Put all b-quarks in a vector
      /// @todo Use a b-hadron search rather than b-quarks for tagging
      Particles bquarks;
      foreach (const GenParticle* p, particles(event.genEvent())) {
        if (std::abs(p->pdg_id()) == PID::BQUARK) {
          bquarks += Particle(*p);
        }
      }

      // Get jets
      const FastJets& jetpro = apply<FastJets>(event, "Jets");
      MSG_DEBUG("Jet multiplicity before any pT cut = " << jetpro.size());

      const PseudoJets& jets = jetpro.pseudoJetsByPt();
      MSG_DEBUG("jetlist size = " << jets.size());

      int numBJet = 0;
      int numJet  = 0;
      // for each b-jet plot the ET and the eta of the jet, normalise to the total cross section at the end
      // for each event plot N jet and pT(Z), normalise to the total cross section at the end
      for (PseudoJets::const_iterator jt = jets.begin(); jt != jets.end(); ++jt) {
        // select jets that pass the kinematic cuts
        if (jt->perp() > _JetPtCut && fabs(jt->rapidity()) <= _JetEtaCut) {
          numJet++;
          // does the jet contain a b-quark?
          bool bjet = false;
          foreach (const Particle& bquark,  bquarks) {
            if (deltaR(jt->rapidity(), jt->phi(), bquark.rapidity(),bquark.phi()) <= _Rjet) {
              bjet = true;
              break;
            }
          } // end loop around b-jets
          if (bjet) {
            numBJet++;
            _dSdET->fill(jt->perp(),event.weight());
            _dSdETA->fill(fabs(jt->rapidity()),event.weight());
          }
        }
      } // end loop around jets

      // wasn't asking for b-jets before!!!!
      if(numJet > 0 && numBJet > 0) _dSdNJet->fill(numJet,event.weight());
      if(numBJet > 0) {
        _dStot->fill(1960.0,event.weight());
        _dSdNbJet->fill(numBJet,event.weight());
        _dSdZpT->fill(Zmom.pT(),event.weight());
      }
    }



    // Finalize
    void finalize() {
      // normalise histograms
      // scale by 1 / the sum-of-weights of events that pass the Z cuts
      // since the cross sections are normalized to the inclusive
      // Z cross sections.
      double Scale = 1.0;
      if (_sumWeightSelected != 0.0) Scale = 1.0/_sumWeightSelected;
      scale(_dStot,Scale);
      scale(_dSdET,Scale);
      scale(_dSdETA,Scale);
      scale(_dSdNJet,Scale);
      scale(_dSdNbJet,Scale);
      scale(_dSdZpT,Scale);
    }

    //@}


  private:

    double _Rjet;
    double _JetPtCut;
    double _JetEtaCut;
    double _Lep1PtCut;
    double _Lep2PtCut;
    double _LepEtaCut;
    double _sumWeightSelected;

    //@{
    /// Histograms
    Histo1DPtr _dStot;
    Histo1DPtr _dSdET;
    Histo1DPtr _dSdETA;
    Histo1DPtr _dSdNJet;
    Histo1DPtr _dSdNbJet;
    Histo1DPtr _dSdZpT;

    //@}

  };



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

}