Rivet analyses referenceCMS_2016_I1454211Boosted $t\bar{t}$ in $pp$ collisions at $\sqrt{s} = 8 \text{TeV}$Experiment: CMS (LHC) Inspire ID: 1454211 Status: VALIDATED Authors:
Beam energies: (4000.0, 4000.0) GeV Run details:
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{R(e/\mu,\mathrm{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/LeptonFinder.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(TopDecay::ELECTRON, PromptEMuFromTau::NO), "ElectronPartonTops");
37 declare(PartonicTops(TopDecay::MUON, PromptEMuFromTau::NO), "MuonPartonTops");
38 declare(PartonicTops(TopDecay::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 LeptonFinder dressed_electrons(electrons, photons, 0.1, leptonCuts);
48 declare(dressed_electrons, "DressedElectrons");
49
50 IdentifiedFinalState mu_id(fs, {{PID::MUON, -PID::MUON}});
51 PromptFinalState muons(mu_id);
52 LeptonFinder dressed_muons(muons, photons, 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, JetAlg::ANTIKT, 0.5), "ak5jets");
61 declare(FastJets(fs_jets, JetAlg::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 LeptonFinder& dressed_electrons = apply<LeptonFinder>(event, "DressedElectrons");
123 const LeptonFinder& dressed_muons = apply<LeptonFinder>(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 if (partonCh == 1) {
180
181 if (_mode == 1) {
182 // protect against unphysical partons
183 if (partonTopP4.E() < 0) {
184 MSG_WARNING("Top parton with negative energy! Vetoing event. Try turning off partonic tops?");
185 vetoEvent;
186 }
187
188 _hMu_topPt_parton->fill(partonTopP4.pT()/GeV);
189 _hMu_topPt_parton_norm->fill(partonTopP4.pT()/GeV);
190 _hComb_topPt_parton->fill(partonTopP4.pT()/GeV);
191 _hComb_topPt_parton_norm->fill(partonTopP4.pT()/GeV);
192
193 if (partonTopP4.pT() >= 400*GeV) {
194 _hMu_cutflow->fill(2.);
195 _hMu_topY_parton->fill(partonTopP4.rapidity());
196 _hMu_topY_parton_norm->fill(partonTopP4.rapidity());
197 _hComb_topY_parton->fill(partonTopP4.rapidity());
198 _hComb_topY_parton_norm->fill(partonTopP4.rapidity());
199 }
200 }
201
202 if (passParticleTop) {
203 _hMu_topPt_particle->fill(particleTopP4.pT()/GeV);
204 _hMu_topPt_particle_norm->fill(particleTopP4.pT()/GeV);
205 _hComb_topPt_particle->fill(particleTopP4.pT()/GeV);
206 _hComb_topPt_particle_norm->fill(particleTopP4.pT()/GeV);
207
208 if (particleTopP4.pT() >= 400*GeV) {
209 _hMu_cutflow->fill(6.);
210 _hMu_topY_particle->fill(particleTopP4.rapidity());
211 _hMu_topY_particle_norm->fill(particleTopP4.rapidity());
212 _hComb_topY_particle->fill(particleTopP4.rapidity());
213 _hComb_topY_particle_norm->fill(particleTopP4.rapidity());
214 }
215 }
216 }
217
218 if (partonCh == 2){
219 if (_mode == 1) {
220 _hEl_topPt_parton->fill(partonTopP4.pT()/GeV);
221 _hEl_topPt_parton_norm->fill(partonTopP4.pT()/GeV);
222 _hComb_topPt_parton->fill(partonTopP4.pT()/GeV);
223 _hComb_topPt_parton_norm->fill(partonTopP4.pT()/GeV);
224
225 if (partonTopP4.pT() >= 400*GeV) {
226 _hEl_cutflow->fill(2.);
227 _hEl_topY_parton->fill(partonTopP4.rapidity());
228 _hEl_topY_parton_norm->fill(partonTopP4.rapidity());
229 _hComb_topY_parton->fill(partonTopP4.rapidity());
230 _hComb_topY_parton_norm->fill(partonTopP4.rapidity());
231 }
232 }
233
234 if (passParticleTop) {
235 _hEl_topPt_particle->fill(particleTopP4.pT()/GeV);
236 _hEl_topPt_particle_norm->fill(particleTopP4.pT()/GeV);
237 _hComb_topPt_particle->fill(particleTopP4.pT()/GeV);
238 _hComb_topPt_particle_norm->fill(particleTopP4.pT()/GeV);
239
240 if (particleTopP4.pT() >= 400*GeV) {
241 _hEl_cutflow->fill(6.);
242 _hEl_topY_particle->fill(particleTopP4.rapidity());
243 _hEl_topY_particle_norm->fill(particleTopP4.rapidity());
244 _hComb_topY_particle->fill(particleTopP4.rapidity());
245 _hComb_topY_particle_norm->fill(particleTopP4.rapidity());
246 }
247 }
248 }
249 }
250
251 void finalize() {
252
253 normalize(_hMu_topPt_particle_norm); normalize(_hMu_topY_particle_norm); normalize(_hEl_topPt_particle_norm);
254 normalize(_hEl_topY_particle_norm); normalize(_hComb_topPt_particle_norm); normalize(_hComb_topY_particle_norm, 1.0, false);
255
256 const double sf = crossSection() / femtobarn / sumOfWeights();
257 scale(_hMu_topPt_particle, sf);
258 scale(_hEl_topPt_particle, sf);
259 scale(_hMu_topY_particle, sf);
260 scale(_hEl_topY_particle, sf);
261 scale(_hComb_topPt_particle, sf);
262 scale(_hComb_topY_particle, sf);
263
264 if (_mode == 1) {
265 normalize(_hMu_topPt_parton_norm); normalize(_hMu_topY_parton_norm); normalize(_hEl_topPt_parton_norm);
266 normalize(_hEl_topY_parton_norm); normalize(_hComb_topPt_parton_norm); normalize(_hComb_topY_parton_norm, 1.0, false);
267 scale(_hMu_topPt_parton, sf);
268 scale(_hEl_topPt_parton, sf);
269 scale(_hMu_topY_parton, sf);
270 scale(_hEl_topY_parton, sf);
271 scale(_hComb_topPt_parton, sf);
272 scale(_hComb_topY_parton, sf);
273 }
274 }
275
276 protected:
277
278 size_t _mode;
279
280 private:
281
282 Histo1DPtr _hMu_topPt_parton, _hMu_topY_parton, _hEl_topPt_parton, _hEl_topY_parton, _hComb_topPt_parton, _hComb_topY_parton;
283 Histo1DPtr _hMu_topPt_particle, _hMu_topY_particle, _hEl_topPt_particle, _hEl_topY_particle, _hComb_topPt_particle, _hComb_topY_particle;
284 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;
285 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;
286 Histo1DPtr _hMu_cutflow, _hEl_cutflow;
287
288 };
289
290
291 RIVET_DECLARE_PLUGIN(CMS_2016_I1454211);
292
293}
|