GM2Calc 2.3.0
Loading...
Searching...
No Matches
gm2_2loop_F.cpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of GM2Calc.
3//
4// GM2Calc 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// GM2Calc 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 GM2Calc. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
20#include "gm2_dilog.hpp"
21#include "gm2_ffunctions.hpp"
22
23#include <cmath>
24#include <limits>
25
26/**
27 * \file gm2_2loop_F.cpp
28 *
29 * Contains functions necessary to calculate the fermionic THDM
30 * contributions for g-2 at the 2-loop level.
31 */
32
33namespace gm2calc {
34
35namespace thdm {
36
37namespace {
38
39struct F_sm_pars {
40 double mw2{}; ///< squared W boson mass
41 double mz2{}; ///< squared Z boson mass
42};
43
44struct F_neut_pars {
45 double qf{}; ///< electromagnetic charge of fermion f
46 double ql{}; ///< electromagnetic charge of fermion l
47 double t3f{}; ///< SU(2)_L charge of ferimon f
48 double t3l{}; ///< SU(2)_L charge of ferimon l
49 double nc{}; ///< number of colors of fermion f
50};
51
52struct F_char_pars {
53 double qd{}; ///< electromagnetic charge of up-type fermion
54 double qu{}; ///< electromagnetic charge of down-type fermion
55 double nc{}; ///< number of colors
56};
57
58const double pi = 3.1415926535897932;
59const double pi2 = 9.8696044010893586; // Pi^2
60const double q_u = 2.0/3.0; ///< electric charge of up-type quarks
61const double q_d = -1.0/3.0; ///< electric charge of down-type quarks
62const double q_v = 0.0; ///< electric charge of up-type leptons
63const double q_l = -1.0; ///< electric charge of down-type leptons
64const double t3_u = +0.5; ///< SU(2)_L charge of up-type quark
65const double t3_d = -0.5; ///< SU(2)_L charge of down-type quark
66const double t3_l = -0.5; ///< SU(2)_L charge of charged lepton
67
68double sqr(double x) noexcept { return x*x; }
69
70double calc_v2(const THDM_F_parameters& thdm) noexcept
71{
72 const double mw2 = sqr(thdm.mw);
73 const double mz2 = sqr(thdm.mz);
74 const double sw2 = 1.0 - mw2/mz2;
75 const double e2 = 4*pi*thdm.alpha_em;
76 const double g22 = e2/sw2;
77 return 4*mw2/g22;
78}
79
80/// Eq (56), arxiv:1607.06292, S = h or H
81double FH(double ms2, double mf2) noexcept
82{
83 const double x = mf2/ms2;
84 return 0.5/x*f_S(x);
85}
86
87/// Eq (57), arxiv:1607.06292, S = A
88double FA(double ms2, double mf2) noexcept
89{
90 const double x = mf2/ms2;
91 return 0.5/x*f_PS(x);
92}
93
94double FHZ(double mf2, double ms2, double mz2) noexcept
95{
96 const double x = mf2/ms2;
97 const double y = mf2/mz2;
98 return FSZ(x, y);
99}
100
101double FAZ(double mf2, double ms2, double mz2) noexcept
102{
103 const double x = mf2/ms2;
104 const double y = mf2/mz2;
105 return FPZ(x, y);
106}
107
108/// Eq (54), arxiv:1607.06292, S = h or H
109template <typename F>
110double fSgamma(double ms2, double mf2, const F_neut_pars& pars, F FH) noexcept
111{
112 const double qf2 = sqr(pars.qf);
113 const double nc = pars.nc;
114
115 return qf2*nc * mf2/ms2 * FH(ms2, mf2);
116}
117
118/// Eq (55), arxiv:1607.06292, S = h or H
119template <typename F>
120double fSZ(double ms2, double mf2, const F_neut_pars& pars, const F_sm_pars& sm, F FHZ) noexcept
121{
122 const double mw2 = sm.mw2;
123 const double mz2 = sm.mz2;
124 const double cw2 = mw2/mz2;
125 const double sw2 = 1.0 - cw2;
126 const double qf = pars.qf;
127 const double ql = pars.ql;
128 const double nc = pars.nc;
129 const double gvf = 0.5*pars.t3f - qf*sw2;
130 const double gvl = 0.5*pars.t3l - ql*sw2;
131
132 // Note: 0.5*FHZ(mf2, ms2, mz2) = -mf2/(ms2 - mz2) * (FH(ms2, mf2) - FH(mz2, mf2))
133 // with FH = {f_S, f_PS}
134
135 return 0.5*nc*qf*gvl*gvf/(sw2*cw2)*FHZ(mf2, ms2, mz2);
136}
137
138/// Eq (53), arxiv:1607.06292, S = h or H
139template <typename F, typename FZ>
140double ffS(double ms2, double mf2, const F_neut_pars& pars, const F_sm_pars& sm, F FH, FZ FHZ) noexcept
141{
142 return fSgamma(ms2, mf2, pars, FH) + fSZ(ms2, mf2, pars, sm, FHZ);
143}
144
145/// Eq (59), arxiv:1607.06292, S = H^\pm, f = l
146double flHp(double ms2, double ml2, const F_char_pars& pars, const F_sm_pars& sm) noexcept
147{
148 const double mw2 = sm.mw2;
149 const double nc = pars.nc;
150 const double x = ml2/ms2;
151 const double y = ml2/mw2;
152
153 return -nc*FCWl(x, y);
154}
155
156/// Eq (59), arxiv:1607.06292, S = H^\pm, f = u
157double fuHp(double ms2, double md2, double mu2, const F_char_pars& pars, const F_sm_pars& sm) noexcept
158{
159 const double mw2 = sm.mw2;
160 const double qd = pars.qd;
161 const double qu = pars.qu;
162 const double nc = pars.nc;
163 const double xu = mu2/ms2;
164 const double xd = md2/ms2;
165 const double yu = mu2/mw2;
166 const double yd = md2/mw2;
167
168 return -nc*FCWu(xu, xd, yu, yd, qu, qd);
169}
170
171/// Eq (59), arxiv:1607.06292, S = H^\pm, f = d
172double fdHp(double ms2, double md2, double mu2, const F_char_pars& pars, const F_sm_pars& sm) noexcept
173{
174 const double mw2 = sm.mw2;
175 const double qd = pars.qd;
176 const double qu = pars.qu;
177 const double nc = pars.nc;
178 const double xu = mu2/ms2;
179 const double xd = md2/ms2;
180 const double yu = mu2/mw2;
181 const double yd = md2/mw2;
182
183 return -nc*FCWd(xu, xd, yu, yd, qu, qd);
184}
185
186} // anonymous namespace
187
188/// Eq (53), arxiv:1607.06292, f = u, S = h or H
189double fuS(double ms2, double mu2, double mw2, double mz2) noexcept
190{
191 const F_neut_pars pars{q_u, q_l, t3_u, t3_l, 3.0};
192 const F_sm_pars sm{ mw2, mz2 };
193 const auto lFH = [] (double ms2, double mu2) { return FH(ms2, mu2); };
194 const auto lFHZ = [] (double mf2, double ms2, double mz2) { return FHZ(mf2, ms2, mz2); };
195
196 return ffS(ms2, mu2, pars, sm, lFH, lFHZ);
197}
198
199/// Eq (53), arxiv:1607.06292, f = d, S = h or H
200double fdS(double ms2, double md2, double mw2, double mz2) noexcept
201{
202 const F_neut_pars pars{q_d, q_l, t3_d, t3_l, 3.0};
203 const F_sm_pars sm{ mw2, mz2 };
204 const auto lFH = [] (double ms2, double md2) { return FH(ms2, md2); };
205 const auto lFHZ = [] (double mf2, double ms2, double mz2) { return FHZ(mf2, ms2, mz2); };
206
207 return ffS(ms2, md2, pars, sm, lFH, lFHZ);
208}
209
210/// Eq (53), arxiv:1607.06292, f = l, S = h or H
211double flS(double ms2, double ml2, double mw2, double mz2) noexcept
212{
213 const F_neut_pars pars{q_l, q_l, t3_l, t3_l, 1.0};
214 const F_sm_pars sm{ mw2, mz2 };
215 const auto lFH = [] (double ms2, double ml2) { return FH(ms2, ml2); };
216 const auto lFHZ = [] (double mf2, double ms2, double mz2) { return FHZ(mf2, ms2, mz2); };
217
218 return ffS(ms2, ml2, pars, sm, lFH, lFHZ);
219}
220
221/// Eq (53), arxiv:1607.06292, f = u, S = A
222double fuA(double ms2, double mu2, double mw2, double mz2) noexcept
223{
224 const F_neut_pars pars{q_u, q_l, t3_u, t3_l, 3.0};
225 const F_sm_pars sm{ mw2, mz2 };
226 const auto lFA = [] (double ms2, double mu2) { return FA(ms2, mu2); };
227 const auto lFAZ = [] (double mf2, double ms2, double mz2) { return FAZ(mf2, ms2, mz2); };
228
229 return ffS(ms2, mu2, pars, sm, lFA, lFAZ);
230}
231
232/// Eq (53), arxiv:1607.06292, f = d, S = A
233double fdA(double ms2, double md2, double mw2, double mz2) noexcept
234{
235 const F_neut_pars pars{q_d, q_l, t3_d, t3_l, 3.0};
236 const F_sm_pars sm{ mw2, mz2 };
237 const auto lFA = [] (double ms2, double md2) { return FA(ms2, md2); };
238 const auto lFAZ = [] (double mf2, double ms2, double mz2) { return FAZ(mf2, ms2, mz2); };
239
240 return ffS(ms2, md2, pars, sm, lFA, lFAZ);
241}
242
243/// Eq (53), arxiv:1607.06292, f = l, S = A
244double flA(double ms2, double ml2, double mw2, double mz2) noexcept
245{
246 const F_neut_pars pars{q_l, q_l, t3_l, t3_l, 1.0};
247 const F_sm_pars sm{mw2, mz2};
248 const auto lFA = [] (double ms2, double ml2) { return FA(ms2, ml2); };
249 const auto lFAZ = [] (double mf2, double ms2, double mz2) { return FAZ(mf2, ms2, mz2); };
250
251 return ffS(ms2, ml2, pars, sm, lFA, lFAZ);
252}
253
254/// Eq (59), arxiv:1607.06292, S = H^\pm, f = u
255double fuHp(double ms2, double md2, double mu2, double mw2, double mz2) noexcept
256{
257 const F_char_pars pars{q_d, q_u, 3.0};
258 const F_sm_pars sm{mw2, mz2};
259 return fuHp(ms2, md2, mu2, pars, sm);
260}
261
262/// Eq (59), arxiv:1607.06292, S = H^\pm, f = d
263double fdHp(double ms2, double md2, double mu2, double mw2, double mz2) noexcept
264{
265 const F_char_pars pars{q_d, q_u, 3.0};
266 const F_sm_pars sm{mw2, mz2};
267 return fdHp(ms2, md2, mu2, pars, sm);
268}
269
270/// Eq (59), arxiv:1607.06292, S = H^\pm, f = l
271double flHp(double ms2, double ml2, double mw2, double mz2) noexcept
272{
273 const F_char_pars pars{q_l, q_v, 1.0};
274 const F_sm_pars sm{mw2, mz2};
275 return flHp(ms2, ml2, pars, sm);
276}
277
278/**
279 * Calculates 2-loop fermionic contributions with charged Higgs
280 * boson.
281 *
282 * Eq (52), arXiv:2110.13238
283 */
284double amu2L_F_charged(const THDM_F_parameters& thdm) noexcept
285{
286 const double mHp2 = sqr(thdm.mHp);
287 const double mw2 = sqr(thdm.mw);
288 const double mz2 = sqr(thdm.mz);
289 const double v2 = calc_v2(thdm);
290 const double sw2 = 1 - mw2/mz2;
291 const double pref = sqr(thdm.alpha_em*thdm.mm/(8*pi*thdm.mw*sw2))*v2/thdm.ml(1);
292
293 double res = 0;
294
295 // loop over generations
296 for (int i = 0; i < 3; ++i) {
297 for (int j = 0; j < 3; ++j) {
298 // u
299 res += fuHp(mHp2, sqr(thdm.md(j)), sqr(thdm.mu(i)), mw2, mz2)
300 *std::real(std::conj(thdm.yuHp(i,j))*thdm.vckm(i,j)*thdm.ylHp(1,1))/thdm.mu(i);
301 // d
302 res += fdHp(mHp2, sqr(thdm.md(j)), sqr(thdm.mu(i)), mw2, mz2)
303 *std::real(std::conj(thdm.ydHp(i,j))*thdm.vckm(i,j)*thdm.ylHp(1,1))/thdm.md(j);
304 }
305 // l
306 res += flHp(mHp2, sqr(thdm.ml(i)), mw2, mz2)
307 *std::real(std::conj(thdm.ylHp(i,i))*thdm.ylHp(1,1))/thdm.ml(i);
308 }
309
310 return pref*res;
311}
312
313/**
314 * Calculates 2-loop fermionic contributions with neutral Higgs
315 * bosons.
316 *
317 * Eq (53), arxiv:1607:06292
318 */
319double amu2L_F_neutral(const THDM_F_parameters& thdm) noexcept
320{
321 const double mh2 = sqr(thdm.mh(0));
322 const double mH2 = sqr(thdm.mh(1));
323 const double mA2 = sqr(thdm.mA);
324 const double mhSM2 = sqr(thdm.mhSM);
325 const double mw2 = sqr(thdm.mw);
326 const double mz2 = sqr(thdm.mz);
327 const double v2 = calc_v2(thdm);
328 const double sw2 = 1 - mw2/mz2;
329 const auto pref = sqr(thdm.alpha_em*thdm.mm/(2*pi*thdm.mw))/sw2;
330
331 double res = 0;
332
333 // loop over generations
334 for (int i = 0; i < 3; ++i) {
335 // h
336 res += fuS(mh2, sqr(thdm.mu(i)), mw2, mz2)*std::real(std::conj(thdm.yuh(i,i))*thdm.ylh(1,1))*v2/(thdm.mu(i)*thdm.ml(1));
337 res += fdS(mh2, sqr(thdm.md(i)), mw2, mz2)*std::real(std::conj(thdm.ydh(i,i))*thdm.ylh(1,1))*v2/(thdm.md(i)*thdm.ml(1));
338 res += flS(mh2, sqr(thdm.ml(i)), mw2, mz2)*std::real(std::conj(thdm.ylh(i,i))*thdm.ylh(1,1))*v2/(thdm.ml(i)*thdm.ml(1));
339
340 // H
341 res += fuS(mH2, sqr(thdm.mu(i)), mw2, mz2)*std::real(std::conj(thdm.yuH(i,i))*thdm.ylH(1,1))*v2/(thdm.mu(i)*thdm.ml(1));
342 res += fdS(mH2, sqr(thdm.md(i)), mw2, mz2)*std::real(std::conj(thdm.ydH(i,i))*thdm.ylH(1,1))*v2/(thdm.md(i)*thdm.ml(1));
343 res += flS(mH2, sqr(thdm.ml(i)), mw2, mz2)*std::real(std::conj(thdm.ylH(i,i))*thdm.ylH(1,1))*v2/(thdm.ml(i)*thdm.ml(1));
344
345 // A
346 res += fuA(mA2, sqr(thdm.mu(i)), mw2, mz2)*std::real(std::conj(thdm.yuA(i,i))*thdm.ylA(1,1))*v2/(thdm.mu(i)*thdm.ml(1));
347 res += fdA(mA2, sqr(thdm.md(i)), mw2, mz2)*std::real(std::conj(thdm.ydA(i,i))*thdm.ylA(1,1))*v2/(thdm.md(i)*thdm.ml(1));
348 res += flA(mA2, sqr(thdm.ml(i)), mw2, mz2)*std::real(std::conj(thdm.ylA(i,i))*thdm.ylA(1,1))*v2/(thdm.ml(i)*thdm.ml(1));
349
350 // subtract hSM
351 res -= fuS(mhSM2, sqr(thdm.mu(i)), mw2, mz2);
352 res -= fdS(mhSM2, sqr(thdm.md(i)), mw2, mz2);
353 res -= flS(mhSM2, sqr(thdm.ml(i)), mw2, mz2);
354 }
355
356 return pref*res;
357}
358
359/**
360 * Calculates the sum of the 2-loop fermionic contributions with
361 * neutral and charged Higgs bosons.
362 *
363 * Eq (63), arxiv:1607:06292
364 */
365double amu2L_F(const THDM_F_parameters& thdm) noexcept
366{
367 return amu2L_F_neutral(thdm) + amu2L_F_charged(thdm);
368}
369
370} // namespace thdm
371
372} // namespace gm2calc
double t3f
SU(2)_L charge of ferimon f.
double ql
electromagnetic charge of fermion l
double qf
electromagnetic charge of fermion f
double qu
electromagnetic charge of down-type fermion
double mw2
squared W boson mass
double nc
number of colors of fermion f
double t3l
SU(2)_L charge of ferimon l.
double mz2
squared Z boson mass
double qd
electromagnetic charge of up-type fermion
double mA2
double fdA(double ms2, double md2, double mw2, double mz2) noexcept
Eq (53), arxiv:1607.06292, f = d, S = A.
double flHp(double ms2, double ml2, double mw2, double mz2) noexcept
Eq (59), arxiv:1607.06292, S = H^\pm, f = l.
double flA(double ms2, double ml2, double mw2, double mz2) noexcept
Eq (53), arxiv:1607.06292, f = l, S = A.
double fuHp(double ms2, double md2, double mu2, double mw2, double mz2) noexcept
Eq (59), arxiv:1607.06292, S = H^\pm, f = u.
double amu2L_F(const THDM_F_parameters &thdm) noexcept
Calculates the sum of the 2-loop fermionic contributions with neutral and charged Higgs bosons.
double fdHp(double ms2, double md2, double mu2, double mw2, double mz2) noexcept
Eq (59), arxiv:1607.06292, S = H^\pm, f = d.
double fdS(double ms2, double md2, double mw2, double mz2) noexcept
Eq (53), arxiv:1607.06292, f = d, S = h or H.
double fuA(double ms2, double mu2, double mw2, double mz2) noexcept
Eq (53), arxiv:1607.06292, f = u, S = A.
double flS(double ms2, double ml2, double mw2, double mz2) noexcept
Eq (53), arxiv:1607.06292, f = l, S = h or H.
double fuS(double ms2, double mu2, double mw2, double mz2) noexcept
Eq (53), arxiv:1607.06292, f = u, S = h or H.
double amu2L_F_neutral(const THDM_F_parameters &thdm) noexcept
Calculates 2-loop fermionic contributions with neutral Higgs bosons.
double amu2L_F_charged(const THDM_F_parameters &thdm) noexcept
Calculates 2-loop fermionic contributions with charged Higgs boson.
T sqr(T x) noexcept
returns number squared
double FSZ(double x, double y) noexcept
Barr-Zee 2-loop function with fermion loop and scalar and Z boson mediators.
double f_S(double z) noexcept
Calculates , Eq (71) arXiv:hep-ph/0609168.
double FCWl(double x, double y) noexcept
Barr-Zee 2-loop function with lepton loop and charge scalar and W boson mediators.
void svd_eigen(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
double FCWu(double xu, double xd, double yu, double yd, double qu, double qd) noexcept
Barr-Zee 2-loop function with up-type quark loop and charge scalar and W boson mediators.
double FPZ(double x, double y) noexcept
Barr-Zee 2-loop function with fermion loop and pseudoscalar and Z boson mediators.
double f_PS(double z) noexcept
Calculates , Eq (70) arXiv:hep-ph/0609168.
double FCWd(double xu, double xd, double yu, double yd, double qu, double qd) noexcept
Barr-Zee 2-loop function with down-type quark loop and charge scalar and W boson mediators.
parameters to be passed to the fermionic contribution functions