rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2022_I2023464

H->yy differentual cross-sections at 13 TeV
Experiment: ATLAS (LHC)
Inspire ID: 2023464
Status: VALIDATED
Authors:
  • Giovanni Marchiori
References:
  • JHEP 08 (2022) 027
  • DOI:10.1007/JHEP08(2022)027
  • arXiv: 2202.00487
Beams: p+ p+
Beam energies: (6500.0, 6500.0) GeV
Run details:
  • pp to Higgs to diphoton production at 13 TeV, include all processes (ggH, VBF, VH, ttH, bbH, tH)

A measurement of inclusive and differential fiducial cross-sections for the production of the Higgs boson decaying into two photons is performed using 139 fb-1 of proton-proton collision data recorded at sqrt(s)=13 TeV by the ATLAS experiment at the Large Hadron Collider. The inclusive cross-section times branching ratio, in a fiducial region closely matching the experimental selection, is measured to be $67 \pm 6$ fb, which is in agreement with the state-of-the-art Standard Model prediction of $64 \pm 4$ fb. Extrapolating this result to the full phase space and correcting for the branching ratio, the total cross-section for Higgs boson production is estimated to be $58 \pm 6$ pb. In addition, the cross-sections in four fiducial regions sensitive to various Higgs boson production modes and differential cross-sections as a function of either one or two of several observables are measured. All the measurements are found to be in agreement with the Standard Model predictions. The measured distributions can be used to test the modelling of Higgs production by various theoretical calculations. In additions they can be used to constrain BSM effects. As an example, in the publication he measured transverse momentum distribution of the Higgs boson is used as an indirect probe of the Yukawa coupling of the Higgs boson to the bottom and charm quarks. In addition, five differential cross-section measurements are used to constrain anomalous Higgs boson couplings to vector bosons in the Standard Model effective field theory framework.

