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 channel, using 20.3 fb of proton-proton collision data. The data were produced at a centre-of-mass energy of TeV at the CERN Large Hadron Collider and recorded by the ATLAS detector in 2012. Cross sections are measured from the observed 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}
|