Rivet analyses

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 → 2 QCD scattering processes. The minimum jet E 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 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(0 → 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 Ψ(r/R = 1) = 1. The measurement is done in bins of jet pT in the range 52 to 300~GeV/c. The jets have |η| < 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 pair from gluon splitting.

Source code:CDF_2008_I787780.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/FastJets.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