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: 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/LeptonFinder.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      SpecialLeptonFinder dressedleptons(fs, superLooseLeptonCuts);
 30      declare(dressedleptons, "LeptonFinder");
 31
 32      // Projection for jets
 33      VetoedFinalState fsForJets(fs);
 34      fsForJets.addVetoOnThisFinalState(dressedleptons);
 35      declare(FastJets(fsForJets, JetAlg::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 SpecialLeptonFinder& dressedleptons = apply<SpecialLeptonFinder>(event, "LeptonFinder");
 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   = apply<FastJets>(event, "Jets");
 60      const Jets      jets30 = jets.jetsByPt(Cuts::pT > 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 SpecialLeptonFinder : public FinalState {
 96    public:
 97
 98      /// Constructor
 99      SpecialLeptonFinder(const FinalState& fs, const Cut& cut)
100        : FinalState(cut)
101      {
102        setName("SpecialLeptonFinder");
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, JetAlg::ANTIKT, 0.1), "LeptonJets");
109      }
110
111      /// Clone on the heap
112      virtual unique_ptr<Projection> clone() const {
113        return unique_ptr<Projection>(new SpecialLeptonFinder(*this));
114      }
115
116      /// Import to avoid warnings about overload-hiding
117      using Projection::operator =;
118
119      /// Retrieve the dressed leptons
120      const DressedLeptons& dressedLeptons() const { return _clusteredLeptons; }
121
122      /// Perform the calculation
123      void project(const Event& e) {
124        _theParticles.clear();
125        _clusteredLeptons.clear();
126
127        DressedLeptons allClusteredLeptons;
128        const Jets jets = apply<FastJets>(e, "LeptonJets").jetsByPt(Cuts::pT > 5*GeV);
129        for (const Jet& jet : jets) {
130          Particle lepCand;
131          for (const Particle& cand : jet.particles()) {
132            const int absPdgId = cand.abspid();
133            if (absPdgId == PID::ELECTRON || absPdgId == PID::MUON) {
134              if (cand.pt() > lepCand.pt()) lepCand = cand;
135            }
136          }
137          // Central lepton must be the major component
138          if ((lepCand.pt() < jet.pt()/2.) || (!lepCand.isChargedLepton())) continue;
139
140          DressedLepton lepton = DressedLepton(lepCand);
141          for (const Particle& cand : jet.particles()) {
142            if (isSame(cand, lepCand)) continue;
143            lepton.addConstituent(cand, true);
144          }
145          allClusteredLeptons.push_back(lepton);
146        }
147
148        for (const DressedLepton& lepton : allClusteredLeptons) {
149          if (accept(lepton)) {
150            _clusteredLeptons.push_back(lepton);
151            _theParticles.push_back(lepton.bareLepton());
152            _theParticles += lepton.photons();
153          }
154        }
155      }
156
157    private:
158
159      /// Container which stores the clustered lepton objects
160      DressedLeptons _clusteredLeptons;
161
162    };
163
164
165  private:
166
167    /// Histograms
168    Histo1DPtr _normedElectronMuonHisto, _absXSElectronMuonHisto;
169
170  };
171
172
173
174  RIVET_DECLARE_PLUGIN(CMS_2016_PAS_TOP_15_006);
175
176}