rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2016_PAS_TOP_15_006

Jet multiplicity in the top-quark pair lepton+jets final state at $\sqrt{s} = 8 \text{TeV}$
Experiment: CMS (LHC)
Inspire ID: 1476015
Status: VALIDATED
Authors:
  • Alexis Descroix
  • Frederik Schaaf
  • Markus Seidel
References:
  • CMS-PAS-TOP-15-006
Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • ttbar events at sqrt(s) = 8 TeV (inclusive decay modes)

The top-quark pair differential production cross section in $pp$ collisions at $\sqrt{s}=8 \text{TeV}$ as a function of the number of jets is measured in the lepton+jets (e/mu+jets) final state for an integrated luminosity of 19.7/fb. The cross section is presented in the visible phase space of the measurement.

Source code: CMS_2016_PAS_TOP_15_006.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/FastJets.hh"
  5#include "Rivet/Projections/DressedLeptons.hh"
  6#include "Rivet/Projections/IdentifiedFinalState.hh"
  7#include "Rivet/Projections/VetoedFinalState.hh"
  8
  9namespace Rivet {
 10
 11
 12  /// Jet multiplicity in lepton+jets ttbar at 8 TeV
 13  class CMS_2016_PAS_TOP_15_006 : public Analysis {
 14  public:
 15
 16    /// Constructor
 17    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2016_PAS_TOP_15_006);
 18
 19
 20    /// @name Analysis methods
 21    //@{
 22
 23    /// Set up projections and book histograms
 24    void init() {
 25
 26      // Complete final state
 27      FinalState fs;
 28      Cut superLooseLeptonCuts = Cuts::pt > 5*GeV;
 29      SpecialDressedLeptons dressedleptons(fs, superLooseLeptonCuts);
 30      declare(dressedleptons, "DressedLeptons");
 31
 32      // Projection for jets
 33      VetoedFinalState fsForJets(fs);
 34      fsForJets.addVetoOnThisFinalState(dressedleptons);
 35      declare(FastJets(fsForJets, FastJets::ANTIKT, 0.5), "Jets");
 36
 37      // Booking of histograms
 38      book(_normedElectronMuonHisto, "normedElectronMuonHisto", 7, 3.5, 10.5);
 39      book(_absXSElectronMuonHisto , "absXSElectronMuonHisto", 7, 3.5, 10.5);
 40    }
 41
 42
 43    /// Per-event analysis
 44    void analyze(const Event& event) {
 45      // Select ttbar -> lepton+jets
 46      const SpecialDressedLeptons& dressedleptons = applyProjection<SpecialDressedLeptons>(event, "DressedLeptons");
 47      vector<FourMomentum> selleptons;
 48      for (const DressedLepton& dressedlepton : dressedleptons.dressedLeptons()) {
 49        // Select good leptons
 50        if (dressedlepton.pT() > 30*GeV && dressedlepton.abseta() < 2.4) selleptons += dressedlepton.mom();
 51        // Veto loose leptons
 52        else if (dressedlepton.pT() > 15*GeV && dressedlepton.abseta() < 2.5) vetoEvent;
 53      }
 54      if (selleptons.size() != 1) vetoEvent;
 55      // Identify hardest tight lepton
 56      const FourMomentum lepton = selleptons[0];
 57
 58      // Jets
 59      const FastJets& jets   = applyProjection<FastJets>(event, "Jets");
 60      const Jets      jets30 = jets.jetsByPt(30*GeV);
 61      int nJets = 0, nBJets = 0;
 62      for (const Jet& jet : jets30) {
 63        if (jet.abseta() > 2.5) continue;
 64        if (deltaR(jet.momentum(), lepton) < 0.5) continue;
 65        nJets += 1;
 66        if (jet.bTagged(Cuts::pT > 5*GeV)) nBJets += 1;
 67      }
 68      // Require >= 4 resolved jets, of which two must be b-tagged
 69      if (nJets < 4 || nBJets < 2) vetoEvent;
 70
 71      // Fill histograms
 72      _normedElectronMuonHisto->fill(min(nJets, 10));
 73      _absXSElectronMuonHisto ->fill(min(nJets, 10));
 74    }
 75
 76
 77    void finalize() {
 78      const double ttbarXS = !std::isnan(crossSectionPerEvent()) ? crossSection() : 252.89*picobarn;
 79      if (std::isnan(crossSectionPerEvent()))
 80        MSG_INFO("No valid cross-section given, using NNLO (arXiv:1303.6254; sqrt(s)=8 TeV, m_t=172.5 GeV): " <<
 81                 ttbarXS/picobarn << " pb");
 82
 83      const double xsPerWeight = ttbarXS/picobarn / sumOfWeights();
 84      scale(_absXSElectronMuonHisto, xsPerWeight);
 85
 86      normalize(_normedElectronMuonHisto);
 87    }
 88
 89    //@}
 90
 91
 92    /// @brief Special dressed lepton finder
 93    ///
 94    /// Find dressed leptons by clustering all leptons and photons
 95    class SpecialDressedLeptons : public FinalState {
 96    public:
 97
 98      /// Constructor
 99      SpecialDressedLeptons(const FinalState& fs, const Cut& cut)
100        : FinalState(cut)
101      {
102        setName("SpecialDressedLeptons");
103        IdentifiedFinalState ifs(fs);
104        ifs.acceptIdPair(PID::PHOTON);
105        ifs.acceptIdPair(PID::ELECTRON);
106        ifs.acceptIdPair(PID::MUON);
107        declare(ifs, "IFS");
108        declare(FastJets(ifs, FastJets::ANTIKT, 0.1), "LeptonJets");
109      }
110
111      /// Clone on the heap
112      virtual unique_ptr<Projection> clone() const {
113        return unique_ptr<Projection>(new SpecialDressedLeptons(*this));
114      }
115
116      /// Retrieve the dressed leptons
117      const vector<DressedLepton>& dressedLeptons() const { return _clusteredLeptons; }
118
119      /// Perform the calculation
120      void project(const Event& e) {
121        _theParticles.clear();
122        _clusteredLeptons.clear();
123
124        vector<DressedLepton> allClusteredLeptons;
125        const Jets jets = applyProjection<FastJets>(e, "LeptonJets").jetsByPt(5*GeV);
126        for (const Jet& jet : jets) {
127          Particle lepCand;
128          for (const Particle& cand : jet.particles()) {
129            const int absPdgId = cand.abspid();
130            if (absPdgId == PID::ELECTRON || absPdgId == PID::MUON) {
131              if (cand.pt() > lepCand.pt()) lepCand = cand;
132            }
133          }
134          // Central lepton must be the major component
135          if ((lepCand.pt() < jet.pt()/2.) || (!lepCand.isChargedLepton())) continue;
136
137          DressedLepton lepton = DressedLepton(lepCand);
138          for (const Particle& cand : jet.particles()) {
139            if (isSame(cand, lepCand)) continue;
140            lepton.addConstituent(cand, true);
141          }
142          allClusteredLeptons.push_back(lepton);
143        }
144
145        for (const DressedLepton& lepton : allClusteredLeptons) {
146          if (accept(lepton)) {
147            _clusteredLeptons.push_back(lepton);
148            _theParticles.push_back(lepton.constituentLepton());
149            _theParticles += lepton.constituentPhotons();
150          }
151        }
152      }
153
154    private:
155
156      /// Container which stores the clustered lepton objects
157      vector<DressedLepton> _clusteredLeptons;
158
159    };
160
161
162  private:
163
164    /// Histograms
165    Histo1DPtr _normedElectronMuonHisto, _absXSElectronMuonHisto;
166
167  };
168
169
170
171  // The hook for the plugin system
172  RIVET_DECLARE_PLUGIN(CMS_2016_PAS_TOP_15_006);
173
174}