Rivet analyses referenceATLAS_2016_I1444991Higgs-to-WW differential cross sections at 8 TeVExperiment: ATLAS (LHC) Inspire ID: 1444991 Status: VALIDATED Authors:
Beam energies: (4000.0, 4000.0) GeV Run details:
This paper describes a measurement of fiducial and differential cross sections of gluon-fusion Higgs boson production in the $H\rightarrow W W^\ast \rightarrow e\nu\mu\nu$ channel, using 20.3 fb$^{-1}$ of proton-proton collision data. The data were produced at a centre-of-mass energy of $\sqrt{s} = 8$ TeV at the CERN Large Hadron Collider and recorded by the ATLAS detector in 2012. Cross sections are measured from the observed $H\rightarrow W W^\ast \rightarrow e\nu\mu\nu$ signal yield in categories distinguished by the number of associated jets. The total cross section is measured in a fiducial region defined by the kinematic properties of the charged leptons and neutrinos. Differential cross sections are reported as a function of the number of jets, the Higgs boson transverse momentum, the dilepton rapidity, and the transverse momentum of the leading jet. The jet-veto efficiency, or fraction of events with no jets above a given transverse momentum threshold, is also reported. All measurements are compared to QCD predictions from Monte Carlo generators and fixed-order calculations, and are in agreement with the Standard Model predictions. Source code: ATLAS_2016_I1444991.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/LeptonFinder.hh"
5#include "Rivet/Projections/IdentifiedFinalState.hh"
6#include "Rivet/Projections/PromptFinalState.hh"
7#include "Rivet/Projections/VetoedFinalState.hh"
8#include "Rivet/Projections/FastJets.hh"
9#include "Rivet/Projections/VisibleFinalState.hh"
10
11namespace Rivet {
12
13
14 /// Higgs-to-WW differential cross sections at 8 TeV
15 class ATLAS_2016_I1444991 : public Analysis {
16 public:
17
18 /// Constructor
19 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_I1444991);
20
21
22 /// Book histograms and initialise projections before the run
23 void init() {
24
25 // All particles within |eta| < 5.0
26 const FinalState FS(Cuts::abseta < 5.0);
27
28 // Project photons for dressing
29 IdentifiedFinalState photon_id(FS);
30 photon_id.acceptIdPair(PID::PHOTON);
31
32 // Project dressed electrons with pT > 15 GeV and |eta| < 2.47
33 IdentifiedFinalState el_id(FS);
34 el_id.acceptIdPair(PID::ELECTRON);
35 PromptFinalState el_bare(el_id);
36 Cut cuts = (Cuts::abseta < 2.47) && ( (Cuts::abseta <= 1.37) || (Cuts::abseta >= 1.52) ) && (Cuts::pT > 15*GeV);
37 LeptonFinder el_dressed_FS(el_bare, photon_id, 0.1, cuts);
38 declare(el_dressed_FS,"EL_DRESSED_FS");
39
40 // Project dressed muons with pT > 15 GeV and |eta| < 2.5
41 IdentifiedFinalState mu_id(FS);
42 mu_id.acceptIdPair(PID::MUON);
43 PromptFinalState mu_bare(mu_id);
44 LeptonFinder mu_dressed_FS(mu_bare, photon_id, 0.1, Cuts::abseta < 2.5 && Cuts::pT > 15*GeV);
45 declare(mu_dressed_FS,"MU_DRESSED_FS");
46
47 // get MET from generic invisibles
48 VetoedFinalState inv_fs(FS);
49 inv_fs.addVetoOnThisFinalState(VisibleFinalState(FS));
50 declare(inv_fs, "InvisibleFS");
51
52 // Project jets
53 FastJets jets(FS, JetAlg::ANTIKT, 0.4);
54 jets.useInvisibles(JetInvisibles::NONE);
55 jets.useMuons(JetMuons::NONE);
56 declare(jets, "jets");
57
58 // Book histograms
59 book(_h_Njets , 2,1,1);
60 book(_h_PtllMET , 3,1,1);
61 book(_h_Yll , 4,1,1);
62 book(_h_PtLead , 5,1,1);
63 book(_h_Njets_norm , 6,1,1);
64 book(_h_PtllMET_norm , 7,1,1);
65 book(_h_Yll_norm , 8,1,1);
66 book(_h_PtLead_norm , 9,1,1);
67 book(_h_JetVeto , 10, 1, 1);
68
69 //histos for jetveto
70 std::vector<double> ptlead25_bins = { 0., 25., 300. };
71 std::vector<double> ptlead40_bins = { 0., 40., 300. };
72 book(_h_pTj1_sel25 , "pTj1_sel25", ptlead25_bins);
73 book(_h_pTj1_sel40 , "pTj1_sel40", ptlead40_bins);
74 }
75
76
77 /// Perform the per-event analysis
78 void analyze(const Event& event) {
79
80 // Get final state particles
81 const FinalState& ifs = apply<FinalState>(event, "InvisibleFS");
82 const DressedLeptons& good_mu = apply<LeptonFinder>(event, "MU_DRESSED_FS").dressedLeptons();
83 const DressedLeptons& el_dressed = apply<LeptonFinder>(event, "EL_DRESSED_FS").dressedLeptons();
84 const Jets& jets = apply<FastJets>(event, "jets").jetsByPt(Cuts::pT>25*GeV && Cuts::abseta < 4.5);
85
86 //find good electrons
87 DressedLeptons good_el;
88 for (const DressedLepton& el : el_dressed){
89 bool keep = true;
90 for (const DressedLepton& mu : good_mu) {
91 keep &= deltaR(el, mu) >= 0.1;
92 }
93 if (keep) good_el += el;
94 }
95
96 // select only emu events
97 if ((good_el.size() != 1) || good_mu.size() != 1) vetoEvent;
98
99 //built dilepton
100 FourMomentum dilep = good_el[0].momentum() + good_mu[0].momentum();
101 double Mll = dilep.mass();
102 double Yll = dilep.rapidity();
103 double DPhill = fabs(deltaPhi(good_el[0], good_mu[0]));
104 double pTl1 = (good_el[0].pT() > good_mu[0].pT())? good_el[0].pT() : good_mu[0].pT();
105
106 //get MET
107 FourMomentum met;
108 for (const Particle& p : ifs.particles()) met += p.momentum();
109
110 // do a few cuts before looking at jets
111 if (pTl1 <= 22. || DPhill >= 1.8 || met.pT() <= 20.) vetoEvent;
112 if (Mll <= 10. || Mll >= 55.) vetoEvent;
113
114 Jets jets_selected;
115 for (const Jet &j : jets) {
116 if( j.abseta() > 2.4 && j.pT()<=30*GeV ) continue;
117 bool keep = true;
118 for(DressedLepton el : good_el) {
119 keep &= deltaR(j, el) >= 0.3;
120 }
121 if (keep) jets_selected += j;
122 }
123
124 double PtllMET = (met + good_el[0].momentum() + good_mu[0].momentum()).pT();
125
126 double Njets = jets_selected.size() > 2 ? 2 : jets_selected.size();
127 double pTj1 = jets_selected.size()? jets_selected[0].pT() : 0.1;
128
129 // Fill histograms
130 _h_Njets->fill(Njets);
131 _h_PtllMET->fill(PtllMET);
132 _h_Yll->fill(fabs(Yll));
133 _h_PtLead->fill(pTj1);
134 _h_Njets_norm->fill(Njets);
135 _h_PtllMET_norm->fill(PtllMET);
136 _h_Yll_norm->fill(fabs(Yll));
137 _h_PtLead_norm->fill(pTj1);
138 _h_pTj1_sel25->fill(pTj1);
139 _h_pTj1_sel40->fill(pTj1);
140 }
141
142
143 /// Normalise histograms etc., after the run
144 void finalize() {
145
146 const double xs = crossSectionPerEvent()/femtobarn;
147
148 /// @todo Normalise, scale and otherwise manipulate histograms here
149 scale(_h_Njets, xs);
150 scale(_h_PtllMET, xs);
151 scale(_h_Yll, xs);
152 scale(_h_PtLead, xs);
153 normalize(_h_Njets_norm);
154 normalize(_h_PtllMET_norm);
155 normalize(_h_Yll_norm);
156 normalize(_h_PtLead_norm);
157 scale(_h_pTj1_sel25, xs);
158 scale(_h_pTj1_sel40, xs);
159 normalize(_h_pTj1_sel25);
160 normalize(_h_pTj1_sel40);
161 // fill jet veto efficiency histogram
162 _h_JetVeto->bin(1).set(_h_pTj1_sel25->bin(1).sumW(), _h_pTj1_sel25->bin(1).errW());
163 _h_JetVeto->bin(2).set(_h_PtLead_norm->bin(1).sumW(), _h_PtLead_norm->bin(1).errW());
164 _h_JetVeto->bin(3).set(_h_pTj1_sel40->bin(1).sumW(), _h_pTj1_sel25->bin(1).errW());
165
166 scale(_h_PtLead_norm , 1000.); // curveball unit change in HepData, just for this one
167 scale(_h_PtllMET_norm, 1000.); // curveball unit change in HepData, and this one
168 }
169
170 private:
171
172 /// @name Histograms
173 /// @{
174 Histo1DPtr _h_Njets;
175 Histo1DPtr _h_PtllMET;
176 Histo1DPtr _h_Yll;
177 Histo1DPtr _h_PtLead;
178 Histo1DPtr _h_Njets_norm;
179 Histo1DPtr _h_PtllMET_norm;
180 Histo1DPtr _h_Yll_norm;
181 Histo1DPtr _h_PtLead_norm;
182
183 Estimate1DPtr _h_JetVeto;
184
185 Histo1DPtr _h_pTj1_sel25;
186 Histo1DPtr _h_pTj1_sel40;
187
188 };
189
190
191 RIVET_DECLARE_PLUGIN(ATLAS_2016_I1444991);
192
193}
|