Rivet analyses referenceATLAS_2015_I1397635$Wt$ at 8 TeVExperiment: ATLAS (LHC) Inspire ID: 1397635 Status: VALIDATED Authors:
Beam energies: (4000.0, 4000.0) GeV Run details:
Fiducial cross-section for $Wt+t\bar{t}$ production in events with two leptons and exactly one jet, using an integrated luminosity of 20.3 fb${}^{-1}$ of proton-proton collisions at a centre-of-mass energy of 8 TeV at the Large Hadron Collider, collected with the ATLAS detector. The cross-section for the production of a top quark and a $W$ boson is measured in a fiducial acceptance requiring two leptons with $p_\perp > 25$ GeV and $|\eta| < 2.5$, one jet with $p_\perp > 20$ GeV and $|\eta| < 2.5$, and $E^\text{miss}_\text{T} > 20$ GeV, including both $Wt$ and top-quark pair events as signal. The measured value of the fiducial cross-section is $0.85 \pm 0.01$ (stat.) $\pm 0.07$ (syst.) $\pm 0.03$ (lumi.) pb. Source code: ATLAS_2015_I1397635.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/VetoedFinalState.hh"
4#include "Rivet/Projections/IdentifiedFinalState.hh"
5#include "Rivet/Projections/PromptFinalState.hh"
6#include "Rivet/Projections/LeptonFinder.hh"
7#include "Rivet/Projections/FastJets.hh"
8
9namespace Rivet {
10
11
12 /// $Wt$ at 8 TeV
13 class ATLAS_2015_I1397635 : public Analysis {
14 public:
15
16 /// Constructor
17 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2015_I1397635);
18
19
20 void init() {
21
22 // Eta ranges
23 Cut eta_full = Cuts::abseta < 5.0 && Cuts::pT >= 1.0*MeV;
24 Cut eta_lep = Cuts::abseta < 2.5;
25
26 // All final state particles
27 FinalState fs(eta_full);
28
29 // Get photons to dress leptons
30 IdentifiedFinalState photons(fs);
31 photons.acceptIdPair(PID::PHOTON);
32
33 // Projection to find the electrons
34 IdentifiedFinalState el_id(fs);
35 el_id.acceptIdPair(PID::ELECTRON);
36 PromptFinalState electrons(el_id);
37 electrons.acceptTauDecays(true);
38 declare(electrons, "electrons");
39 LeptonFinder dressedelectrons(electrons, photons, 0.1, eta_lep && Cuts::pT > 25*GeV);
40 declare(dressedelectrons, "dressedelectrons");
41 LeptonFinder ewdressedelectrons(electrons, photons, 0.1, eta_full);
42
43 // Projection to find the muons
44 IdentifiedFinalState mu_id(fs);
45 mu_id.acceptIdPair(PID::MUON);
46 PromptFinalState muons(mu_id);
47 muons.acceptTauDecays(true);
48 declare(muons, "muons");
49 LeptonFinder dressedmuons(muons, photons, 0.1, eta_lep && Cuts::pT > 25*GeV);
50 declare(dressedmuons, "dressedmuons");
51 LeptonFinder ewdressedmuons(muons, photons, 0.1, eta_full);
52
53 // Projection to find neutrinos and produce MET
54 IdentifiedFinalState nu_id;
55 nu_id.acceptNeutrinos();
56 PromptFinalState neutrinos(nu_id);
57 neutrinos.acceptTauDecays(true);
58 declare(neutrinos, "neutrinos");
59
60 // Jet clustering.
61 VetoedFinalState vfs;
62 vfs.addVetoOnThisFinalState(ewdressedelectrons);
63 vfs.addVetoOnThisFinalState(ewdressedmuons);
64 vfs.addVetoOnThisFinalState(neutrinos);
65 FastJets jets(vfs,JetAlg::ANTIKT, 0.4);
66 jets.useInvisibles();
67 declare(jets, "jets");
68
69 book(_histo, 1, 1, 1);
70 }
71
72
73 void analyze(const Event& event) {
74
75 // Get the selected objects, using the projections.
76 DressedLeptons electrons = apply<LeptonFinder>(event, "dressedelectrons").dressedLeptons();
77 DressedLeptons muons = apply<LeptonFinder>(event, "dressedmuons").dressedLeptons();
78 // also make basic event selection cuts for leptons
79 if (electrons.empty() && muons.empty()) vetoEvent;
80 if (electrons.size() + muons.size() != 2) vetoEvent;
81
82 // next selection cuts for jets
83 const Jets jets = apply<FastJets>(event, "jets").jets(Cuts::pT>20*GeV && Cuts::abseta < 2.5, cmpMomByPt);
84 if (jets.size() != 1) vetoEvent;
85
86 // and selection cuts for b-tagging
87 Jets bjets;
88 // Check overlap of jets/leptons.
89 for (Jet jet : jets) {
90 // if dR(el,jet) < 0.4 skip the event
91 for (DressedLepton el : electrons) {
92 if (deltaR(jet, el) < 0.4) vetoEvent;
93 }
94 // if dR(mu,jet) < 0.4 skip the event
95 for (DressedLepton mu : muons) {
96 if (deltaR(jet, mu) < 0.4) vetoEvent;
97 }
98 // Count the number of b-tags
99 // We have to check that the ghost-matched B hadrons have pT > 5 GeV
100 // By default jet.bTags() returns all B hadrons without cuts
101 bool btagged = jet.bTags(Cuts::pT >= 5*GeV).size();
102 if (btagged) bjets += jet;
103 }
104 if (bjets.size() != 1) vetoEvent;
105
106 // Now evaluate MET selection
107 // Get the neutrinos from the event record (they have pT > 0.0 and |eta| < 4.5 at this stage
108 const Particles& neutrinos = apply<PromptFinalState>(event, "neutrinos").particlesByPt();
109 FourMomentum met;
110 for (const Particle& nu : neutrinos) met += nu.momentum();
111 if (met.pT() <= 20*GeV) vetoEvent;
112
113 // Make the plot
114 _histo->fill();
115 }
116
117
118 // Normalise histograms etc., after the run
119 void finalize() {
120 scale(_histo, crossSection() / femtobarn / sumOfWeights());
121 }
122
123
124 private:
125
126 CounterPtr _histo;
127
128 };
129
130
131 RIVET_DECLARE_PLUGIN(ATLAS_2015_I1397635);
132
133}
|