flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_H_to_ubaru.inc
Go to the documentation of this file.
1template <>
2double CLASSNAME::get_partial_width<Higgs, bar<UpTypeQuark>::type, UpTypeQuark>(
3 const context_base& context,
4 typename field_indices<Higgs>::type const& indexIn,
5 typename field_indices<UpTypeQuark>::type const& indexOut1,
6 typename field_indices<UpTypeQuark>::type const& indexOut2)
7{
8 // get HQQbar vertex
9 // we don't use amplitude_squared here because we need both this vertex
10 // both with running and pole masses
11 const auto indices = concatenate(indexOut1, indexOut2, indexIn);
12 const auto HQQbarVertexDR = Vertex<bar<UpTypeQuark>::type, UpTypeQuark, Higgs>::evaluate(indices, context);
13
14 const double mHOS = context.physical_mass<Higgs>(indexIn);
15 const double flux = 1./(2.*mHOS);
16
17 static constexpr double color_factor = squared_color_generator<Higgs, bar<UpTypeQuark>::type, UpTypeQuark>();
18
19 if(!boost::range::equal(indexOut1, indexOut2)) {
20 const double muqOS1 = context.physical_mass<UpTypeQuark>(indexOut1);
21 const double muqOS2 = context.physical_mass<UpTypeQuark>(indexOut2);
22 if (mHOS > muqOS1 + muqOS2 && (!is_zero(HQQbarVertexDR.left()) || !is_zero(HQQbarVertexDR.right()))) {
23 const auto xOS1 = Sqr(muqOS1/mHOS);
24 const auto xOS2 = Sqr(muqOS2/mHOS);
25 const double phase_space = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS1, xOS2));
26 return flux * phase_space * color_factor * amplitude_squared<Higgs, bar<UpTypeQuark>::type, UpTypeQuark>(context, indexIn, indexOut1, indexOut2);
27 }
28 return 0.;
29 }
30
31 const double muqDR = context.mass<UpTypeQuark>(indexOut1);
32 const double muqOS = context.physical_mass<UpTypeQuark>(indexOut1);
33 if(is_zero(muqDR) || is_zero(muqOS)) {
34 throw std::runtime_error(
35 create_process_string<Higgs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2)
36 + ": Up-type quark cannot be massless. Aborting."
37 );
38 }
39 const auto xOS = Sqr(muqOS/mHOS);
40 const auto xDR = Sqr(muqDR/mHOS);
41
42 const auto HQQbarVertexDR_S = 0.5*(HQQbarVertexDR.left() + HQQbarVertexDR.right());
43 const auto HQQbarVertexDR_P = 0.5*(HQQbarVertexDR.right() - HQQbarVertexDR.left());
44
45 double result_S = 0;
46 double result_P = 0;
47
48 if (4.*std::max(xDR, xOS) > 1.) {
49 if (flexibledecay_settings.get(FlexibleDecay_settings::call_higgstools) != 0 ||
50 flexibledecay_settings.get(FlexibleDecay_settings::call_lilith) != 0 ||
51 flexibledecay_settings.get(FlexibleDecay_settings::calculate_normalized_effc) != 0
52 ) {
53 neutral_higgs_effc.add_coupling(
54 field_as_string<Higgs>(indexIn),
55 {
56 boost::hana::unpack(bar<UpTypeQuark>::pdgids, _to_array<bar<UpTypeQuark>::numberOfGenerations>).at(indexOut1.at(0)),
57 boost::hana::unpack(UpTypeQuark::pdgids, _to_array<UpTypeQuark::numberOfGenerations>).at(indexOut2.at(0))
58 },
59 std::pair<std::string, std::complex<double>> {
60 field_as_string<Higgs>(indexIn) + "-" + field_as_string<bar<UpTypeQuark>::type>(indexOut1) + "-" + field_as_string<UpTypeQuark>(indexOut2),
61 indexOut1.at(0) == 2 && indexOut2.at(0) == 2 ? std::real(HQQbarVertexDR_S) + std::imag(HQQbarVertexDR_P)*1i : 0.
62 },
63 0 // decay channel kinematically closed, doesn't contribute to total width
64 );
65 }
66 }
67 else {
68 const auto betaOS = std::sqrt(1.-4.*xOS);
69 const auto betaDR = std::sqrt(1.-4.*xDR);
70
71 const double phase_spaceDR = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xDR, xDR));
72 const double phase_spaceOS = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS, xOS));
73
74 double amp2DR_S = Sqr(mHOS) * Sqr(betaDR) *
75 2*std::norm(HQQbarVertexDR_S);
76 double amp2OS_S = Sqr(mHOS) * Sqr(betaOS) *
77 2*std::norm(HQQbarVertexDR_S) * Sqr(muqOS / muqDR);
78
79 double amp2DR_P = 0;
80 double amp2OS_P = 0;
81 if (info::is_CP_violating_Higgs_sector) {
82 amp2DR_P = Sqr(mHOS) *
83 2*std::norm(HQQbarVertexDR_P);
84 amp2OS_P = Sqr(mHOS) *
85 2*std::norm(HQQbarVertexDR_P) * Sqr(muqOS / muqDR);
86 }
87
88 const int Nf = number_of_active_flavours(qedqcd, mHOS);
89 if (Nf < 5) {
90 problems.add_warning(
91 create_process_string<Higgs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2)
92 + ": Cannot determine the number of active quark flavours. Disabling higher-order corrections."
93 );
94 }
95
96 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 0 && Nf >= 5) {
97 double alpha_s_red;
98 double Y_conversion = 1.;
99 switch (Nf) {
100 case 5: {
101 auto qedqcd_ = qedqcd;
102 qedqcd_.to(mHOS);
103 alpha_s_red = qedqcd_.displayAlpha(softsusy::ALPHAS)/Pi;
104 Y_conversion = Sqr(qedqcd_.displayUpQuarkRunningMass(indexOut1.at(0))/muqDR);
105 break;
106 }
107 case 6:
108 alpha_s_red = get_alphas(context)/Pi;
109 break;
110 default:
111 throw std::runtime_error(
112 create_process_string<Higgs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2)
113 + ": Cannot determine the number of active quark flavours"
114 );
115 }
116 double deltaqq_QCD_DR_S = calc_Deltaqq(alpha_s_red, Nf, flexibledecay_settings);
117 double deltaqq_QCD_DR_P = deltaqq_QCD_DR_S;
118
119 // 1L QED correction - eq. 17 in FD paper
120 const double alpha_red = get_alpha(context)/Pi;
121 const double deltaqq_QED_DR = 17./4.*Sqr(UpTypeQuark::electricCharge)*alpha_red;
122
123 deltaqq_QCD_DR_S +=
124 2.*(1. - 10.*xDR)/(1-4.*xDR)*(4./3. - std::log(xDR))*alpha_s_red +
125 4./3.*alpha_s_red*calc_DeltaH(betaDR);
126
127 const double deltaqq_QCD_OS_S =
128 4./3. * alpha_s_red * calc_DeltaH(betaOS);
129
130 const double deltaqq_QED_OS_S =
131 alpha_red * Sqr(UpTypeQuark::electricCharge) * calc_DeltaH(betaOS);
132
133 double deltaqq_QCD_OS_P = 0.;
134 double deltaqq_QED_OS_P = 0.;
135 // don't waste time computing it in models without CPV
136 if (info::is_CP_violating_Higgs_sector) {
137 deltaqq_QCD_DR_P +=
138 2.*(1. - 6.*xDR)/(1-4.*xDR)*(4./3. - std::log(xDR))*alpha_s_red +
139 4./3.*alpha_s_red*calc_DeltaAh(betaDR);
140
141 deltaqq_QCD_OS_P =
142 4./3. * alpha_s_red * calc_DeltaAh(betaOS);
143
144 deltaqq_QED_OS_P =
145 alpha_red * Sqr(UpTypeQuark::electricCharge) * calc_DeltaAh(betaOS);
146 }
147
148 double deltaPhi2_S = 0.;
149 double deltaPhi2_P = 0.;
150 double deltaqq_QCDxQED_DR = 0.;
151 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 1) {
152 deltaqq_QCDxQED_DR =
153 deltaqq_QCDxQED*Sqr(UpTypeQuark::electricCharge)*alpha_red*alpha_s_red;
154 if ((indexOut1.at(0) < 2 || indexOut2.at(0) < 2)) {
155 const double mtpole = qedqcd.displayPoleMt();
156 const double lt = std::log(Sqr(mHOS/mtpole));
157 const double lq = std::log(xDR);
158 // eq. 28 of hep-ph/9505358
159 const auto Httindices = concatenate(std::array<int, 1> {2}, std::array<int, 1> {2}, indexIn);
160 const auto Httbar = Vertex<bar<UpTypeQuark>::type, UpTypeQuark, Higgs>::evaluate(Httindices, context);
161 const auto gbHoVEV = HQQbarVertexDR_S/muqDR;
162 if (!is_zero(gbHoVEV)) {
163 const auto Httbar_S = 0.5*(Httbar.left() + Httbar.right());
164 const auto gtHoVEV = Httbar_S/context.mass<UpTypeQuark>({2});
165 deltaPhi2_S = Sqr(alpha_s_red) * std::real(gtHoVEV/gbHoVEV) * (8/3. - Sqr(Pi/3.) - 2.0/3.0*lt + 1.0/9.0*Sqr(lq));
166 }
167 if (info::is_CP_violating_Higgs_sector) {
168 const auto CSuu = HQQbarVertexDR_S/muqDR;
169 if (!is_zero(CSuu)) {
170 const auto Httbar_P = 0.5*(Httbar.right() - Httbar.left());
171 const auto CStu = Httbar_P/context.mass<Fu>({2});
172 deltaPhi2_P = Sqr(alpha_s_red) * std::real(CStu/CSuu) * (23/6. - lt + 1.0/6.0*Sqr(lq));
173 }
174 }
175 }
176 }
177
178 amp2DR_S *= Y_conversion*(1. + deltaqq_QCD_DR_S + deltaqq_QED_DR + deltaqq_QCDxQED_DR + deltaPhi2_S);
179 amp2DR_P *= Y_conversion*(1. + deltaqq_QCD_DR_P + deltaqq_QED_DR + deltaqq_QCDxQED_DR + deltaPhi2_P);
180 amp2OS_S *= 1. + deltaqq_QCD_OS_S + deltaqq_QED_OS_S;
181 amp2OS_P *= 1. + deltaqq_QCD_OS_P + deltaqq_QED_OS_P;
182 }
183
184 // low x limit
185 const double result_DR_S =
186 flux * color_factor * phase_spaceDR * amp2DR_S;
187 const double result_DR_P =
188 flux * color_factor * phase_spaceDR * amp2DR_P;
189 // high x limit
190 const double result_OS_S =
191 flux * color_factor * phase_spaceOS * amp2OS_S;
192 const double result_OS_P =
193 flux * color_factor * phase_spaceOS * amp2OS_P;
194
195 result_S = (1-4.*xOS)*result_DR_S + 4*xOS*result_OS_S;
196 result_P = (1-4.*xOS)*result_DR_P + 4*xOS*result_OS_P;
197
198 if (flexibledecay_settings.get(FlexibleDecay_settings::call_higgstools) != 0 ||
199 flexibledecay_settings.get(FlexibleDecay_settings::call_lilith) != 0 ||
200 flexibledecay_settings.get(FlexibleDecay_settings::calculate_normalized_effc) != 0
201 ) {
202 const double remove_normalization = flux*phase_spaceOS*2*Sqr(mHOS);
203 neutral_higgs_effc.add_coupling(
204 field_as_string<Higgs>(indexIn),
205 {
206 boost::hana::unpack(bar<UpTypeQuark>::pdgids, _to_array<bar<UpTypeQuark>::numberOfGenerations>).at(indexOut1.at(0)),
207 boost::hana::unpack(UpTypeQuark::pdgids, _to_array<UpTypeQuark::numberOfGenerations>).at(indexOut2.at(0))
208 },
209 std::pair<std::string, std::complex<double>> {
210 field_as_string<Higgs>(indexIn) + "-" + field_as_string<bar<UpTypeQuark>::type>(indexOut1) + "-" + field_as_string<UpTypeQuark>(indexOut2),
211 std::sqrt(result_S/(remove_normalization*Sqr(betaOS))) + std::sqrt(result_P/(remove_normalization))*1i
212 },
213 result_S + result_P
214 );
215 }
216
217 }
218 return result_S + result_P;
219}
bool is_zero(double x) noexcept
Definition ckm.cpp:30
double calc_DeltaAh(double b) noexcept
unsigned int number_of_active_flavours(softsusy::QedQcd const &qedqcd, double m) noexcept
double calc_DeltaH(double b) noexcept
Eq.(2.6) of hep-ph/0503173.
double calc_Deltaqq(double alpha_s_red, double Nf, FlexibleDecay_settings const &settings) noexcept
Eq.(2.11) of hep-ph/0503173, 2-loop and higher order.
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition wrappers.hpp:633
detail::result_of::concatenate< Args... >::type concatenate(Args &&... args)
T KallenLambda(T x, T y, T z) noexcept
Definition wrappers.hpp:837
@ ALPHAS
Definition lowe.h:44