rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2016_I1454211

Boosted $t\bar{t}$ in $pp$ collisions at $\sqrt{s} = 8 \text{TeV}$
Experiment: CMS (LHC)
Inspire ID: 1454211
Status: VALIDATED
Authors:
  • Salvatore Rappoccio
  • Maral Alyari
  • Julia Thom
  • Louise Skinnari
  • Susan Dittmer
  • Matthew Bellis
References: Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • $pp$ QCD interactions at $\sqrt{s} = 8 \text{TeV} with $t\bar{t}$ process. Data collected by CMS during the year 2012. Boosted topology restricts phase space, requiring high statistics in a single run or custom merging of the YODA files.

The cross section for pair production of top quarks with high transverse momenta ($p_\mathrm{T} > 400$ \text{GeV}) is measured in 19.7 fb$^{-1}$ of $\mathrm{pp}$ collisions, collected with the CMS detector at $\sqrt{s} = 8 \text{TeV}$. The measurement is performed for lepton+jets events, where one top quark decays according to $t \rightarrow Wb \rightarrow \ell \nu b$, with $\ell$ denoting an electron or muon, and the second top quark decays to an hadronic final state and is reconstructed as a single large-radius jet and identified as a top quark candidate using jet substructure techniques. Integrated cross sections, as well as differential cross sections as a function of the top quark $p_\mathrm{T}$ and rapidity, are measured both at particle level within a fiducial region resembling the detector-level selections and at parton level. RIVET: This analysis is to be run on $t\bar{t}$ Monte Carlo. It utilizes the PartonicTops projection, which assumes top quarks in the event record. The analysis has been validated with Powheg+Pythia6. The parton-level phase space is defined by requiring two PartonicTops. Exactly one PartonicTop must decay directly to a muon or electron (no intermediate tau), and exactly one PartonicTop decays hadronically. For $t\bar{t}$ Monte Carlo, this is equivalent to requiring the event to be semileptonic at parton level. The parton-level top quark is defined as the hadronically decaying top. The parton-level top quark is required to have $p_\mathrm{T} > 400 \text{GeV}$. The particle-level phase space is defined using the following object definitions: - Lepton: A dressed electron or muon, meaning the lepton has been clustered with all photons within a cone of $R=0.1$. The DressedLepton projection is used to construct the dressed lepton. The lepton is required to have $p_\mathrm{T} > 45$ GeV and $|\eta| < 2.1$. - B Jet Candidate: Gen AK5 jets are formed by clustering the final state particles in the event using the anti-$k_{T}$ algorithm with distance parameter $R=0.5$. Neutrinos are excluded from the clustering, as are any particles included in the dressed lepton. The gen AK5 jet is required to have $p_{T} > 30$ GeV and $|\eta| < 2.4$. Gen AK5 jets in the same hemisphere as the lepton ($\Delta R(e/\mu, \mathrm{jet}) < \pi/2$) are defined as $b$-jet candidates. - Top Jet Candidate: Gen CA8 jets are formed by clustering the final state particles in the event using the Cambridge-Aachen algorithm with distance parameter $R=0.8$. Neutrinos are excluded from the clustering, as are any particles included in the dressed lepton. The gen CA8 jet is required to have $p_{T} > 30$ GeV and $|\eta| < 2.4$. Gen CA8 jets which have $p_{T} > 400$ GeV, 140 GeV $<$ mass $<$ 250 GeV, and are in the opposite hemisphere from the lepton ($\Delta{\rm R(e/\mu, jet)} > \pi/2$) are defined as top jet candidates. The particle-level phase space is defined by requiring $\geq 1$ b jet candidate, $\geq 1$ top jet candidate, and exactly one lepton. This is in addition to the parton-level semileptonic requirement. The highest-$p_\mathrm{T}$ top jet candidate is defined as the particle-level $t$ jet.

