Rivet analyses referenceATLAS_2016_I1426523Measurement of the $WZ$ production cross section at 8 TeVExperiment: ATLAS (LHC) Inspire ID: 1426523 Status: VALIDATED Authors:
Beam energies: (4000.0, 4000.0) GeV Run details:
This paper presents measurements of $W^\pm Z$ production in pp collisions at a center-of-mass energy of 8 TeV. The gauge bosons are reconstructed using their leptonic decay modes into electrons and muons. The data were collected in 2012 by the ATLAS experiment at the Large Hadron Collider and correspond to an integrated luminosity of 20.3 fb${}^{-1}$. The measured inclusive cross section in the detector fiducial region is $\sigma(W^\pm Z\to \ell^\prime\nu\ell\ell) = 35.1\pm 0.9$(stat)$\pm 0.8$(sys)$\pm 0.8$(lumi) fb, for one leptonic decay channel. In comparison, the next-to-leading-order Standard Model expectation is $30.0\pm 2.1$ fb. Cross sections for $W^+ Z$ and $W^- Z$ production and their ratio are presented as well as differential cross sections for several kinematic observables. Limits on anomalous triple gauge boson couplings are derived from the transverse mass spectrum of the $W^\pm Z$ system. From the analysis of events with a $W$ and a $Z$ boson associated with two or more forward jets an upper limit at 95% confidence level on the $W^\pm Z$ scattering cross section of 0.63 fb, for each leptonic decay channel, is established, while the Standard Model prediction at next-to-leading order is $0.13\pm 0.01$ fb. Limits on anomalous quartic gauge boson couplings are also extracted. For distributions that include the infinity symbol ($\infty$) on the horizontal axis, the last bin will include the events from the overflow bin. Users should note that explicit matching of lepton flavour between individual SM neutrinos and charged leptons is used in this analysis routine, to match the MC-based correction to the fiducial region applied in the paper. The data are therefore only valid under the assumption of the Standard Model and cannot be used for BSM reinterpretation. Source code: ATLAS_2016_I1426523.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/FastJets.hh"
5#include "Rivet/Projections/IdentifiedFinalState.hh"
6#include "Rivet/Projections/PromptFinalState.hh"
7#include "Rivet/Projections/LeptonFinder.hh"
8#include "Rivet/Projections/VetoedFinalState.hh"
9
10namespace Rivet {
11
12
13 /// @brief Measurement of the WZ production cross section at 8 TeV
14 class ATLAS_2016_I1426523 : public Analysis {
15 public:
16
17 /// Constructor
18 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_I1426523);
19
20
21 /// @name Analysis methods
22 /// @{
23
24 /// Book histograms and initialise projections before the run
25 void init() {
26
27 // Lepton cuts
28 Cut FS_Zlept = Cuts::abseta < 2.5 && Cuts::pT > 15*GeV;
29
30 const FinalState fs;
31 Cut fs_z = Cuts::abseta < 2.5 && Cuts::pT > 15*GeV;
32 Cut fs_j = Cuts::abseta < 4.5 && Cuts::pT > 25*GeV;
33
34 // Get photons to dress leptons
35 PromptFinalState photons(Cuts::abspid == PID::PHOTON);
36
37 // Electrons and muons in Fiducial PS
38 PromptFinalState leptons(fs_z && (Cuts::abspid == PID::ELECTRON || Cuts::abspid == PID::MUON));
39 leptons.acceptTauDecays(false);
40 LeptonFinder dressedleptons(leptons, photons, 0.1, FS_Zlept);
41 declare(dressedleptons, "LeptonFinder");
42
43 // Electrons and muons in Total PS
44 PromptFinalState leptons_total(Cuts::abspid == PID::ELECTRON || Cuts::abspid == PID::MUON);
45 leptons_total.acceptTauDecays(false);
46 LeptonFinder dressedleptonsTotal(leptons_total, photons, 0.1);
47 declare(dressedleptonsTotal, "LeptonFinderTotal");
48
49 // Neutrinos
50 IdentifiedFinalState nu_id;
51 nu_id.acceptNeutrinos();
52 PromptFinalState neutrinos(nu_id);
53 neutrinos.acceptTauDecays(false);
54 declare(neutrinos, "Neutrinos");
55 MSG_WARNING("\033[91;1mLIMITED VALIDITY - check info file for details!\033[m");
56
57 // Jets
58 VetoedFinalState veto;
59 veto.addVetoOnThisFinalState(dressedleptons);
60 FastJets jets(veto, JetAlg::ANTIKT, 0.4);
61 declare(jets, "Jets");
62
63 // Book histograms
64 book(_i["eee"] , 1, 1, 1);
65 book(_i["mee"] , 1, 1, 2);
66 book(_i["emm"] , 1, 1, 3);
67 book(_i["mmm"] , 1, 1, 4);
68 book(_i["fid"] , 1, 1, 5);
69 book(_i["eee_Plus"] , 2, 1, 1);
70 book(_i["mee_Plus"] , 2, 1, 2);
71 book(_i["emm_Plus"] , 2, 1, 3);
72 book(_i["mmm_Plus"] , 2, 1, 4);
73 book(_i["fid_Plus"] , 2, 1, 5);
74 book(_i["eee_Minus"] , 3, 1, 1);
75 book(_i["mee_Minus"] , 3, 1, 2);
76 book(_i["emm_Minus"] , 3, 1, 3);
77 book(_i["mmm_Minus"] , 3, 1, 4);
78 book(_i["fid_Minus"] , 3, 1, 5);
79 book(_i["total"] , 5, 1, 1);
80
81 book(_ss["Njets"] , 27, 1, 1);
82 book(_ss["Njets_norm"], 41, 1, 1);
83
84 bookHandler("ZpT", 12);
85 bookHandler("ZpT_Plus", 13);
86 bookHandler("ZpT_Minus", 14);
87 bookHandler("WpT", 15);
88 bookHandler("WpT_Plus", 16);
89 bookHandler("WpT_Minus", 17);
90 bookHandler("mTWZ", 18);
91 bookHandler("mTWZ_Plus", 19);
92 bookHandler("mTWZ_Minus", 20);
93 bookHandler("pTv", 21);
94 bookHandler("pTv_Plus", 22);
95 bookHandler("pTv_Minus", 23);
96 bookHandler("Deltay", 24);
97 bookHandler("Deltay_Plus", 25);
98 bookHandler("Deltay_Minus", 26);
99 bookHandler("mjj", 28);
100 bookHandler("Deltayjj", 29);
101 bookHandler("ZpT_norm", 30);
102 bookHandler("ZpT_Plus_norm", 31);
103 bookHandler("ZpT_Minus_norm", 32);
104 bookHandler("WpT_norm", 33);
105 bookHandler("mTWZ_norm", 34);
106 bookHandler("pTv_norm", 35);
107 bookHandler("pTv_Plus_norm", 36);
108 bookHandler("pTv_Minus_norm", 37);
109 bookHandler("Deltay_norm", 38);
110 bookHandler("Deltay_Minus_norm", 39);
111 bookHandler("Deltay_Plus_norm", 40);
112 bookHandler("mjj_norm", 42);
113 bookHandler("Deltayjj_norm", 43);
114 }
115
116 void bookHandler(const string& tag, size_t ID) {
117 book(_s[tag], ID, 1, 1);
118 const string code1 = mkAxisCode(ID, 1, 1);
119 const string code2 = mkAxisCode(ID, 1, 2);
120 book(_h[tag], code2, refData(code1));
121 }
122
123
124 /// Perform the per-event analysis
125 void analyze(const Event& event) {
126 if(_edges.empty()) _edges = _ss["Njets"]->xEdges();
127 const DressedLeptons& dressedleptons = apply<LeptonFinder>(event, "LeptonFinder").dressedLeptons();
128 const DressedLeptons& dressedleptonsTotal = apply<LeptonFinder>(event, "LeptonFinderTotal").dressedLeptons();
129 const Particles& neutrinos = apply<PromptFinalState>(event, "Neutrinos").particlesByPt();
130 Jets jets = apply<JetFinder>(event, "Jets").jetsByPt( (Cuts::abseta < 4.5) && (Cuts::pT > 25*GeV) );
131
132 if ((dressedleptonsTotal.size()<3) || (neutrinos.size()<1)) vetoEvent;
133
134 //---Total PS: assign leptons to W and Z bosons using Resonant shape algorithm
135 // NB: This resonant shape algorithm assumes the Standard Model and can therefore
136 // NOT be used for reinterpretation in terms of new-physics models.
137
138 int i, j, k;
139 double MassZ01 = 0., MassZ02 = 0., MassZ12 = 0.;
140 double MassW0 = 0., MassW1 = 0., MassW2 = 0.;
141 double WeightZ1, WeightZ2, WeightZ3;
142 double WeightW1, WeightW2, WeightW3;
143 double M1, M2, M3;
144 double WeightTotal1, WeightTotal2, WeightTotal3;
145
146 //try Z pair of leptons 01
147 if ( (dressedleptonsTotal[0].pid()==-(dressedleptonsTotal[1].pid())) && (dressedleptonsTotal[2].abspid()==neutrinos[0].abspid()-1)){
148 MassZ01 = (dressedleptonsTotal[0].momentum()+dressedleptonsTotal[1].momentum()).mass();
149 MassW2 = (dressedleptonsTotal[2].momentum()+neutrinos[0].momentum()).mass();
150 }
151 //try Z pair of leptons 02
152 if ( (dressedleptonsTotal[0].pid()==-(dressedleptonsTotal[2].pid())) && (dressedleptonsTotal[1].abspid()==neutrinos[0].abspid()-1)){
153 MassZ02 = (dressedleptonsTotal[0].momentum()+dressedleptonsTotal[2].momentum()).mass();
154 MassW1 = (dressedleptonsTotal[1].momentum()+neutrinos[0].momentum()).mass();
155 }
156 //try Z pair of leptons 12
157 if ( (dressedleptonsTotal[1].pid()==-(dressedleptonsTotal[2].pid())) && (dressedleptonsTotal[0].abspid()==neutrinos[0].abspid()-1)){
158 MassZ12 = (dressedleptonsTotal[1].momentum()+dressedleptonsTotal[2].momentum()).mass();
159 MassW0 = (dressedleptonsTotal[0].momentum()+neutrinos[0].momentum()).mass();
160 }
161 WeightZ1 = 1/(pow(MassZ01*MassZ01 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
162 WeightW1 = 1/(pow(MassW2*MassW2 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
163 WeightTotal1 = WeightZ1*WeightW1;
164 M1 = -1*WeightTotal1;
165
166 WeightZ2 = 1/(pow(MassZ02*MassZ02- MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
167 WeightW2 = 1/(pow(MassW1*MassW1- MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
168 WeightTotal2 = WeightZ2*WeightW2;
169 M2 = -1*WeightTotal2;
170
171 WeightZ3 = 1/(pow(MassZ12*MassZ12 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
172 WeightW3 = 1/(pow(MassW0*MassW0 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
173 WeightTotal3 = WeightZ3*WeightW3;
174 M3 = -1*WeightTotal3;
175 bool found = false;
176
177 if( (M1 < M2 && M1 < M3) || (MassZ01 != 0 && MassW2 != 0 && MassZ02 == 0 && MassZ12 == 0) ){
178 i = 0; j = 1; k = 2;
179 found = true;
180 }
181 if( (M2 < M1 && M2 < M3) || (MassZ02 != 0 && MassW1 != 0 && MassZ01 == 0 && MassZ12 == 0) ){
182 i = 0; j = 2; k = 1;
183 found = true;
184 }
185 if( (M3 < M1 && M3 < M2) || (MassZ12 != 0 && MassW0 != 0 && MassZ01 == 0 && MassZ02 == 0) ){
186 i = 1; j = 2; k = 0;
187 found = true;
188 }
189 if (!found) vetoEvent;
190
191 FourMomentum ZbosonTotal = dressedleptonsTotal[i].momentum()+dressedleptonsTotal[j].momentum();
192
193 if ( (ZbosonTotal.mass() >= 66*GeV) && (ZbosonTotal.mass() <= 116*GeV) ) _i["total"]->fill(8000);
194
195 //---end Total PS
196
197
198 //---Fiducial PS: assign leptons to W and Z bosons using Resonant shape algorithm
199 if (dressedleptons.size() < 3 || neutrinos.size() < 1) vetoEvent;
200
201 int EventType = -1;
202 int Nel = 0, Nmu = 0;
203
204 for (const DressedLepton& l : dressedleptons) {
205 if (l.abspid() == 11) ++Nel;
206 if (l.abspid() == 13) ++Nmu;
207 }
208
209 if ( Nel == 3 && Nmu==0 ) EventType = 3;
210 if ( Nel == 2 && Nmu==1 ) EventType = 2;
211 if ( Nel == 1 && Nmu==2 ) EventType = 1;
212 if ( Nel == 0 && Nmu==3 ) EventType = 0;
213
214 int EventCharge = -dressedleptons[0].charge()*dressedleptons[1].charge()*dressedleptons[2].charge();
215
216 MassZ01 = 0; MassZ02 = 0; MassZ12 = 0;
217 MassW0 = 0; MassW1 = 0; MassW2 = 0;
218
219 //try Z pair of leptons 01
220 if ( (dressedleptons[0].pid()==-(dressedleptons[1].pid())) && (dressedleptons[2].abspid()==neutrinos[0].abspid()-1)){
221 MassZ01 = (dressedleptons[0].momentum()+dressedleptons[1].momentum()).mass();
222 MassW2 = (dressedleptons[2].momentum()+neutrinos[0].momentum()).mass();
223 }
224 //try Z pair of leptons 02
225 if ( (dressedleptons[0].pid()==-(dressedleptons[2].pid())) && (dressedleptons[1].abspid()==neutrinos[0].abspid()-1)){
226 MassZ02 = (dressedleptons[0].momentum()+dressedleptons[2].momentum()).mass();
227 MassW1 = (dressedleptons[1].momentum()+neutrinos[0].momentum()).mass();
228 }
229 //try Z pair of leptons 12
230 if ( (dressedleptons[1].pid()==-(dressedleptons[2].pid())) && (dressedleptons[0].abspid()==neutrinos[0].abspid()-1)){
231 MassZ12 = (dressedleptons[1].momentum()+dressedleptons[2].momentum()).mass();
232 MassW0 = (dressedleptons[0].momentum()+neutrinos[0].momentum()).mass();
233 }
234 WeightZ1 = 1/(pow(MassZ01*MassZ01 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
235 WeightW1 = 1/(pow(MassW2*MassW2 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
236 WeightTotal1 = WeightZ1*WeightW1;
237 M1 = -1*WeightTotal1;
238
239 WeightZ2 = 1/(pow(MassZ02*MassZ02- MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
240 WeightW2 = 1/(pow(MassW1*MassW1- MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
241 WeightTotal2 = WeightZ2*WeightW2;
242 M2 = -1*WeightTotal2;
243
244 WeightZ3 = 1/(pow(MassZ12*MassZ12 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
245 WeightW3 = 1/(pow(MassW0*MassW0 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
246 WeightTotal3 = WeightZ3*WeightW3;
247 M3 = -1*WeightTotal3;
248 found = false;
249 if( (M1 < M2 && M1 < M3) || (MassZ01 != 0 && MassW2 != 0 && MassZ02 == 0 && MassZ12 == 0) ){
250 i = 0; j = 1; k = 2;
251 found=true;
252 }
253 if( (M2 < M1 && M2 < M3) || (MassZ02 != 0 && MassW1 != 0 && MassZ01 == 0 && MassZ12 == 0) ){
254 i = 0; j = 2; k = 1;
255 found=true;
256 }
257 if( (M3 < M1 && M3 < M2) || (MassZ12 != 0 && MassW0 != 0 && MassZ01 == 0 && MassZ02 == 0) ){
258 i = 1; j = 2; k = 0;
259 found=true;
260 }
261 if(!found) vetoEvent;
262
263 FourMomentum Zlepton1 = dressedleptons[i].momentum();
264 FourMomentum Zlepton2 = dressedleptons[j].momentum();
265 FourMomentum Wlepton = dressedleptons[k].momentum();
266 FourMomentum Zboson = dressedleptons[i].momentum()+dressedleptons[j].momentum();
267 FourMomentum Wboson = dressedleptons[k].momentum()+neutrinos[0].momentum();
268
269 double Wboson_mT = sqrt( 2 * Wlepton.pT() * neutrinos[0].pt() * (1 - cos(deltaPhi(Wlepton, neutrinos[0]))) )/GeV;
270
271 if (fabs(Zboson.mass()-MZ_PDG)>=10.) vetoEvent;
272 if (Wboson_mT<=30.) vetoEvent;
273 if (Wlepton.pT()<=20.) vetoEvent;
274 if (deltaR(Zlepton1,Zlepton2) < 0.2) vetoEvent;
275 if (deltaR(Zlepton1,Wlepton) < 0.3) vetoEvent;
276 if (deltaR(Zlepton2,Wlepton) < 0.3) vetoEvent;
277
278 double WZ_pt = Zlepton1.pt() + Zlepton2.pt() + Wlepton.pt() + neutrinos[0].pt();
279 double WZ_px = Zlepton1.px() + Zlepton2.px() + Wlepton.px() + neutrinos[0].px();
280 double WZ_py = Zlepton1.py() + Zlepton2.py() + Wlepton.py() + neutrinos[0].py();
281 double mTWZ = sqrt( pow(WZ_pt, 2) - ( pow(WZ_px, 2) + pow(WZ_py,2) ) )/GeV;
282
283 double AbsDeltay = fabs(Zboson.rapidity()-Wlepton.rapidity());
284
285 if (EventType == 3) _i["eee"]->fill(8000);
286 if (EventType == 2) _i["mee"]->fill(8000);
287 if (EventType == 1) _i["emm"]->fill(8000);
288 if (EventType == 0) _i["mmm"]->fill(8000);
289 _i["fid"]->fill(8000);
290
291 if (EventCharge == 1) {
292
293 if (EventType == 3) _i["eee_Plus"]->fill(8000);
294 if (EventType == 2) _i["mee_Plus"]->fill(8000);
295 if (EventType == 1) _i["emm_Plus"]->fill(8000);
296 if (EventType == 0) _i["mmm_Plus"]->fill(8000);
297 _i["fid_Plus"]->fill(8000);
298
299 _h["Deltay_Plus"]->fill(AbsDeltay);
300 _h["Deltay_Plus_norm"]->fill(AbsDeltay);
301 fillWithOverflow("ZpT_Plus", Zboson.pT()/GeV, 220);
302 fillWithOverflow("WpT_Plus", Wboson.pT()/GeV, 220);
303 fillWithOverflow("mTWZ_Plus", mTWZ, 600);
304 fillWithOverflow("pTv_Plus", neutrinos[0].pt(), 90);
305 fillWithOverflow("ZpT_Plus_norm", Zboson.pT()/GeV, 220);
306 fillWithOverflow("pTv_Plus_norm", neutrinos[0].pt()/GeV, 90);
307
308 } else {
309
310 if (EventType == 3) _i["eee_Minus"]->fill(8000);
311 if (EventType == 2) _i["mee_Minus"]->fill(8000);
312 if (EventType == 1) _i["emm_Minus"]->fill(8000);
313 if (EventType == 0) _i["mmm_Minus"]->fill(8000);
314 _i["fid_Minus"]->fill(8000);
315
316 _h["Deltay_Minus"]->fill(AbsDeltay);
317 _h["Deltay_Minus_norm"]->fill(AbsDeltay);
318 fillWithOverflow("ZpT_Minus", Zboson.pT()/GeV, 220);
319 fillWithOverflow("WpT_Minus", Wboson.pT()/GeV, 220);
320 fillWithOverflow("mTWZ_Minus", mTWZ, 600);
321 fillWithOverflow("pTv_Minus", neutrinos[0].pt()/GeV, 90);
322 fillWithOverflow("ZpT_Minus_norm", Zboson.pT()/GeV, 220);
323 fillWithOverflow("pTv_Minus_norm", neutrinos[0].pt()/GeV, 90);
324
325 }
326
327 fillWithOverflow("ZpT", Zboson.pT()/GeV, 220);
328 fillWithOverflow("WpT", Wboson.pT()/GeV, 220);
329 fillWithOverflow("mTWZ", mTWZ, 600);
330 fillWithOverflow("pTv", neutrinos[0].pt()/GeV, 90);
331
332 _h["Deltay"]->fill(AbsDeltay);
333 size_t njets = min(jets.size(),size_t(5));
334 _ss["Njets" ]->fill(_edges[njets]);
335 _ss["Njets_norm"]->fill(_edges[njets]);
336 fillWithOverflow("ZpT_norm", Zboson.pT()/GeV, 220);
337 fillWithOverflow("WpT_norm", Wboson.pT()/GeV, 220);
338 fillWithOverflow("mTWZ_norm", mTWZ, 600);
339 fillWithOverflow("pTv_norm", neutrinos[0].pt()/GeV, 90);
340
341 _h["Deltay_norm"]->fill(AbsDeltay);
342
343 if (jets.size()>1) {
344 double mjj = (jets[0].momentum()+jets[1].momentum()).mass()/GeV;
345 fillWithOverflow("mjj", mjj, 800);
346 fillWithOverflow("mjj_norm", mjj, 800);
347 double DeltaYjj = fabs(jets[0].rapidity()-jets[1].rapidity());
348 fillWithOverflow("Deltayjj", DeltaYjj, 5);
349 fillWithOverflow("Deltayjj_norm", DeltaYjj, 5);
350 }
351
352 }
353
354
355 void fillWithOverflow(const string& tag, const double value, const double overflow){
356 if (value < overflow) _h[tag]->fill(value);
357 else _h[tag]->fill(overflow - 0.45);
358 }
359
360
361 /// Normalise histograms etc., after the run
362 void finalize() {
363
364 const double xs_pb(crossSection() / picobarn);
365 const double xs_fb(crossSection() / femtobarn);
366 const double sumw(sumOfWeights());
367 MSG_DEBUG("Cross-Section/pb: " << xs_pb );
368 MSG_DEBUG("Cross-Section/fb: " << xs_fb );
369 MSG_DEBUG("Sum of weights : " << sumw );
370 MSG_DEBUG("nEvents : " << numEvents());
371
372 const double sf_pb(xs_pb / sumw);
373 const double sf_fb(xs_fb / sumw);
374
375 MSG_DEBUG("sf_pb : " << sf_pb);
376 MSG_DEBUG("sf_fb : " << sf_fb);
377
378 float totalBR= 4*0.1086*0.033658; // W and Z leptonic branching fractions
379
380 for (auto& it : _h) {
381 if (it.first.find("total") != string::npos) scale(it.second, sf_pb/totalBR);
382 else if (it.first.find("norm") != string::npos) normalize(it.second);
383 else if (it.first.find("fid") != string::npos) scale(it.second, sf_fb/4.);
384 else if (it.first.find("Njets") != string::npos) scale(it.second, sf_fb/4.);
385 else if (it.first.find("ZpT") != string::npos) scale(it.second, sf_fb/4.);
386 else if (it.first.find("WpT") != string::npos) scale(it.second, sf_fb/4.);
387 else if (it.first.find("mTWZ") != string::npos) scale(it.second, sf_fb/4.);
388 else if (it.first.find("pTv") != string::npos) scale(it.second, sf_fb/4.);
389 else if (it.first.find("Deltay") != string::npos) scale(it.second, sf_fb/4.);
390 else if (it.first.find("mjj") != string::npos) scale(it.second, sf_fb/4.);
391 else scale(it.second, sf_fb);
392 }
393 for (auto& it : _i) {
394 if (it.first.find("total") != string::npos) scale(it.second, sf_pb/totalBR);
395 else if (it.first.find("norm") != string::npos) normalize(it.second);
396 else if (it.first.find("fid") != string::npos) scale(it.second, sf_fb/4.);
397 else if (it.first.find("Njets") != string::npos) scale(it.second, sf_fb/4.);
398 else if (it.first.find("ZpT") != string::npos) scale(it.second, sf_fb/4.);
399 else if (it.first.find("WpT") != string::npos) scale(it.second, sf_fb/4.);
400 else if (it.first.find("mTWZ") != string::npos) scale(it.second, sf_fb/4.);
401 else if (it.first.find("pTv") != string::npos) scale(it.second, sf_fb/4.);
402 else if (it.first.find("Deltay") != string::npos) scale(it.second, sf_fb/4.);
403 else if (it.first.find("mjj") != string::npos) scale(it.second, sf_fb/4.);
404 else scale(it.second, sf_fb);
405 }
406 for (auto& it : _s) {
407 barchart(_h[it.first], it.second);
408 removeAnalysisObject(_h[it.first]);
409 }
410 // normalisation of njets
411 scale(_ss["Njets"], sf_fb/4.);
412 normalize(_ss["Njets_norm"]);
413 }
414
415 /// @}
416
417
418 private:
419
420 /// @name Histograms
421 /// @{
422
423 map<string, Histo1DPtr> _h;
424 map<string, BinnedHistoPtr<int> > _i;
425 map<string, BinnedHistoPtr<string> > _ss;
426 map<string, Estimate1DPtr> _s;
427 vector<string> _edges;
428
429 /// @}
430
431 double MZ_PDG = 91.1876;
432 double MW_PDG = 83.385;
433 double GammaZ_PDG = 2.4952;
434 double GammaW_PDG = 2.085;
435
436 };
437
438 RIVET_DECLARE_PLUGIN(ATLAS_2016_I1426523);
439
440}
|