rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2016_I1426523

Measurement of the $WZ$ production cross section at 8 TeV
Experiment: ATLAS (LHC)
Inspire ID: 1426523
Status: VALIDATED
Authors:
  • Elena Yatsenko
References: Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • pp -> WZ + X, diboson decays to electrons and muons

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(_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 DressedLeptons& dressedleptons = apply<LeptonFinder>(event, "LeptonFinder").dressedLeptons();
127      const DressedLeptons& dressedleptonsTotal = apply<LeptonFinder>(event, "LeptonFinderTotal").dressedLeptons();
128      const Particles& neutrinos = apply<PromptFinalState>(event, "Neutrinos").particlesByPt();
129      Jets jets = apply<JetFinder>(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 (auto& it : _h) {
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 (auto& it : _s) {
393        barchart(_h[it.first], it.second);
394        removeAnalysisObject(_h[it.first]);
395      }
396    }
397
398    /// @}
399
400
401  private:
402
403    /// @name Histograms
404    /// @{
405
406     map<string, Histo1DPtr> _h;
407     map<string, Estimate1DPtr> _s;
408
409     /// @}
410
411     double MZ_PDG = 91.1876;
412     double MW_PDG = 83.385;
413     double GammaZ_PDG = 2.4952;
414     double GammaW_PDG = 2.085;
415
416  };
417
418  RIVET_DECLARE_PLUGIN(ATLAS_2016_I1426523);
419
420}