Rivet analyses


title: CDF_2008_I806082

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

References: - arXiv: 0812.4458

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_I806082.cc

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

include "Rivet/Analysis.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/InvMassFinalState.hh"

include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {

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

RIVET_DEFAULT_ANALYSIS_CTOR(CDF_2008_I806082);


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

void init() {
  // Set up projections
  const FinalState fs((Cuts::etaIn(-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((Cuts::etaIn(-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, JetAlg::CDFMIDPOINT, 0.7), "Jets");

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

  book(_sumWeightSelected, "sumWeightSelected");
}


// 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->fill();
  /// @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;
  for (ConstGenParticlePtr p : HepMCUtils::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;
      for (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());
        _dSdETA->fill(fabs(jt->rapidity()));
      }
    }
  } // end loop around jets

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


// 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->val() != 0.0) Scale = 1.0 / dbl(*_sumWeightSelected);
  scale(_dStot, Scale);
  scale(_dSdET, Scale);
  scale(_dSdETA, Scale);
  scale(_dSdNJet, Scale);
  scale(_dSdNbJet, Scale);
  scale(_dSdZpT, Scale);
}

/// @}

private:

/// @name Cuts
/// @{
const double _Rjet = 0.7;
const double _JetPtCut = 20;
const double _JetEtaCut = 1.5;
const double _Lep1PtCut = 18;
const double _Lep2PtCut = 10;
const double _LepEtaCut = 3.2;
/// @}

/// Counter
CounterPtr _sumWeightSelected;

/// @name Histograms
/// @{
BinnedHistoPtr<int> _dStot, _dSdNbJet, _dSdNJet;
Histo1DPtr _dSdET, _dSdETA, _dSdZpT;
/// @}

};

RIVET_DECLARE_ALIASED_PLUGIN(CDF_2008_I806082, CDF_2008_S8095620);

} ```

Aliases: - CDF_2008_S8095620