2double CLASSNAME::get_partial_width<Higgs,ZBoson,ZBoson>(
3 const context_base& context,
4 typename field_indices<Higgs>::type
const& indexIn,
5 typename field_indices<ZBoson>::type
const& indexOut1,
6 typename field_indices<ZBoson>::type
const& indexOut2)
9 const double mHOS = context.physical_mass<Higgs>(indexIn);
15 const double mZOS = qedqcd.displayPoleMZ();
16 const double x =
Sqr(mZOS/mHOS);
20 const int offshell_VV_decays = flexibledecay_settings.get(FlexibleDecay_settings::offshell_VV_decays);
21 if ((x > 1.0 && offshell_VV_decays != 0) ||
22 (4.*x > 1.0 && offshell_VV_decays == 2)) {
25 static constexpr double GammaZ = 2.4952;
26 struct hVV_4body_params params = {mHOS, mZOS, GammaZ};
27 gsl_monte_function G = {&
hVV_4body, 2, ¶ms};
31 double xl[2] = {0, 0};
32 double xu[2] = {
Sqr(mHOS),
Sqr(mHOS)};
34 static constexpr size_t calls = 1
'000'000;
36 const gsl_rng_type *T = gsl_rng_default;
37 gsl_rng *r = gsl_rng_alloc (T);
38 gsl_monte_miser_state *s = gsl_monte_miser_alloc (2);
39 gsl_monte_miser_integrate (&G, xl, xu, 2, calls, r, s,
43 gsl_monte_miser_free (s);
47 const auto indices =
concatenate(indexIn, indexOut2, indexOut1);
49 Vertex<Higgs, ZBoson, ZBoson>::evaluate(indices, context).value();
50 const double normalization = 1./(64.*
Cube(Pi)) * std::norm(ghZZ) *
Cube(mHOS)/
Power4(mZOS)/2.;
53 const double rel_err = err/res;
54 static constexpr double errorThresholdPerc = 0.1;
55 if (rel_err*100 > errorThresholdPerc) {
57 create_process_string<Higgs,ZBoson,ZBoson>(indexIn, indexOut1, indexOut2)
58 +
": Relative integration error > " + std::to_string(errorThresholdPerc) +
"%"
64 else if (4 * x > 1.0 && offshell_VV_decays != 0) {
66 if (check_3body_Vff_decay<BSMForZdecay,ZBoson>(context, mHOS, indexOut1)) {
67 const std::string index_as_string = indexIn.size() == 0 ?
"" :
"(" + std::to_string(indexIn.at(0)) +
")";
68 WARNING(
"Warning in H" + index_as_string +
"->ZZ decays: Single off-shell decays H->Zff' assume no possible BSM particles in the final state. Turning off.");
72 const double sw2 =
Sqr(std::sin(context.model.ThetaW()));
73 const double deltaV = 7.0/12.0 - 10.0/9.0*sw2 + 40.0/27.0*
Sqr(sw2);
75 res = 3./(512.*
Power3(Pi)) * 1./mHOS * deltaV *
RT(x)/x;
77 const auto indices =
concatenate(indexIn, indexOut2, indexOut1);
79 Vertex<Higgs, ZBoson, ZBoson>::evaluate(indices, context).value();
81 const double g2 = context.model.get_g2();
83 res *= std::norm(ghZZ*g2)/(1-sw2);
87 else if (4.*x < 1.0) {
89 const double flux = 1. / (2 * mHOS);
91 const double ps = 1. / (8. * Pi) * std::sqrt(
KallenLambda(1., x, x));
94 const double ps_symmetry = 1./2.;
97 const auto mat_elem = calculate_amplitude<Higgs, ZBoson, ZBoson>(
98 context, indexIn, indexOut1, indexOut2);
99 const auto mat_elem_sq = mat_elem.square();
102 res = flux * ps * ps_symmetry * mat_elem_sq;
105 if (flexibledecay_settings.get(FlexibleDecay_settings::call_higgstools) != 0 ||
106 flexibledecay_settings.get(FlexibleDecay_settings::call_lilith) != 0 ||
107 flexibledecay_settings.get(FlexibleDecay_settings::calculate_normalized_effc) != 0
109 neutral_higgs_effc.add_coupling(
110 field_as_string<Higgs>(indexIn),
112 std::pair<std::string, double> {field_as_string<Higgs>(indexIn) +
"-" + field_as_string<ZBoson>(indexOut1) +
"-" + field_as_string<ZBoson>(indexOut2), std::sqrt(res)},
constexpr Base Power3(Base b) noexcept
double RT(double x) noexcept
Eq.(2.31) of hep-ph/0503172, including edge cases.
double hVV_4body(double *q2, size_t, void *params)
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
detail::result_of::concatenate< Args... >::type concatenate(Args &&... args)
T KallenLambda(T x, T y, T z) noexcept
constexpr Base Power4(Base b) noexcept
constexpr T Cube(T a) noexcept