flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_functions.cpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of FlexibleSUSY.
3//
4// FlexibleSUSY is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// FlexibleSUSY is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with FlexibleSUSY. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
19#include <cmath>
20#include <limits>
21
22#include "decay_functions.hpp"
23#include "Li2.hpp"
24#include "Li3.hpp"
25#include "Li4.hpp"
26#include "numerics2.hpp"
27#include "wrappers.hpp"
28
29namespace flexiblesusy {
30
31namespace {
32
33using namespace std::literals::complex_literals;
34
36double RT_general(double x) noexcept
37{
38 const std::complex<double> z(x, 0.0);
39
40 return std::real(
41 3.*(1. - 8.*z + 20.*z*z)/std::sqrt(4.*z - 1.)*std::acos((3.*z - 1.)/(2.*std::pow(z, 3./2.)))
42 - (1. - z)/(2.*z)*(2. - 13.*z + 47.*z*z)
43 - 3./2. * (1. - 6.*z + 4.*z*z)*std::log(z)
44 );
45}
46
48double calc_A(double b) noexcept
49{
50 const double log_b {std::log(b)};
51 const double log_ratio {std::log((1 + b) / (1 - b))};
52
53 return (1 + b * b) *
54 (4. * Li2((1 - b) / (1 + b)) + 2. * Li2(-(1 - b) / (1 + b)) -
55 3. * log_ratio * std::log(2 / (1 + b)) -
56 2. * log_ratio * log_b) -
57 3. * b * std::log(4. / (1 - b * b)) - 4. * b * log_b;
58}
59
60} // anonymous namespace
61
63double calc_DeltaH(double b) noexcept
64{
65 const double b2 = b*b;
66
67 return calc_A(b)/b
68 + 1./(16*b2*b) * (3 + b2*(34 - 13*b2)) * std::log((1+b)/(1-b))
69 + 3./(8.*b2)*(7*b2 - 1);
70}
71
72// Eq.(2.6 of) hep-ph/0503173
73double calc_DeltaAh(double b) noexcept
74{
75 const double b2 = b*b;
76
77 return calc_A(b)/b + 1./(16*b) * (19 + b2*(2 + 3*b2))
78 * std::log((1+b)/(1-b)) + 3./8.*(7 - b2);
79}
80
81// higher order corrections to H/A -> qqbar
82double calc_Deltaqq(double alpha_s_red, double Nf, FlexibleDecay_settings const& settings) noexcept
83{
84 constexpr double Pi2 = Sqr(Pi);
85
86 double result = 0.;
88 case 4:
89 result += alpha_s_red * (39.34 + Nf*(-220.9 + Nf*(9.685 - 0.0205*Nf)));
90 [[fallthrough]];
91 case 3:
92 result +=
93 6163613/5184. - 3535/72.*Pi2 - 109735/216.*zeta3 + 815/12.*zeta5
94 + (- 46147/486. + 277/72.*Pi2 + 262/9.*zeta3 - 5/6.*zeta4 - 25/9.*zeta5)*Nf
95 + (15511/11664. - 11/162.*Pi2 - 1/3.*zeta3)*Sqr(Nf);
96 result *= alpha_s_red;
97 [[fallthrough]];
98 case 2:
99 result +=
100 10801/144. - 19/12.*Pi2 - 39/2.*zeta3 + (- 65/24. + 1/18.*Pi2 + 2/3.*zeta3)*Nf;
101 result *= alpha_s_red;
102 [[fallthrough]];
103 case 1:
104 result *= alpha_s_red;
105 [[fallthrough]];
106 case 0:
107 break;
108 default:
109 WARNING("Unknow correction in calc_Deltaqq");
110 break;
111 }
112
113 // order alpha_s_red^1 is taken into account with mass dependence somewhere else
114 return result;
115}
116
118double RT(double x) noexcept
119{
120 if (x < 0.25) {
121 return RT_general(x);
122 } else if (x == 0.25) {
123 return std::numeric_limits<double>::quiet_NaN();
124 } else if (x < 0.95) {
125 return RT_general(x);
126 } else if (x < 1) {
127 const double d = x - 1;
128 const double d2 = d*d;
129 const double d4 = d2*d2;
130 const double d5 = d4*d;
131 return d5*(-3./10. + d*(13./20. + d*(-15./14. + d*(447./280. + d*(-95./42. + 523.*d/168)))));
132 } else if (x == 1) {
133 return 0;
134 } else if (x < 1.01) {
135 const double d = x - 1;
136 return d*(39 + d*(75.0/2.0 + d*(-6 + 5.0/4.0*d)));
137 }
138 return RT_general(x);
139}
140
141std::complex<double> f(double tau) noexcept {
142 if (tau <= 1) {
143 return Sqr(std::asin(std::sqrt(tau)));
144 }
145 else {
146 return -0.25*Sqr(std::log((1.+std::sqrt(1.-1./tau))/(1.-std::sqrt(1.-1./tau))) - 1i*Pi);
147 }
148}
149
150std::complex<double> taum1fprime(double tau) noexcept {
151 if (is_zero(tau-1)) {
152 return 0.;
153 }
154 else if (tau < 1) {
155 return (tau-1.)*std::asin(std::sqrt(tau))/std::sqrt(tau - Sqr(tau));
156 }
157 else {
158 return
159(tau-1.)*(1i*std::log(-1. - 1i*Pi + 2.*tau + 2.*std::sqrt((-1. + tau)*tau)))/
160 (-2i*std::sqrt((-1. + tau)*tau) +
161 2*Pi*(2*(-1 + tau)*tau + std::sqrt((-1 + tau)*tau) - 2*std::sqrt((-1 + tau)*Power3(tau))));
162 }
163}
164
165std::complex<double> fprime(double tau) noexcept {
166 if (tau < 1) {
167 return std::asin(std::sqrt(tau))/std::sqrt(tau - Sqr(tau));
168 }
169 else {
170 return
171(1i*std::log(-1. - 1i*Pi + 2.*tau + 2.*std::sqrt((-1. + tau)*tau)))/
172 (-2i*std::sqrt((-1. + tau)*tau) +
173 2*Pi*(2*(-1 + tau)*tau + std::sqrt((-1 + tau)*tau) - 2*std::sqrt((-1 + tau)*Power3(tau))));
174 }
175}
176
177// eq. 2.5, 2.7 & 2.8 of https://arxiv.org/pdf/hep-ph/0509189.pdf
178std::complex<double> delta_hAA_2loopQCD_for_quark_loop(double mH, double mq, double mu) noexcept
179{
180 const double tau = Sqr(mH/(2.*mq));
181 const std::complex<double> z = is_zero(tau) ? 1. : (std::sqrt(std::complex<double>(1. - 1./tau))-1.)/(std::sqrt(std::complex<double>(1.-1./tau))+1.);
182 const std::complex<double> ln = std::log(z);
183 const std::complex<double> li2p = Li2(z);
184 const std::complex<double> li2m = Li2(-z);
185 const std::complex<double> li3p = Li3(z);
186 const std::complex<double> li3m = Li3(-z);
187 const std::complex<double> li4p = Li4(z);
188 const std::complex<double> li4m = Li4(-z);
189 const std::complex<double> p41mz = Power4(1.0-z);
190 const std::complex<double> p51mz = Power5(1.0-z);
191
192 const std::complex<double> F0H = 3./(2.*Sqr(tau))*(tau+(tau-1.)*f(tau));
193
194 const std::complex<double> F0HC1H =
195 -z*(1. + z + Sqr(z) + Cube(z))/p51mz * (108.*li4p + 144.*li4m - 64.*li3p*ln
196 - 64.*li3m*ln + 14.*li2p*Sqr(ln) + 8.*li2m*Sqr(ln) + 1./12.*Power4(ln)
197 + 4.*zeta2*Sqr(ln) + 16.*zeta3*ln + 18.*zeta4)
198 + z*Sqr(1+z)/p41mz * (-32.*li3m + 16.*li2m*ln - 4.*zeta2*ln)
199 - 4.*z*(7.-2*z+7*Sqr(z))/p41mz*li3p + 8.*z*(3.-2*z+3*Sqr(z))/p41mz*li2p*ln
200 + 2.*z*(5.-6.*z+5.*Sqr(z))/p41mz*std::log(1.-z)*Sqr(ln) + z*(3.+25.*z-7.*Sqr(z)+3.*Cube(z))/(3.*p51mz)*Cube(ln)
201 + 4.*z*(1.-14.*z+Sqr(z))/p41mz*zeta3 + 12.*Sqr(z)/p41mz*Sqr(ln) - 12.*z*(1.+z)/Power3(1.-z)*ln - 20.*z/Sqr(1.-z);
202 const std::complex<double> F0HC2H = 3./Sqr(tau)*(tau+(tau-2.)*f(tau) - tau*taum1fprime(tau));
203
204 return (F0HC1H + F0HC2H*std::log(Sqr(mu/mq)))/F0H;
205}
206
207// eq. 2.17, 2.19 & 2.20 of https://arxiv.org/pdf/hep-ph/0509189.pdf
208std::complex<double> delta_AhAA_2loopQCD_for_quark_loop(double mAh, double mq, double mu) noexcept {
209 const double tau = Sqr(mAh/(2.*mq));
210 // know threshold singularity at mAh = 2*mq
211 if (is_zero(1 - tau, 1e-2)) {
212 WARNING("2-loop QCD corrections to A→γγ are disable in the threshold region: τ = " << std::to_string(tau));
213 return 0.;
214 }
215 const std::complex<double> z = is_zero(tau) ? 1. : (std::sqrt(std::complex<double>(1. - 1./tau))-1.)/(std::sqrt(std::complex<double>(1.-1./tau))+1.);
216 const std::complex<double> ln = std::log(z);
217 const std::complex<double> li2p = Li2(z);
218 const std::complex<double> li2m = Li2(-z);
219 const std::complex<double> li3p = Li3(z);
220 const std::complex<double> li3m = Li3(-z);
221 const std::complex<double> li4p = Li4(z);
222 const std::complex<double> li4m = Li4(-z);
223
224 const std::complex<double> F0A = f(tau)/tau;
225
226 const std::complex<double> F0AC1A =
227 - z*(1.+Sqr(z))/(Cube(1.-z)*(1.+z))*(72.*li4p + 96.*li4m - 128./3.*(li3p + li3m)*ln
228 + 28./3.*li2p*Sqr(ln) + 16./3.*li2m*Sqr(ln) + 1./18.*Power4(ln)
229 + 8./3.*zeta2*Sqr(ln) + 32./3.*zeta3*ln + 12.*zeta4)
230 + z/Sqr(1.-z)*(-56./.3*li3p - 64./3.*li3m + 16.*li2p*ln
231 + 32./3*li2m*ln + 20./3.*std::log(1.-z)*Sqr(ln) - 8./3.*zeta2*ln + 8./3.*zeta3)
232 + 2.*z*(1.+z)/(3.*Cube(1.-z))*Cube(ln);
233 const std::complex<double> F0AC2A = 2./tau*(f(tau) - tau*fprime(tau));
234
235 return (F0AC1A + F0AC2A*std::log(Sqr(mu/mq)))/F0A;
236}
237
238/* 2-loop QCD corrections to H->gamma gamma amplitude through scalar color triplet loop
239 * from hep-ph/0611266 */
240
241/* this functions could be improved to cover all range in r by linking
242 * to CHAPLIN library (https://arxiv.org/abs/1106.5739) */
243std::complex<double> delta_hAA_2loopQCD_for_squark_loop(double mH, double msq, double mu) noexcept {
244 const std::complex<double> r = Sqr(mH/msq);
245 if (std::abs(r) < 0.7) {
246 // eq. A.3
247 const std::complex<double> F01l = -1./3. - 2./45*r - 1./140.*Sqr(r) - 2./1575*Cube(r) - 1./4158*Power4(r);
248 const std::complex<double> F02la = -3./4. - 29./216.*r - 4973./226800.*Sqr(r) - 3137./882000.*Cube(r) - 1180367./2095632000.*Power4(r);
249 const std::complex<double> F02lb = -1./4. - 1./15.*r - 9./560.*Sqr(r) - 2./525.*Cube(r) - 5./5544.*Power4(r);
250 const std::complex<double> F02lc = - 3/.4*F01l;
251 return (F02la + (F02lb + F02lc)*std::log(Sqr(msq/mu)))/F01l;
252 }
253 else if (std::abs(r) > 1.5) {
254 // eq. A.6
255 const std::complex<double> F01l = 4./r + Sqr(2.*std::log(-r)/r);
256 const std::complex<double> F02la =
257 (14.-3*std::log(-r))/r
258 + (6. - 72./5*Sqr(zeta2) - 24.*zeta3 - 8.*(1.-zeta2-4.*zeta3)*std::log(-r)
259 +(17.-8*zeta2)*Sqr(std::log(-r)) - 5./3.*Cube(std::log(-r)) - 1./6.*Power4(std::log(-r))
260 )/Sqr(r);
261 const std::complex<double> F02lb =
262 (6.*std::log(-r) - 3.*Sqr(std::log(-r)))/Sqr(r);
263 const std::complex<double> F02lc = - 3/.4*F01l;
264 return (F02la + (F02lb + F02lc)*std::log(Sqr(msq/mu)))/F01l;
265 }
266 else {
267 return 0.;
268 }
269}
270
271std::complex<double> delta_AhAA_2loopQCD_for_squark_loop(double mAh, double msq, double mu) noexcept {
272 const double r = Sqr(mAh/msq);
273 if (r < 0.7) {
274 return 0.;
275 }
276 else if (r > 1.5) {
277 return 0.;
278 }
279 else {
280 return 0.;
281 }
282}
283
284// eq. 6 of https://arxiv.org/pdf/1109.5304.pdf
285std::complex<double> hgg_SM_loop_function(double x) noexcept {
286 if(is_zero(1.-x)) {
287 return Sqr(Pi/2.);
288 }
289 else if (x > 1) {
290 return Sqr(std::asin(1./std::sqrt(x)));
291 }
292 else {
293 return -0.25*Sqr(std::log((1.+std::sqrt(1.-x))/(1.-std::sqrt(1.-x))) - 1i*Pi);
294 }
295}
296
297unsigned int number_of_active_flavours(softsusy::QedQcd const& qedqcd, double m) noexcept
298{
299 unsigned nf = 0;
300 if (m > qedqcd.displayMass(softsusy::mUp)) { nf++; }
301 if (m > qedqcd.displayMass(softsusy::mDown)) { nf++; }
302 if (m > qedqcd.displayMass(softsusy::mStrange)) { nf++; }
303 if (m > qedqcd.displayMass(softsusy::mCharm)) { nf++; }
304 if (m > qedqcd.displayMass(softsusy::mBottom)) { nf++; }
305 if (m > qedqcd.displayMass(softsusy::mTop)) { nf++; }
306
307 return nf;
308}
309
310} // namespace flexiblesusy
@ include_higher_order_corrections
[2] include higher order corrections in decays
Quark and lepton masses and gauge couplings in QEDxQCD effective theory.
Definition lowe.h:64
#define ln(x, s)
Definition defs.h:634
#define WARNING(msg)
Definition logger.hpp:63
double calc_A(double b) noexcept
Eq.(2.7) of hep-ph/0503173.
double RT_general(double x) noexcept
Eq.(2.31) of hep-ph/0503172.
constexpr Base Power3(Base b) noexcept
Definition wrappers.hpp:489
double calc_DeltaAh(double b) noexcept
static constexpr double zeta2
Definition wrappers.hpp:54
std::complex< double > f(double tau) noexcept
unsigned int number_of_active_flavours(softsusy::QedQcd const &qedqcd, double m) noexcept
std::complex< double > delta_AhAA_2loopQCD_for_quark_loop(double mAh, double mq, double mu) noexcept
double calc_DeltaH(double b) noexcept
Eq.(2.6) of hep-ph/0503173.
double RT(double x) noexcept
Eq.(2.31) of hep-ph/0503172, including edge cases.
std::enable_if_t< std::is_unsigned< T >::value, bool > is_zero(T a, T prec=std::numeric_limits< T >::epsilon()) noexcept
compares a number for being close to zero
Definition numerics2.hpp:46
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.
double Li4(double x) noexcept
Real 4-th order polylogarithm .
Definition Li4.cpp:131
std::complex< double > fprime(double tau) noexcept
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition wrappers.hpp:633
float Li2(float x) noexcept
Real dilogarithm .
Definition Li2.cpp:38
static constexpr double zeta4
Definition wrappers.hpp:56
std::complex< double > delta_hAA_2loopQCD_for_squark_loop(double mH, double msq, double mu) noexcept
std::complex< double > taum1fprime(double tau) noexcept
std::complex< double > delta_AhAA_2loopQCD_for_squark_loop(double mAh, double msq, double mu) noexcept
double Li3(double x) noexcept
Real trilogarithm .
Definition Li3.cpp:88
static constexpr double zeta5
Definition wrappers.hpp:57
constexpr Base Power5(Base b) noexcept
Definition wrappers.hpp:501
constexpr Base Power4(Base b) noexcept
Definition wrappers.hpp:495
static constexpr double Pi
Definition wrappers.hpp:44
std::complex< double > hgg_SM_loop_function(double x) noexcept
constexpr T Cube(T a) noexcept
Definition wrappers.hpp:181
std::complex< double > delta_hAA_2loopQCD_for_quark_loop(double mH, double mq, double mu) noexcept
static constexpr double zeta3
Definition wrappers.hpp:55
@ mDown
Definition lowe.h:41
@ mStrange
Definition lowe.h:41
@ mTop
Definition lowe.h:41
@ mUp
Definition lowe.h:41
@ mBottom
Definition lowe.h:41
@ mCharm
Definition lowe.h:41