Rivet analyses referenceATLAS_2013_I1217863W/Z + gamma production at 7 TeVExperiment: ATLAS (LHC) Inspire ID: 1217863 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
Measurements of the differential fiducial cross sections for the production of a W or Z boson in association with a high-energy photon are measured using pp collisions at $\sqrt{s}=7 \text{TeV}$. The analysis uses a data sample with an integrated luminosity of 4.6/fb collected by the ATLAS detector during the 2011 LHC data-taking period. Events are selected using leptonic decays of the W or Z bosons with the requirement of an associated isolated photon. The default routine will consider the electron decay channel of the Z boson. Use LMODE to specify the decay channel directly. Source code: ATLAS_2013_I1217863.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/PromptFinalState.hh"
5#include "Rivet/Projections/MissingMomentum.hh"
6#include "Rivet/Projections/LeptonFinder.hh"
7#include "Rivet/Projections/DileptonFinder.hh"
8#include "Rivet/Projections/VetoedFinalState.hh"
9#include "Rivet/Projections/LeadingParticlesFinalState.hh"
10#include "Rivet/Projections/FastJets.hh"
11
12namespace Rivet {
13
14
15 /// Electroweak Wjj production at 8 TeV
16 class ATLAS_2013_I1217863 : public Analysis {
17 public:
18
19 /// Constructor
20 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2013_I1217863);
21
22
23 /// @name Analysis methods
24 /// @{
25
26 /// Book histograms and initialise projections before the run
27 void init() {
28
29 // Get modes from the option system
30 _mode = 2;
31 _doZ = true;
32 _doW = true;
33 if ( getOption("LMODE") == "EL" ) { _mode = 2;}
34 if ( getOption("LMODE") == "MU" ) _mode = 3;
35 if ( getOption("LMODE") == "ZEL" ) {
36 _mode = 2;
37 _doW = false;
38 }
39 if ( getOption("LMODE") == "ZMU" ) {
40 _mode = 3;
41 _doW = false;
42 }
43 if ( getOption("LMODE") == "WEL" ) {
44 _mode = 2;
45 _doZ = false;
46 }
47 if ( getOption("LMODE") == "WMU" ) {
48 _mode = 3;
49 _doZ = false;
50 }
51
52 Cut cuts = Cuts::abseta < 2.47 && Cuts::pT > 25*GeV;
53 VetoedFinalState jet_fs;
54
55 // Z finder
56 if (_doZ) {
57 DileptonFinder zf(91.2*GeV, 0.1, cuts && Cuts::abspid == (_mode == 3 ? PID::MUON : PID::ELECTRON), Cuts::massIn(40.0*GeV, 1000.0*GeV));
58 declare(zf, "ZF");
59 jet_fs.addVetoOnThisFinalState(zf);
60 }
61
62 if (_doW) {
63 // W finder
64 declare("MET", MissingMomentum());
65 LeptonFinder lf(0.1, cuts && Cuts::abspid == (_mode==3? PID::MUON : PID::ELECTRON));
66 declare(lf, "Leptons");
67 jet_fs.addVetoOnThisFinalState(lf);
68 }
69
70 // Leading photon
71 LeadingParticlesFinalState photonfs(FinalState(Cuts::abseta < 2.37 && Cuts::pT > 15*GeV));
72 photonfs.addParticleId(PID::PHOTON);
73 declare(photonfs, "LeadingPhoton");
74 jet_fs.addVetoOnThisFinalState(photonfs);
75
76 // Jets
77 FastJets jets(jet_fs, JetAlg::ANTIKT, 0.4, JetMuons::ALL, JetInvisibles::NONE);
78 declare(jets, "Jets");
79
80 // FS excluding only the leading photon
81 VetoedFinalState vfs;
82 vfs.addVetoOnThisFinalState(photonfs);
83 declare(vfs, "isolatedFS");
84
85
86 // Book histograms
87 if (_doZ) {
88 book(_hist_EgammaT_inclZ ,11, 1, _mode); // dSigma / dE^gamma_T for Njet >= 0
89 book(_hist_EgammaT_exclZ ,12, 1, _mode); // dSigma / dE^gamma_T for Njet = 0
90 book(_hist_Njet_EgammaT15Z ,17, 1, _mode); // dSigma / dNjet for E^gamma_T >= 15
91 book(_hist_Njet_EgammaT60Z ,18, 1, _mode); // dSigma / dNjet for E^gamma_T >= 60
92 book(_hist_mZgamma ,20, 1, _mode); // dSigma / dm^{Zgamma}
93 }
94 if (_doW){
95 book(_hist_EgammaT_inclW , 7, 1, _mode); // dSigma / dE^gamma_T for Njet >= 0
96 book(_hist_EgammaT_exclW , 8, 1, _mode); // dSigma / dE^gamma_T for Njet = 0
97 book(_hist_Njet_EgammaT15W ,15, 1, _mode); // dSigma / dNjet for E^gamma_T >= 15
98 book(_hist_Njet_EgammaT60W ,16, 1, _mode); // dSigma / dNjet for E^gamma_T >= 60
99 book(_hist_mWgammaT ,19, 1, _mode); // dSigma / dm^{Zgamma}
100 }
101 }
102
103
104 /// Perform the per-event analysis
105 void analyze(const Event& event) {
106
107 // Retrieve leading photon
108 Particles photons = apply<LeadingParticlesFinalState>(event, "LeadingPhoton").particles();
109 if (photons.size() != 1) vetoEvent;
110 const Particle& leadingPhoton = photons[0];
111 if (leadingPhoton.Et() < 15.0*GeV) vetoEvent;
112 if (leadingPhoton.abseta() > 2.37) vetoEvent;
113
114 // Check photon isolation
115 double coneEnergy(0.0);
116 Particles fs = apply<VetoedFinalState>(event, "isolatedFS").particles();
117 for (const Particle& p : fs) {
118 if ( deltaR(leadingPhoton, p) < 0.4 ) coneEnergy += p.E();
119 }
120 if (coneEnergy / leadingPhoton.E() >= 0.5 ) vetoEvent;
121
122 if (_doW) {
123 // Retrieve W boson candidate
124 const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
125 if (pmiss.pT() > 35*GeV) {
126
127 const Particles& ls = apply<LeptonFinder>(event, "Leptons").particles();
128 const int ifound = closestMatchIndex(ls, pmiss, Kin::mass, 80.4*GeV);
129 if (ifound >= 0) {
130
131 // Retrieve constituent lepton
132 const Particle& lepton = ls[ifound];
133 if ( lepton.pT() > 25.0*GeV && lepton.abseta() < 2.47 ) { //< redundant cut
134
135 // Check photon-lepton overlap
136 if ( deltaR(leadingPhoton, lepton) > 0.7 ) {
137
138 // Count jets
139 const FastJets& jetfs = apply<FastJets>(event, "Jets");
140 Jets jets = jetfs.jets(cmpMomByEt);
141 int goodJets = 0;
142 for (const Jet& j : jets) {
143 if ( !(j.Et() > 30.0*GeV) ) break;
144 if ( (j.abseta() < 4.4) && \
145 (deltaR(leadingPhoton, j) > 0.3) && \
146 (deltaR(lepton, j) > 0.3) ) ++goodJets;
147 }
148
149 double Njets = double(goodJets) + 0.5;
150 double photonEt = leadingPhoton.Et()*GeV;
151
152 const FourMomentum& lep_gamma = lepton.momentum() + leadingPhoton.momentum();
153 double term1 = sqrt(lep_gamma.mass2() + lep_gamma.pT2()) + pmiss.Et();
154 double term2 = (lep_gamma + pmiss).pT2();
155 double mWgammaT = sqrt(term1 * term1 - term2) * GeV;
156
157 _hist_EgammaT_inclW->fill(photonEt);
158
159 _hist_Njet_EgammaT15W->fill(Njets);
160
161 if ( !goodJets ) _hist_EgammaT_exclW->fill(photonEt);
162
163 if (photonEt > 40.0*GeV) {
164 _hist_mWgammaT->fill(mWgammaT);
165 if (photonEt > 60.0*GeV) _hist_Njet_EgammaT60W->fill(Njets);
166 }
167 }
168 }
169 }
170 }
171 }
172
173 if (_doZ ) {
174
175 // Retrieve Z boson candidate
176 const DileptonFinder& zf = apply<DileptonFinder>(event, "ZF");
177 if ( zf.bosons().size() == 1 ) {
178 const Particle& Zboson = zf.boson();
179 if ( (Zboson.mass() > 40.0*GeV) ) {
180
181 // Check charge of constituent leptons
182 const Particles& leptons = zf.constituents();
183 if (leptons.size() == 2 && leptons[0].charge() * leptons[1].charge() < 0.) {
184
185 bool lpass = true;
186 // Check photon-lepton overlap
187 for (const Particle& p : leptons) {
188 if ( !(p.pT() > 25.0*GeV && p.abseta() < 2.47 && deltaR(leadingPhoton, p) > 0.7) ) lpass = false;
189 }
190 if ( lpass ) {
191
192 // Count jets
193 const FastJets& jetfs = apply<FastJets>(event, "Jets");
194 Jets jets = jetfs.jets(cmpMomByEt);
195 int goodJets = 0;
196 for (const Jet& j : jets) {
197 if ( !(j.Et() > 30.0*GeV) ) break;
198 if ( (j.abseta() < 4.4) && \
199 (deltaR(leadingPhoton, j) > 0.3) && \
200 (deltaR(leptons[0], j) > 0.3) && \
201 (deltaR(leptons[1], j) > 0.3) ) ++goodJets;
202 }
203
204 double Njets = double(goodJets) + 0.5;
205 double photonEt = leadingPhoton.Et()*GeV;
206 double mZgamma = (Zboson.momentum() + leadingPhoton.momentum()).mass() * GeV;
207
208 _hist_EgammaT_inclZ->fill(photonEt);
209
210 _hist_Njet_EgammaT15Z->fill(Njets);
211
212 if ( !goodJets ) _hist_EgammaT_exclZ->fill(photonEt);
213
214 if (photonEt >= 40.0*GeV) {
215 _hist_mZgamma->fill(mZgamma);
216 if (photonEt >= 60.0*GeV) _hist_Njet_EgammaT60Z->fill(Njets);
217 }
218 }
219 }
220 }
221 }
222 }
223
224 }
225
226
227 /// Normalise histograms etc., after the run
228 void finalize() {
229
230 const double xs_fb = crossSection()/femtobarn;
231 const double sumw = sumOfWeights();
232 const double sf = xs_fb / sumw;
233
234 if (_doZ) {
235 scale(_hist_EgammaT_exclZ, sf);
236 scale(_hist_EgammaT_inclZ, sf);
237 normalize(_hist_Njet_EgammaT15Z);
238 normalize(_hist_Njet_EgammaT60Z);
239 normalize(_hist_mZgamma);
240 }
241
242 if (_doW) {
243 scale(_hist_EgammaT_exclW, sf);
244 scale(_hist_EgammaT_inclW, sf);
245 normalize(_hist_Njet_EgammaT15W);
246 normalize(_hist_Njet_EgammaT60W);
247 normalize(_hist_mWgammaT);
248 }
249
250 }
251
252 /// @}
253
254 private:
255
256 size_t _mode;
257 bool _doW;
258 bool _doZ;
259
260 /// @name Histograms
261 /// @{
262 Histo1DPtr _hist_EgammaT_inclZ;
263 Histo1DPtr _hist_EgammaT_exclZ;
264 Histo1DPtr _hist_Njet_EgammaT15Z;
265 Histo1DPtr _hist_Njet_EgammaT60Z;
266 Histo1DPtr _hist_mZgamma;
267 //
268 Histo1DPtr _hist_EgammaT_inclW;
269 Histo1DPtr _hist_EgammaT_exclW;
270 Histo1DPtr _hist_Njet_EgammaT15W;
271 Histo1DPtr _hist_Njet_EgammaT60W;
272 Histo1DPtr _hist_mWgammaT;
273 /// @}
274
275 };
276
277
278 RIVET_DECLARE_PLUGIN(ATLAS_2013_I1217863);
279
280}
|