GM2Calc 2.3.0
Loading...
Searching...
No Matches
SM.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
19#include "gm2calc/SM.hpp"
20#include "gm2calc/gm2_error.hpp"
21#include "gm2_numerics.hpp"
22#include "gm2_constants.hpp"
23#include <cmath>
24#include <complex>
25#include <iostream>
26
27namespace gm2calc {
28
29namespace {
30
31const double pi = 3.1415926535897932;
32
33Eigen::Matrix<std::complex<double>,3,3> get_ckm_from_angles(
34 double theta_12, double theta_13, double theta_23, double delta) noexcept
35{
36 const std::complex<double> eID(std::polar(1.0, delta));
37 const double s12 = std::sin(theta_12);
38 const double s13 = std::sin(theta_13);
39 const double s23 = std::sin(theta_23);
40 const double c12 = std::cos(theta_12);
41 const double c13 = std::cos(theta_13);
42 const double c23 = std::cos(theta_23);
43
44 Eigen::Matrix<std::complex<double>,3,3> ckm;
45 ckm(0, 0) = c12 * c13;
46 ckm(0, 1) = s12 * c13;
47 ckm(0, 2) = s13 / eID;
48 ckm(1, 0) = -s12 * c23 - c12 * s23 * s13 * eID;
49 ckm(1, 1) = c12 * c23 - s12 * s23 * s13 * eID;
50 ckm(1, 2) = s23 * c13;
51 ckm(2, 0) = s12 * s23 - c12 * c23 * s13 * eID;
52 ckm(2, 1) = -c12 * s23 - s12 * c23 * s13 * eID;
53 ckm(2, 2) = c23 * c13;
54
55 return ckm;
56}
57
58Eigen::Matrix<std::complex<double>,3,3> get_ckm_from_wolfenstein(
59 double lambdaW, double aCkm, double rhobar, double etabar)
60{
61 if (std::abs(lambdaW) > 1.0) { throw EInvalidInput("Error: Wolfenstein lambda out of range!"); }
62 if (std::abs(aCkm) > 1.0) { throw EInvalidInput("Error: Wolfenstein A parameter out of range!"); }
63 if (std::abs(rhobar) > 1.0) { throw EInvalidInput("Error: Wolfenstein rho-bar parameter out of range!"); }
64 if (std::abs(etabar) > 1.0) { throw EInvalidInput("Error: Wolfenstein eta-bar parameter out of range!"); }
65
66 const double theta_12 = std::asin(lambdaW);
67 const double theta_23 = std::asin(aCkm * sqr(lambdaW));
68 const double lambdaW3 = cube(lambdaW);
69 const double lambdaW4 = pow4(lambdaW);
70
71 const std::complex<double> rpe(rhobar, etabar);
72 const std::complex<double> V13conj = aCkm * lambdaW3 * rpe
73 * std::sqrt(1.0 - sqr(aCkm) * lambdaW4) /
74 std::sqrt(1.0 - sqr(lambdaW)) / (1.0 - sqr(aCkm) * lambdaW4 * rpe);
75
76 double theta_13 = 0.0;
77 double delta = 0.0;
78
79 if (std::isfinite(std::real(V13conj)) && std::isfinite(std::imag(V13conj))) {
80 theta_13 = std::asin(std::abs(V13conj));
81 delta = std::arg(V13conj);
82 }
83
85}
86
87} // anonymous namespace
88
90 : alpha_em_0(ALPHA_EM_THOMPSON)
91 , alpha_em_mz(ALPHA_EM_MZ)
92 , alpha_s_mz(ALPHA_S_MZ)
93 , mh(MH)
94 , mw(MW)
95 , mz(MZ)
96 , mu((Eigen::Matrix<double,3,1>() << MU, MC, MT).finished())
97 , md((Eigen::Matrix<double,3,1>() << MD, MS, MBMB).finished())
98 , ml((Eigen::Matrix<double,3,1>() << ME, MM, ML).finished())
100{
101}
102
103double SM::get_e_0() const
104{
105 return std::sqrt(alpha_em_0*4*pi);
106}
107
108double SM::get_e_mz() const
109{
110 return std::sqrt(alpha_em_mz*4*pi);
111}
112
113double SM::get_gY() const
114{
115 return get_e_mz()/get_cw();
116}
117
118double SM::get_g2() const
119{
120 return get_e_mz()/get_sw();
121}
122
123double SM::get_g3() const
124{
125 return std::sqrt(alpha_s_mz*4*pi);
126}
127
128double SM::get_cw() const
129{
130 return std::abs(mw/mz);
131}
132
133double SM::get_sw() const
134{
135 return std::sqrt(1 - sqr(get_cw()));
136}
137
138double SM::get_v() const
139{
140 return 2*mw/get_g2();
141}
142
144 double lambdaW, double aCkm, double rhobar, double etabar)
145{
147}
148
150 double theta_12, double theta_13, double theta_23, double delta)
151{
153}
154
155std::ostream& operator<<(std::ostream& ostr, const SM& sm)
156{
157 ostr << "========================================\n"
158 " SM\n"
159 "========================================\n"
160 << "alpha_em(MZ) = " << sm.get_alpha_em_mz() << '\n'
161 << "alpha_em(0) = " << sm.get_alpha_em_0() << '\n'
162 << "alpha_s(MZ) = " << sm.get_alpha_s_mz() << '\n'
163 << "mw = " << sm.get_mw() << " GeV\n"
164 << "mz = " << sm.get_mz() << " GeV\n"
165 << "mh = " << sm.get_mh() << " GeV\n"
166 << "mu = {" << sm.get_mu(0) << ", " << sm.get_mu(1) << ", " << sm.get_mu(2) << "} GeV\n"
167 << "md = {" << sm.get_md(0) << ", " << sm.get_md(1) << ", " << sm.get_md(2) << "} GeV\n"
168 << "mv = {" << sm.get_mv(0) << ", " << sm.get_mv(1) << ", " << sm.get_mv(2) << "} GeV\n"
169 << "ml = {" << sm.get_ml(0) << ", " << sm.get_ml(1) << ", " << sm.get_ml(2) << "} GeV\n"
170 << "CKM = {{" << sm.get_ckm(0,0) << ", " << sm.get_ckm(0,1) << ", " << sm.get_ckm(0,2) << "},\n"
171 " {" << sm.get_ckm(1,0) << ", " << sm.get_ckm(1,1) << ", " << sm.get_ckm(1,2) << "},\n"
172 " {" << sm.get_ckm(2,0) << ", " << sm.get_ckm(2,1) << ", " << sm.get_ckm(2,2) << "}}\n"
173 ;
174 return ostr;
175}
176
177} // namespace gm2calc
double get_mz() const
Definition SM.hpp:56
double get_gY() const
Definition SM.cpp:113
double get_mw() const
Definition SM.hpp:55
const Eigen::Matrix< std::complex< double >, 3, 3 > & get_ckm() const
Definition SM.hpp:73
double get_cw() const
Definition SM.cpp:128
double get_v() const
Definition SM.cpp:138
void set_ckm_from_angles(double theta_12, double theta_13, double theta_23, double delta)
Definition SM.cpp:149
double get_alpha_em_0() const
Definition SM.hpp:51
double get_g2() const
Definition SM.cpp:118
double get_g3() const
Definition SM.cpp:123
double get_sw() const
Definition SM.cpp:133
double get_e_0() const
Definition SM.cpp:103
const Eigen::Matrix< double, 3, 1 > & get_mv() const
Definition SM.hpp:59
const Eigen::Matrix< double, 3, 1 > & get_ml() const
Definition SM.hpp:60
double get_alpha_s_mz() const
Definition SM.hpp:53
double get_mh() const
Definition SM.hpp:54
double get_alpha_em_mz() const
Definition SM.hpp:52
double get_e_mz() const
Definition SM.cpp:108
const Eigen::Matrix< double, 3, 1 > & get_mu() const
Definition SM.hpp:57
void set_ckm_from_wolfenstein(double lambdaW, double aCkm, double rhobar, double etabar)
Definition SM.cpp:143
const Eigen::Matrix< double, 3, 1 > & get_md() const
Definition SM.hpp:58
double mu
T pow4(T x) noexcept
returns number to the 4th power
T sqr(T x) noexcept
returns number squared
constexpr double MD
constexpr double CKM_THETA13
constexpr double MM
constexpr double CKM_DELTA
constexpr double MW
constexpr double MT
constexpr double MBMB
constexpr double MZ
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)
constexpr double MH
constexpr double ALPHA_EM_MZ
T cube(T x) noexcept
returns number to the third power
std::ostream & operator<<(std::ostream &os, const MSSMNoFV_onshell &model)
streaming operator
constexpr double MS
constexpr double ALPHA_EM_THOMPSON
constexpr double MC
constexpr double CKM_THETA23
constexpr double ME
constexpr double MU
constexpr double ALPHA_S_MZ
constexpr double CKM_THETA12
constexpr double ML