flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_Ah_to_gg.inc
Go to the documentation of this file.
1template <>
2double CLASSNAME::get_partial_width<PseudoscalarHiggs, Gluon, Gluon>(
3 const context_base& context,
4 const typename field_indices<PseudoscalarHiggs>::type& in_idx,
5 const typename field_indices<Gluon>::type& out1_idx,
6 const typename field_indices<Gluon>::type& out2_idx)
7{
8 if (in_idx.at(0) < info::number_of_neutral_goldstones) {
9 throw OutOfBoundsError("Error in " + create_process_string<PseudoscalarHiggs,Gluon,Gluon>(in_idx, out1_idx, out2_idx) + " decay. Decaying particle is a Goldstone.");
10 }
11
12 const auto amp = calculate_amplitude<PseudoscalarHiggs, Gluon, Gluon>(context, in_idx, out1_idx, out2_idx);
13 const double mAh = context.physical_mass<PseudoscalarHiggs>(in_idx);
14 static constexpr double ps {1/(8.*Pi)};
15 static constexpr double ps_symmetry {0.5};
16 static constexpr double color_fact = squared_color_generator<PseudoscalarHiggs, Gluon, Gluon>();
17 const double flux = 0.5/mAh;
18
19 double result = flux * color_fact * ps * ps_symmetry * amp.square();
20
21 const int Nf = number_of_active_flavours(qedqcd, mAh);
22 if (Nf < 5) {
23 problems.add_warning(
24 create_process_string<PseudoscalarHiggs,Gluon,Gluon>(in_idx, out1_idx, out2_idx)
25 + ": Pseudoscalar Higgs too light (less than 5 active quark flavours). Disabling higher-order corrections."
26 );
27 }
28
29 // higher order QCD corrections
30 const double tau = Sqr(mAh/(2.*context.mass<UpTypeQuark>({2})));
31 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) && Nf >= 5 && tau < 0.7) {
32 // number of active light flavours
33 static constexpr int Nf = 5;
34 auto qedqcd_ = qedqcd;
35 qedqcd_.to(mAh);
36 // 5-flavour SM alpha_s
37 const double alpha_s_5f = qedqcd_.displayAlpha(softsusy::ALPHAS);
38
39 const auto indices = concatenate(std::array<int, 1> {2}, std::array<int, 1> {2}, in_idx);
40 const auto AhGGVertex = Vertex<bar<UpTypeQuark>::type, UpTypeQuark, PseudoscalarHiggs>::evaluate(indices, context);
41 std::complex<double> const AhGGVertexVal = 0.5*(-AhGGVertex.left() + AhGGVertex.right());
42
43 const double tau = Sqr(mAh/(2.*context.mass<UpTypeQuark>({2})));
44
45 const std::complex<double> A12_A = 2.*f(tau)/tau;
46 // LO width comming only from the top-loop
47 // agrees up to a full double precision with autmatically generated one
48 const double Gamma_SM_LO_P = mAh/(18.*Power3(Pi))*std::norm(alpha_s_5f * AhGGVertexVal*sqrt(tau) * 3./4*A12_A);
49
50 const double mu = mAh;
51 const double LH = std::log(Sqr(mu/mAh));
52 const double deltaNLO {
53 97/4. - 7/6.*Nf + (33-2*Nf)/6.*LH
54 };
55
56 const double mt {context.mass<UpTypeQuark>({2})};
57 const double Lt = std::log(Sqr(mu/mt));
58 // eq. D10 of 2207.01032 and 23 of 9807241
59 const double deltaNNLO {
60 51959/96. - 363/8.*zeta2 - 495/8.*zeta3 + Nf*(-473/8. + 11/2.*zeta2 + 5/4.*zeta3 + Lt) + Sqr(Nf)*(251/216. - 1/6.*zeta2)
61 + (3405/16. - 73/3*Nf + 7/12.*Sqr(Nf))*LH
62 + (363/16. - 11/4.*Nf + 1/12.*Sqr(Nf))*Sqr(LH)
63 };
64
65 const double alpha_s_red = alpha_s_5f/Pi;
66
67 double pseudoscalar_corr = 0.0;
68 switch (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections))) {
69 case 4:
70 [[fallthrough]];
71 case 3:
72 [[fallthrough]];
73 case 2:
74 pseudoscalar_corr += deltaNNLO*alpha_s_red;
75 [[fallthrough]];
76 case 1:
77 pseudoscalar_corr += deltaNLO;
78 pseudoscalar_corr *= alpha_s_red/std::norm(0.5*A12_A);
79 pseudoscalar_corr += 1. - Sqr(get_alphas(context)/alpha_s_5f);
80 pseudoscalar_corr *= Gamma_SM_LO_P;
81 break;
82 default:
83 WARNING("Unknow correcion in Phi->gg");
84 }
85 result += pseudoscalar_corr;
86 }
87
88 const std::string tag = field_as_string<PseudoscalarHiggs>(in_idx) + "-" + field_as_string<Gluon>(out1_idx) + "-" + field_as_string<Gluon>(out2_idx);
89
90 if (flexibledecay_settings.get(FlexibleDecay_settings::print_effc_block)) {
91 effhiggscouplings_block_input.push_back(
92 {
93 fieldPDG<PseudoscalarHiggs>(in_idx), 21, 21,
94 std::sqrt(result/(flux * color_fact * ps * ps_symmetry)/(0.5*Power4(mAh))),
95 tag
96 }
97 );
98 }
99
100 if (flexibledecay_settings.get(FlexibleDecay_settings::call_higgstools) != 0 ||
101 flexibledecay_settings.get(FlexibleDecay_settings::call_lilith) != 0 ||
102 flexibledecay_settings.get(FlexibleDecay_settings::calculate_normalized_effc) != 0
103 ) {
104 neutral_higgs_effc.add_coupling(
105 field_as_string<Ah>(in_idx),
106 {21, 21},
107 std::pair<std::string, double> {tag, std::sqrt(result)},
108 result
109 );
110 }
111
112 return result;
113}
#define WARNING(msg)
Definition logger.hpp:63
constexpr Base Power3(Base b) noexcept
Definition wrappers.hpp:489
std::complex< double > f(double tau) noexcept
unsigned int number_of_active_flavours(softsusy::QedQcd const &qedqcd, double m) noexcept
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition wrappers.hpp:633
detail::result_of::concatenate< Args... >::type concatenate(Args &&... args)
constexpr Base Power4(Base b) noexcept
Definition wrappers.hpp:495
@ ALPHAS
Definition lowe.h:44