Source code: ATLAS_2022_I2023464.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/PromptFinalState.hh"
  5#include "Rivet/Projections/ChargedFinalState.hh"
  6#include "Rivet/Projections/InvisibleFinalState.hh"
  7#include "Rivet/Projections/VetoedFinalState.hh"
  8#include "Rivet/Projections/LeptonFinder.hh"
  9#include "Rivet/Projections/FastJets.hh"
 10
 11namespace Rivet {
 12
 13
 14  /// @brief H->yy differentual cross-sections at 13 TeV
 15  class ATLAS_2022_I2023464 : public Analysis {
 16  public:
 17
 18    /// Default constructor
 19    RIVET_DEFAULT_ANALYSIS_CTOR( ATLAS_2022_I2023464 );
 20
 21    /// @name Analysis methods
 22    /// @{
 23    void init() {
 24      // Project all final state particles (for missing ET)
 25      const FinalState fs ( Cuts::abseta < 5.5 ) ;
 26      declare(fs , "FS");
 27
 28      // Project final state particles with pT>1 GeV (for track-based isolation)
 29      declare(ChargedFinalState(Cuts::pT > 1*GeV ), "CFS") ;
 30
 31      // Project photons which pass kinematic cuts
 32      // (pT>25 GeV, |eta|<2.37  excluding crack)
 33      PromptFinalState kin_fs_ph (Cuts::abspid == PID::PHOTON &&
 34                                  Cuts::pT > 25*GeV &&
 35                                  Cuts::abseta < 2.37 &&
 36                                  ( Cuts::abseta < 1.37 || Cuts::abseta > 1.52 ),
 37                                  TauDecaysAs::PROMPT, MuDecaysAs::PROMPT);
 38      declare(kin_fs_ph, "PFS");
 39
 40      // All photons (to dress leptons)
 41      FinalState photons( Cuts::abspid == PID::PHOTON );
 42
 43      // Create dressed mu projection
 44      // true in last arg = use also muons from prompt tau decays
 45      PromptFinalState bare_mu(Cuts::abspid == PID::MUON, TauDecaysAs::PROMPT);
 46      LeptonFinder dressed_mu(bare_mu, photons, 0.1, Cuts::abseta < 2.7);
 47      declare(dressed_mu, "MFS");
 48
 49      // Create dressed e projection
 50      PromptFinalState bare_el(Cuts::abspid == PID::ELECTRON, TauDecaysAs::PROMPT);
 51      // true in last arg = use also electrons from prompt tau decays
 52      Cut fid_el = Cuts::abseta < 2.47 && (Cuts::abseta < 1.37 || Cuts::abseta > 1.52);
 53      LeptonFinder dressed_el(bare_el, photons, 0.1, fid_el);
 54      declare(dressed_el, "EFS");
 55
 56      // Create AntiKt4TruthWZJets projection
 57      VetoedFinalState vfs( FinalState(Cuts::abseta < 4.5) );
 58      vfs.addVetoOnThisFinalState( dressed_el );
 59      vfs.addVetoOnThisFinalState( dressed_mu );
 60      FastJets jets( vfs, JetAlg::ANTIKT, 0.4, JetMuons::ALL, JetInvisibles::DECAY);
 61      declare(jets , "jets");
 62
 63      declare(InvisibleFinalState(OnlyPrompt::YES), "MET");
 64
 65      // Declare histograms
 66
 67      // plots in main body
 68      book(_d["fid_regions"], 1, 1, 1); // inclusive regions
 69      book(_h["pT_yy"], 2, 1, 1); // photon obs, in baseline region
 70
 71      book(_d["N_j_30"], 3, 1, 1); // N(jet) and N(b-jet) categories
 72      book(_d["catXS_nbjet"], 4, 1, 1);
 73      book(_h["pT_j1_30"], 5, 1, 1); // Observables in 1-jet events
 74      book(_h["pT_yy_JV_30"],  6, 1, 1); // Jet-veto observables
 75      book(_h["m_jj_30"],  7, 1, 1); // Observables in 2-jet events
 76      book(_h["Dphi_j_j_30_signed"],  8, 1, 1);
 77      book(_d["pT_yy_vs_yAbs_yy"],  9, 1, 1); // 2D xsections
 78      book(_h["VBF_Dphi_j_j_30_signed"], 10, 1, 1); // Observables in VBF fiducial region
 79
 80      // plots in appendix
 81      book(_h["rel_pT_y1"], 21, 1, 1); // photon obs"], in baseline region
 82      book(_h["rel_pT_y2"], 23, 1, 1);
 83      book(_h["yAbs_yy"], 25, 1, 1);
 84      book(_h["m_yyj_30"], 27, 1, 1); // Observables in 1-jet events
 85      book(_h["pT_yyj_30"], 29, 1, 1);
 86      book(_h["HT_30"], 31, 1, 1);
 87      book(_h["maxTau_yyj_30"], 33, 1, 1);
 88      book(_h["sumTau_yyj_30"], 35, 1, 1);
 89      book(_h["pT_yy_JV_40"], 37, 1, 1); // Jet-veto observables
 90      book(_h["pT_yy_JV_50"], 39, 1, 1);
 91      book(_h["pT_yy_JV_60"], 41, 1, 1);
 92      book(_h["Dphi_yy_jj_30"], 43, 1, 1); // Observables in 2-jet events
 93      book(_h["pT_yyjj_30"], 45, 1, 1);
 94      book(_d["pT_yy_vs_pT_yyj"], 47, 1, 1); // 2D xsections
 95      book(_d["pT_yy_vs_maxTau_yyj"], 49, 1, 1);
 96      book(_d["rel_DpT_y_y_vs_rel_sumpT_y_y"], 51, 1, 1);
 97      book(_h["VBF_abs_Zepp"], 53, 1, 1); // Observables in VBF fiducial region
 98      book(_h["VBF_pT_yyjj_30"], 55, 1, 1);
 99      book(_h["VBF_pT_j1_30"], 57, 1, 1);
100      book(_d["VBF_pT_j1_30_vs_Dphi_j_j_30_signed"], 59, 1, 1);
101    }
102
103
104    void analyze(const Event& event) {
105
106      if (edges.empty()) {
107        for (const string& label : vector<string>{"fid_regions", "N_j_30", "catXS_nbjet", "pT_yy_vs_yAbs_yy",
108                                                  "pT_yy_vs_pT_yyj", "pT_yy_vs_maxTau_yyj", "rel_DpT_y_y_vs_rel_sumpT_y_y",
109                                                  "VBF_pT_j1_30_vs_Dphi_j_j_30_signed"}) {
110          edges[label] = _d[label]->xEdges();
111        }
112      }
113      // Get charged particles
114      const Particles& tracks = apply<ChargedFinalState>(event,"CFS").particles();
115
116      // Save prompt photons passing particle-level isolation requirement
117      Particles photons;
118      for (const Particle& ph : apply<FinalState>(event, "PFS").particlesByPt()) {
119        FourMomentum ET_iso (0, 0, 0, 0);
120        for (const auto& track : tracks) {
121          if ( deltaR(track, ph) > 0.2)  continue;
122          ET_iso += track.mom();
123        }
124        const bool passIso = ET_iso.Et() / ph.pt() < 0.05;
125        if ( !passIso )  continue;
126        photons += ph;
127      }
128
129      // Diphoton selection: two fiducial photons with
130      // 105<m_yy<160 GeV
131      // pT/m_yy > 0.35, 0.25
132      if (photons.size() < 2)  vetoEvent;
133
134      const FourMomentum y1 = photons[0].mom();
135      const FourMomentum y2 = photons[1].mom();
136      const FourMomentum yy = y1 + y2;
137      const double myy = yy.mass();
138      if ( y1.pT() < 0.35*myy || y2.pT() < 0.25*myy )  vetoEvent;
139      if ( !inRange(myy/GeV, 105., 160.) )  vetoEvent;
140
141      // Retain prompt electrons with pseudorapidity in acceptance
142      // and pT>10 GeV (electrons10) or >15 GeV (electrons15)
143      // Do not retain electrons overlapping with photons
144      Particles electrons10 = apply<FinalState>(event, "EFS").particlesByPt(Cuts::pT > 10*GeV);
145      Particles electrons15 = apply<FinalState>(event, "EFS").particlesByPt(Cuts::pT > 15*GeV);
146      idiscardIfAnyDeltaRLess(electrons10, photons, 0.4);
147      idiscardIfAnyDeltaRLess(electrons15, photons, 0.4);
148
149      // Retain prompt muons with pseudorapidity in acceptance
150      // and pT>10 GeV (muons10) or >15 GeV (muons15)
151      Particles muons10 = apply<FinalState>(event, "MFS").particlesByPt(Cuts::pT > 10*GeV);
152      Particles muons15 = apply<FinalState>(event, "MFS").particlesByPt(Cuts::pT > 15*GeV);
153      idiscardIfAnyDeltaRLess(muons10, photons, 0.4);
154      idiscardIfAnyDeltaRLess(muons15, photons, 0.4);
155
156      const size_t nlep10 = electrons10.size() + muons10.size();
157      const size_t nlep15 = electrons15.size() + muons15.size();
158
159      // Remove jets overlapping with the fiducial photons and electrons
160      // Fill vectors of remaining jets (jets30), and subsets of these jets
161      // that are central (|eta|<2.5) and b-jets (bjets)
162      Jets jets30, jets30central, bjets;
163      for (const Jet& jet : apply<FastJets>(event, "jets").jetsByPt(Cuts::pT>30*GeV && Cuts::absrap<4.4)) {
164        if ( any(photons,     DeltaRLess(jet, 0.4)) )  continue;
165        if ( any(electrons15, DeltaRLess(jet, 0.2)) )  continue;
166        jets30 += jet;
167        if (jet.abseta() < 2.5) {
168          jets30central += jet;
169          if (jet.bTagged())  bjets += jet;
170        }
171      }
172      const size_t njets30 = jets30.size();
173      const size_t njets30central = jets30central.size();
174      const size_t nbjets  = bjets.size();
175
176      // Calculate missing ET
177      Vector3 met_vec;
178      for (const Particle& p : apply<InvisibleFinalState>(event, "MET").particles()) {
179        met_vec += p.mom().perpVec();
180      }
181      const double met =  met_vec.mod();
182
183      // Fill the histograms
184
185      // Diphoton Xsections
186      const double pT_yy = yy.pt();
187      _h["pT_yy"]->fill(pT_yy/GeV);
188
189      const double yAbs_yy = yy.absrap();
190      _h["yAbs_yy"]->fill(yAbs_yy);
191
192      const double pTy1 = y1.pt();
193      _h["rel_pT_y1"]->fill(pTy1/myy);
194
195      const double pTy2 = y2.pt();
196      _h["rel_pT_y2"]->fill(pTy2/myy);
197
198      // pT_yy in bins of |y_yy|
199      {
200        int binYabs(-1), binpT(-1);
201        double binWidth=0.0;
202        if (pT_yy/GeV < 45.) {
203          binpT = 0;
204          binWidth = 45.;
205        }
206        else if (pT_yy/GeV < 120.) {
207          binpT = 1;
208          binWidth = 120.-45.;
209        }
210        else if (pT_yy/GeV < 350.) {
211          binpT=2;
212          binWidth = 350.-120.;
213        }
214
215        if (yAbs_yy<0.5) binYabs=0;
216        else if (yAbs_yy<1.0) binYabs=1;
217        else if (yAbs_yy<1.5) binYabs=2;
218        else if (yAbs_yy<2.5) binYabs=3;
219
220        if (binYabs>=0 && binpT>=0) {
221          int bin = binYabs*3 + binpT;
222          fillHist("pT_yy_vs_yAbs_yy", bin, binWidth );
223        }
224      }
225
226      // [pT(y1)-pT(y2)]/myy in bins of [pT(y1)+pT(y2)]/myy
227      const double pTy1py2 = pTy1 + pTy2;
228      const double pTy1my2 = pTy1 - pTy2;
229      {
230        int bin = -1;
231        double binWidth = 0.0;
232        if ( pTy1py2/myy >= 0.6 && pTy1py2/myy < 0.8) {
233          if ( pTy1my2/myy < 0.3 ) {
234            bin = 0;
235            binWidth = 0.3;
236          }
237        }
238        else if ( pTy1py2/myy >= 0.8 && pTy1py2/myy < 1.1 ) {
239          if ( pTy1my2/myy < 0.05 ) { bin = 1; binWidth = 0.05;}
240          else if ( pTy1my2/myy < 0.10) { bin = 2; binWidth = 0.05; }
241          else if ( pTy1my2/myy < 0.20) { bin = 3; binWidth = 0.10; }
242          else if ( pTy1my2/myy < 0.80) { bin = 4; binWidth = 0.60; }
243        } else if ( pTy1py2/myy >= 0.8 && pTy1py2/myy < 4.0) {
244          if ( pTy1my2/myy < 0.3 ) { bin = 5; binWidth = 0.3; }
245          else if ( pTy1my2/myy < 0.6 ) { bin = 6; binWidth = 0.3; }
246          else if ( pTy1my2/myy < 4.0 ) { bin = 7; binWidth = 3.4; }
247        }
248        if (bin>-1) {
249          fillHist("rel_DpT_y_y_vs_rel_sumpT_y_y", bin, binWidth);
250        }
251      }
252
253      // Jet multiplicity bin
254      _d["N_j_30"]->fill( edges["N_j_30"][ min((int)njets30, 3) ] );
255      if (njets30central<1 || nlep10>0) {
256        _d["catXS_nbjet"]->fill( edges["catXS_nbjet"][0] );
257      }
258      else if (nbjets==0) 	_d["catXS_nbjet"]->fill( edges["catXS_nbjet"][1] );
259      else if (nbjets>=1) 	_d["catXS_nbjet"]->fill( edges["catXS_nbjet"][2] );
260
261
262      // Jet variables
263      bool isVBF(false);
264      FourMomentum j1(0.,0.,0.,0.);
265      double pT_j1_30(0.);
266      double maxtau (0.);
267      double sumtau (0.);
268      double pT_yyj_30 (0.);
269      double m_yyj_30 (0.);
270      double dphi_jj_signed(-99.);
271      double ht = sum(jets30, Kin::pT, 0.0);
272      _h["HT_30"]->fill(ht/GeV);
273      if (njets30 > 0) {
274        j1 = jets30[0].mom();
275        pT_j1_30 = j1.pt();
276        maxtau = max_tau_jet(yy, jets30);
277        sumtau = sum_tau_jet(yy, jets30);
278        pT_yyj_30 = (y1+y2+j1).pt();
279        m_yyj_30 = (y1+y2+j1).mass();
280
281        _h["pT_j1_30"]->fill(pT_j1_30 / GeV);
282        _h["maxTau_yyj_30"]->fill(maxtau / GeV);
283        _h["sumTau_yyj_30"]->fill(sumtau / GeV);
284        _h["pT_yyj_30"]->fill(pT_yyj_30 / GeV);
285        _h["m_yyj_30"]->fill(m_yyj_30 / GeV);
286
287        if (pT_j1_30 < 40*GeV) _h["pT_yy_JV_40"]->fill(pT_yy / GeV);
288        if (pT_j1_30 < 50*GeV) _h["pT_yy_JV_50"]->fill(pT_yy / GeV);
289        if (pT_j1_30 < 60*GeV) _h["pT_yy_JV_60"]->fill(pT_yy / GeV);
290      }
291      else {
292        _h["pT_j1_30"]->fill(15.) ;
293        _h["pT_yy_JV_30"]->fill(pT_yy / GeV);
294        _h["pT_yy_JV_40"]->fill(pT_yy / GeV);
295        _h["pT_yy_JV_50"]->fill(pT_yy / GeV);
296        _h["pT_yy_JV_60"]->fill(pT_yy / GeV);
297      }
298
299      // Dijet variables
300      if ( njets30 > 1 ) {
301        FourMomentum j2 = jets30[1].momentum();
302        FourMomentum dijet = j1 + j2;
303        FourMomentum yyjj = yy + dijet;
304        double mjj = dijet.mass();
305        dphi_jj_signed = j1.rap() > j2.rap()? deltaPhi(j1, j2, true) : deltaPhi(j2, j1, true);
306        double dyjj = deltaRap(j1, j2);
307        double dphiyyjj = deltaPhi(yy, dijet, false);
308        double abs_Zepp = fabs( (y1+y2).eta() - 0.5*(j1.eta() + j2.eta()));
309
310        _h["m_jj_30"]->fill(mjj / GeV);
311        _h["Dphi_j_j_30_signed"]->fill(dphi_jj_signed);
312        _h["pT_yyjj_30"]->fill(yyjj.pt() / GeV);
313        _h["Dphi_yy_jj_30"]->fill(M_PI - dphiyyjj); // pi - dphi
314
315        isVBF = (mjj/GeV>600. && dyjj>3.5);
316        if (isVBF) {
317          _h["VBF_pT_j1_30"]->fill(pT_j1_30 / GeV);
318          _h["VBF_Dphi_j_j_30_signed"]->fill(dphi_jj_signed);
319          _h["VBF_pT_yyjj_30"]->fill(yyjj.pt() / GeV);
320          _h["VBF_abs_Zepp"]->fill(abs_Zepp);
321        }
322      }
323
324      // 2d distributions
325
326      // pT(yy) in bins pT(yyj)
327      if (njets30==0) {
328        if (pT_yy/GeV < 350) fillHist("pT_yy_vs_pT_yyj", 0, 350.);
329      }
330      else {
331        if (pT_yyj_30/GeV < 30) {
332          if (pT_yy/GeV < 100) fillHist("pT_yy_vs_pT_yyj", 1, 100.);
333          else if (pT_yy/GeV < 350) fillHist("pT_yy_vs_pT_yyj", 2, 250.);
334        }
335        else if (pT_yyj_30/GeV < 60) {
336          if (pT_yy/GeV < 45) fillHist("pT_yy_vs_pT_yyj", 3, 45.);
337          else if (pT_yy/GeV < 120) fillHist("pT_yy_vs_pT_yyj", 4, 120.-45.);
338          else if (pT_yy/GeV < 350) fillHist("pT_yy_vs_pT_yyj", 5, 350.-120.);
339        }
340        else if (pT_yyj_30/GeV < 350) {
341          if (pT_yy/GeV < 80) fillHist("pT_yy_vs_pT_yyj", 6, 80.);
342          else if (pT_yy/GeV < 250) fillHist("pT_yy_vs_pT_yyj", 7, 250.-80.);
343          else if (pT_yy/GeV < 450) fillHist("pT_yy_vs_pT_yyj", 8, 450.-250.);
344        }
345      }
346
347      // pT(yy) in bins of max(tau_C^j)
348      if ( njets30 == 0 ) {
349        if (pT_yy/GeV < 350.)
350          fillHist("pT_yy_vs_maxTau_yyj", 0, 350.);
351      }
352      else {
353        if ( maxtau/GeV < 15. ) {
354
355          if (pT_yy/GeV < 100.)
356            fillHist("pT_yy_vs_maxTau_yyj", 1, 100.);
357
358          else if (pT_yy/GeV < 350.)
359            fillHist("pT_yy_vs_maxTau_yyj", 2, 350.-100.);
360
361        }
362      	else if (maxtau/GeV < 25.) {
363
364        if (pT_yy/GeV < 120.)
365          fillHist("pT_yy_vs_maxTau_yyj", 3, 120.);
366
367        else if (pT_yy/GeV < 350.)
368          fillHist("pT_yy_vs_maxTau_yyj", 4, 350.-120.);
369
370        }
371      	else if (maxtau/GeV < 40.) {
372
373        if (pT_yy/GeV < 200.)
374          fillHist("pT_yy_vs_maxTau_yyj", 5, 200.);
375
376        else if (pT_yy/GeV < 350.)
377          fillHist("pT_yy_vs_maxTau_yyj", 6, 350.-200.);
378
379        }
380      	else if (maxtau/GeV < 400.) {
381
382        if (pT_yy/GeV < 250.)
383          fillHist("pT_yy_vs_maxTau_yyj", 7, 250. );
384
385        else if (pT_yy/GeV < 650.)
386          fillHist("pT_yy_vs_maxTau_yyj", 8, 650.-250.);
387
388        }
389      }
390
391      // VBF pT_j1_30 in bins of Dphi_j_j_30_signed
392      if (isVBF) {
393        if (dphi_jj_signed < 0.) {
394
395          if (pT_j1_30/GeV < 120.)
396            fillHist("VBF_pT_j1_30_vs_Dphi_j_j_30_signed", 0, 120.-30.);
397
398          else if (pT_j1_30/GeV < 500.)
399            fillHist("VBF_pT_j1_30_vs_Dphi_j_j_30_signed", 1, 500.-120.);
400
401        }
402        else {
403
404          if (pT_j1_30/GeV < 120.)
405            fillHist("VBF_pT_j1_30_vs_Dphi_j_j_30_signed", 2, 120.-30.);
406
407          else if (pT_j1_30/GeV < 500.)
408            fillHist("VBF_pT_j1_30_vs_Dphi_j_j_30_signed", 3, 500.-120.);
409
410        }
411      }
412
413
414      // fiducial regions
415      // inclusive
416      _d["fid_regions"]->fill(edges["fid_regions"][0]) ;
417      // VBF
418      if ( isVBF ) _d["fid_regions"]->fill(edges["fid_regions"][1]);
419      // lep
420      if ( nlep15>0 ) _d["fid_regions"]->fill(edges["fid_regions"][2]) ;
421      // MET
422      if ( met>=80*GeV && pT_yy>80*GeV ) _d["fid_regions"]->fill(edges["fid_regions"][3]) ;
423      // ttH
424      const bool ttH_lep = njets30 > 2 && nlep15 >= 1 && nbjets > 0;
425      const bool ttH_had = njets30 > 3 && nlep15 == 0 && nbjets > 0;
426      if ( ttH_lep || ttH_had ) _d["fid_regions"]->fill(edges["fid_regions"][4]);
427    }
428
429
430    void finalize () {
431      // Scale histograms from nEvents (sumW) to Xsection
432      const double xs = crossSectionPerEvent() / femtobarn;
433      scale(_h, xs);
434      scale(_d, xs);
435    }
436
437    /// @}
438
439
440    double tau_jet(const FourMomentum& Higgs, const Jet& jet ) const {
441      const double mTj = sqrt( sqr(jet.pT()) + sqr(jet.mass()) );
442      return mTj/(2.0*cosh( jet.rap() - Higgs.rap() ) ) ;
443    }
444
445    double max_tau_jet ( const FourMomentum& Higgs , const Jets& jets ) const {
446      double max_tj ( 0 ) ;
447      for (const Jet& jet : jets) {
448        double tau_j ( tau_jet (Higgs , jet) ) ;
449        if ( tau_j < max_tj ) continue ;
450        max_tj = tau_j ;
451      }
452      return max_tj ;
453    }
454
455    double sum_tau_jet ( const FourMomentum& Higgs , const Jets& jets) const {
456      double sum_tj ( 0 ) ;
457      double temp ( -99 ) ;
458      for (const Jet& jet : jets){
459        temp =  tau_jet(Higgs, jet);
460        //sum_tj += temp;
461        sum_tj += temp > 8*GeV ? temp : 0.0;
462      }
463      return sum_tj ;
464    }
465
466    void fillHist(const string& name, const size_t index, const double binWidth=-1.0) {
467      // scale weight by 1/binWidth to make differential xsections distributions
468      // hack needed for 2D hists which are shown as 1D histograms
469      const string& edge = edges[name][index];
470      if (binWidth) _d[name]->fill(edge , 1. / binWidth);
471      else          _d[name]->fill(edge);
472    }
473
474
475  private:
476
477    map<string,Histo1DPtr> _h;
478    map<string,BinnedHistoPtr<string>> _d;
479    map<string, vector<string>> edges;
480
481  };
482
483
484  RIVET_DECLARE_PLUGIN(ATLAS_2022_I2023464);
485
486}