37#include <boost/math/tools/roots.hpp>
42 const double Pi = 3.141592653589793;
43 const double eps = std::numeric_limits<double>::epsilon();
44 const double root2 = 1.414213562373095;
48 return std::sqrt(4. *
Pi *
alpha);
53 return e *
e / (4. *
Pi);
57 template <
class Derived>
58 void print_row(std::ostream& str,
const Eigen::DenseBase<Derived>&
row)
63 for (
int i = 1;
i <
row.cols(); ++
i) {
64 str <<
", " <<
row(
i);
71 template <
class Derived>
74 std::ostringstream
sstr;
82 for (
int r = 1;
r <
v.rows(); ++
r) {
103template <
class Derived>
107 ZN.col(0).cwiseAbs2().maxCoeff(&
max_bino);
118template <
class Derived>
121 return (std::norm(ZM(0,0)) > std::norm(ZM(0,1))) ? 1 : 0;
126MSSMNoFV_onshell::MSSMNoFV_onshell()
141void MSSMNoFV_onshell::set_alpha_MZ(
double alpha)
146void MSSMNoFV_onshell::set_alpha_thompson(
double alpha)
151void MSSMNoFV_onshell::set_TB(
double tanb)
156 const double cosb = 1. /
rt;
161double MSSMNoFV_onshell::get_vev()
const
170double MSSMNoFV_onshell::get_TB()
const
193void MSSMNoFV_onshell::convert_to_onshell(
198 copy_susy_masses_to_pole();
200 calculate_mb_DRbar_MZ();
201 convert_gauge_couplings();
204 convert_yukawa_couplings_treelevel();
206 convert_yukawa_couplings();
208 convert_yukawa_couplings();
211 convert_yukawa_couplings();
231void MSSMNoFV_onshell::calculate_masses()
234 calculate_mb_DRbar_MZ();
235 convert_gauge_couplings();
238 convert_yukawa_couplings_treelevel();
239 convert_yukawa_couplings();
247 copy_susy_masses_to_pole();
256void MSSMNoFV_onshell::convert_to_non_tan_beta_resummed()
258 convert_yukawa_couplings_treelevel();
263void MSSMNoFV_onshell::check_input()
const
265#define WARN_OR_THROW_IF(cond,msg) \
267 if (do_force_output()) { \
270 throw EInvalidInput(msg); \
274#define WARN_OR_THROW_IF_ZERO(mass,msg) \
275 WARN_OR_THROW_IF(is_zero(get_##mass(), eps), msg)
291#undef WARN_OR_THROW_IF
292#undef WARN_OR_THROW_IF_ZERO
295void MSSMNoFV_onshell::check_problems()
const
308 throw EInvalidInput(
"soft mass squared < 0");
313 throw EInvalidInput(
"lightest chargino mass = 0");
318void MSSMNoFV_onshell::copy_susy_masses_to_pole()
323#define COPY_IF_ZERO_0(m) \
324 if (is_zero(get_physical().m, eps)) { \
325 get_physical().m = get_##m(); \
327#define COPY_IF_ZERO_1(m,z) \
328 if (is_zero(get_physical().m, eps)) { \
329 get_physical().m = get_##m(); \
330 get_physical().z = get_##z(); \
332#define COPY_IF_ZERO_2(m,u,v) \
333 if (is_zero(get_physical().m, eps)) { \
334 get_physical().m = get_##m(); \
335 get_physical().u = get_##u(); \
336 get_physical().v = get_##v(); \
359void MSSMNoFV_onshell::convert_gauge_couplings()
363 const double cW =
MW /
MZ;
365 set_g1(std::sqrt(5. / 3.) * EL /
cW);
369void MSSMNoFV_onshell::convert_BMu()
378void MSSMNoFV_onshell::convert_vev()
394void MSSMNoFV_onshell::calculate_mb_DRbar_MZ()
402void MSSMNoFV_onshell::convert_yukawa_couplings_treelevel()
404 Eigen::Matrix<double,3,3>
Ye_neu(Eigen::Matrix<double,3,3>::Zero());
410 Eigen::Matrix<double,3,3>
Yu_neu(Eigen::Matrix<double,3,3>::Zero());
416 Eigen::Matrix<double,3,3>
Yd_neu(Eigen::Matrix<double,3,3>::Zero());
435void MSSMNoFV_onshell::convert_yukawa_couplings()
437 Eigen::Matrix<double,3,3>
Ye_neu(Eigen::Matrix<double,3,3>::Zero());
443 Eigen::Matrix<double,3,3>
Yu_neu(Eigen::Matrix<double,3,3>::Zero());
449 Eigen::Matrix<double,3,3>
Yd_neu(Eigen::Matrix<double,3,3>::Zero());
465unsigned MSSMNoFV_onshell::find_bino_like_neutralino()
489void MSSMNoFV_onshell::convert_Mu_M1_M2(
499 if (verbose_output) {
500 VERBOSE(
"Converting Mu, M1, M2 to on-shell scheme ...\n"
519 const Eigen::Matrix<double,2,2>
X = (
U.transpose() *
MCha_goal.matrix().asDiagonal() *
V).
real();
520 const Eigen::Matrix<double,4,4>
Y = (
N.transpose() *
MChi_goal.matrix().asDiagonal() *
N).
real();
522 if (!
X.allFinite()) {
523 WARNING(
"chargino mixing matrix contains NaNs");
527 if (!
Y.allFinite()) {
528 WARNING(
"neutralino mixing matrix contains NaNs");
548 if (verbose_output) {
549 VERBOSE(
" No improvement in last iteration step, stopping iteration ...");
554 if (verbose_output) {
560 <<
", accuracy = " << precision <<
" GeV");
574 if (verbose_output) {
577 " DR-bar to on-shell conversion for Mu, M1 and M2 did"
578 " not converge (reached absolute accuracy: " << precision <<
582 VERBOSE(
" Achieved absolute accuracy: " << precision <<
" GeV");
590void MSSMNoFV_onshell::convert_ml2()
598 if (verbose_output) {
599 VERBOSE(
"Converting msl(2,2) to on-shell scheme ...\n"
607 if (std::isfinite(
ml211)) {
614 if (verbose_output) {
626void MSSMNoFV_onshell::convert_me2(
652double MSSMNoFV_onshell::convert_me2_root_modify(
661 double operator()(
double me211) {
662 model.set_me2(1,1,me211);
663 model.calculate_MSm();
665 Eigen::Array<double,2,1> MSm_pole(model.get_physical().MSm);
666 std::sort(MSm_pole.data(), MSm_pole.data() + MSm_pole.size());
667 const int right_index = detail::find_right_like_smuon(model.get_ZM());
669 return model.get_MSm(right_index) - MSm_pole(right_index);
682 if (verbose_output) {
683 VERBOSE(
"Converting mse(2,2) to on-shell scheme with root finder ...");
691 const std::pair<double,double>
root = boost::math::tools::toms748_solve(
694 }
catch (
const std::exception&
e) {
695 if (verbose_output) {
696 VERBOSE(
" DR-bar to on-shell conversion for mse failed with"
697 " root finder: " <<
e.what());
705 if (verbose_output) {
708 " DR-bar to on-shell conversion for mse did not converge with"
709 " root finder (reached absolute accuracy: " << precision <<
713 VERBOSE(
" Achieved absolute accuracy: " << precision <<
" GeV");
732double MSSMNoFV_onshell::convert_me2_root(
739 if (!std::isfinite(precision) ||
740 !std::isfinite(
get_me2(1,1)) ||
747 return std::numeric_limits<double>::max();
761double MSSMNoFV_onshell::convert_me2_fpi_modify(
774 if (verbose_output) {
775 VERBOSE(
"Converting mse(2,2) to on-shell scheme with FPI ...\n"
788 const Eigen::Matrix<double,2,2> ZM(
get_ZM());
789 const Eigen::Matrix<double,2,2>
M(
790 ZM.adjoint() *
MSm_goal.square().matrix().asDiagonal() * ZM);
795 const double ymu2 = std::norm(
Ye(1,1));
797 const double me211 =
M(1,1)
800 if (std::isfinite(
me211)) {
809 if (verbose_output) {
810 VERBOSE(
" NaN appearing in DR-bar to on-shell conversion"
811 " for mse with FPI:\n"
812 " mse2(2,2) = " <<
me211 <<
816 return std::numeric_limits<double>::max();
828 if (verbose_output) {
829 VERBOSE(
" No improvement in last iteration step, stopping iteration ...");
834 if (verbose_output) {
835 VERBOSE(
" Iteration " <<
it <<
": mse(2,2) = "
838 <<
", accuracy = " << precision);
844 if (verbose_output) {
847 " DR-bar to on-shell conversion for mse did not converge with"
848 " FPI (reached absolute accuracy: " << precision <<
852 VERBOSE(
" Achieved absolute accuracy: " << precision <<
" GeV");
870double MSSMNoFV_onshell::convert_me2_fpi(
877 if (!std::isfinite(precision) ||
878 !std::isfinite(
get_me2(1,1)) ||
885 return std::numeric_limits<double>::max();
906 "===============================\n"
907 " GM2Calc masses and parameters \n"
908 "===============================\n"
912 "MM pole = " <<
model.get_MM() <<
" GeV\n" <<
913 "MT = " <<
model.get_MT() <<
" GeV\n" <<
914 "mb(mb) MS-bar = " <<
model.get_MBMB() <<
" GeV\n" <<
915 "mb(MZ) DR-bar = " <<
model.get_MB() <<
" GeV\n" <<
916 "MTau = " <<
model.get_ML() <<
" GeV\n" <<
917 "MW pole = " <<
model.get_MW() <<
" GeV\n" <<
918 "MZ pole = " <<
model.get_MZ() <<
" GeV\n" <<
921 "MSvm pole = " <<
model.get_MSvmL() <<
" GeV\n" <<
936 "MA0 = " <<
model.get_MA0() <<
" GeV\n" <<
938 "tan(beta) DR-bar = " <<
model.get_TB() <<
'\n' <<
940 "yd resummed = " <<
pretty_print(
model.get_Yd().diagonal().transpose()) <<
'\n' <<
941 "ye resummed = " <<
pretty_print(
model.get_Ye().diagonal().transpose()) <<
'\n' <<
944 "Mu on-shell = " <<
model.get_Mu() <<
" GeV\n" <<
945 "M1 on-shell = " <<
model.get_MassB() <<
" GeV\n" <<
946 "M2 on-shell = " <<
model.get_MassWB() <<
" GeV\n" <<
947 "M3 = " <<
model.get_MassG() <<
" GeV\n" <<
948 "msl on-shell = " <<
pretty_print(
model.get_ml2().diagonal().transpose().unaryExpr(
sas)) <<
" GeV\n" <<
949 "mse on-shell = " <<
pretty_print(
model.get_me2().diagonal().transpose().unaryExpr(
sas)) <<
" GeV\n" <<
955 "Ae DR-bar = " <<
pretty_print(
model.get_Ae().diagonal().transpose()) <<
" GeV\n" <<
956 "ren. scale = " <<
model.get_scale() <<
" GeV\n"
#define WARN_OR_THROW_IF(cond, msg)
#define COPY_IF_ZERO_1(m, z)
#define COPY_IF_ZERO_2(m, u, v)
#define COPY_IF_ZERO_0(m)
#define WARN_OR_THROW_IF_ZERO(mass, msg)
const Eigen::Matrix< std::complex< double >, 4, 4 > & get_ZN() const
const Eigen::Matrix< std::complex< double >, 2, 2 > & get_UM() const
void calculate_DRbar_masses()
routine which finds the DRbar mass eigenstates and mixings.
const Eigen::Array< double, 2, 1 > & get_MAh() const
const Eigen::Array< double, 4, 1 > & get_MChi() const
const MSSMNoFV_onshell_physical & get_physical() const
const Eigen::Matrix< std::complex< double >, 2, 2 > & get_UP() const
const Eigen::Array< double, 2, 1 > & get_MCha() const
const Eigen::Array< double, 2, 1 > & get_MSm() const
const Eigen::Matrix< double, 2, 2 > & get_ZM() const
bool do_force_output() const
const MSSMNoFV_onshell_problems & get_problems() const
const Eigen::Array< double, 2, 1 > & get_Mhh() const
void unflag_no_convergence_me2()
void unflag_no_convergence_Mu_MassB_MassWB()
void flag_no_convergence_me2(double, unsigned)
void clear_problems()
delete all problems
void clear()
delete all problems and warnings
void flag_no_convergence_Mu_MassB_MassWB(double, unsigned)
void set_MassWB(double MassWB_)
const Eigen::Matrix< double, 3, 3 > & get_mq2() const
const Eigen::Matrix< double, 3, 3 > & get_mu2() const
const Eigen::Matrix< double, 3, 3 > & get_md2() const
const Eigen::Matrix< double, 3, 3 > & get_me2() const
void set_BMu(double BMu_)
void set_TYd(const Eigen::Matrix< double, 3, 3 > &TYd_)
double get_MassWB() const
void set_MassB(double MassB_)
const Eigen::Matrix< double, 3, 3 > & get_ml2() const
void set_ml2(const Eigen::Matrix< double, 3, 3 > &ml2_)
void set_TYu(const Eigen::Matrix< double, 3, 3 > &TYu_)
void set_me2(const Eigen::Matrix< double, 3, 3 > &me2_)
void set_TYe(const Eigen::Matrix< double, 3, 3 > &TYe_)
Eigen::Matrix< double, 3, 3 > Ye
void set_Yu(const Eigen::Matrix< double, 3, 3 > &Yu_)
void set_Ye(const Eigen::Matrix< double, 3, 3 > &Ye_)
void set_Yd(const Eigen::Matrix< double, 3, 3 > &Yd_)
contains the MSSMNoFV parameters in the on-shell scheme
double get_TB() const
tan(beta) DR-bar
double get_MM() const
returns muon pole mass
double get_ME() const
returns electron mass
double get_MW() const
returns W boson pole mass
double get_MA0() const
returns CP-odd Higgs mass
double get_MS() const
returns strange-quark mass
double get_MU() const
returns up-quark mass
double get_vev() const
Vacuum expectation value v.
double get_MT() const
returns top-quark mass
double get_MB() const
returns mb(MZ) DR-bar
double get_ML() const
returns tau mass
double get_MC() const
returns charm-quark mass
double get_MZ() const
returns Z boson pole mass
double get_EL() const
electromagnetic gauge coupling at MZ w/o hadronic corrections
double get_MD() const
returns down-quark mass
double get_MBMB() const
returns mb(mb) MS-bar
struct MSSMNoFV_onshell MSSMNoFV_onshell
unsigned find_bino_like_neutralino(const Eigen::MatrixBase< Derived > &ZN)
Returns index of most bino-like neutralino.
unsigned find_right_like_smuon(const Eigen::MatrixBase< Derived > &ZM)
Returns index of most right-handed smuon.
T sqr(T x) noexcept
returns number squared
double delta_bottom_correction(const MSSMNoFV_onshell &model)
Returns the corrections from arxiv:0901.2065, Eq (103) and Eqs (31)-(35)
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 ALPHA_EM_MZ
bool is_zero(const Eigen::ArrayBase< Derived > &a, double eps)
double delta_tau_correction(const MSSMNoFV_onshell &model)
Calculates using delta_down_lepton_correction()
std::ostream & operator<<(std::ostream &os, const MSSMNoFV_onshell &model)
streaming operator
constexpr double ALPHA_EM_THOMPSON
double calculate_mb_SM5_DRbar(double mb_mb, double alpha_s, double scale)
Calculates mb(Q) in the DR-bar scheme in the SM w/ 5 active quark flavours using the approach describ...
double signed_abs_sqrt(double x) noexcept
returns square root of absolute of number, times sign
constexpr double ALPHA_S_MZ
bool is_equal(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< Derived > &b, double precision_goal)
double delta_mu_correction(const MSSMNoFV_onshell &model)
Calculates using delta_down_lepton_correction()
Eigen::Array< double, 2, 1 > MAh
Eigen::Array< double, 2, 1 > Mhh
Eigen::Array< double, 4, 1 > MChi