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(_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}