Rivet analyses referenceATLAS_2022_I2023464H->yy differentual cross-sections at 13 TeVExperiment: ATLAS (LHC) Inspire ID: 2023464 Status: VALIDATED Authors:
Beam energies: (6500.0, 6500.0) GeV Run details:
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}
|