flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_H_to_ZZ.inc
Go to the documentation of this file.
1template <>
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)
7{
8
9 const double mHOS = context.physical_mass<Higgs>(indexIn);
10 // There might be large differences between mZ from mass block
11 // and one from slha input, especially in the decoupling limit
12 // so we use the latter one. There might be a problem with
13 // models where Z mixes with something else.
14 // const double mZOS = context.physical_mass<Z>(indexOut1);
15 const double mZOS = qedqcd.displayPoleMZ();
16 const double x = Sqr(mZOS/mHOS);
17 double res = 0;
18
19 // mH < mZ
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)) {
23
24 // integrand
25 static constexpr double GammaZ = 2.4952;
26 struct hVV_4body_params params = {mHOS, mZOS, GammaZ};
27 gsl_monte_function G = {&hVV_4body, 2, &params};
28
29 // setup integration
30 gsl_rng_env_setup ();
31 double xl[2] = {0, 0};
32 double xu[2] = {Sqr(mHOS), Sqr(mHOS)};
33 // this gives relative error < 0.05%
34 static constexpr size_t calls = 1'000'000;
35 double err;
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,
40 &res, &err);
41
42 // clean-up
43 gsl_monte_miser_free (s);
44 gsl_rng_free (r);
45
46 // prefactor
47 const auto indices = concatenate(indexIn, indexOut2, indexOut1);
48 const auto ghZZ =
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.;
51 res *= normalization;
52 err *= normalization;
53 const double rel_err = err/res;
54 static constexpr double errorThresholdPerc = 0.1;
55 if (rel_err*100 > errorThresholdPerc) {
56 problems.add_warning(
57 create_process_string<Higgs,ZBoson,ZBoson>(indexIn, indexOut1, indexOut2)
58 + ": Relative integration error > " + std::to_string(errorThresholdPerc) + "%"
59 );
60 }
61 // mZ < mH < 2*mZ
62 // three-body decay
63 }
64 else if (4 * x > 1.0 && offshell_VV_decays != 0) {
65
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.");
69 return 0.;
70 }
71
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);
74
75 res = 3./(512.*Power3(Pi)) * 1./mHOS * deltaV * RT(x)/x;
76
77 const auto indices = concatenate(indexIn, indexOut2, indexOut1);
78 const auto ghZZ =
79 Vertex<Higgs, ZBoson, ZBoson>::evaluate(indices, context).value();
80
81 const double g2 = context.model.get_g2();
82
83 res *= std::norm(ghZZ*g2)/(1-sw2);
84 // mH > 2mZ
85 // two-body decay
86 }
87 else if (4.*x < 1.0) {
88
89 const double flux = 1. / (2 * mHOS);
90 // phase space without symmetry factor
91 const double ps = 1. / (8. * Pi) * std::sqrt(KallenLambda(1., x, x));
92
93 // phase space symmetry factor
94 const double ps_symmetry = 1./2.;
95
96 // matrix element squared
97 const auto mat_elem = calculate_amplitude<Higgs, ZBoson, ZBoson>(
98 context, indexIn, indexOut1, indexOut2);
99 const auto mat_elem_sq = mat_elem.square();
100
101 // flux * phase space factor * matrix element squared
102 res = flux * ps * ps_symmetry * mat_elem_sq;
103 }
104
105 return res;
106}
#define WARNING(msg)
Definition: logger.hpp:63
constexpr T norm(const Complex< T > &z) noexcept
Definition: complex.hpp:66
constexpr Base Power3(Base b) noexcept
Definition: wrappers.hpp:487
double RT(double x) noexcept
Eq.(2.31) of hep-ph/0503172, including edge cases.
std::string to_string(char a)
double hVV_4body(double *q2, size_t, void *params)
Definition: decay.cpp:122
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition: wrappers.hpp:631
detail::result_of::concatenate< Args... >::type concatenate(Args &&... args)
Definition: concatenate.hpp:87
T KallenLambda(T x, T y, T z) noexcept
Definition: wrappers.hpp:835
constexpr Base Power4(Base b) noexcept
Definition: wrappers.hpp:493
static constexpr double Pi
Definition: wrappers.hpp:44
constexpr T Cube(T a) noexcept
Definition: wrappers.hpp:179