Source code: CMS_2016_I1454211.cc
  1#include "Rivet/Analysis.hh"
  2#include "Rivet/Projections/FinalState.hh"
  3#include "Rivet/Projections/FastJets.hh"
  4#include "Rivet/Projections/PartonicTops.hh"
  5#include "Rivet/Projections/DressedLeptons.hh"
  6#include "Rivet/Projections/IdentifiedFinalState.hh"
  7#include "Rivet/Projections/PromptFinalState.hh"
  8#include "Rivet/Projections/VetoedFinalState.hh"
  9#include "Rivet/Projections/InvMassFinalState.hh"
 10#include "Rivet/Projections/MissingMomentum.hh"
 11
 12namespace Rivet {
 13
 14
 15  /// Boosted ttbar in pp collisions at sqrtS = 8 TeV
 16  /// @todo Use persistent weight counters
 17  class CMS_2016_I1454211 : public Analysis {
 18  public:
 19    
 20    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2016_I1454211);
 21    
 22    
 23    // Set up projections and book histograms
 24    void init() {
 25      
 26      // Get options particle-level only.
 27      _mode = 0;
 28      if ( getOption("TMODE") == "PARTICLE" ) _mode = 0;
 29      if ( getOption("TMODE") == "BOTH" ) _mode = 1;
 30      
 31      // Complete final state
 32      FinalState fs;
 33      
 34      // Partonic tops
 35      // Need these for flavour determination, even if only plotting particle-level
 36      declare(PartonicTops(PartonicTops::DecayMode::ELECTRON, false), "ElectronPartonTops");
 37      declare(PartonicTops(PartonicTops::DecayMode::MUON, false),     "MuonPartonTops");
 38      declare(PartonicTops(PartonicTops::DecayMode::HADRONIC),        "HadronicPartonTops");
 39      
 40      // Projection for electrons and muons
 41      IdentifiedFinalState photons(fs, PID::PHOTON);
 42      
 43      const Cut leptonCuts = Cuts::pt > 45*GeV && Cuts::abseta < 2.1;
 44      
 45      IdentifiedFinalState el_id(fs, {{PID::ELECTRON, -PID::ELECTRON}});
 46      PromptFinalState electrons(el_id);
 47      DressedLeptons dressed_electrons(photons, electrons, 0.1, leptonCuts);
 48      declare(dressed_electrons, "DressedElectrons");
 49      
 50      IdentifiedFinalState mu_id(fs, {{PID::MUON, -PID::MUON}});
 51      PromptFinalState muons(mu_id);
 52      DressedLeptons dressed_muons(photons, muons, 0.1, leptonCuts);
 53      declare(dressed_muons, "DressedMuons");
 54
 55      // Projection for jets
 56      VetoedFinalState fs_jets(fs);
 57      fs_jets.addVetoOnThisFinalState(dressed_muons);
 58      fs_jets.addVetoOnThisFinalState(dressed_electrons);
 59      fs_jets.vetoNeutrinos();
 60      declare(FastJets(fs_jets, FastJets::ANTIKT, 0.5), "ak5jets");
 61      declare(FastJets(fs_jets, FastJets::CAM, 0.8), "ca8jets");
 62
 63      if (_mode == 1) {
 64        book(_hEl_topPt_parton          , "d01-x01-y01"); // dsigma/dpt(top quark), el ch
 65        book(_hEl_topY_parton           , "d03-x01-y01"); // dsigma/dy(top quark), el ch
 66        book(_hMu_topPt_parton          , "d05-x01-y01"); // dsigma/dpt(top quark), mu ch
 67        book(_hMu_topY_parton           , "d07-x01-y01"); // dsigma/dy(top quark), mu ch
 68        book(_hComb_topPt_parton        , "d09-x01-y01"); // dsigma/dpt(top quark), comb ch
 69        book(_hComb_topY_parton         , "d11-x01-y01"); // dsigma/dy(top quark), comb ch
 70
 71        book(_hEl_topPt_parton_norm     , "d13-x01-y01"); // 1/sigma dsigma/dpt(top quark), el ch
 72        book(_hEl_topY_parton_norm      , "d15-x01-y01"); // 1/sigma dsigma/dy(top quark), el ch
 73        book(_hMu_topPt_parton_norm     , "d17-x01-y01"); // 1/sigma dsigma/dpt(top quark), mu ch
 74        book(_hMu_topY_parton_norm      , "d19-x01-y01"); // 1/sigma dsigma/dy(top quark), mu ch
 75        book(_hComb_topPt_parton_norm   , "d21-x01-y01"); // 1/sigma dsigma/dpt(top quark), comb ch
 76        book(_hComb_topY_parton_norm    , "d23-x01-y01"); // 1/sigma dsigma/dy(top quark), comb ch
 77      }
 78
 79      book(_hEl_topPt_particle        , "d02-x01-y01"); // dsigma/dpt(top jet), el ch
 80      book(_hEl_topY_particle         , "d04-x01-y01"); // dsigma/dy(top jet), el ch
 81      book(_hMu_topPt_particle        , "d06-x01-y01"); // dsigma/dpt(top jet), mu ch
 82      book(_hMu_topY_particle         , "d08-x01-y01"); // dsigma/dy(top jet), mu ch
 83      book(_hComb_topPt_particle      , "d10-x01-y01"); // dsigma/dpt(top jet), comb ch
 84      book(_hComb_topY_particle       , "d12-x01-y01"); // dsigma/dy(top jet), comb ch
 85      book(_hEl_topY_particle_norm    , "d16-x01-y01"); // 1/sigma dsigma/dy(top jet), el ch
 86      book(_hEl_topPt_particle_norm   , "d14-x01-y01"); // 1/sigma dsigma/dpt(top jet), el ch
 87      book(_hComb_topY_particle_norm  , "d24-x01-y01"); // 1/sigma dsigma/dy(top jet), comb ch
 88      book(_hMu_topPt_particle_norm   , "d18-x01-y01"); // 1/sigma dsigma/dpt(top jet), mu ch
 89      book(_hMu_topY_particle_norm    , "d20-x01-y01"); // 1/sigma dsigma/dy(top jet), mu ch
 90      book(_hComb_topPt_particle_norm , "d22-x01-y01"); // 1/sigma dsigma/dpt(top jet), comb ch
 91
 92      book(_hMu_cutflow , "mu_cutflow", 7, -0.5, 6.5);
 93      book(_hEl_cutflow , "el_cutflow", 7, -0.5, 6.5);
 94    }
 95
 96
 97    // per event analysis
 98    void analyze(const Event& event) {
 99
100       // Total-events cutflow entries
101      _hMu_cutflow->fill(0.);
102      _hEl_cutflow->fill(0.);
103
104      // Do parton-level selection and channel determination
105      // Note that channel determination relies on partonic info, even for the particle-level tops
106      int partonCh = 0; //0 non-semi-lep, 1 muon, 2 electron
107      const Particles muonpartontops = apply<ParticleFinder>(event, "MuonPartonTops").particlesByPt();
108      const Particles electronpartontops = apply<ParticleFinder>(event, "ElectronPartonTops").particlesByPt();
109      if (electronpartontops.size() == 0 && muonpartontops.size() == 1) partonCh = 1;
110      else if (electronpartontops.size() == 1 && muonpartontops.size() == 0) partonCh = 2;
111      else vetoEvent;
112      const Particles hadronicpartontops = apply<ParticleFinder>(event, "HadronicPartonTops").particlesByPt();
113      if (hadronicpartontops.size() != 1) vetoEvent;
114
115      if (partonCh == 1) _hMu_cutflow->fill(1.); // muon at parton level
116      if (partonCh == 2) _hEl_cutflow->fill(1.); // electron at parton level
117
118      // Get hadronic parton-level top
119      const FourMomentum& partonTopP4 = hadronicpartontops.front();
120
121      // Do particle-level selection and channel determination
122      const DressedLeptons& dressed_electrons = apply<DressedLeptons>(event, "DressedElectrons");
123      const DressedLeptons& dressed_muons = apply<DressedLeptons>(event, "DressedMuons");
124
125      bool passParticleLep = false, passParticleTop = false;
126      FourMomentum lepton, particleTopP4;
127
128      if (partonCh == 1 && dressed_muons.dressedLeptons().size() == 1 && dressed_electrons.dressedLeptons().size() == 0) {
129        passParticleLep = true;
130        _hMu_cutflow->fill(3.); //muon at particle level
131        lepton = dressed_muons.dressedLeptons()[0].momentum();
132      }
133      if (partonCh == 2 && dressed_muons.dressedLeptons().size() == 0 && dressed_electrons.dressedLeptons().size() == 1) {
134        passParticleLep = true;
135        _hEl_cutflow->fill(3.); //electron at particle level
136        lepton = dressed_electrons.dressedLeptons()[0].momentum();
137      }
138
139      if (passParticleLep) {
140
141        // Jet cuts
142        Cut jetCuts = Cuts::pt > 30*GeV && Cuts::abseta < 2.4;
143        Jets genBjets, genTjets;
144        int nGenBjets = 0, nGenTjets = 0;
145        
146        const FastJets& AK5jets = apply<FastJets>(event, "ak5jets");
147        for (const Jet& jet : AK5jets.jetsByPt(jetCuts)) {
148          if (deltaR(jet, lepton) > M_PI / 2.0) continue;
149          if (deltaR(jet, lepton) < 0.1) continue;
150          genBjets.push_back(jet);
151          nGenBjets += 1;
152        }
153        
154        const FastJets& CA8jets = apply<FastJets>(event, "ca8jets");
155        for (const Jet& jet : CA8jets.jetsByPt(jetCuts)) {
156          if (deltaR(jet, lepton) < M_PI / 2.0) continue;
157          if (jet.mass() < 140*GeV) continue;
158          if (jet.mass() > 250*GeV) continue;
159          genTjets.push_back(jet);
160          nGenTjets += 1;
161        }
162        
163        if (nGenBjets >=1) {
164          if (_mode == 1) {
165            if (partonCh == 1) _hMu_cutflow->fill(4.); // muon at parton level
166            if (partonCh == 2) _hEl_cutflow->fill(4.); // electron at parton level
167          }
168          if (nGenTjets >= 1) {
169            passParticleTop = true;
170            if (_mode == 1) {
171              if (partonCh == 1) _hMu_cutflow->fill(5.); // muon at parton level
172              if (partonCh == 2) _hEl_cutflow->fill(5.); // electron at parton level
173            }
174            particleTopP4 = genTjets[0];
175          }
176        }
177      }
178      
179      const double weight = 1.0;        
180      if (partonCh == 1) {
181        _nMu += weight;
182
183        if (_mode == 1) {
184          // protect against unphysical partons
185          if (partonTopP4.E() < 0) {
186            MSG_WARNING("Top parton with negative energy! Vetoing event. Try turning off partonic tops?");
187            vetoEvent;
188          }
189          
190          _hMu_topPt_parton->fill(partonTopP4.pT()/GeV, weight);
191          _hMu_topPt_parton_norm->fill(partonTopP4.pT()/GeV, weight);
192          _hComb_topPt_parton->fill(partonTopP4.pT()/GeV, weight);
193          _hComb_topPt_parton_norm->fill(partonTopP4.pT()/GeV, weight);
194          
195          if (partonTopP4.pT() >= 400*GeV) {
196            _nPassParton_mu += weight;
197            _hMu_cutflow->fill(2.);
198            _hMu_topY_parton->fill(partonTopP4.rapidity(), weight);
199            _hMu_topY_parton_norm->fill(partonTopP4.rapidity(), weight);
200            _hComb_topY_parton->fill(partonTopP4.rapidity(), weight);
201            _hComb_topY_parton_norm->fill(partonTopP4.rapidity(), weight);
202          }
203        }
204         
205        if (passParticleTop) {
206          _hMu_topPt_particle->fill(particleTopP4.pT()/GeV, weight);
207          _hMu_topPt_particle_norm->fill(particleTopP4.pT()/GeV, weight);
208          _hComb_topPt_particle->fill(particleTopP4.pT()/GeV, weight);
209          _hComb_topPt_particle_norm->fill(particleTopP4.pT()/GeV, weight);
210          
211          if (particleTopP4.pT() >= 400*GeV) {
212            _nPassParticle_mu += weight;
213            _hMu_cutflow->fill(6.);
214            _hMu_topY_particle->fill(particleTopP4.rapidity(), weight);
215            _hMu_topY_particle_norm->fill(particleTopP4.rapidity(), weight);
216            _hComb_topY_particle->fill(particleTopP4.rapidity(), weight);
217            _hComb_topY_particle_norm->fill(particleTopP4.rapidity(), weight);
218          }
219        }
220      }
221
222      if (partonCh == 2){
223        _nEl += weight;
224        if (_mode == 1) {
225          _hEl_topPt_parton->fill(partonTopP4.pT()/GeV, weight);
226          _hEl_topPt_parton_norm->fill(partonTopP4.pT()/GeV, weight);
227          _hComb_topPt_parton->fill(partonTopP4.pT()/GeV, weight);
228          _hComb_topPt_parton_norm->fill(partonTopP4.pT()/GeV, weight);
229          
230          if (partonTopP4.pT() >= 400*GeV) {
231            _nPassParton_el += weight;
232            _hEl_cutflow->fill(2.);
233            _hEl_topY_parton->fill(partonTopP4.rapidity(), weight);
234            _hEl_topY_parton_norm->fill(partonTopP4.rapidity(), weight);
235            _hComb_topY_parton->fill(partonTopP4.rapidity(), weight);
236            _hComb_topY_parton_norm->fill(partonTopP4.rapidity(), weight);
237          }
238        }
239      
240        if (passParticleTop) {
241          _hEl_topPt_particle->fill(particleTopP4.pT()/GeV, weight);
242          _hEl_topPt_particle_norm->fill(particleTopP4.pT()/GeV, weight);
243          _hComb_topPt_particle->fill(particleTopP4.pT()/GeV, weight);
244          _hComb_topPt_particle_norm->fill(particleTopP4.pT()/GeV, weight);
245          
246          if (particleTopP4.pT() >= 400*GeV) {
247            _nPassParticle_el += weight;
248            _hEl_cutflow->fill(6.);
249            _hEl_topY_particle->fill(particleTopP4.rapidity(), weight);
250            _hEl_topY_particle_norm->fill(particleTopP4.rapidity(), weight);
251            _hComb_topY_particle->fill(particleTopP4.rapidity(), weight);
252            _hComb_topY_particle_norm->fill(particleTopP4.rapidity(), weight);
253          }
254        }
255      }
256    }
257    
258    void finalize() {
259
260      normalize(_hMu_topPt_particle_norm); normalize(_hMu_topY_particle_norm); normalize(_hEl_topPt_particle_norm);
261      normalize(_hEl_topY_particle_norm); normalize(_hComb_topPt_particle_norm); normalize(_hComb_topY_particle_norm, 1.0, false);
262      
263      const double sf = crossSection() / femtobarn / sumOfWeights();
264      scale(_hMu_topPt_particle, sf);
265      scale(_hEl_topPt_particle, sf);
266      scale(_hMu_topY_particle, sf);
267      scale(_hEl_topY_particle, sf);
268      scale(_hComb_topPt_particle, sf);
269      scale(_hComb_topY_particle, sf);
270      
271      if (_mode == 1) {
272        normalize(_hMu_topPt_parton_norm); normalize(_hMu_topY_parton_norm); normalize(_hEl_topPt_parton_norm);
273        normalize(_hEl_topY_parton_norm); normalize(_hComb_topPt_parton_norm); normalize(_hComb_topY_parton_norm, 1.0, false);
274        scale(_hMu_topPt_parton, sf);
275        scale(_hEl_topPt_parton, sf);
276        scale(_hMu_topY_parton, sf);
277        scale(_hEl_topY_parton, sf);
278        scale(_hComb_topPt_parton, sf);
279        scale(_hComb_topY_parton, sf);
280      }
281    }
282
283  protected:
284
285    size_t _mode;
286
287  private:
288
289    Histo1DPtr _hMu_topPt_parton, _hMu_topY_parton, _hEl_topPt_parton, _hEl_topY_parton, _hComb_topPt_parton, _hComb_topY_parton;
290    Histo1DPtr _hMu_topPt_particle, _hMu_topY_particle, _hEl_topPt_particle, _hEl_topY_particle, _hComb_topPt_particle, _hComb_topY_particle;
291    Histo1DPtr _hMu_topPt_parton_norm, _hMu_topY_parton_norm, _hEl_topPt_parton_norm, _hEl_topY_parton_norm, _hComb_topPt_parton_norm, _hComb_topY_parton_norm;
292    Histo1DPtr _hMu_topPt_particle_norm, _hMu_topY_particle_norm, _hEl_topPt_particle_norm, _hEl_topY_particle_norm, _hComb_topPt_particle_norm, _hComb_topY_particle_norm;
293    Histo1DPtr _hMu_cutflow, _hEl_cutflow;
294
295    double _nMu = 0., _nEl = 0.;
296    double _nPassParton_mu = 0.,_nPassParton_el = 0.;
297    double _nPassParticle_mu = 0., _nPassParticle_el = 0.;
298
299  };
300
301
302  // The hook for the plugin system
303  RIVET_DECLARE_PLUGIN(CMS_2016_I1454211);
304
305}