flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
experimental_constraints.cpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of FlexibleSUSY.
3//
4// FlexibleSUSY is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// FlexibleSUSY is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with FlexibleSUSY. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
19
27#include "decays/standard_model_decays.hpp"
28
29#include <gsl/gsl_min.h>
30#include <gsl/gsl_errno.h>
31#include <boost/math/distributions/chi_squared.hpp>
32
33#include <algorithm>
34#include <filesystem>
35#include <fstream>
36#include <iostream>
37#include <functional>
38#include <random>
39
40#ifdef ENABLE_HIGGSTOOLS
41#include "Higgs/Predictions.hpp"
42#include "Higgs/Bounds.hpp"
43#include "Higgs/Signals.hpp"
44namespace HP = Higgs::predictions;
45#endif
46
47#ifdef ENABLE_LILITH
48#include <Python.h>
49#include "lilith.h"
50#include "lilith.c"
51#endif
52
53namespace flexiblesusy {
54
55namespace {
56
57// Whether to calculate the X->gaga and X->gg decay widths in terms of the
58// effective tree-level couplings (calcHgamgam=calcggH=true) or by rescaling
59// the X->gaga and X->gg decay by the squared of the effective gamgam and gg
60// couplings (calcHgamgam=calcggH=false). True would make sense only if we
61// would not compute those loop-induced decays ourself.
62constexpr bool calcggH = false;
63constexpr bool calcHgamgam = false;
64
65// relative BSM Higgs-like state mass uncertainty
66// example: 0.03 means 3% uncertainty
67constexpr double relMassError = 0.03;
68
69#ifdef ENABLE_HIGGSTOOLS
70// Ref. model for computing brs and xsections on the HiggsTools side
71constexpr auto refModel = HP::ReferenceModel::SMHiggsInterp;
72
73double minChi2SM_hs(const double mhSM, std::string const& higgssignals_dataset) {
74 const auto signals = Higgs::Signals {higgssignals_dataset};
75
76 auto pred = Higgs::Predictions();
77 auto& s = pred.addParticle(HP::BsmParticle("hSM", HP::ECharge::neutral, HP::CP::even));
78 auto effc = HP::scaledSMlikeEffCouplings(1.0);
79 s.setMass(mhSM);
80 s.setMassUnc(0.);
81 effectiveCouplingInput(
82 s, effc,
83 refModel,
85 );
86 return signals(pred);
87}
88#endif
89
90#ifdef ENABLE_LILITH
91double minChi2SM_lilith(const double mhSM, bool cpEvenHiggs, const std::string& lilithdb) {
92
93 const std::string XMLinputstring =
94 R"(<?xml version="1.0"?>
95<lilithinput>
96<reducedcouplings part="h">
97<mass>)" + std::to_string(mhSM) + R"(</mass>
98<C to="gammagamma">1.0</C>
99<C to="Zgamma">1.0</C>
100<C to="gg">1.0</C>
101<C to="VV">1.0</C>
102<C to="ff" part="re">1.0</C>
103<C to="ff" part="im">0.0</C>
104<precision>)" + (cpEvenHiggs ? "BEST-QCD" : "LO") + R"(</precision>
105<extraBR>
106<BR to="invisible">0.0</BR>
107<BR to="undetected">0.0</BR>
108</extraBR>
109</reducedcouplings>
110</lilithinput>)";
111
112 Py_Initialize();
113
114 PyObject* lilithcalc2 = initialize_lilith(const_cast<char*>(lilithdb.c_str()));
115 lilith_readuserinput(lilithcalc2, const_cast<char*>(XMLinputstring.c_str()));
116 const double my_likelihood = lilith_computelikelihood(lilithcalc2);
117
118 Py_Finalize();
119
120 return my_likelihood;
121}
122#endif
123
125 standard_model::Standard_model& sm,
126 Spectrum_generator_settings const& spectrum_generator_settings)
127{
128 sm.set_pole_mass_loop_order(static_cast<int>(spectrum_generator_settings.get(Spectrum_generator_settings::pole_mass_loop_order)));
129 sm.set_ewsb_loop_order(static_cast<int>(spectrum_generator_settings.get(Spectrum_generator_settings::ewsb_loop_order)));
130 sm.set_precision(spectrum_generator_settings.get(Spectrum_generator_settings::precision));
131 sm.set_threshold_corrections(spectrum_generator_settings.get_threshold_corrections());
132 sm.set_loop_corrections(spectrum_generator_settings.get_loop_corrections());
133 sm.set_loops(static_cast<int>(spectrum_generator_settings.get(Spectrum_generator_settings::beta_loop_order)));
134
135 Loop_corrections loop_corrections_;
136 loop_corrections_.higgs_at_as = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_2loop_correction_at_as);
137 loop_corrections_.higgs_ab_as = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_2loop_correction_ab_as);
138 loop_corrections_.higgs_at_at = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_2loop_correction_at_at);
139 loop_corrections_.higgs_atau_atau = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_2loop_correction_atau_atau);
140 loop_corrections_.top_qcd = spectrum_generator_settings.get(Spectrum_generator_settings::top_pole_qcd_corrections);
141 loop_corrections_.higgs_at_as_as = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_3loop_correction_at_as2);
142 loop_corrections_.higgs_ab_as_as = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_3loop_correction_ab_as2);
143 loop_corrections_.higgs_at_at_as = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_3loop_correction_at2_as);
144 loop_corrections_.higgs_at_at_at = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_3loop_correction_at3);
145 loop_corrections_.higgs_at_as_as_as = spectrum_generator_settings.get(Spectrum_generator_settings::higgs_4loop_correction_at_as3);
146 sm.set_loop_corrections(loop_corrections_);
147
148 sm.set_threshold_corrections(spectrum_generator_settings.get_threshold_corrections());
149}
150
151void set_sm_lambda_to_match_bsm_mh(standard_model::Standard_model& sm, double mass, std::string const& name) {
152
153 // set SM λ such that mhSM == mass
154 auto match_Higgs_mass = [&sm, mass](double x) {
155 sm.set_Lambdax(x);
156 sm.calculate_DRbar_masses(); // internaly calls solve_ewsb_tree_level()
157 sm.solve_ewsb();
158 sm.calculate_Mhh_pole();
159 return std::abs(sm.get_physical().Mhh - mass);
160 };
161
162 int status, iter = 0;
163 static constexpr int max_iter = 100;
164 const gsl_min_fminimizer_type *T;
165 gsl_min_fminimizer *sGSL;
166 // find λ in range [0, 5]
167 double a = 0.0001, b = 5;
168 // initial guess for the location of minimum: λ=(mass/v)^2/2
169 double m = 0.5*Sqr(mass/247);
170
171 // hack to pass lambda-function to GSL
172 std::function<double(double)> f = std::bind(match_Higgs_mass, std::placeholders::_1);
173 gsl_function F = {
174 [](double d, void* vf) -> double {
175 auto& f = *static_cast<std::function<double(double)>*>(vf);
176 return f(d);
177 },
178 &f
179 };
180
181 // checked on a single point in the MRSSM2:
182 // brent seems faster and more accurate than quad_golden
183 T = gsl_min_fminimizer_brent;
184 sGSL = gsl_min_fminimizer_alloc (T);
185
186 // gsl_min_fminimizer_set expects f(m) < f(a) && f(m) < f(b),
187 // otherwise it returns GSL_EINVAL status.
188 // In this case we randomly try different m from [max(a, 0.01m), min(b, 100m)]
189 // until status != GSL_EINVAL
190 gsl_error_handler_t * _error_handler = gsl_set_error_handler_off();
191 status = gsl_min_fminimizer_set (sGSL, &F, m, a, b);
192 if (status == GSL_EINVAL) {
193 std::random_device rd;
194 std::mt19937 gen(rd());
195 std::uniform_real_distribution<> dis(std::max(a,1e-2*m), std::min(b,1e+2*m));
196 int iterCount = 0;
197 do {
198 m = dis(gen);
199 status = gsl_min_fminimizer_set (sGSL, &F, m, a, b);
200 iterCount++;
201 } while (status == GSL_EINVAL && iterCount < 100);
202 }
203 gsl_set_error_handler (_error_handler);
204
205 static constexpr double mass_precision = 1e-4;
206
207 do
208 {
209 iter++;
210 status = gsl_min_fminimizer_iterate (sGSL);
211
212 m = gsl_min_fminimizer_x_minimum (sGSL);
213 a = gsl_min_fminimizer_x_lower (sGSL);
214 b = gsl_min_fminimizer_x_upper (sGSL);
215 }
216 while (std::abs(1. - sm.get_physical().Mhh/mass) > mass_precision && iter < max_iter);
217
218 gsl_min_fminimizer_free (sGSL);
219
220 if (const double diff = std::abs(1. - sm.get_physical().Mhh/mass); diff > mass_precision) {
221 throw std::runtime_error("Normalized Higgs effective couplings: Cannot find a SM equivalent of " + name +
222 " after " + std::to_string(iter+1) + "/" + std::to_string(max_iter) + " iterations. "
223 "Mass difference: " + std::to_string(mass) + " GeV (BSM) vs " +
224 std::to_string(sm.get_physical().Mhh) + " GeV (SM) for λSM = " + std::to_string(m) +
225 ". Difference: " + std::to_string(100*diff) + "%. ");
226 }
227
228
229}
230} // anonymous
231
232double chi2_to_pval(double chi2BSM, double chi2SM) {
233 boost::math::chi_squared dist(2);
234 const double pval = chi2BSM<=chi2SM ? 1 : boost::math::cdf(complement(dist, chi2BSM-chi2SM));
235 return pval;
236}
237
239 EffectiveCoupling_list const& bsm_input,
240 Physical_input const& physical_input,
241 softsusy::QedQcd const& qedqcd,
242 Spectrum_generator_settings const& spectrum_generator_settings,
243 FlexibleDecay_settings const& flexibledecay_settings)
244{
245 // make sure we don't compute input for the EFFHIGGSCOUPLINGS block in the
246 // built in SM
247 auto flexibledecay_settings_ = flexibledecay_settings;
248
249 EffectiveCoupling_list normalized_effc_list;
250 for (auto const& el : bsm_input) {
251
252 const double mass = el.mass;
253 // in the SM, λ = (mh/v)^2/2
254 // for mh > 650 GeV this gives λ > 4
255 // it probably makes no sense to use coupling strengh modifiers in this case so we skip those particles
256 // On the other hand there's a problem with finding a SM equivalent of very light states
257 if (mass > 650 || mass < 1) {
258 VERBOSE_MSG("Cannot construct normalization for effective coupling of " + el.particle + " with mass of " + std::to_string(mass) + " GeV");
259 continue;
260 }
261
262 // create a SM equivalent to the BSM model, with mhSM == mass
263 standard_model::Standard_model sm {};
264 set_sm_settings_matching_bsm(sm, spectrum_generator_settings);
265 sm.set_physical_input(physical_input);
266 sm.initialise_from_input(qedqcd);
267 set_sm_lambda_to_match_bsm_mh(sm, mass, el.particle);
268 sm.calculate_pole_masses();
269
270 if (sm.get_physical().Mhh > 0) {
271 // calculate decays in the SM equivalent
272 flexiblesusy::Standard_model_decays sm_decays(sm, qedqcd, physical_input, flexibledecay_settings_);
273 sm_decays.calculate_decays();
274 const auto sm_input = sm_decays.get_neutral_higgs_effc();
275
276 // fermion channels are given as complex numbers
277 // we normalize to real part of SM coupling
278 // quarks
280 coups.width_sm = sm_input[0].width;
281 coups.dd.second = std::abs(sm_input[0].dd.second) > 0 ? el.dd.second/sm_input[0].dd.second.real() : 0.;
282 coups.uu.second = std::abs(sm_input[0].uu.second) > 0 ? el.uu.second/sm_input[0].uu.second.real() : 0.;
283 coups.ss.second = std::abs(sm_input[0].ss.second) > 0 ? el.ss.second/sm_input[0].ss.second.real() : 0.;
284 coups.cc.second = std::abs(sm_input[0].cc.second) > 0 ? el.cc.second/sm_input[0].cc.second.real() : 0.;
285 coups.bb.second = std::abs(sm_input[0].bb.second) > 0 ? el.bb.second/sm_input[0].bb.second.real() : 0.;
286 using namespace std::complex_literals;
287 coups.tt.second = std::abs(sm_input[0].tt.second) > 0 ? (std::abs(el.tt.second.real()) + 1i*std::abs(el.tt.second.imag()))/std::abs(sm_input[0].tt.second.real()) : 0.;
288 // leptons
289 coups.ee.second = std::abs(sm_input[0].ee.second) > 0 ? el.ee.second/sm_input[0].ee.second.real() : 0.;
290 coups.mumu.second = std::abs(sm_input[0].mumu.second) > 0 ? el.mumu.second/sm_input[0].mumu.second.real() : 0.;
291 coups.tautau.second = std::abs(sm_input[0].tautau.second) > 0 ? el.tautau.second/sm_input[0].tautau.second.real() : 0.;
292
293 // gauge bosons
294 coups.WW.second = std::abs(sm_input[0].WW.second) > 0 ? el.WW.second/sm_input[0].WW.second : 0.;
295 coups.ZZ.second = std::abs(sm_input[0].ZZ.second) > 0 ? el.ZZ.second/sm_input[0].ZZ.second : 0.;
296 coups.gamgam.second = std::abs(sm_input[0].gamgam.second) > 0 ? el.gamgam.second/sm_input[0].gamgam.second : 0.;
297 coups.Zgam.second = std::abs(sm_input[0].Zgam.second) > 0 ? el.Zgam.second/sm_input[0].Zgam.second : 0.;
298 coups.gg.second = std::abs(sm_input[0].gg.second) > 0 ? el.gg.second/sm_input[0].gg.second : 0.;
299
300 coups.lam = std::abs(sm_input[0].lam) > 0 ? el.lam/sm_input[0].lam : 0.;
301 normalized_effc_list.push_back(std::move(coups));
302 }
303 }
304
305 return normalized_effc_list;
306}
307
308#ifdef ENABLE_HIGGSTOOLS
309std::tuple<std::optional<SignalResult>, std::vector<std::tuple<int, double, double, std::string>>> call_higgstools(
310 EffectiveCoupling_list const& bsm_input,
311 Physical_input const& physical_input,
312 std::string const& higgsbounds_dataset, std::string const& higgssignals_dataset) {
313
314 // check location of databases
315 // HiggsBounds
316 if (higgsbounds_dataset.empty()) {
317 throw SetupError("Need to specify location of HiggsBounds database");
318 }
319
320 auto pred = Higgs::Predictions();
321 namespace HP = Higgs::predictions;
322
323 for (auto const& el : bsm_input) {
324 auto effc = HP::NeutralEffectiveCouplings {};
325 // 1 (even), -1 (odd), 0 (undefined)
326 auto& s = pred.addParticle(HP::BsmParticle(el.particle, HP::ECharge::neutral, static_cast<HP::CP>(el.CP)));
327 s.setMass(el.mass);
328 s.setMassUnc(relMassError*el.mass); // set mass uncertainty to 3%
329
330 // quarks
331 effc.dd = el.dd.second;
332 effc.uu = el.uu.second;
333 effc.ss = el.ss.second;
334 effc.cc = el.cc.second;
335 effc.bb = el.bb.second;
336 effc.tt = el.tt.second;
337
338 // leptons
339 effc.ee = el.ee.second;
340 effc.mumu = el.mumu.second;
341 effc.tautau = el.tautau.second;
342
343 // gauge bosons
344 effc.WW = el.WW.second;
345 effc.ZZ = el.ZZ.second;
346 effc.gamgam = el.gamgam.second;
347 effc.Zgam = el.Zgam.second;
348 effc.gg = el.gg.second;
349
350 effc.lam = el.lam;
351
352 effectiveCouplingInput(s, effc, refModel, calcggH, calcHgamgam);
353
354 // Effective coupligs below are defined as sqrt(Gamma CP-even) + I sqrt(Gamma CP-odd)
355 // (note that this is different than couplings like gg, WW etc)
356 // so taking a norm gives a total partial width
357 s.setDecayWidth(HP::Decay::emu, std::norm(el.emu.second));
358 s.setDecayWidth(HP::Decay::etau, std::norm(el.etau.second));
359 s.setDecayWidth(HP::Decay::mutau, std::norm(el.mutau.second));
360
361 // Higgs to LSP decay (if model contains one)
362 s.setDecayWidth(HP::Decay::directInv, el.invWidth);
363
364 // all remaining partial widths
365 s.setDecayWidth("Undetected", "Undetected", el.get_undetected_width());
366 }
367
368 std::vector<std::tuple<int, double, double, std::string>> hb_return {};
369 if (std::filesystem::exists(higgsbounds_dataset)) {
370 auto bounds = Higgs::Bounds {higgsbounds_dataset};
371 auto hbResult = bounds(pred);
372 for (auto const& _hb: hbResult.selectedLimits) {
373 auto found = std::find_if(
374 std::begin(bsm_input), std::end(bsm_input),
375 [&_hb](auto const& el) { return el.particle==_hb.first; }
376 );
377 hb_return.push_back({found->pdgid, _hb.second.obsRatio(), _hb.second.expRatio(), _hb.second.limit()->to_string()});
378 }
379 }
380 else if (higgsbounds_dataset.empty()) {
381 WARNING("Warning: no HiggsBounds database provided");
382 }
383 else {
384 WARNING("Warning: no HiggsBounds database at " + higgsbounds_dataset);
385 }
386
387 std::optional<SignalResult> hs_return;
388 if (std::filesystem::exists(higgssignals_dataset)) {
389 const auto signals = Higgs::Signals {higgssignals_dataset};
390 const double hs_chisq = signals(pred);
391 const double mhSMref = physical_input.get(Physical_input::mh_pole);
392 const double smChi2 = minChi2SM_hs(mhSMref, higgssignals_dataset);
393 const double pvalue = chi2_to_pval(hs_chisq, smChi2);
394 hs_return = {signals.observableCount(), mhSMref, hs_chisq, smChi2, pvalue};
395 }
396 else if (higgssignals_dataset.empty()) {
397 WARNING("Warning: no HiggsSignals database provided");
398 }
399 else {
400 WARNING("Warning: no HiggsSinglas database at " + higgssignals_dataset);
401 }
402
403 return {hs_return, hb_return};
404}
405#endif
406
407#ifdef ENABLE_LILITH
408std::optional<SignalResult> call_lilith(
409 EffectiveCoupling_list const& bsm_input,
410 Physical_input const& physical_input,
411 std::string const& lilith_db) {
412
413 // Lilith requires Higgs mass to be in range [123, 128]
414 bool higgs_in_range = false;
415 bool cpEvenHiggs = false;
416 for (auto const& el : bsm_input) {
417 const double mh = el.mass;
418 if (mh > 123.0 && mh < 128.0) {
419 higgs_in_range = true;
420 cpEvenHiggs = (el.CP == 1);
421 }
422 }
423 if (!higgs_in_range) {
424 return std::nullopt;
425 }
426
427 std::string XMLinputstring;
428 XMLinputstring += "<?xml version=\"1.0\"?>\n";
429 XMLinputstring += "<lilithinput>\n";
430
431 for (auto const& el : bsm_input) {
432
433 const double mh = el.mass;
434 if (mh < 123.0 || mh > 128.0) continue;
435
436 XMLinputstring += "<reducedcouplings part=\"" + el.particle + "\">\n";
437 XMLinputstring += "<mass>" + std::to_string(mh) + "</mass>\n";
438
439 // massless gauge bosons
440 XMLinputstring += "<C to=\"gammagamma\">" + std::to_string(el.gamgam.second) + "</C>\n";
441 XMLinputstring += "<C to=\"Zgamma\">" + std::to_string(el.Zgam.second) + "</C>\n";
442 // the same reduce coupling for production and decay for gluons
443 XMLinputstring += "<C to=\"gg\">" + std::to_string(el.gg.second) + "</C>\n";
444
445 // massive gauge bosons
446 XMLinputstring += "<C to=\"ZZ\">" + std::to_string(el.ZZ.second) + "</C>\n";
447 XMLinputstring += "<C to=\"WW\">" + std::to_string(el.WW.second) + "</C>\n";
448
449 // fermions
450 // tt
451 XMLinputstring += "<C to=\"tt\" part=\"re\">" + std::to_string(std::real(el.tt.second)) + "</C>\n";
452 XMLinputstring += "<C to=\"tt\" part=\"im\">" + std::to_string(std::imag(el.tt.second)) + "</C>\n";
453 // cc
454 XMLinputstring += "<C to=\"cc\" part=\"re\">" + std::to_string(std::real(el.cc.second)) + "</C>\n";
455 XMLinputstring += "<C to=\"cc\" part=\"im\">" + std::to_string(std::imag(el.cc.second)) + "</C>\n";
456 // bb
457 XMLinputstring += "<C to=\"bb\" part=\"re\">" + std::to_string(std::real(el.bb.second)) + "</C>\n";
458 XMLinputstring += "<C to=\"bb\" part=\"im\">" + std::to_string(std::imag(el.bb.second)) + "</C>\n";
459 // tautau
460 XMLinputstring += "<C to=\"tautau\" part=\"re\">" + std::to_string(std::real(el.tautau.second)) + "</C>\n";
461 XMLinputstring += "<C to=\"tautau\" part=\"im\">" + std::to_string(std::imag(el.tautau.second)) + "</C>\n";
462 // mumu
463 XMLinputstring += "<C to=\"mumu\" part=\"re\">" + std::to_string(std::real(el.mumu.second)) + "</C>\n";
464 XMLinputstring += "<C to=\"mumu\" part=\"im\">" + std::to_string(std::imag(el.mumu.second)) + "</C>\n";
465
466 // in the BEST-QCD mode, only the real part of the coupling is taken into account (see 1502.04138)
467 const std::string orderAsStr = (el.CP == 1 ? "BEST-QCD" : "LO");
468 XMLinputstring += "<precision>" + orderAsStr + "</precision>\n";
469
470 const double BRinv = el.invWidth/el.width;
471 const double BRund = el.get_undetected_width()/el.width;
472 XMLinputstring += "<extraBR>\n";
473 XMLinputstring += "<BR to=\"invisible\">" + std::to_string(BRinv) + "</BR>\n";
474 XMLinputstring += "<BR to=\"undetected\">" + std::to_string(BRund) + "</BR>\n";
475 XMLinputstring += "</extraBR>\n";
476
477 XMLinputstring += "</reducedcouplings>\n";
478 }
479
480 XMLinputstring += "</lilithinput>\n";
481 VERBOSE_MSG("Lilith input: \n" << XMLinputstring);
482
483 Py_Initialize();
484
485 // Creating an object of the class Lilith: lilithcalc
486 PyObject* lilithcalc = initialize_lilith(const_cast<char*>(lilith_db.c_str()));
487 // reading user input XML string
488 lilith_readuserinput(lilithcalc, const_cast<char*>(XMLinputstring.c_str()));
489 // getting -2*log(L)
490 const double my_likelihood = lilith_computelikelihood(lilithcalc);
491 // getting ndf
492 const std::size_t exp_ndf = static_cast<std::size_t>(lilith_exp_ndf(lilithcalc));
493 const double mhSMref = physical_input.get(Physical_input::mh_pole);
494 const double sm_likelihood = minChi2SM_lilith(mhSMref, cpEvenHiggs, lilith_db);
495
496 Py_Finalize();
497
498 const double pvalue = chi2_to_pval(my_likelihood, sm_likelihood);
499 const SignalResult res {exp_ndf, mhSMref, my_likelihood, sm_likelihood, pvalue};
500
501 return res;
502}
503#endif
504
505} // flexiblesusy
void push_back(NeutralHiggsEffectiveCouplings &&el)
Definition decay.hpp:130
stores physical input parameters
@ mh_pole
[1] SM Higgs pole mass
@ pole_mass_loop_order
[4] loop-order for calculation of pole masses
@ top_pole_qcd_corrections
[13] Top-quark pole mass QCD corrections
@ higgs_2loop_correction_at_as
[8] Higgs 2-loop correction O(alpha_t alpha_s)
@ ewsb_loop_order
[5] loop-order for solving the EWSB eqs.
@ higgs_2loop_correction_ab_as
[9] Higgs 2-loop correction O(alpha_b alpha_s)
@ higgs_2loop_correction_at_at
[10] Higgs 2-loop correction O(alpha_t alpha_t + alpha_t alpha_b + alpha_b alpha_b)
@ higgs_4loop_correction_at_as3
[30] Higgs 4-loop correction O(alpha_t alpha_s^3)
@ higgs_3loop_correction_ab_as2
[27] Higgs 3-loop correction O(alpha_b alpha_s^2)
@ higgs_3loop_correction_at3
[29] Higgs 3-loop correction O(alpha_t^3)
@ higgs_2loop_correction_atau_atau
[11] Higgs 2-loop correction O(alpha_tau alpha_tau)
@ higgs_3loop_correction_at_as2
[26] Higgs 3-loop correction O(alpha_t alpha_s^2)
@ higgs_3loop_correction_at2_as
[28] Higgs 3-loop correction O(alpha_t^2 alpha_s)
double get(Settings) const
get value of spectrum generator setting
Quark and lepton masses and gauge couplings in QEDxQCD effective theory.
Definition lowe.h:64
contains Higgs effective coupling calculation and interfaces to HiggsTools and Lilith
#define WARNING(msg)
Definition logger.hpp:63
#define VERBOSE_MSG(msg)
Definition logger.hpp:57
void set_sm_lambda_to_match_bsm_mh(standard_model::Standard_model &sm, double mass, std::string const &name)
void set_sm_settings_matching_bsm(standard_model::Standard_model &sm, Spectrum_generator_settings const &spectrum_generator_settings)
double chi2_to_pval(double chi2BSM, double chi2SM)
std::complex< double > f(double tau) noexcept
EffectiveCoupling_list get_normalized_effective_couplings(EffectiveCoupling_list const &bsm_input, Physical_input const &physical_input, softsusy::QedQcd const &qedqcd, Spectrum_generator_settings const &spectrum_generator_settings, FlexibleDecay_settings const &flexibledecay_settings)
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition wrappers.hpp:633
int top_qcd
top pole mass QCD corrections