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 case 3:
91 result +=
92 6163613/5184. - 3535/72.*Pi2 - 109735/216.*zeta3 + 815/12.*zeta5
93 + (- 46147/486. + 277/72.*Pi2 + 262/9.*zeta3 - 5/6.*zeta4 - 25/9.*zeta5)*Nf
94 + (15511/11664. - 11/162.*Pi2 - 1/3.*zeta3)*Sqr(Nf);
95 result *= alpha_s_red;
96 case 2:
97 result +=
98 10801/144. - 19/12.*Pi2 - 39/2.*zeta3 + (- 65/24. + 1/18.*Pi2 + 2/3.*zeta3)*Nf;
99 result *= alpha_s_red;
100 case 1:
101 result *= alpha_s_red;
102 case 0:
103 break;
104 default:
105 WARNING("Unknow correction in calc_Deltaqq");
106 break;
107 }
108
109 // order alpha_s_red^1 is taken into account with mass dependence somewhere else
110 return result;
111}
112
114double RT(double x) noexcept
115{
116 if (x < 0.25) {
117 return RT_general(x);
118 } else if (x == 0.25) {
119 return std::numeric_limits<double>::quiet_NaN();
120 } else if (x < 0.95) {
121 return RT_general(x);
122 } else if (x < 1) {
123 const double d = x - 1;
124 const double d2 = d*d;
125 const double d4 = d2*d2;
126 const double d5 = d4*d;
127 return d5*(-3./10. + d*(13./20. + d*(-15./14. + d*(447./280. + d*(-95./42. + 523.*d/168)))));
128 } else if (x == 1) {
129 return 0;
130 } else if (x < 1.01) {
131 const double d = x - 1;
132 return d*(39 + d*(75.0/2.0 + d*(-6 + 5.0/4.0*d)));
133 }
134 return RT_general(x);
135}
136
137std::complex<double> f(double tau) noexcept {
138 if (tau <= 1) {
139 return Sqr(std::asin(std::sqrt(tau)));
140 }
141 else {
142 return -0.25*Sqr(std::log((1.+std::sqrt(1.-1./tau))/(1.-std::sqrt(1.-1./tau))) - 1i*Pi);
143 }
144}
145
146std::complex<double> taum1fprime(double tau) noexcept {
147 if (is_zero(tau-1)) {
148 return 0.;
149 }
150 else if (tau < 1) {
151 return (tau-1.)*std::asin(std::sqrt(tau))/std::sqrt(tau - Sqr(tau));
152 }
153 else {
154 return
155(tau-1.)*(1i*std::log(-1. - 1i*Pi + 2.*tau + 2.*std::sqrt((-1. + tau)*tau)))/
156 (-2i*std::sqrt((-1. + tau)*tau) +
157 2*Pi*(2*(-1 + tau)*tau + std::sqrt((-1 + tau)*tau) - 2*std::sqrt((-1 + tau)*Power3(tau))));
158 }
159}
160
161std::complex<double> fprime(double tau) noexcept {
162 if (tau < 1) {
163 return std::asin(std::sqrt(tau))/std::sqrt(tau - Sqr(tau));
164 }
165 else {
166 return
167(1i*std::log(-1. - 1i*Pi + 2.*tau + 2.*std::sqrt((-1. + tau)*tau)))/
168 (-2i*std::sqrt((-1. + tau)*tau) +
169 2*Pi*(2*(-1 + tau)*tau + std::sqrt((-1 + tau)*tau) - 2*std::sqrt((-1 + tau)*Power3(tau))));
170 }
171}
172
173// eq. 2.5, 2.7 & 2.8 of https://arxiv.org/pdf/hep-ph/0509189.pdf
174std::complex<double> delta_hAA_2loopQCD_for_quark_loop(double mH, double mq, double mu) noexcept
175{
176 const double tau = Sqr(mH/(2.*mq));
177 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.);
178 const std::complex<double> ln = std::log(z);
179 const std::complex<double> li2p = Li2(z);
180 const std::complex<double> li2m = Li2(-z);
181 const std::complex<double> li3p = Li3(z);
182 const std::complex<double> li3m = Li3(-z);
183 const std::complex<double> li4p = Li4(z);
184 const std::complex<double> li4m = Li4(-z);
185 const std::complex<double> p41mz = Power4(1.0-z);
186 const std::complex<double> p51mz = Power5(1.0-z);
187
188 const std::complex<double> F0H = 3./(2.*Sqr(tau))*(tau+(tau-1.)*f(tau));
189
190 const std::complex<double> F0HC1H =
191 -z*(1. + z + Sqr(z) + Cube(z))/p51mz * (108.*li4p + 144.*li4m - 64.*li3p*ln
192 - 64.*li3m*ln + 14.*li2p*Sqr(ln) + 8.*li2m*Sqr(ln) + 1./12.*Power4(ln)
193 + 4.*zeta2*Sqr(ln) + 16.*zeta3*ln + 18.*zeta4)
194 + z*Sqr(1+z)/p41mz * (-32.*li3m + 16.*li2m*ln - 4.*zeta2*ln)
195 - 4.*z*(7.-2*z+7*Sqr(z))/p41mz*li3p + 8.*z*(3.-2*z+3*Sqr(z))/p41mz*li2p*ln
196 + 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)
197 + 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);
198 const std::complex<double> F0HC2H = 3./Sqr(tau)*(tau+(tau-2.)*f(tau) - tau*taum1fprime(tau));
199
200 return (F0HC1H + F0HC2H*std::log(Sqr(mu/mq)))/F0H;
201}
202
203// eq. 2.17, 2.19 & 2.20 of https://arxiv.org/pdf/hep-ph/0509189.pdf
204std::complex<double> delta_AhAA_2loopQCD_for_quark_loop(double mAh, double mq, double mu) noexcept {
205 const double tau = Sqr(mAh/(2.*mq));
206 // know threshold singularity at mAh = 2*mq
207 if (is_zero(1 - tau, 1e-2)) {
208 WARNING("2-loop QCD corrections to A→γγ are disable in the threshold region: τ = " << std::to_string(tau));
209 return 0.;
210 }
211 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.);
212 const std::complex<double> ln = std::log(z);
213 const std::complex<double> li2p = Li2(z);
214 const std::complex<double> li2m = Li2(-z);
215 const std::complex<double> li3p = Li3(z);
216 const std::complex<double> li3m = Li3(-z);
217 const std::complex<double> li4p = Li4(z);
218 const std::complex<double> li4m = Li4(-z);
219
220 const std::complex<double> F0A = f(tau)/tau;
221
222 const std::complex<double> F0AC1A =
223 - z*(1.+Sqr(z))/(Cube(1.-z)*(1.+z))*(72.*li4p + 96.*li4m - 128./3.*(li3p + li3m)*ln
224 + 28./3.*li2p*Sqr(ln) + 16./3.*li2m*Sqr(ln) + 1./18.*Power4(ln)
225 + 8./3.*zeta2*Sqr(ln) + 32./3.*zeta3*ln + 12.*zeta4)
226 + z/Sqr(1.-z)*(-56./.3*li3p - 64./3.*li3m + 16.*li2p*ln
227 + 32./3*li2m*ln + 20./3.*std::log(1.-z)*Sqr(ln) - 8./3.*zeta2*ln + 8./3.*zeta3)
228 + 2.*z*(1.+z)/(3.*Cube(1.-z))*Cube(ln);
229 const std::complex<double> F0AC2A = 2./tau*(f(tau) - tau*fprime(tau));
230
231 return (F0AC1A + F0AC2A*std::log(Sqr(mu/mq)))/F0A;
232}
233
234/* 2-loop QCD corrections to H->gamma gamma amplitude through scalar color triplet loop
235 * from hep-ph/0611266 */
236
237/* this functions could be improved to cover all range in r by linking
238 * to CHAPLIN library (https://arxiv.org/abs/1106.5739) */
239std::complex<double> delta_hAA_2loopQCD_for_squark_loop(double mH, double msq, double mu) noexcept {
240 const std::complex<double> r = Sqr(mH/msq);
241 if (std::abs(r) < 0.7) {
242 // eq. A.3
243 const std::complex<double> F01l = -1./3. - 2./45*r - 1./140.*Sqr(r) - 2./1575*Cube(r) - 1./4158*Power4(r);
244 const std::complex<double> F02la = -3./4. - 29./216.*r - 4973./226800.*Sqr(r) - 3137./882000.*Cube(r) - 1180367./2095632000.*Power4(r);
245 const std::complex<double> F02lb = -1./4. - 1./15.*r - 9./560.*Sqr(r) - 2./525.*Cube(r) - 5./5544.*Power4(r);
246 const std::complex<double> F02lc = - 3/.4*F01l;
247 return (F02la + (F02lb + F02lc)*std::log(Sqr(msq/mu)))/F01l;
248 }
249 else if (std::abs(r) > 1.5) {
250 // eq. A.6
251 const std::complex<double> F01l = 4./r + Sqr(2.*std::log(-r)/r);
252 const std::complex<double> F02la =
253 (14.-3*std::log(-r))/r
254 + (6. - 72./5*Sqr(zeta2) - 24.*zeta3 - 8.*(1.-zeta2-4.*zeta3)*std::log(-r)
255 +(17.-8*zeta2)*Sqr(std::log(-r)) - 5./3.*Cube(std::log(-r)) - 1./6.*Power4(std::log(-r))
256 )/Sqr(r);
257 const std::complex<double> F02lb =
258 (6.*std::log(-r) - 3.*Sqr(std::log(-r)))/Sqr(r);
259 const std::complex<double> F02lc = - 3/.4*F01l;
260 return (F02la + (F02lb + F02lc)*std::log(Sqr(msq/mu)))/F01l;
261 }
262 else {
263 return 0.;
264 }
265}
266
267std::complex<double> delta_AhAA_2loopQCD_for_squark_loop(double mAh, double msq, double mu) noexcept {
268 const double r = Sqr(mAh/msq);
269 if (r < 0.7) {
270 return 0.;
271 }
272 else if (r > 1.5) {
273 return 0.;
274 }
275 else {
276 return 0.;
277 }
278}
279
280// eq. 6 of https://arxiv.org/pdf/1109.5304.pdf
281std::complex<double> hgg_SM_loop_function(double x) noexcept {
282 if(is_zero(1.-x)) {
283 return Sqr(Pi/2.);
284 }
285 else if (x > 1) {
286 return Sqr(std::asin(1./std::sqrt(x)));
287 }
288 else {
289 return -0.25*Sqr(std::log((1.+std::sqrt(1.-x))/(1.-std::sqrt(1.-x))) - 1i*Pi);
290 }
291}
292
293unsigned int number_of_active_flavours(softsusy::QedQcd const& qedqcd, double m) noexcept
294{
295 unsigned nf = 0;
296 if (m > qedqcd.displayMass(softsusy::mUp)) { nf++; }
297 if (m > qedqcd.displayMass(softsusy::mDown)) { nf++; }
298 if (m > qedqcd.displayMass(softsusy::mStrange)) { nf++; }
299 if (m > qedqcd.displayMass(softsusy::mCharm)) { nf++; }
300 if (m > qedqcd.displayMass(softsusy::mBottom)) { nf++; }
301 if (m > qedqcd.displayMass(softsusy::mTop)) { nf++; }
302
303 return nf;
304}
305
306} // 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:487
double calc_DeltaAh(double b) noexcept
static constexpr double zeta2
Definition: wrappers.hpp:53
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
std::string to_string(char a)
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:136
std::complex< double > fprime(double tau) noexcept
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition: wrappers.hpp:631
double Li2(double x) noexcept
Real dilogarithm .
Definition: Li2.cpp:68
static constexpr double zeta4
Definition: wrappers.hpp:55
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:104
static constexpr double zeta5
Definition: wrappers.hpp:56
constexpr Base Power5(Base b) noexcept
Definition: wrappers.hpp:499
constexpr Base Power4(Base b) noexcept
Definition: wrappers.hpp:493
Complex< T > log(const Complex< T > &z) noexcept
Definition: complex.hpp:54
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:179
std::complex< double > delta_hAA_2loopQCD_for_quark_loop(double mH, double mq, double mu) noexcept
static constexpr double zeta3
Definition: wrappers.hpp:54
@ 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