2double CLASSNAME::get_partial_width<Higgs, WpBoson, WmBoson>(
3 const context_base& context,
typename field_indices<Higgs>::type
const& indexIn,
4 typename field_indices<WpBoson>::type
const& indexOut1,
5 typename field_indices<WmBoson>::type
const& indexOut2)
8 const double mHOS = context.physical_mass<Higgs>(indexIn);
9 const double mWOS = context.physical_mass<WpBoson>(indexOut1);
10 const double x =
Sqr(mWOS/mHOS);
13 const int offshell_VV_decays = flexibledecay_settings.get(FlexibleDecay_settings::offshell_VV_decays);
14 if ((x > 1.0 && offshell_VV_decays != 0) ||
15 (4.*x > 1.0 && offshell_VV_decays == 2)) {
18 static constexpr double GammaW = 2.085;
19 struct hVV_4body_params params = {mHOS, mWOS, GammaW};
20 gsl_monte_function G = { &
hVV_4body, 2, ¶ms };
24 double xl[2] = {0, 0};
25 double xu[2] = {
Sqr(mHOS),
Sqr(mHOS)};
27 static constexpr size_t calls = 1
'000'000;
29 const gsl_rng_type *T = gsl_rng_default;
30 gsl_rng *r = gsl_rng_alloc (T);
31 gsl_monte_miser_state *s = gsl_monte_miser_alloc (2);
32 gsl_monte_miser_integrate (&G, xl, xu, 2, calls, r, s,
36 gsl_monte_miser_free (s);
40 const auto indices =
concatenate(indexIn, indexOut1, indexOut2);
42 Vertex<Higgs, WpBoson, WmBoson>::evaluate(indices, context).value();
44 const double normalization = 1./(64.*
Cube(Pi)) * std::norm(ghWW) *
Cube(mHOS)/
Power4(mWOS);
47 const double rel_err = err/res;
48 static constexpr double errorThresholdPerc = 0.1;
49 if (rel_err*100 > errorThresholdPerc) {
51 create_process_string<Higgs,WpBoson,WmBoson>(indexIn, indexOut1, indexOut2)
52 +
": Relative integration error > " + std::to_string(errorThresholdPerc) +
"%"
57 else if (4 * x > 1.0 && offshell_VV_decays != 0) {
59 if (check_3body_Vff_decay<BSMForWdecay, WpBoson>(context, mHOS, indexOut1)) {
60 const std::string index_as_string = indexIn.size() == 0 ?
"" :
"(" + std::to_string(indexIn.at(0)) +
")";
61 WARNING(
"Warning in H" + index_as_string +
"->WW decays: Single off-shell decays H->Wff' assume no possible BSM particles in the final state. Turning off.");
64 res = 1./(768.*
Power3(Pi)*mHOS) *
RT(x)/x;
66 const auto indices =
concatenate(indexIn, indexOut1, indexOut2);
68 Vertex<Higgs, WpBoson, WmBoson>::evaluate(indices, context).value();
71 const double g2 = context.model.get_g2();
72 const double gWud =
g2/std::sqrt(2.0);
74 res *= std::norm(ghWW*gWud);
77 static constexpr double NLF = 3;
78 static constexpr double Nc = 3;
79 static constexpr double NQF = 2;
84 else if (4.*x < 1.0) {
85 const double flux = 1. / (2 * mHOS);
87 const double ps = 1./(8.*Pi)*std::sqrt(
KallenLambda(1., x, x));
90 const auto mat_elem = calculate_amplitude<Higgs, WpBoson, WmBoson>(
91 context, indexIn, indexOut1, indexOut2);
92 const auto mat_elem_sq = mat_elem.square();
95 res = flux * ps * mat_elem_sq;
98 if (flexibledecay_settings.get(FlexibleDecay_settings::call_higgstools) != 0 ||
99 flexibledecay_settings.get(FlexibleDecay_settings::call_lilith) != 0 ||
100 flexibledecay_settings.get(FlexibleDecay_settings::calculate_normalized_effc) != 0
102 neutral_higgs_effc.add_coupling(
103 field_as_string<Higgs>(indexIn),
105 std::pair<std::string, double> {field_as_string<Higgs>(indexIn) +
"-" + field_as_string<WpBoson>(indexOut1) +
"-" + field_as_string<WmBoson>(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