Rivet analyses referenceATLAS_2013_I1219109W + b production at 7 TeVExperiment: ATLAS (LHC) Inspire ID: 1219109 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
Measurements of the W+b-jets ($W+b+X$ and $W+b\bar{b}+X$) production cross-section in proton-proton collisions at a centre-of-mass energy of 7 TeV at the LHC. These results are based on data corresponding to an integrated luminosity of 4.6 $fb^{-1}$, collected with the ATLAS detector. Cross-sections are presented as a function of jet multiplicity and of the transverse momentum of the leading b-jet for both the combined muon and electron decay modes of the W boson. The default routine will consider the average of electron and muon decay channel of the W boson. Use LMODE=EL and LMODE=MU to specify the decay channel directly. Source code: ATLAS_2013_I1219109.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/WFinder.hh"
5#include "Rivet/Projections/VetoedFinalState.hh"
6#include "Rivet/Projections/FastJets.hh"
7#include "Rivet/Projections/HeavyHadrons.hh"
8
9namespace Rivet {
10
11
12 /// @brief ATLAS W+b measurement
13 class ATLAS_2013_I1219109: public Analysis {
14 public:
15
16 ///@brief: Electroweak Wjj production at 8 TeV
17 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2013_I1219109);
18 //@}
19
20 void init() {
21
22 // Get options from the new option system
23 _mode = 0;
24 if ( getOption("LMODE") == "EL" ) _mode = 1;
25 if ( getOption("LMODE") == "MU" ) _mode = 2;
26
27 const FinalState fs;
28
29 Cut cuts = Cuts::abseta < 2.5 && Cuts::pT >= 25*GeV;
30
31 // W finder for electrons and muons
32 WFinder wf_mu(fs, cuts, PID::MUON, 0.0*GeV, DBL_MAX, 0.0, 0.1,
33 WFinder::ChargedLeptons::PROMPT, WFinder::ClusterPhotons::NODECAY, WFinder::AddPhotons::NO, WFinder::MassWindow::MT);
34 WFinder wf_el(fs, cuts, PID::ELECTRON, 0.0*GeV, DBL_MAX, 0.0, 0.1,
35 WFinder::ChargedLeptons::PROMPT, WFinder::ClusterPhotons::NODECAY, WFinder::AddPhotons::NO, WFinder::MassWindow::MT);
36 declare(wf_mu, "WFmu");
37 declare(wf_el, "WFel");
38
39 // jets
40 VetoedFinalState jet_fs(fs);
41 jet_fs.addVetoOnThisFinalState(wf_el);
42 jet_fs.addVetoOnThisFinalState(wf_mu);
43 FastJets fj(jet_fs, FastJets::ANTIKT, 0.4);
44 fj.useInvisibles();
45 declare(fj, "Jets");
46 declare(HeavyHadrons(Cuts::abseta < 2.5 && Cuts::pT > 5*GeV), "BHadrons");
47
48
49 // book histograms
50 book(_njet ,1, 1, 1); // dSigma / dNjet
51 book(_jet1_bPt ,3, 1, 1); // dSigma / dBjetPt for Njet = 1
52 book(_jet2_bPt ,8, 1, 1); // dSigma / dBjetPt for Njet = 2
53
54 }
55
56
57 void analyze(const Event& event) {
58
59 // retrieve W boson candidate
60 const WFinder& wf_mu = apply<WFinder>(event, "WFmu");
61 const WFinder& wf_el = apply<WFinder>(event, "WFel");
62
63 size_t nWmu = wf_mu.size();
64 size_t nWel = wf_el.size();
65
66 if (_mode == 0 && !((nWmu == 1 && !nWel) || (!nWmu && nWel == 1))) vetoEvent; // one W->munu OR W->elnu candidate, otherwise veto
67 if (_mode == 1 && !(!nWmu && nWel == 1)) vetoEvent; // one W->elnu candidate, otherwise veto
68 if (_mode == 2 && !(nWmu == 1 && !nWel)) vetoEvent; // one W->munu candidate, otherwise veto
69
70
71 if ( (nWmu? wf_mu : wf_el).bosons().size() != 1 ) vetoEvent; // only one W boson candidate
72 if ( !((nWmu? wf_mu : wf_el).mT() > 60.0*GeV) ) vetoEvent;
73 //const Particle& Wboson = wf.boson();
74
75
76 // retrieve constituent neutrino
77 const Particle& neutrino = (nWmu? wf_mu : wf_el).constituentNeutrino();
78 if( !(neutrino.pT() > 25*GeV) ) vetoEvent;
79
80 // retrieve constituent lepton
81 const Particle& lepton = (nWmu? wf_mu : wf_el).constituentLepton();
82
83 // count good jets, check if good jet contains B hadron
84 const Particles& bHadrons = apply<HeavyHadrons>(event, "BHadrons").bHadrons();
85 const Jets& jets = apply<JetAlg>(event, "Jets").jetsByPt(25*GeV);
86 int goodjets = 0, bjets = 0;
87 double bPt = 0.;
88 for(const Jet& j : jets) {
89 if( (j.abseta() < 2.1) && (deltaR(lepton, j) > 0.5) ) {
90 // this jet passes the selection!
91 ++goodjets;
92 // j.bTagged() uses ghost association which is
93 // more elegant, but not what has been used in
94 // this analysis originally, will match B had-
95 // rons in eta-phi space instead
96 for(const Particle& b : bHadrons) {
97 if( deltaR(j, b) < 0.3 ) {
98 // jet matched to B hadron!
99 if(!bPt) bPt = j.pT() * GeV; // leading b-jet pT
100 ++bjets; // count number of b-jets
101 break;
102 }
103 }
104 }
105 }
106 if( goodjets > 2 ) vetoEvent; // at most two jets
107 if( !bjets ) vetoEvent; // at least one of them b-tagged
108
109 double njets = double(goodjets);
110 double ncomb = 3.0;
111 _njet->fill(njets);
112 _njet->fill(ncomb);
113
114 if( goodjets == 1) _jet1_bPt->fill(bPt);
115 else if(goodjets == 2) _jet2_bPt->fill(bPt);
116 }
117
118
119 void finalize() {
120 const double sf = _mode? 1.0 : 0.5;
121 const double xs_pb = sf * crossSection() / picobarn / sumOfWeights();
122 const double xs_fb = sf * crossSection() / femtobarn / sumOfWeights();
123 scale(_njet, xs_pb);
124 scale(_jet1_bPt, xs_fb);
125 scale(_jet2_bPt, xs_fb);
126 }
127
128 protected:
129
130 size_t _mode;
131
132 private:
133
134 Histo1DPtr _njet;
135 Histo1DPtr _jet1_bPt;
136 Histo1DPtr _jet2_bPt;
137
138 //bool _isMuon;
139
140 };
141
142
143 // The hook for the plugin system
144 RIVET_DECLARE_PLUGIN(ATLAS_2013_I1219109);
145
146}
|