Rivet analyses


title: CDF_2008_I787780

CDF Run II $b$-jet shape paper

Experiment: CDF (Tevatron Run 2)

Inspire ID: 787780

Status: VALIDATED

Authors: - Alison Lister - Emily Nurse - Andy Buckley

References: - arXiv: 0806.1699 - Phys.Rev.D78:072005,2008

Beams: p- p+

Beam energies: (980.0, 980.0)GeV

Run details: - Requires $2 \rightarrow 2$ QCD scattering processes. The minimum jet $E_\perp$ is 52~GeV, so kinematic cuts on pTmin may be required for statistical validity.

A measurement of the shapes of $b$-jets using 300 pb$^{-1}$ of data obtained with CDF II in $p\bar{p}$ collisions at $\sqrt{s}=1.96$ TeV. The measured quantity is the average integrated jet shape, which is computed over an ensemble of jets. This quantity is expressed as $\Psi(r/R) = \langle\frac{p_\perp(0 \rightarrow r)}{p_\perp(0 \rightarrow R)}\rangle$, where $p_\perp(0 \rightarrow r)$ is the scalar sum of the transverse momenta of all objects inside a sub-cone of radius $r$ around the jet axis. The integrated shapes are by definition normalized such that $\Psi(r/R =1) = 1$. The measurement is done in bins of jet pT in the range 52 to 300~GeV/$c$. The jets have $|\eta| < 0.7$. The $b$-jets are expected to be broader than inclusive jets. Moreover, $b$-jets containing a single $b$-quark are expected to be narrower than those containing a $b \bar{b}$ pair from gluon splitting.

Source code:CDF_2008_I787780.cc

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

include "Rivet/Analysis.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/JetShape.hh"

namespace Rivet {

/// @brief CDF Run II b-jet shape paper class CDF_2008_I787780 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(CDF_2008_I787780);


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

void init() {
  // Set up projections
  const FinalState fs((Cuts::etaIn(-3.6, 3.6)));
  declare(fs, "FS");
  FastJets jetproj(fs, JetAlg::CDFMIDPOINT, 0.7);
  jetproj.useInvisibles();
  declare(jetproj, "Jets");

  // Book histograms and corresponding jet shape projections
  _ptedges = {{52, 80, 104, 142, 300}};
  for (size_t i = 0; i < 4; ++i) {
    stringstream ss;
    ss << "JetShape" << i;
    const string pname = ss.str();
    _jsnames_pT[i] = pname;
    const JetShape jsp(jetproj, 0.0, 0.7, 7, _ptedges[i], _ptedges[i + 1], 0.0, 0.7, RAPIDITY);
    declare(jsp, pname);
    book(_h_Psi_pT[i], i + 1, 2, 1);
  }
  book(_h_OneMinusPsi_vs_pT, 5, 1, 1);
}


// Do the analysis
void analyze(const Event& event) {
  const FastJets& fjs = apply<FastJets>(event, "Jets");
  const Jets& jets = fjs.jets(Cuts::ptIn(_ptedges.front() * GeV, _ptedges.back() * GeV)
                              && Cuts::absrap < 0.7);
  if (jets.size() == 0) {
    MSG_DEBUG("No jets found in required pT range");
    vetoEvent;
  }

  // Filter to just get a vector of b-jets
  Jets bjets;
  for (const Jet& j : jets) {
    if (j.bTagged()) bjets += j;
  }
  if (bjets.empty()) {
    MSG_DEBUG("No b-jet axes in acceptance");
    vetoEvent;
  }

  // Bin b-jets in pT
  Jets bjets_ptbinned[4];
  for (const Jet& bj : bjets) {
    const FourMomentum pbj = bj.momentum();
    const int ipt = binIndex(pbj.pT(), _ptedges);
    if (ipt == -1) continue; ///< Out of pT range (somehow!)
    bjets_ptbinned[ipt] += bj;
  }

  // Loop over jet pT bins and fill shape profiles
  for (size_t ipt = 0; ipt < 4; ++ipt) {
    if (bjets_ptbinned[ipt].empty()) continue;
    // Don't use the cached result: copy construct and calculate for provided b-jets only
    JetShape jsipt = apply<JetShape>(event, _jsnames_pT[ipt]);
    jsipt.calc(bjets_ptbinned[ipt]);
    for (size_t ijet = 0; ijet < jsipt.numJets(); ++ijet) {
      for (size_t rbin = 0; rbin < jsipt.numBins(); ++rbin) {
        const double r_Psi = jsipt.rBinMax(rbin);
        _h_Psi_pT[ipt]->fill(r_Psi / 0.7, jsipt.intJetShape(ijet, rbin));
      }
    }
  }
}


/// Finalize
void finalize() {

  // Construct final 1-Psi(0.3/0.7) profile from Psi profiles
  for (size_t i = 0; i < _ptedges.size() - 1; ++i) {
    // Get entry for rad_Psi = 0.2 bin
    Profile1DPtr ph_i = _h_Psi_pT[i];
    double y = 0;                           // This is to protect against exceptions
    double ey = 0;                          // thrown by YODA when calling mean and
    if (ph_i->bin(1).effNumEntries() > 1) { // stdErr at
      y = 1.0 - ph_i->bin(1).yMean();       // low stats
      ey = ph_i->bin(1).yStdErr();
    }
    _h_OneMinusPsi_vs_pT->bin(i + 1).set(y, ey);
  }
}

/// @}

private:

/// @name Analysis data
/// @{
/// Jet \f$ p_\perp\f$ bins.
vector<double> _ptedges; // This can't be a raw array if we want to initialise it non-painfully
/// JetShape projection name for each \f$p_\perp\f$ bin.
string _jsnames_pT[4];
/// @}


/// @name Histograms
/// @{
Profile1DPtr _h_Psi_pT[4];
Estimate1DPtr _h_OneMinusPsi_vs_pT;
/// @}

};

RIVET_DECLARE_ALIASED_PLUGIN(CDF_2008_I787780, CDF_2008_S7782535);

} ```

Aliases: - CDF_2008_S7782535