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/DressedLeptons.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 DressedLeptons dressedleptons(photons, leptons, 0.1, FS_Zlept, true);
41 declare(dressedleptons, "DressedLeptons");
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 DressedLeptons dressedleptonsTotal(photons, leptons_total, 0.1, Cuts::open(), true);
47 declare(dressedleptonsTotal, "DressedLeptonsTotal");
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, FastJets::ANTIKT, 0.4);
61 declare(jets, "Jets");
62
63 // Book histograms
64 book(_h["eee"] , 1, 1, 1);
65 book(_h["mee"] , 1, 1, 2);
66 book(_h["emm"] , 1, 1, 3);
67 book(_h["mmm"] , 1, 1, 4);
68 book(_h["fid"] , 1, 1, 5);
69 book(_h["eee_Plus"] , 2, 1, 1);
70 book(_h["mee_Plus"] , 2, 1, 2);
71 book(_h["emm_Plus"] , 2, 1, 3);
72 book(_h["mmm_Plus"] , 2, 1, 4);
73 book(_h["fid_Plus"] , 2, 1, 5);
74 book(_h["eee_Minus"] , 3, 1, 1);
75 book(_h["mee_Minus"] , 3, 1, 2);
76 book(_h["emm_Minus"] , 3, 1, 3);
77 book(_h["mmm_Minus"] , 3, 1, 4);
78 book(_h["fid_Minus"] , 3, 1, 5);
79 book(_h["total"] , 5, 1, 1);
80 book(_h["Njets"] , 27, 1, 1);
81 book(_h["Njets_norm"], 41, 1, 1);
82
83 bookHandler("ZpT", 12);
84 bookHandler("ZpT_Plus", 13);
85 bookHandler("ZpT_Minus", 14);
86 bookHandler("WpT", 15);
87 bookHandler("WpT_Plus", 16);
88 bookHandler("WpT_Minus", 17);
89 bookHandler("mTWZ", 18);
90 bookHandler("mTWZ_Plus", 19);
91 bookHandler("mTWZ_Minus", 20);
92 bookHandler("pTv", 21);
93 bookHandler("pTv_Plus", 22);
94 bookHandler("pTv_Minus", 23);
95 bookHandler("Deltay", 24);
96 bookHandler("Deltay_Plus", 25);
97 bookHandler("Deltay_Minus", 26);
98 bookHandler("mjj", 28);
99 bookHandler("Deltayjj", 29);
100 bookHandler("ZpT_norm", 30);
101 bookHandler("ZpT_Plus_norm", 31);
102 bookHandler("ZpT_Minus_norm", 32);
103 bookHandler("WpT_norm", 33);
104 bookHandler("mTWZ_norm", 34);
105 bookHandler("pTv_norm", 35);
106 bookHandler("pTv_Plus_norm", 36);
107 bookHandler("pTv_Minus_norm", 37);
108 bookHandler("Deltay_norm", 38);
109 bookHandler("Deltay_Minus_norm", 39);
110 bookHandler("Deltay_Plus_norm", 40);
111 bookHandler("mjj_norm", 42);
112 bookHandler("Deltayjj_norm", 43);
113 }
114
115 void bookHandler(const string& tag, size_t ID) {
116 book(_s[tag], ID, 1, 1);
117 const string code1 = mkAxisCode(ID, 1, 1);
118 const string code2 = mkAxisCode(ID, 1, 2);
119 book(_h[tag], code2, refData(code1));
120 }
121
122
123 /// Perform the per-event analysis
124 void analyze(const Event& event) {
125
126 const vector<DressedLepton>& dressedleptons = apply<DressedLeptons>(event, "DressedLeptons").dressedLeptons();
127 const vector<DressedLepton>& dressedleptonsTotal = apply<DressedLeptons>(event, "DressedLeptonsTotal").dressedLeptons();
128 const Particles& neutrinos = apply<PromptFinalState>(event, "Neutrinos").particlesByPt();
129 Jets jets = apply<JetAlg>(event, "Jets").jetsByPt( (Cuts::abseta < 4.5) && (Cuts::pT > 25*GeV) );
130
131 if ((dressedleptonsTotal.size()<3) || (neutrinos.size()<1)) vetoEvent;
132
133 //---Total PS: assign leptons to W and Z bosons using Resonant shape algorithm
134 // NB: This resonant shape algorithm assumes the Standard Model and can therefore
135 // NOT be used for reinterpretation in terms of new-physics models.
136
137 int i, j, k;
138 double MassZ01 = 0., MassZ02 = 0., MassZ12 = 0.;
139 double MassW0 = 0., MassW1 = 0., MassW2 = 0.;
140 double WeightZ1, WeightZ2, WeightZ3;
141 double WeightW1, WeightW2, WeightW3;
142 double M1, M2, M3;
143 double WeightTotal1, WeightTotal2, WeightTotal3;
144
145 //try Z pair of leptons 01
146 if ( (dressedleptonsTotal[0].pid()==-(dressedleptonsTotal[1].pid())) && (dressedleptonsTotal[2].abspid()==neutrinos[0].abspid()-1)){
147 MassZ01 = (dressedleptonsTotal[0].momentum()+dressedleptonsTotal[1].momentum()).mass();
148 MassW2 = (dressedleptonsTotal[2].momentum()+neutrinos[0].momentum()).mass();
149 }
150 //try Z pair of leptons 02
151 if ( (dressedleptonsTotal[0].pid()==-(dressedleptonsTotal[2].pid())) && (dressedleptonsTotal[1].abspid()==neutrinos[0].abspid()-1)){
152 MassZ02 = (dressedleptonsTotal[0].momentum()+dressedleptonsTotal[2].momentum()).mass();
153 MassW1 = (dressedleptonsTotal[1].momentum()+neutrinos[0].momentum()).mass();
154 }
155 //try Z pair of leptons 12
156 if ( (dressedleptonsTotal[1].pid()==-(dressedleptonsTotal[2].pid())) && (dressedleptonsTotal[0].abspid()==neutrinos[0].abspid()-1)){
157 MassZ12 = (dressedleptonsTotal[1].momentum()+dressedleptonsTotal[2].momentum()).mass();
158 MassW0 = (dressedleptonsTotal[0].momentum()+neutrinos[0].momentum()).mass();
159 }
160 WeightZ1 = 1/(pow(MassZ01*MassZ01 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
161 WeightW1 = 1/(pow(MassW2*MassW2 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
162 WeightTotal1 = WeightZ1*WeightW1;
163 M1 = -1*WeightTotal1;
164
165 WeightZ2 = 1/(pow(MassZ02*MassZ02- MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
166 WeightW2 = 1/(pow(MassW1*MassW1- MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
167 WeightTotal2 = WeightZ2*WeightW2;
168 M2 = -1*WeightTotal2;
169
170 WeightZ3 = 1/(pow(MassZ12*MassZ12 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
171 WeightW3 = 1/(pow(MassW0*MassW0 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
172 WeightTotal3 = WeightZ3*WeightW3;
173 M3 = -1*WeightTotal3;
174 bool found = false;
175
176 if( (M1 < M2 && M1 < M3) || (MassZ01 != 0 && MassW2 != 0 && MassZ02 == 0 && MassZ12 == 0) ){
177 i = 0; j = 1; k = 2;
178 found = true;
179 }
180 if( (M2 < M1 && M2 < M3) || (MassZ02 != 0 && MassW1 != 0 && MassZ01 == 0 && MassZ12 == 0) ){
181 i = 0; j = 2; k = 1;
182 found = true;
183 }
184 if( (M3 < M1 && M3 < M2) || (MassZ12 != 0 && MassW0 != 0 && MassZ01 == 0 && MassZ02 == 0) ){
185 i = 1; j = 2; k = 0;
186 found = true;
187 }
188 if (!found) vetoEvent;
189
190 FourMomentum ZbosonTotal = dressedleptonsTotal[i].momentum()+dressedleptonsTotal[j].momentum();
191
192 if ( (ZbosonTotal.mass() >= 66*GeV) && (ZbosonTotal.mass() <= 116*GeV) ) _h["total"]->fill(8000);
193
194 //---end Total PS
195
196
197 //---Fiducial PS: assign leptons to W and Z bosons using Resonant shape algorithm
198 if (dressedleptons.size() < 3 || neutrinos.size() < 1) vetoEvent;
199
200 int EventType = -1;
201 int Nel = 0, Nmu = 0;
202
203 for (const DressedLepton& l : dressedleptons) {
204 if (l.abspid() == 11) ++Nel;
205 if (l.abspid() == 13) ++Nmu;
206 }
207
208 if ( Nel == 3 && Nmu==0 ) EventType = 3;
209 if ( Nel == 2 && Nmu==1 ) EventType = 2;
210 if ( Nel == 1 && Nmu==2 ) EventType = 1;
211 if ( Nel == 0 && Nmu==3 ) EventType = 0;
212
213 int EventCharge = -dressedleptons[0].charge()*dressedleptons[1].charge()*dressedleptons[2].charge();
214
215 MassZ01 = 0; MassZ02 = 0; MassZ12 = 0;
216 MassW0 = 0; MassW1 = 0; MassW2 = 0;
217
218 //try Z pair of leptons 01
219 if ( (dressedleptons[0].pid()==-(dressedleptons[1].pid())) && (dressedleptons[2].abspid()==neutrinos[0].abspid()-1)){
220 MassZ01 = (dressedleptons[0].momentum()+dressedleptons[1].momentum()).mass();
221 MassW2 = (dressedleptons[2].momentum()+neutrinos[0].momentum()).mass();
222 }
223 //try Z pair of leptons 02
224 if ( (dressedleptons[0].pid()==-(dressedleptons[2].pid())) && (dressedleptons[1].abspid()==neutrinos[0].abspid()-1)){
225 MassZ02 = (dressedleptons[0].momentum()+dressedleptons[2].momentum()).mass();
226 MassW1 = (dressedleptons[1].momentum()+neutrinos[0].momentum()).mass();
227 }
228 //try Z pair of leptons 12
229 if ( (dressedleptons[1].pid()==-(dressedleptons[2].pid())) && (dressedleptons[0].abspid()==neutrinos[0].abspid()-1)){
230 MassZ12 = (dressedleptons[1].momentum()+dressedleptons[2].momentum()).mass();
231 MassW0 = (dressedleptons[0].momentum()+neutrinos[0].momentum()).mass();
232 }
233 WeightZ1 = 1/(pow(MassZ01*MassZ01 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
234 WeightW1 = 1/(pow(MassW2*MassW2 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
235 WeightTotal1 = WeightZ1*WeightW1;
236 M1 = -1*WeightTotal1;
237
238 WeightZ2 = 1/(pow(MassZ02*MassZ02- MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
239 WeightW2 = 1/(pow(MassW1*MassW1- MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
240 WeightTotal2 = WeightZ2*WeightW2;
241 M2 = -1*WeightTotal2;
242
243 WeightZ3 = 1/(pow(MassZ12*MassZ12 - MZ_PDG*MZ_PDG,2) + pow(MZ_PDG*GammaZ_PDG,2));
244 WeightW3 = 1/(pow(MassW0*MassW0 - MW_PDG*MW_PDG,2) + pow(MW_PDG*GammaW_PDG,2));
245 WeightTotal3 = WeightZ3*WeightW3;
246 M3 = -1*WeightTotal3;
247 found = false;
248 if( (M1 < M2 && M1 < M3) || (MassZ01 != 0 && MassW2 != 0 && MassZ02 == 0 && MassZ12 == 0) ){
249 i = 0; j = 1; k = 2;
250 found=true;
251 }
252 if( (M2 < M1 && M2 < M3) || (MassZ02 != 0 && MassW1 != 0 && MassZ01 == 0 && MassZ12 == 0) ){
253 i = 0; j = 2; k = 1;
254 found=true;
255 }
256 if( (M3 < M1 && M3 < M2) || (MassZ12 != 0 && MassW0 != 0 && MassZ01 == 0 && MassZ02 == 0) ){
257 i = 1; j = 2; k = 0;
258 found=true;
259 }
260 if(!found) vetoEvent;
261
262 FourMomentum Zlepton1 = dressedleptons[i].momentum();
263 FourMomentum Zlepton2 = dressedleptons[j].momentum();
264 FourMomentum Wlepton = dressedleptons[k].momentum();
265 FourMomentum Zboson = dressedleptons[i].momentum()+dressedleptons[j].momentum();
266 FourMomentum Wboson = dressedleptons[k].momentum()+neutrinos[0].momentum();
267
268 double Wboson_mT = sqrt( 2 * Wlepton.pT() * neutrinos[0].pt() * (1 - cos(deltaPhi(Wlepton, neutrinos[0]))) )/GeV;
269
270 if (fabs(Zboson.mass()-MZ_PDG)>=10.) vetoEvent;
271 if (Wboson_mT<=30.) vetoEvent;
272 if (Wlepton.pT()<=20.) vetoEvent;
273 if (deltaR(Zlepton1,Zlepton2) < 0.2) vetoEvent;
274 if (deltaR(Zlepton1,Wlepton) < 0.3) vetoEvent;
275 if (deltaR(Zlepton2,Wlepton) < 0.3) vetoEvent;
276
277 double WZ_pt = Zlepton1.pt() + Zlepton2.pt() + Wlepton.pt() + neutrinos[0].pt();
278 double WZ_px = Zlepton1.px() + Zlepton2.px() + Wlepton.px() + neutrinos[0].px();
279 double WZ_py = Zlepton1.py() + Zlepton2.py() + Wlepton.py() + neutrinos[0].py();
280 double mTWZ = sqrt( pow(WZ_pt, 2) - ( pow(WZ_px, 2) + pow(WZ_py,2) ) )/GeV;
281
282 double AbsDeltay = fabs(Zboson.rapidity()-Wlepton.rapidity());
283
284 if (EventType == 3) _h["eee"]->fill(8000.);
285 if (EventType == 2) _h["mee"]->fill(8000.);
286 if (EventType == 1) _h["emm"]->fill(8000.);
287 if (EventType == 0) _h["mmm"]->fill(8000.);
288 _h["fid"]->fill(8000.);
289
290 if (EventCharge == 1) {
291
292 if (EventType == 3) _h["eee_Plus"]->fill(8000.);
293 if (EventType == 2) _h["mee_Plus"]->fill(8000.);
294 if (EventType == 1) _h["emm_Plus"]->fill(8000.);
295 if (EventType == 0) _h["mmm_Plus"]->fill(8000.);
296 _h["fid_Plus"]->fill(8000.);
297
298 _h["Deltay_Plus"]->fill(AbsDeltay);
299 _h["Deltay_Plus_norm"]->fill(AbsDeltay);
300 fillWithOverflow("ZpT_Plus", Zboson.pT()/GeV, 220);
301 fillWithOverflow("WpT_Plus", Wboson.pT()/GeV, 220);
302 fillWithOverflow("mTWZ_Plus", mTWZ, 600);
303 fillWithOverflow("pTv_Plus", neutrinos[0].pt(), 90);
304 fillWithOverflow("ZpT_Plus_norm", Zboson.pT()/GeV, 220);
305 fillWithOverflow("pTv_Plus_norm", neutrinos[0].pt()/GeV, 90);
306
307 } else {
308
309 if (EventType == 3) _h["eee_Minus"]->fill(8000.);
310 if (EventType == 2) _h["mee_Minus"]->fill(8000.);
311 if (EventType == 1) _h["emm_Minus"]->fill(8000.);
312 if (EventType == 0) _h["mmm_Minus"]->fill(8000.);
313 _h["fid_Minus"]->fill(8000.);
314
315 _h["Deltay_Minus"]->fill(AbsDeltay);
316 _h["Deltay_Minus_norm"]->fill(AbsDeltay);
317 fillWithOverflow("ZpT_Minus", Zboson.pT()/GeV, 220);
318 fillWithOverflow("WpT_Minus", Wboson.pT()/GeV, 220);
319 fillWithOverflow("mTWZ_Minus", mTWZ, 600);
320 fillWithOverflow("pTv_Minus", neutrinos[0].pt()/GeV, 90);
321 fillWithOverflow("ZpT_Minus_norm", Zboson.pT()/GeV, 220);
322 fillWithOverflow("pTv_Minus_norm", neutrinos[0].pt()/GeV, 90);
323
324 }
325
326 fillWithOverflow("ZpT", Zboson.pT()/GeV, 220);
327 fillWithOverflow("WpT", Wboson.pT()/GeV, 220);
328 fillWithOverflow("mTWZ", mTWZ, 600);
329 fillWithOverflow("pTv", neutrinos[0].pt()/GeV, 90);
330
331 _h["Deltay"]->fill(AbsDeltay);
332
333 fillWithOverflow("Njets", jets.size(), 5);
334 fillWithOverflow("Njets_norm", jets.size(), 5);
335 fillWithOverflow("ZpT_norm", Zboson.pT()/GeV, 220);
336 fillWithOverflow("WpT_norm", Wboson.pT()/GeV, 220);
337 fillWithOverflow("mTWZ_norm", mTWZ, 600);
338 fillWithOverflow("pTv_norm", neutrinos[0].pt()/GeV, 90);
339
340 _h["Deltay_norm"]->fill(AbsDeltay);
341
342 if (jets.size()>1) {
343 double mjj = (jets[0].momentum()+jets[1].momentum()).mass()/GeV;
344 fillWithOverflow("mjj", mjj, 800);
345 fillWithOverflow("mjj_norm", mjj, 800);
346 double DeltaYjj = fabs(jets[0].rapidity()-jets[1].rapidity());
347 fillWithOverflow("Deltayjj", DeltaYjj, 5);
348 fillWithOverflow("Deltayjj_norm", DeltaYjj, 5);
349 }
350
351 }
352
353
354 void fillWithOverflow(const string& tag, const double value, const double overflow){
355 if (value < overflow) _h[tag]->fill(value);
356 else _h[tag]->fill(overflow - 0.45);
357 }
358
359
360 /// Normalise histograms etc., after the run
361 void finalize() {
362
363 const double xs_pb(crossSection() / picobarn);
364 const double xs_fb(crossSection() / femtobarn);
365 const double sumw(sumOfWeights());
366 MSG_DEBUG("Cross-Section/pb: " << xs_pb );
367 MSG_DEBUG("Cross-Section/fb: " << xs_fb );
368 MSG_DEBUG("Sum of weights : " << sumw );
369 MSG_DEBUG("nEvents : " << numEvents());
370
371 const double sf_pb(xs_pb / sumw);
372 const double sf_fb(xs_fb / sumw);
373
374 MSG_DEBUG("sf_pb : " << sf_pb);
375 MSG_DEBUG("sf_fb : " << sf_fb);
376
377 float totalBR= 4*0.1086*0.033658; // W and Z leptonic branching fractions
378
379 for (map<string, Histo1DPtr>::iterator it = _h.begin(); it != _h.end(); ++it) {
380 if (it->first.find("total") != string::npos) scale(it->second, sf_pb/totalBR);
381 else if (it->first.find("norm") != string::npos) normalize(it->second);
382 else if (it->first.find("fid") != string::npos) scale(it->second, sf_fb/4.);
383 else if (it->first.find("Njets") != string::npos) scale(it->second, sf_fb/4.);
384 else if (it->first.find("ZpT") != string::npos) scale(it->second, sf_fb/4.);
385 else if (it->first.find("WpT") != string::npos) scale(it->second, sf_fb/4.);
386 else if (it->first.find("mTWZ") != string::npos) scale(it->second, sf_fb/4.);
387 else if (it->first.find("pTv") != string::npos) scale(it->second, sf_fb/4.);
388 else if (it->first.find("Deltay") != string::npos) scale(it->second, sf_fb/4.);
389 else if (it->first.find("mjj") != string::npos) scale(it->second, sf_fb/4.);
390 else scale(it->second, sf_fb);
391 }
392 for (map<string, Scatter2DPtr>::iterator it = _s.begin(); it != _s.end(); ++it) {
393 // @todo replace with new YODA object?
394 makeScatterWithoutDividingByBinwidth(it->first);
395 // @todo need this to disappear if we want reentrant safety
396 removeAnalysisObject(_h[it->first]);
397 }
398 }
399
400 void makeScatterWithoutDividingByBinwidth(const string& tag) {
401 vector<Point2D> points;
402 //size_t nBins = _dummy->numBins();
403 for (const HistoBin1D &bin : _h[tag]->bins()) {
404 double x = bin.midpoint();
405 double y = bin.sumW();
406 double ex = bin.xWidth()/2;
407 double ey = sqrt(bin.sumW2());
408 points.push_back(Point2D(x, y, ex, ey));
409 }
410 _s[tag]->addPoints(points);
411 }
412
413
414 //@}
415
416
417 private:
418
419 /// @name Histograms
420 //@{
421
422 map<string, Histo1DPtr> _h;
423 map<string, Scatter2DPtr> _s;
424
425 //@}
426
427 double MZ_PDG = 91.1876;
428 double MW_PDG = 83.385;
429 double GammaZ_PDG = 2.4952;
430 double GammaW_PDG = 2.085;
431
432 };
433
434 // The hook for the plugin system
435 RIVET_DECLARE_PLUGIN(ATLAS_2016_I1426523);
436
437}
|