14 #include <gsl/gsl_errno.h>
15 #include <gsl/gsl_math.h>
16 #include <gsl/gsl_roots.h>
18 #include <Math/WrappedTF1.h>
19 #include <Math/BrentRootFinder.h>
26 "mup",
"mdown",
"mcharm",
"mstrange",
"mtop",
"mbottom",
39 CF =
Nc / 2. - 1. / (2. *
Nc);
57 for (
int j = 0; j < 8; j++)
59 for (
int j = 0; j < 4; j++)
61 for (
int j = 0; j < 10; j++)
63 for (
int j = 0; j < 5; j++)
101 throw std::runtime_error(
"QCD::orderToString(): order not implemented.");
107 bool QCD::Init(
const std::map<std::string, double>& DPars)
110 if (!check)
return (check);
131 for (std::map<std::string, double>::const_iterator it = DPars.begin(); it != DPars.end(); it++)
168 #if SUSYFIT_DEBUG & 2
172 std::cout <<
"postupdate: " <<
mtpole << std::endl;
174 std::cout <<
"mut set to " <<
mut << std::endl;
184 for (std::vector<std::string>::iterator it = params_i.begin(); it < params_i.end(); it++) {
196 if (name_i.compare(
"BBs") == 0 || name_i.compare(
"BBd") == 0) {
210 if (name_i.compare(
"BD") == 0) {
216 if (name_i.compare(
"BK") == 0) {
222 if (name_i.compare(
"BKd1") == 0) {
228 if (name_i.compare(
"BKd3") == 0) {
240 mesonsMap.insert(std::pair<const QCD::meson, Meson>(meson_i,
Meson()));
260 std::stringstream out;
262 throw std::runtime_error(
"QCD::initializeMeson() meson " + out.str() +
" not implemented");
275 int notABparameter = 0;
276 int notAMesonParameter = 0;
278 if (
name.compare(
"AlsM") == 0) {
283 }
else if (
name.compare(
"MAls") == 0) {
288 }
else if (
name.compare(
"mup") == 0) {
292 }
else if (
name.compare(
"mdown") == 0) {
296 }
else if (
name.compare(
"mcharm") == 0) {
300 }
else if (
name.compare(
"mstrange") == 0) {
304 }
else if (
name.compare(
"mtop") == 0) {
308 }
else if (
name.compare(
"mbottom") == 0) {
312 }
else if (
name.compare(
"muc") == 0)
314 else if (
name.compare(
"mub") == 0)
316 else if (
name.compare(
"mut") == 0)
323 if(it->second.setParameter(
name, value))
326 for (std::map<const QCD::meson, Meson>::iterator it =
mesonsMap.begin(); it !=
mesonsMap.end(); it++)
327 if(it->second.setParameter(
name, value))
328 notAMesonParameter += 1;
338 if (DPars.find(
QCDvars[i]) == DPars.end()) {
339 std::cout <<
"ERROR: missing mandatory QCD parameter " <<
QCDvars[i] << std::endl;
344 if (DPars.find(it->first) == DPars.end()) {
345 std::cout <<
"ERROR: missing optional parameter " << it->first << std::endl;
352 std::vector<std::string> parameters = it->second.parameterList(it->first);
353 for (std::vector<std::string>::iterator it1 = parameters.begin(); it1 != parameters.end(); it1++) {
354 if (DPars.find(*it1) == DPars.end()) {
355 std::cout <<
"ERROR: missing parameter for " << it->first <<
": " << *it1 << std::endl;
363 for (std::map<const QCD::meson, Meson>::iterator it =
mesonsMap.begin(); it !=
mesonsMap.end(); it++) {
364 std::vector<std::string> parameters = it->second.parameterList(it->second.getName());
365 for (std::vector<std::string>::iterator it1 = parameters.begin(); it1 != parameters.end(); it1++) {
366 if (DPars.find(*it1) == DPars.end()) {
367 std::cout <<
"ERROR: missing parameter for " <<
mesonsMap.at(it->first).getName() <<
": " << *it1 << std::endl;
383 if (
name.compare(
"FlagCsi") == 0) {
395 std::cout <<
"WARNING: wrong name or value for ModelFlag " <<
name << std::endl;
409 throw std::runtime_error(
"inverted thresholds in QCD::Thresholds()!");
412 case 0:
return (1.0E10);
413 case 1:
return (
mut);
414 case 2:
return (
mub);
415 case 3:
return (
muc);
416 default:
return (0.);
423 for (i = 4; i >= 0; i--)
426 throw std::runtime_error(
"Error in QCD::AboveTh()");
432 for (i = 0; i < 5; i++)
435 throw std::runtime_error(
"Error in QCD::BelowTh()");
441 for (i = 1; i < 5; i++)
443 return (7. - (
double) i);
445 throw std::runtime_error(
"Error in QCD::Nf()");
452 for (j = 0; j < n; j++)
453 cache[j][i] = cache[j][i - 1];
460 for (j = 0; j < n; j++)
461 cache[j][i] = cache[j][i - 1];
468 return ( (11. *
CA - 4. *
TF * nf) / 3. );
473 return ( 34./3. *
CA *
CA - ( 20./3. *
CA + 4. *
CF )*
TF * nf);
478 return ( 2857./54. *
CA *
CA *
CA - (1415./27. *
CA *
CA + 205./9. *
CF *
CA -
480 (158./27. *
CA + 44./9. *
CF ) *
TF *
TF * nf * nf );
486 return (
CA *
CF *
TF *
TF * nf * nf * (17152./243. + 448./9. *
zeta3) +
489 (7073./243. - 656./9. *
zeta3) +
CA *
CA *
TF *
TF * nf * nf * (7930./81.+
490 224./9. *
zeta3) + 1232./243. *
CF *
TF *
TF *
TF * nf * nf * nf +
493 (1352./27. - 704./9. *
zeta3) + 46. *
CF *
CF *
CF *
TF * nf +
501 double nf =
Nf(mu_i);
507 double v = 1. -
Beta0(nf) * alsi / 2. / M_PI *
log(mu_i / mu);
508 double logv =
log(v);
514 return (- alsi * alsi / 4. / M_PI / v / v * b1_b0 * logv );
516 return (alsi * alsi * alsi / 4. / 4. / M_PI /M_PI / v / v / v * (
517 Beta2(nf) /
Beta0(nf) * (1. - v) + b1_b0 * b1_b0 * (logv * logv -
520 return (alsi * alsi * alsi * alsi / 4. / 4. / 4. / M_PI /M_PI / M_PI /
521 v / v / v / v * (
Beta3(nf) /
Beta0(nf) * (1. - v * v) / 2. +
522 b1_b0 *
Beta2(nf) /
Beta0(nf) * ((2. * v - 3.) * logv + v * v -
523 v) + b1_b0 * b1_b0 * b1_b0 * (-logv * logv * logv + 2.5 *
524 logv * logv + 2. * (1. - v) * logv - 0.5 * (v - 1.) * (v - 1.))));
530 return(
AlsWithInit(mu,alsi,mu_i,
LO)+
AlsWithInit(mu,alsi,mu_i,
NLO)+
AlsWithInit(mu,alsi,mu_i,
NNLO)+
AlsWithInit(mu,alsi,mu_i,
NNNLO));
532 throw std::runtime_error(
"QCD::AlsWithInit(): " +
orderToString(order) +
" is not implemented.");
549 double b0 =
Beta0(nf);
551 double alsLO = 4. * M_PI / b0L;
552 if (order ==
LO)
return alsLO;
555 double b1 =
Beta1(nf);
556 double log_L =
log(L);
557 double alsNLO = 4. * M_PI / b0L * (-b1 * log_L / b0 / b0L);
558 if (order ==
NLO)
return alsNLO;
559 if (order ==
FULLNLO)
return (alsLO + alsNLO);
562 double b2 =
Beta2(nf);
563 double alsNNLO = 4. * M_PI / b0L * (1. / b0L / b0L
564 * (b1 * b1 / b0 / b0 * (log_L * log_L - log_L - 1.) + b2 / b0));
565 if (order ==
NNLO)
return alsNNLO;
566 if (order ==
FULLNNLO)
return (alsLO + alsNLO + alsNNLO);
569 double b3 =
Beta3(nf);
570 double alsNNNLO = 4. * M_PI / b0L * (-1. / b0L / b0L / b0L
571 * (b1 * b1 * b1 / b0 / b0 / b0 * (log_L * log_L * log_L - 5./2. * log_L * log_L -2. * log_L - 0.5) + 3. * b1 * b2 * log_L / b0 / b0 - 0.5 * b3 / b0));
572 if (order ==
NNNLO)
return alsNNNLO;
573 if (order ==
FULLNNNLO)
return (alsLO + alsNLO + alsNNLO + alsNNNLO);
575 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::AlsWithLambda().");
585 double lmM = 2.*
log(mu/M), res = 0.;
590 2191./576.*lmM + 511./576.*lmM*lmM + lmM*lmM*lmM/216. + ((double) nf - 1.) * (2633./31104. - 67./576.*lmM + lmM*lmM/36.));
592 res += als*als/M_PI/M_PI*(-11./72. + 19./24.*lmM + lmM*lmM/36.);
594 res += als/M_PI*lmM/6.;
598 throw std::runtime_error(
"QCD::ThresholdCorrections(): order not implemented.");
616 throw std::runtime_error(
"QCD::FullOrder(): " +
orderToString(order) +
" is not implemented.");
633 throw std::runtime_error(
"QCD::MassOfNf(): no running masses for light quarks");
654 throw std::runtime_error(
"QCD::Als(): " +
orderToString(order) +
" is not implemented.");
660 int i, nfAls = (int)
Nf(
MAls), nfmu = Nf_thr ? (int)
Nf(mu) : nfAls;
661 double als, alstmp, mutmp;
684 for (i = nfAls - 1; i > nfmu; i--) {
696 for (i = nfAls + 1; i < nfmu; i++) {
717 throw std::runtime_error(
"QCD::Als(): " +
orderToString(order) +
" is not implemented.");
731 double nfmu =
Nf(mu), nfz =
Nf(
MAls), mu_thre1, mu_thre2, Als_tmp, mf;
740 else if (nfmu > nfz) {
742 throw std::runtime_error(
"NLO is not implemented in QCD::Als(mu,order).");
743 if (nfmu == nfz + 1.) {
748 Als_tmp = (1. + Als_tmp / M_PI *
log(mu_thre1 / mf) / 3.) * Als_tmp;
750 als =
AlsWithInit(mu, Als_tmp, mu_thre1 + MEPS, order);
752 throw std::runtime_error(
"Error in QCD::Als(mu,order)");
755 throw std::runtime_error(
"NLO is not implemented in QCD::Als(mu,order).");
756 if (nfmu == nfz - 1.) {
761 Als_tmp = (1. - Als_tmp / M_PI *
log(mu_thre1 / mf) / 3.) * Als_tmp;
763 als =
AlsWithInit(mu, Als_tmp, mu_thre1 - MEPS, order);
764 }
else if (nfmu == nfz - 2.) {
767 Als_tmp =
Als(mu_thre1 + MEPS, order);
770 Als_tmp = (1. - Als_tmp / M_PI *
log(mu_thre1 / mf) / 3.) * Als_tmp;
772 Als_tmp =
AlsWithInit(mu_thre2, Als_tmp, mu_thre1 - MEPS, order);
775 Als_tmp = (1. - Als_tmp / M_PI *
log(mu_thre2 / mf) / 3.) * Als_tmp;
777 als =
AlsWithInit(mu, Als_tmp, mu_thre2 - MEPS, order);
779 throw std::runtime_error(
"Error in QCD::Als(mu,order)");
790 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::Als(mu,order).");
848 double xmin = -4., xmax = -0.2;
849 TF1 f = TF1(
"f",
this, &
QCD::ZeroNf5, xmin, xmax, 1,
"QCD",
"zeroNf5");
851 ROOT::Math::WrappedTF1 wf1(f);
852 double ledouble = (double) order;
853 wf1.SetParameters(&ledouble);
855 ROOT::Math::BrentRootFinder brf;
856 brf.SetFunction(wf1, xmin, xmax);
860 throw std::runtime_error(
"Error in QCD::logLambda5()");
866 const double logLambdaORG)
const
889 double xmin = -4., xmax = -0.2;
892 if (nfNEW == 6. && nfORG == 5.) {
893 f = TF1(
"f",
this, &
QCD::ZeroNf6NLO, xmin, xmax, 1,
"QCD",
"zeroNf6NLO");
894 }
else if (nfNEW == 4. && nfORG == 5.) {
895 f = TF1(
"f",
this, &
QCD::ZeroNf4NLO, xmin, xmax, 1,
"QCD",
"zeroNf4NLO");
896 }
else if (nfNEW == 3. && nfORG == 4.) {
897 f = TF1(
"f",
this, &
QCD::ZeroNf3NLO, xmin, xmax, 1,
"QCD",
"zeroNf3NLO");
899 throw std::runtime_error(
"Error in QCD::logLambdaNLO()");
901 ROOT::Math::WrappedTF1 wf1(f);
902 wf1.SetParameters(&logLambdaORG);
904 ROOT::Math::BrentRootFinder brf;
905 brf.SetFunction(wf1, xmin, xmax);
909 throw std::runtime_error(
"Error in QCD::logLambdaNLO()");
915 const double nfNEW,
const double nfORG,
916 const double logLambdaORG,
orders order)
const
918 if (fabs(nfNEW - nfORG) != 1.)
919 throw std::runtime_error(
"Error in QCD::logLambda()");
931 double logMuMatching =
log(muMatching);
932 double L = 2. * (logMuMatching - logLambdaORG);
933 double rNEW = 0.0, rORG = 0.0, log_mu2_mf2 = 0.0, log_L = 0.0;
934 double C1 = 0.0, C2 = 0.0;
938 logLambdaNEW = 1. / 2. /
Beta0(nfNEW)
939 *(
Beta0(nfNEW) -
Beta0(nfORG)) * L + logLambdaORG;
945 log_mu2_mf2 = 2. * (logMuMatching -
log(mf));
948 C1 = 2. / 3. * log_mu2_mf2;
950 C1 = -2. / 3. * log_mu2_mf2;
951 logLambdaNEW += 1. / 2. /
Beta0(nfNEW)
952 *((rNEW - rORG) * log_L
958 if (nfNEW == 5. && nfORG == 6.)
959 C2 = -16. * (log_mu2_mf2 * log_mu2_mf2 / 36. - 19. / 24. * log_mu2_mf2 - 7. / 24.);
960 else if (nfNEW == 6. && nfORG == 5.)
961 C2 = -16. * (log_mu2_mf2 * log_mu2_mf2 / 36. + 19. / 24. * log_mu2_mf2 + 7. / 24.);
964 C2 = -16. * (log_mu2_mf2 * log_mu2_mf2 / 36. - 19. / 24. * log_mu2_mf2 + 11. / 72.);
966 C2 = -16. * (log_mu2_mf2 * log_mu2_mf2 / 36. + 19. / 24. * log_mu2_mf2 - 11. / 72.);
968 logLambdaNEW += 1. / 2. /
Beta0(nfNEW) /
Beta0(nfORG) / L
969 * (rORG * (rNEW - rORG) * log_L + rNEW * rNEW - rORG * rORG
971 + rNEW * C1 - C1 * C1 - C2);
982 double muMatching, mf, logLambdaORG, logLambdaNEW;
990 }
else if (nf == 4. || nf == 3.) {
994 logLambdaNEW =
logLambda(muMatching, mf, 4., 5., logLambdaORG, order);
998 logLambdaORG = logLambdaNEW;
999 logLambdaNEW =
logLambda(muMatching, mf, 3., 4., logLambdaORG, order);
1001 return logLambdaNEW;
1003 throw std::runtime_error(
"Error in QCD::logLambda()");
1015 return (
CF * (3. *
CF + 97. / 3. *
Nc - 10. / 3. * nf));
1020 return ( 129. *
CF *
CF *
CF - 129. / 2. *
CF *
CF *
Nc + 11413. / 54. *
CF *
Nc *
Nc
1022 - 70. / 27. *
CF * nf * nf);
1027 if (fabs(nf_f - nf_i) != 1.)
1028 throw std::runtime_error(
"Error in QCD::threCorrForMass()");
1030 double mu_threshold, mf, log_mu2_mf2;
1035 }
else if (nf_f == 5.) {
1038 }
else if (nf_f == 4.) {
1042 throw std::runtime_error(
"Error in QCD::threCorrForMass()");
1043 log_mu2_mf2 = 2. *
log(mu_threshold / mf);
1045 *(-log_mu2_mf2 * log_mu2_mf2 / 12. + 5. / 36. * log_mu2_mf2 - 89. / 432.));
1050 }
else if (nf_i == 5.) {
1053 }
else if (nf_i == 4.) {
1057 throw std::runtime_error(
"Error in QCD::threCorrForMass()");
1058 log_mu2_mf2 = 2. *
log(mu_threshold / mf);
1060 *(log_mu2_mf2 * log_mu2_mf2 / 12. - 5. / 36. * log_mu2_mf2 + 89. / 432.));
1066 return Mrun(mu, m, m, order);
1069 double QCD::Mrun(
const double mu_f,
const double mu_i,
const double m,
1070 const orders order)
const
1085 double nfi =
Nf(mu_i), nff =
Nf(mu_f);
1086 double mu_threshold, mu_threshold2, mu_threshold3, mrun;
1088 mrun =
MrunTMP(mu_f, mu_i, m, order);
1089 else if (nff > nfi) {
1090 if (order ==
NLO || order ==
NNLO)
1091 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::Mrun(mu_f,mu_i,m,order)");
1093 mrun =
MrunTMP(mu_threshold - MEPS, mu_i, m, order);
1096 if (nff == nfi + 1.) {
1097 mrun =
MrunTMP(mu_f, mu_threshold + MEPS, mrun, order);
1098 }
else if (nff == nfi + 2.) {
1099 mu_threshold2 =
BelowTh(mu_f);
1100 mrun =
MrunTMP(mu_threshold2 - MEPS, mu_threshold + MEPS, mrun, order);
1103 mrun =
MrunTMP(mu_f, mu_threshold2 + MEPS, mrun, order);
1104 }
else if (nff == nfi + 3.) {
1105 mu_threshold2 =
AboveTh(mu_threshold);
1106 mrun =
MrunTMP(mu_threshold2 - MEPS, mu_threshold + MEPS, mrun, order);
1109 mu_threshold3 =
BelowTh(mu_f);
1110 mrun =
MrunTMP(mu_threshold3 - MEPS, mu_threshold2 + MEPS, mrun, order);
1113 mrun =
MrunTMP(mu_f, mu_threshold3 + MEPS, mrun, order);
1115 throw std::runtime_error(
"Error in QCD::Mrun(mu_f,mu_i,m,order)");
1117 if (order ==
NLO || order ==
NNLO)
1118 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::Mrun(mu_f,mu_i,m,order)");
1120 mrun =
MrunTMP(mu_threshold + MEPS, mu_i, m, order);
1123 if (nff == nfi - 1.)
1124 mrun =
MrunTMP(mu_f, mu_threshold - MEPS, mrun, order);
1125 else if (nff == nfi - 2.) {
1126 mu_threshold2 =
AboveTh(mu_f);
1127 mrun =
MrunTMP(mu_threshold2 + MEPS, mu_threshold - MEPS, mrun, order);
1130 mrun =
MrunTMP(mu_f, mu_threshold2 - MEPS, mrun, order);
1132 throw std::runtime_error(
"Error in QCD::Mrun(mu_f,mu_i,m,order)");
1136 std::stringstream out;
1137 out <<
"QCD::Mrun(): A quark mass becomes tachyonic in QCD::Mrun("
1138 << mu_f <<
", " << mu_i <<
", " << m <<
", " <<
orderToString(order) <<
")"
1140 <<
" Als(" << mu_i <<
", " <<
orderToString(order) <<
")/(4pi)="
1141 <<
Als(mu_i, order) / (4. * M_PI) << std::endl
1142 <<
" Als(" << mu_f <<
", " <<
orderToString(order) <<
")/(4pi)="
1143 <<
Als(mu_f, order) / (4. * M_PI);
1144 throw std::runtime_error(out.str());
1163 const orders order)
const
1165 double nf =
Nf(mu_f);
1167 throw std::runtime_error(
"Error in QCD::MrunTMP().");
1171 if (order ==
LO) orderForAls =
LO;
1174 double ai =
Als(mu_i, orderForAls) / (4. * M_PI);
1175 double af =
Als(mu_f, orderForAls) / (4. * M_PI);
1179 double mLO = m *
pow(af / ai, g0 / (2. * b0));
1180 if (order ==
LO)
return mLO;
1184 double A1 = g1 / (2. * b0) - b1 * g0 / (2. * b0 * b0);
1185 double mNLO = mLO * A1 * (af - ai);
1186 if (order ==
NLO)
return mNLO;
1187 if (order ==
FULLNLO)
return (mLO + mNLO);
1191 double A2 = b1 * b1 * g0 / (2. * b0 * b0 * b0) - b2 * g0 / (2. * b0 * b0) - b1 * g1 / (2. * b0 * b0) + g2 / (2. * b0);
1192 double mNNLO = mLO * (A1 * A1 / 2. * (af - ai)*(af - ai) + A2 / 2. * (af * af - ai * ai));
1193 if (order ==
NNLO)
return mNNLO;
1194 if (order ==
FULLNNLO)
return (mLO + mNLO + mNNLO);
1196 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::MrunTMP()");
1199 double QCD::Mrun4(
const double mu_f,
const double mu_i,
const double m)
const
1204 double ai =
Als4(mu_i) / (4. * M_PI);
1205 double af =
Als4(mu_f) / (4. * M_PI);
1209 double mLO = m *
pow(af / ai, g0 / (2. * b0));
1213 double A1 = g1 / (2. * b0) - b1 * g0 / (2. * b0 * b0);
1214 double mNLO = mLO * A1 * (af - ai);
1215 return (mLO + mNLO);
1225 if (order ==
LO)
return MpLO;
1231 double a =
Als(mbar + MEPS, orderForAls) / M_PI;
1234 double MpNLO = mbar * 4. / 3. * a;
1235 if (order ==
NLO)
return MpNLO;
1236 if (order ==
FULLNLO)
return (MpLO + MpNLO);
1241 throw std::runtime_error(
"QCD::Mbar2Mp() can convert only top and bottom masses");
1242 else if (mbar < 50.) {
1254 double Delta = M_PI * M_PI / 8. * x - 0.597 * x * x + 0.230 * x * x*x;
1255 double MpNNLO = mbar * (307. / 32. + 2. *
zeta2 + 2. / 3. *
zeta2 *
log(2.0) -
zeta3 / 6.
1256 - nl / 3. * (
zeta2 + 71. / 48.) + 4. / 3. * Delta) * a*a;
1257 if (order ==
NNLO)
return MpNNLO;
1258 if (order ==
FULLNNLO)
return (MpLO + MpNLO + MpNNLO);
1260 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::Mbar2Mp().");
1265 double mp = params[0];
1267 return (mp -
Mbar2Mp(*mu, order));
1272 if (order ==
NLO || order ==
NNLO)
1273 throw std::runtime_error(
orderToString(order) +
" is not implemented in QCD::Mp2Mbar().");
1277 double alsmp =
Als(mp, order);
1289 TF1 f(
"f",
this, &
QCD::Mp2MbarTMP, mp / 2., 2. * mp, 2,
"QCD",
"mp2mbara");
1291 ROOT::Math::WrappedTF1 wf1(f);
1294 params[1] = (double) order;
1295 wf1.SetParameters(params);
1297 ROOT::Math::BrentRootFinder brf;
1299 brf.SetFunction(wf1, .7 * mp, 1.3 * mp);
1303 throw std::runtime_error(
"error in QCD::mp2mbar");
1310 return (MSbar / (1. +
Als(MSbar,
FULLNLO) / 4. / M_PI *
CF));
1315 return (MSbar / (1. +
Als(MSscale,
FULLNLO) / 4. / M_PI *
CF));