StandardModel.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 HEPfit Collaboration
3  * All rights reserved.
4  *
5  * For the licensing terms see doc/COPYING.
6  */
7 
8 #include <iostream>
9 #include <math.h>
10 #include <stdlib.h>
11 #include <stdexcept>
12 #include <TF1.h>
13 #include <Math/WrappedTF1.h>
14 #include <Math/BrentRootFinder.h>
15 #include <gsl/gsl_sf_zeta.h>
16 #include "StandardModel.h"
17 #include "EWSMcache.h"
18 #include "EWSMOneLoopEW.h"
19 #include "EWSMTwoLoopQCD.h"
20 #include "EWSMThreeLoopQCD.h"
21 #include "EWSMTwoLoopEW.h"
22 #include "EWSMThreeLoopEW2QCD.h"
23 #include "EWSMThreeLoopEW.h"
25 #include "Flavour.h"
26 #include "LeptonFlavour.h"
28 #include "EWSMTwoFermionsLEP2.h"
32 const std::string StandardModel::SMvars[NSMvars] = {
33  "Mz", "AlsMz", "GF", "ale", "dAle5Mz", "mHl", "delMw", "delSin2th_l", "delGammaZ",
34  "mneutrino_1", "mneutrino_2", "mneutrino_3", "melectron", "mmu", "mtau",
35  "lambda", "A", "rhob", "etab", "muw",
36  "EpsK", "phiEpsK", "DeltaMK", "KbarEpsK", "Dmk", "SM_M12D"
37 };
38 
39 const double StandardModel::GeVminus2_to_nb = 389379.338;
40 const double StandardModel::Mw_error = 0.00001; /* 0.01 MeV */
41 
43 : QCD(), VCKM(3, 3, 0.), UPMNS(3, 3, 0.), Yu(3, 3, 0.), Yd(3, 3, 0.), Yn(3, 3, 0.),
44 Ye(3, 3, 0.)
45 {
48  FlagMw = "APPROXIMATEFORMULA";
49  FlagRhoZ = "NORESUM";
50  FlagKappaZ = "APPROXIMATEFORMULA";
51 
52  /* Internal flags for EWPO (for debugging) */
53  flag_order[EW1] = true;
54  flag_order[EW1QCD1] = true;
55  flag_order[EW1QCD2] = true;
56  flag_order[EW2] = true;
57  flag_order[EW2QCD1] = true;
58  flag_order[EW3] = true;
59 
60  // Caches for EWPO
61  FlagCacheInStandardModel = true; // use caches in the current class
63  useDeltaAlpha_cache = false;
64  useMw_cache = false;
65  useGammaW_cache = false;
67  DeltaAlpha_cache = 0.0;
68  Mw_cache = 0.0;
69  GammaW_cache = 0.0;
70  for (int i = 0; i < 12; ++i) {
71  useRhoZ_f_cache[i] = false;
72  useKappaZ_f_cache[i] = false;
73  rhoZ_f_cache[i] = gslpp::complex(0.0, 0.0, false);
74  kappaZ_f_cache[i] = gslpp::complex(0.0, 0.0, false);
75  }
76 
77  myEWSMcache = NULL;
78  myOneLoopEW = NULL;
79  myTwoLoopQCD = NULL;
80  myThreeLoopQCD = NULL;
81  myTwoLoopEW = NULL;
82  myThreeLoopEW2QCD = NULL;
83  myThreeLoopEW = NULL;
84  myApproximateFormulae = NULL;
86  myTwoFermionsLEP2 = NULL;
89 
90  // Particle(std::string name, double mass, double mass_scale = 0., double width = 0., double charge = 0.,double isospin = 0.);
91  leptons[NEUTRINO_1] = Particle("NEUTRINO_1", 0., 0., 0., 0., .5);
92  leptons[NEUTRINO_2] = Particle("NEUTRINO_2", 0., 0., 0., 0., .5);
93  leptons[NEUTRINO_3] = Particle("NEUTRINO_3", 0., 0., 0., 0., .5);
94  leptons[ELECTRON] = Particle("ELECTRON", 0., 0., 0., -1., -.5);
95  leptons[MU] = Particle("MU", 0., 0., 0., -1., -.5);
96  leptons[TAU] = Particle("TAU", 0., 0., 0., -1., -.5);
97 
98  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("Mz", boost::cref(Mz)));
99  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("AlsMz", boost::cref(AlsMz)));
100  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("GF", boost::cref(GF)));
101  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("ale", boost::cref(ale)));
102  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("dAle5Mz", boost::cref(dAle5Mz)));
103  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("mHl", boost::cref(mHl)));
104  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("delMw", boost::cref(delMw)));
105  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("delSin2th_l", boost::cref(delSin2th_l)));
106  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("delGammaZ", boost::cref(delGammaZ)));
107  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("mneutrino_1", boost::cref(leptons[NEUTRINO_1].getMass())));
108  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("mneutrino_2", boost::cref(leptons[NEUTRINO_2].getMass())));
109  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("mneutrino_3", boost::cref(leptons[NEUTRINO_3].getMass())));
110  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("melectron", boost::cref(leptons[ELECTRON].getMass())));
111  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("mmu", boost::cref(leptons[MU].getMass())));
112  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("mtau", boost::cref(leptons[TAU].getMass())));
113  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("lambda", boost::cref(lambda)));
114  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("A", boost::cref(A)));
115  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("rhob", boost::cref(rhob)));
116  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("etab", boost::cref(etab)));
117  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("muw", boost::cref(muw)));
118  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("EpsK", boost::cref(EpsK)));
119  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("phiEpsK", boost::cref(phiEpsK)));
120  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("DeltaMK", boost::cref(DeltaMK)));
121  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("KbarEpsK", boost::cref(KbarEpsK)));
122  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("Dmk", boost::cref(Dmk)));
123  ModelParamMap.insert(std::pair<std::string, boost::reference_wrapper<const double> >("SM_M12D", boost::cref(SM_M12D)));
124 
125  iterationNo = 0;
126 }
127 
129 {
130  if (IsModelInitialized()) {
131  if (myEWSMcache != NULL) delete(myEWSMcache);
132  if (myOneLoopEW != NULL) delete(myOneLoopEW);
133  if (myTwoLoopQCD != NULL) delete(myTwoLoopQCD);
134  if (myThreeLoopQCD != NULL) delete(myThreeLoopQCD);
135  if (myTwoLoopEW != NULL) delete(myTwoLoopEW);
136  if (myThreeLoopEW2QCD != NULL) delete(myThreeLoopEW2QCD);
137  if (myApproximateFormulae != NULL) delete(myApproximateFormulae);
139  if (myFlavour != NULL) delete(myFlavour);
140  if (myLeptonFlavour != NULL) delete(myLeptonFlavour);
142  if (myTwoFermionsLEP2 != NULL) delete(myTwoFermionsLEP2);
144  }
145 }
146 
147 
149 // Initialization
150 
152 {
153  myEWSMcache = new EWSMcache(*this);
162  myFlavour = new Flavour(*this);
163  myLeptonFlavour = new LeptonFlavour(*this);
165  myTwoFermionsLEP2 = new EWSMTwoFermionsLEP2(*myEWSMcache);
166 
167  setModelInitialized(true);
168  return (true);
169 }
170 
171 
173 // Parameters
174 
175 bool StandardModel::Init(const std::map<std::string, double>& DPars)
176 {
177  for (std::map<std::string, double>::const_iterator it = DPars.begin(); it != DPars.end(); it++)
178  if (it->first.compare("AlsM") == 0 || it->first.compare("MAls") == 0)
179  throw std::runtime_error("ERROR: inappropriate parameter " + it->first
180  + " in model initialization");
181 
182  std::map<std::string, double> myDPars(DPars);
183  myDPars["AlsM"] = myDPars.at("AlsMz");
184  myDPars["MAls"] = myDPars.at("Mz");
185  return (QCD::Init(myDPars));
186 }
187 
189 {
190  requireCKM = false;
191  requireYe = false;
192  requireYn = false;
193 
194  if (!QCD::PreUpdate()) return (false);
195 
196  return (true);
197 }
198 
199 bool StandardModel::Update(const std::map<std::string, double>& DPars)
200 {
201  if (!PreUpdate()) return (false);
202 
203  UpdateError = false;
204 
205  for (std::map<std::string, double>::const_iterator it = DPars.begin(); it != DPars.end(); it++)
206  setParameter(it->first, it->second);
207 
208  if (UpdateError) return (false);
209 
210  if (!PostUpdate()) return (false);
211 
212  return (true);
213 }
214 
216 {
217  if (!QCD::PostUpdate()) return (false);
218 
219  /* Set the CKM and PMNS matrices */
220  computeCKM();
221 
222  /* Set the Yukawa matrices */
223  if ( !isModelSUSY() ) {
224  computeYukawas();
225  }
226 
227  /* Check whether the parameters for the EWPO are updated or not */
228  if (!checkSMparamsForEWPO()) {
230  useDeltaAlpha_cache = false;
231  useMw_cache = false;
232  useGammaW_cache = false;
233  for (int i = 0; i < 12; ++i) {
234  useRhoZ_f_cache[i] = false;
235  useKappaZ_f_cache[i] = false;
236  }
237  }
238 
239  /* Necessary for updating StandardModel parameters in StandardModelMatching */
240  if (ModelName() == "StandardModel") {
242  }
243 
245  iterationNo++;
246 
247  return (true);
248 }
249 
250 void StandardModel::setParameter(const std::string name, const double& value)
251 {
252  if (name.compare("Mz") == 0) {
253  Mz = value;
254  QCD::setParameter("MAls", value);
255  } else if (name.compare("AlsMz") == 0) {
256  AlsMz = value;
257  QCD::setParameter("AlsM", value);
258  } else if (name.compare("GF") == 0)
259  GF = value;
260  else if (name.compare("ale") == 0)
261  ale = value;
262  else if (name.compare("dAle5Mz") == 0)
263  dAle5Mz = value;
264  else if (name.compare("mHl") == 0)
265  mHl = value;
266  else if (name.compare("delMw") == 0)
267  delMw = value;
268  else if (name.compare("delSin2th_l") == 0)
269  delSin2th_l = value;
270  else if (name.compare("delGammaZ") == 0)
271  delGammaZ = value;
272  else if (name.compare("mneutrino_1") == 0) {
273  leptons[NEUTRINO_1].setMass(value);
274  requireYn = true;
275  } else if (name.compare("mneutrino_2") == 0) {
276  leptons[NEUTRINO_2].setMass(value);
277  requireYn = true;
278  } else if (name.compare("mneutrino_3") == 0) {
279  leptons[NEUTRINO_3].setMass(value);
280  requireYn = true;
281  } else if (name.compare("melectron") == 0) {
282  leptons[ELECTRON].setMass(value);
283  requireYe = true;
284  } else if (name.compare("mmu") == 0) {
285  leptons[MU].setMass(value);
286  requireYe = true;
287  } else if (name.compare("mtau") == 0) {
288  leptons[TAU].setMass(value);
289  requireYe = true;
290  } else if (name.compare("lambda") == 0) {
291  lambda = value;
292  requireCKM = true;
293  } else if (name.compare("A") == 0) {
294  A = value;
295  requireCKM = true;
296  } else if (name.compare("rhob") == 0) {
297  rhob = value;
298  requireCKM = true;
299  } else if (name.compare("etab") == 0) {
300  etab = value;
301  requireCKM = true;
302  } else if (name.compare("muw") == 0)
303  muw = value;
304  else if (name.compare("EpsK") == 0)
305  EpsK = value;
306  else if (name.compare("phiEpsK") == 0)
307  phiEpsK = value;
308  else if (name.compare("DeltaMK") == 0)
309  DeltaMK = value;
310  else if (name.compare("KbarEpsK") == 0)
311  KbarEpsK = value;
312  else if (name.compare("Dmk") == 0)
313  Dmk = value;
314  else if (name.compare("SM_M12D") == 0)
315  SM_M12D = value;
316  else
317  QCD::setParameter(name, value);
318 }
319 
320 bool StandardModel::CheckParameters(const std::map<std::string, double>& DPars)
321 {
322  for (int i = 0; i < NSMvars; i++) {
323  if (DPars.find(SMvars[i]) == DPars.end()) {
324  std::cout << "missing mandatory SM parameter " << SMvars[i] << std::endl;
325  return false;
326  }
327  }
328  return (QCD::CheckParameters(DPars));
329 }
330 
332 {
333  if (requireCKM) {
335  myCKM.getCKM(VCKM);
336  }
338 }
339 
341 {
342  /* THE FOLLOWING CODES HAVE TO BE MODIFIED!!
343  * The Yukawa matrices have to be computed at a common scale
344  * for all the fermions!!! */
345  if (requireYu || requireCKM) {
347  for (int i = 0; i < 3; i++)
348  Yu.assign(i, i, this->quarks[UP + 2 * i].getMass() / v() * sqrt(2.));
349  Yu = VCKM.transpose() * Yu;
350  }
351  if (requireYd) {
353  for (int i = 0; i < 3; i++)
354  Yd.assign(i, i, this->quarks[DOWN + 2 * i].getMass() / v() * sqrt(2.));
355  }
356  if (requireYe) {
358  for (int i = 0; i < 3; i++)
359  Ye.assign(i, i, this->leptons[ELECTRON + 2 * i].getMass() / v() * sqrt(2.));
360  }
361  if (requireYn) {
363  for (int i = 0; i < 3; i++)
364  Yn.assign(i, i, this->leptons[NEUTRINO_1 + 2 * i].getMass() / v() * sqrt(2.));
365  Yn = Yn * UPMNS.hconjugate();
366  }
367 }
368 
369 
371 // Flags
372 
373 bool StandardModel::setFlag(const std::string name, const bool value)
374 {
375  bool res = false;
376  if (name.compare("CacheInStandardModel") == 0) {
378  res = true;
379  } else if (name.compare("CacheInEWSMcache") == 0) {
381  res = true;
382  } else if (name.compare("WithoutNonUniversalVC") == 0) {
384  res = true;
385  } else if (name.compare("NoApproximateGammaZ") == 0) {
386  FlagNoApproximateGammaZ = value;
387  res = true;
388  } else
389  res = QCD::setFlag(name, value);
390 
391  return (res);
392 }
393 
394 bool StandardModel::setFlagStr(const std::string name, const std::string value)
395 {
396  bool res = false;
397  if (name.compare("Mw") == 0) {
398  if (checkEWPOscheme(value)) {
399  FlagMw = value;
400  res = true;
401  } else
402  throw std::runtime_error("StandardModel::setFlagStr(): Invalid flag "
403  + name + "=" + value);
404 
405  } else if (name.compare("RhoZ") == 0) {
406  if (checkEWPOscheme(value)) {
407  FlagRhoZ = value;
408  res = true;
409  } else
410  throw std::runtime_error("StandardModel::setFlagStr(): Invalid flag "
411  + name + "=" + value);
412  } else if (name.compare("KappaZ") == 0) {
413  if (checkEWPOscheme(value)) {
414  FlagKappaZ = value;
415  res = true;
416  } else
417  throw std::runtime_error("StandardModel::setFlagStr(): Invalid flag "
418  + name + "=" + value);
419  } else
420  res = QCD::setFlagStr(name, value);
421 
422  return (res);
423 }
424 
426 {
427  return (QCD::CheckFlags());
428 }
429 
430 
432 // For EWPO caches
433 
435 {
436  // 11 parameters in QCD:
437  // AlsMz, Mz, mup, mdown, mcharm, mstrange, mtop, mbottom,
438  // mut, mub, muc
439  // 13 parameters in StandardModel
440  // GF, ale, dAle5Mz, mHl,
441  // mneutrino_1, mneutrino_2, mneutrino_3, melectron, mmu, mtau,
442  // delMw, delSin2th_l, delGammaZ
443  // 3 flags in StandardModel
444  // FlagMw_cache, FlagRhoZ_cache, FlagKappaZ_cache
445 
446  // Note: When modifying the array below, the constant NumSMParams has to
447  // be modified accordingly.
448  double SMparams[NumSMParamsForEWPO] = {
449  AlsMz, Mz, GF, ale, dAle5Mz,
450  mHl, mtpole,
455  leptons[MU].getMass(),
456  leptons[TAU].getMass(),
457  quarks[UP].getMass(),
458  quarks[DOWN].getMass(),
459  quarks[CHARM].getMass(),
460  quarks[STRANGE].getMass(),
461  quarks[BOTTOM].getMass(),
462  mut, mub, muc,
467  };
468 
469  // check updated parameters
470  bool bNotUpdated = true;
471  for (int i = 0; i < NumSMParamsForEWPO; ++i) {
472  if (SMparamsForEWPO_cache[i] != SMparams[i]) {
473  SMparamsForEWPO_cache[i] = SMparams[i];
474  bNotUpdated &= false;
475  }
476  }
477 
478  return bNotUpdated;
479 }
480 
481 
483 // CKM parameters
484 
485 // Angles
486 
488 {
489  return (-VCKM(1, 0) * VCKM(1, 2).conjugate() / (VCKM(2, 0) * VCKM(2, 2).conjugate())).arg();
490 }
491 
493 {
494  return (-VCKM(0, 0) * VCKM(0, 2).conjugate() / (VCKM(1, 0) * VCKM(1, 2).conjugate())).arg();
495 }
496 
498 {
499  return (-VCKM(2, 0) * VCKM(2, 2).conjugate() / (VCKM(0, 0) * VCKM(0, 2).conjugate())).arg();
500 }
501 
503 {
504  return (-VCKM(2, 1) * VCKM(2, 2).conjugate() / (VCKM(1, 1) * VCKM(1, 2).conjugate())).arg();
505 }
506 
507 // Lambda_q
508 
510 {
511  return VCKM(2, 0) * VCKM(2, 1).conjugate();
512 }
513 
515 {
516  return VCKM(1, 0) * VCKM(1, 1).conjugate();
517 }
518 
520 {
521  return VCKM(0, 0) * VCKM(0, 1).conjugate();
522 }
523 
525 {
526  return VCKM(2, 0) * VCKM(2, 2).conjugate();
527 }
528 
530 {
531  return VCKM(1, 0) * VCKM(1, 2).conjugate();
532 }
533 
535 {
536  return VCKM(0, 0) * VCKM(0, 2).conjugate();
537 }
538 
540 {
541  return VCKM(2, 1) * VCKM(2, 2).conjugate();
542 }
543 
545 {
546  return VCKM(1, 1) * VCKM(1, 2).conjugate();
547 }
548 
550 {
551  return VCKM(0, 1) * VCKM(0, 2).conjugate();
552 }
553 
555 {
556  return (VCKM(2, 0) * VCKM(2, 2).conjugate()
557  / (VCKM(1, 0) * VCKM(1, 2).conjugate())).abs();
558 }
559 
561 {
562  return (VCKM(2, 1) * VCKM(2, 2).conjugate()
563  / (VCKM(1, 1) * VCKM(1, 2).conjugate())).abs();
564 }
565 
567 {
568  return (VCKM(0, 0) * VCKM(0, 2).conjugate()
569  / (VCKM(1, 0) * VCKM(1, 2).conjugate())).abs();
570 }
571 
572 
574 
575 double StandardModel::ale_OS(const double mu, orders order) const
576 {
577  if (mu < 50.0)
578  throw std::runtime_error("out of range in StandardModel::ale_OS()");
579 
580  double N = 20.0 / 3.0;
581  double beta1 = N / 3.0;
582  double beta2 = N / 4.0;
583  double alpha_ini = alphaMz();
584  double v = 1.0 + 2.0 * beta1 * alpha_ini / M_PI * log(Mz / mu);
585 
586  switch (order) {
587  case LO:
588  return ( alpha_ini / v);
589  case FULLNLO:
590  return ( alpha_ini / v * (1.0 - beta2 / beta1 * alpha_ini / M_PI * log(v) / v));
591  default:
592  throw std::runtime_error("Error in StandardModel::ale_OS()");
593  }
594 }
595 
596 double StandardModel::DeltaAlphaLepton(const double s) const
597 {
598  if (s == Mz * Mz)
601  return DeltaAlphaLepton_cache;
602 
603  double DeltaAlphaL = 0.0;
604  if (flag_order[EW1])
605  DeltaAlphaL += myOneLoopEW->DeltaAlpha_l(s);
606  if (flag_order[EW1QCD1])
607  DeltaAlphaL += myTwoLoopQCD->DeltaAlpha_l(s);
608  if (flag_order[EW1QCD2])
609  DeltaAlphaL += myThreeLoopQCD->DeltaAlpha_l(s);
610  if (flag_order[EW2])
611  DeltaAlphaL += myTwoLoopEW->DeltaAlpha_l(s);
612  if (flag_order[EW2QCD1])
613  DeltaAlphaL += myThreeLoopEW2QCD->DeltaAlpha_l(s);
614  if (flag_order[EW3])
615  DeltaAlphaL += myThreeLoopEW->DeltaAlpha_l(s);
616 
617  if (s == Mz * Mz) {
618  DeltaAlphaLepton_cache = DeltaAlphaL;
620  }
621  return DeltaAlphaL;
622 }
623 
625 {
626  double Mz2 = Mz*Mz;
627  return (DeltaAlphaLepton(Mz2) + dAle5Mz);
628 }
629 
630 double StandardModel::DeltaAlphaTop(const double s) const
631 {
632  double DeltaAlpha = 0.0;
633  if (flag_order[EW1])
634  DeltaAlpha += myOneLoopEW->DeltaAlpha_t(s);
635  if (flag_order[EW1QCD1])
636  DeltaAlpha += myTwoLoopQCD->DeltaAlpha_t(s);
637  if (flag_order[EW1QCD2])
638  DeltaAlpha += myThreeLoopQCD->DeltaAlpha_t(s);
639  if (flag_order[EW2])
640  DeltaAlpha += myTwoLoopEW->DeltaAlpha_t(s);
641  if (flag_order[EW2QCD1])
642  DeltaAlpha += myThreeLoopEW2QCD->DeltaAlpha_t(s);
643  if (flag_order[EW3])
644  DeltaAlpha += myThreeLoopEW->DeltaAlpha_t(s);
645 
646  return DeltaAlpha;
647 }
648 
650 {
653  return DeltaAlpha_cache;
654 
655  double Mz2 = Mz*Mz;
657  useDeltaAlpha_cache = true;
658  return DeltaAlpha_cache;
659 }
660 
662 {
663  return (ale / (1.0 - DeltaAlpha()));
664 }
665 
666 
668 
669 double StandardModel::v() const
670 {
671  return ( 1. / sqrt(sqrt(2.) * GF));
672 }
673 
674 
676 
678 {
679  return ( Mz / sqrt(2.0) * sqrt(1.0 + sqrt(1.0 - 4.0 * M_PI * ale / sqrt(2.0) / GF / Mz / Mz)));
680 }
681 
682 double StandardModel::s02() const
683 {
684  double tmp = 1.0 - 4.0 * M_PI * alphaMz() / sqrt(2.0) / GF / Mz / Mz;
685  if (tmp < 0.0)
686  throw std::runtime_error("Error in s02()");
687 
688  return ( (1.0 - sqrt(tmp)) / 2.0);
689 }
690 
691 double StandardModel::c02() const
692 {
693  return ( 1.0 - s02());
694 }
695 
696 double StandardModel::Mw() const
697 {
698  /* Debug */
699  //std::cout << std::boolalpha
700  // << checkScheme(schemeMw_cache,schemeMw,false)
701  // << " [cache:" << schemeMw_cache
702  // << " current:" << schemeMw << "]" << std::endl;
703 
705  if (useMw_cache)
706  return Mw_cache;
707 
708  double Mw;
709  if (FlagMw.compare("APPROXIMATEFORMULA") == 0)
710  Mw = myApproximateFormulae->Mw();
711  else {
712  //std::cout << std::setprecision(12)
713  // << "TEST: Mw_tree = " << Mw_tree() << std::endl;
714 
715  double DeltaRho[orders_EW_size], DeltaR_rem[orders_EW_size];
716  ComputeDeltaRho(Mw_tree(), DeltaRho);
717  ComputeDeltaR_rem(Mw_tree(), DeltaR_rem);
718  Mw = resumMw(Mw_tree(), DeltaRho, DeltaR_rem);
719 
720  /* Mw from iterations */
721  double Mw_org = Mw_tree();
722  while (fabs(Mw - Mw_org) > Mw_error) {
723  Mw_org = Mw;
724  ComputeDeltaRho(Mw, DeltaRho);
725  ComputeDeltaR_rem(Mw, DeltaR_rem);
726  Mw = resumMw(Mw, DeltaRho, DeltaR_rem);
727  /* TEST */
728  //int prec_def = std::cout.precision();
729  //std::cout << std::setprecision(12) << "TEST: Mw_org = " << Mw_org
730  // << " Mw_new = " << Mw << std::endl;
731  //std::cout.precision(prec_def);
732  }
733  }
734 
735  Mw_cache = Mw;
736  useMw_cache = true;
737  return Mw;
738 }
739 
740 double StandardModel::cW2(double Mw_i) const
741 {
742  return ( Mw_i * Mw_i / Mz / Mz);
743 }
744 
745 double StandardModel::cW2() const
746 {
747  return ( cW2(Mw()));
748 }
749 
750 double StandardModel::sW2(double Mw_i) const
751 {
752  return ( 1.0 - cW2(Mw_i));
753 }
754 
755 double StandardModel::sW2() const
756 {
757  return ( 1.0 - cW2());
758 }
759 
760 double StandardModel::DeltaR() const
761 {
762  /* in the experimental/running-width scheme */
763  double myMw = Mw();
764  double sW2 = 1.0 - myMw * myMw / Mz / Mz;
765  double tmp = sqrt(2.0) * GF * sW2 * myMw * myMw / M_PI / ale;
766  if (FlagMw.compare("NORESUM") == 0
767  || FlagMw.compare("APPROXIMATEFORMULA") == 0) {
768  return (tmp - 1.0);
769  } else {
770  return (1.0 - 1.0 / tmp);
771  }
772 }
773 
774 void StandardModel::ComputeDeltaRho(const double Mw_i,
775  double DeltaRho[orders_EW_size]) const
776 {
777  if (flag_order[EW1])
778  DeltaRho[EW1] = myOneLoopEW->DeltaRho(Mw_i);
779  else
780  DeltaRho[EW1] = 0.0;
781  if (flag_order[EW1QCD1])
782  DeltaRho[EW1QCD1] = myTwoLoopQCD->DeltaRho(Mw_i);
783  else
784  DeltaRho[EW1QCD1] = 0.0;
785  if (flag_order[EW1QCD2])
786  DeltaRho[EW1QCD2] = myThreeLoopQCD->DeltaRho(Mw_i);
787  else
788  DeltaRho[EW1QCD2] = 0.0;
789  if (flag_order[EW2])
790  DeltaRho[EW2] = myTwoLoopEW->DeltaRho(Mw_i);
791  else
792  DeltaRho[EW2] = 0.0;
793  if (flag_order[EW2QCD1])
794  DeltaRho[EW2QCD1] = myThreeLoopEW2QCD->DeltaRho(Mw_i);
795  else
796  DeltaRho[EW2QCD1] = 0.0;
797  if (flag_order[EW3])
798  DeltaRho[EW3] = myThreeLoopEW->DeltaRho(Mw_i);
799  else
800  DeltaRho[EW3] = 0.0;
801 }
802 
803 void StandardModel::ComputeDeltaR_rem(const double Mw_i,
804  double DeltaR_rem[orders_EW_size]) const
805 {
806  if (flag_order[EW1])
807  DeltaR_rem[EW1] = myOneLoopEW->DeltaR_rem(Mw_i);
808  else
809  DeltaR_rem[EW1] = 0.0;
810  if (flag_order[EW1QCD1])
811  DeltaR_rem[EW1QCD1] = myTwoLoopQCD->DeltaR_rem(Mw_i);
812  else
813  DeltaR_rem[EW1QCD1] = 0.0;
814  if (flag_order[EW1QCD2])
815  DeltaR_rem[EW1QCD2] = myThreeLoopQCD->DeltaR_rem(Mw_i);
816  else
817  DeltaR_rem[EW1QCD2] = 0.0;
818  if (flag_order[EW2])
819  DeltaR_rem[EW2] = myTwoLoopEW->DeltaR_rem(Mw_i);
820  else
821  DeltaR_rem[EW2] = 0.0;
822  if (flag_order[EW2QCD1])
823  DeltaR_rem[EW2QCD1] = myThreeLoopEW2QCD->DeltaR_rem(Mw_i);
824  else
825  DeltaR_rem[EW2QCD1] = 0.0;
826  if (flag_order[EW3])
827  DeltaR_rem[EW3] = myThreeLoopEW->DeltaR_rem(Mw_i);
828  else
829  DeltaR_rem[EW3] = 0.0;
830 }
831 
832 
834 
835 double StandardModel::Mzbar() const
836 {
837  double G0 = GF * pow(Mz, 3.0) / 24.0 / sqrt(2.0) / M_PI;
838  double sW2tree = 1.0 - Mw_tree() * Mw_tree() / Mz / Mz;
839  double Gz = 6.0 * G0; // neutrinos
840  Gz += 3.0 * G0 * (pow(1.0 - 4.0 * sW2tree, 2.0) + 1.0); // e, mu and tau
841  Gz += 6.0 * G0 * (pow(1.0 - 8.0 / 3.0 * sW2tree, 2.0) + 1.0)
842  * (1.0 + AlsMz / M_PI); // u and c
843  Gz += 9.0 * G0 * (pow(1.0 - 4.0 / 3.0 * sW2tree, 2.0) + 1.0)
844  * (1.0 + AlsMz / M_PI); // d, s and b
845 
846  //Gz = 2.4952; // experimental data
847  //std::cout << "Gz=" << Gz << std::endl; // for test
848 
849  return ( Mz - Gz * Gz / 2.0 / Mz);
850 }
851 
852 double StandardModel::MwbarFromMw(const double Mw) const
853 {
854  double AlsMw = Als(Mw, FULLNLO);
855  double Gw_SM = 3.0 * GF * pow(Mw, 3.0) / 2.0 / sqrt(2.0) / M_PI
856  * (1.0 + 2.0 * AlsMw / 3.0 / M_PI);
857 
858  return ( Mw - Gw_SM * Gw_SM / 2.0 / Mw);
859 }
860 
861 double StandardModel::MwFromMwbar(const double Mwbar) const
862 {
863  double AlsMw = Als(Mwbar, FULLNNLO);
864  double Gw_SM = 3.0 * GF * pow(Mwbar, 3.0) / 2.0 / sqrt(2.0) / M_PI
865  * (1.0 + 2.0 * AlsMw / 3.0 / M_PI);
866 
867  return (Mwbar + Gw_SM * Gw_SM / 2.0 / Mwbar);
868 }
869 
871 {
872  double Mwbar_SM = MwbarFromMw(Mw());
873  double sW2bar = 1.0 - Mwbar_SM * Mwbar_SM / Mzbar() / Mzbar();
874  double tmp = sqrt(2.0) * GF * sW2bar * Mwbar_SM * Mwbar_SM / M_PI / ale;
875 
876  return (tmp - 1.0);
877 }
878 
879 
881 
882 double StandardModel::rho_GammaW(const Particle fi, const Particle fj) const
883 {
884  double rhoW = 0.0;
885  if (flag_order[EW1])
886  rhoW = myOneLoopEW->rho_GammaW(fi, fj, Mw());
887  return rhoW;
888 }
889 
890 double StandardModel::GammaW(const Particle fi, const Particle fj) const
891 {
892  if ((fi.getIndex()) % 2 || (fj.getIndex() + 1) % 2)
893  throw std::runtime_error("Error in StandardModel::GammaW()");
894 
895  double G0 = GF * pow(Mw(), 3.0) / 6.0 / sqrt(2.0) / M_PI;
896  gslpp::complex V(0.0, 0.0, false);
897 
898  if (fi.is("TOP"))
899  return (0.0);
900 
901  if (fj.getIndex() - fi.getIndex() == 1)
902  V = gslpp::complex(1.0, 0.0, false);
903  else
904  V = gslpp::complex(0.0, 0.0, false);
905 
906  if (fi.is("LEPTON"))
907  return ( V.abs2() * G0 * rho_GammaW(fi, fj));
908  else {
909  double AlsMw = AlsWithInit(Mw(), AlsMz, Mz, FULLNLO);
910  return ( 3.0 * V.abs2() * G0 * rho_GammaW(fi, fj)*(1.0 + AlsMw / M_PI));
911  }
912 }
913 
914 double StandardModel::GammaW() const
915 {
917  if (useGammaW_cache)
918  return GammaW_cache;
919 
920  double GammaWtmp = 0.;
921 
922  for (int i = 0; i < 6; i += 2)
923  GammaWtmp += GammaW(leptons[i], leptons[i + 1]) + GammaW(quarks[i], quarks[i + 1]);
924 
925  GammaW_cache = GammaWtmp;
926  useGammaW_cache = true;
927  return GammaWtmp;
928 }
929 
930 
932 
933 double StandardModel::A_f(const Particle f) const
934 {
935  double Re_kappa = kappaZ_f(f).real();
936  double Re_gV_over_gA = 1.0 - 4.0 * fabs(f.getCharge()) * Re_kappa * sW2();
937  return ( 2.0 * Re_gV_over_gA / (1.0 + pow(Re_gV_over_gA, 2.0)));
938 }
939 
940 double StandardModel::AFB(const Particle f) const
941 {
942  return (3.0 / 4.0 * A_f(leptons[ELECTRON]) * A_f(f));
943 }
944 
946 {
947  double Re_kappa = kappaZ_f(f).real();
948  return ( Re_kappa * sW2());
949 }
950 
951 double StandardModel::GammaZ(const Particle f) const
952 {
953  if (f.is("TOP"))
954  return 0.0;
955  double Gamma;
956  if (!IsFlagNoApproximateGammaZ()) {
957  /* SM contribution with the approximate formula */
958  if (f.is("NEUTRINO_1") || f.is("NEUTRINO_2") || f.is("NEUTRINO_3"))
959  Gamma = myApproximateFormulae->X_extended("Gamma_nu");
960  else if (f.is("ELECTRON") || f.is("MU"))
961  Gamma = myApproximateFormulae->X_extended("Gamma_e_mu");
962  else if (f.is("TAU"))
963  Gamma = myApproximateFormulae->X_extended("Gamma_tau");
964  else if (f.is("UP"))
965  Gamma = myApproximateFormulae->X_extended("Gamma_u");
966  else if (f.is("CHARM"))
967  Gamma = myApproximateFormulae->X_extended("Gamma_c");
968  else if (f.is("DOWN") || f.is("STRANGE"))
969  Gamma = myApproximateFormulae->X_extended("Gamma_d_s");
970  else if (f.is("BOTTOM"))
971  Gamma = myApproximateFormulae->X_extended("Gamma_b");
972  else
973  throw std::runtime_error("Error in StandardModel::GammaZ()");
974  } else {
975  gslpp::complex myrhoZ_f = rhoZ_f(f);
976  gslpp::complex gV_over_gA = gV_f(f) / gA_f(f);
977  double G0 = GF * pow(Mz, 3.0) / 24.0 / sqrt(2.0) / M_PI;
978  if (f.is("LEPTON")) {
979  double myalphaMz = alphaMz();
980  double Q = f.getCharge();
981  double xl = pow(f.getMass() / Mz, 2.0);
982  Gamma = G0 * myrhoZ_f.abs() * sqrt(1.0 - 4.0 * xl)
983  * ((1.0 + 2.0 * xl)*(gV_over_gA.abs2() + 1.0) - 6.0 * xl)
984  * (1.0 + 3.0 / 4.0 * myalphaMz / M_PI * pow(Q, 2.0));
985  } else if (f.is("QUARK")) {
986  Gamma = 3.0 * G0 * myrhoZ_f.abs()*(gV_over_gA.abs2() * RVq((QCD::quark) (f.getIndex() - 6)) + RAq((QCD::quark) (f.getIndex() - 6)));
987 
988  /* Nonfactorizable EW-QCD corrections */
989  Gamma += Delta_EWQCD((QCD::quark) (f.getIndex() - 6));
990  } else
991  throw std::runtime_error("Error in StandardModel::GammaZ()");
992  }
993 
994  return Gamma;
995 }
996 
998 {
1000  + GammaZ(leptons[NEUTRINO_3]));
1001 }
1002 
1004 {
1005  double Gamma_had_tmp = GammaZ(quarks[UP]) + GammaZ(quarks[DOWN]) + GammaZ(quarks[CHARM])
1006  + GammaZ(quarks[STRANGE]) + GammaZ(quarks[BOTTOM]);
1007 
1008  /* Singlet vector contribution (not included in the approximate formula) */
1009  double G0 = GF * pow(Mz, 3.0) / 24.0 / sqrt(2.0) / M_PI;
1010  Gamma_had_tmp += 4.0 * 3.0 * G0 * RVh();
1011 
1012  return Gamma_had_tmp;
1013 }
1014 
1016 {
1018  /* SM contribution with the approximate formula */
1019  return myApproximateFormulae->X_extended("GammaZ");
1020  else
1021  return ( GammaZ(leptons[ELECTRON]) + GammaZ(leptons[MU]) + GammaZ(leptons[TAU])
1022  + Gamma_inv() + Gamma_had());
1023 }
1024 
1026 {
1028  /* SM contribution with the approximate formula */
1029  return (myApproximateFormulae->X_extended("sigmaHadron")
1030  / GeVminus2_to_nb);
1031  else
1032  return (12.0 * M_PI * GammaZ(leptons[ELECTRON]) * Gamma_had()
1033  / Mz / Mz / Gamma_Z() / Gamma_Z());
1034 }
1035 
1036 double StandardModel::R0_f(const Particle f) const
1037 {
1038  if (f.is("LEPTON")) {
1040  /* SM contribution with the approximate formula */
1041  return (myApproximateFormulae->X_extended("R0_lepton"));
1042  else
1043  return (Gamma_had() / GammaZ(leptons[ELECTRON]));
1044  } else if (f.is("CHARM")) {
1046  /* SM contribution with the approximate formula */
1047  return (myApproximateFormulae->X_extended("R0_charm"));
1048  else
1049  return (GammaZ(quarks[CHARM]) / Gamma_had());
1050 
1051  } else if (f.is("BOTTOM")) {
1053  /* SM contribution with the approximate formula */
1054  return (myApproximateFormulae->X_extended("R0_bottom"));
1055  else
1056  return (GammaZ(quarks[BOTTOM]) / Gamma_had());
1057 
1058  } else throw std::runtime_error("StandardModel::R0_f called with wrong argument");
1059 }
1060 
1061 
1063 
1065 {
1066  return ( gA_f(f)
1067  *(1.0 - 4.0 * fabs(f.getCharge())*(kappaZ_f(f)) * sW2()));
1068 }
1069 
1071 {
1072  return ( sqrt(rhoZ_f(f)) * f.getIsospin());
1073 }
1074 
1076 {
1077  if (f.getName().compare("TOP") == 0) return (gslpp::complex(0.0, 0.0, false));
1078  if (FlagRhoZ.compare("APPROXIMATEFORMULA") == 0)
1079  throw std::runtime_error("No approximate formula is available for rhoZ^f");
1080  else {
1081 
1083  if (useRhoZ_f_cache[f.getIndex()])
1084  return rhoZ_f_cache[f.getIndex()];
1085 
1086  double myMw = Mw();
1087 
1088  /* compute Delta rho */
1089  double DeltaRho[orders_EW_size];
1090  ComputeDeltaRho(myMw, DeltaRho);
1091 
1092  /* compute delta rho_rem^f */
1093  gslpp::complex deltaRho_remf[orders_EW_size];
1094  deltaRho_remf[EW1] = gslpp::complex(0.0, 0.0, false);
1095  deltaRho_remf[EW1QCD1] = gslpp::complex(0.0, 0.0, false);
1096  deltaRho_remf[EW1QCD2] = gslpp::complex(0.0, 0.0, false);
1097  deltaRho_remf[EW2] = gslpp::complex(0.0, 0.0, false);
1098  deltaRho_remf[EW2QCD1] = gslpp::complex(0.0, 0.0, false);
1099  deltaRho_remf[EW3] = gslpp::complex(0.0, 0.0, false);
1100  if (flag_order[EW1])
1101  deltaRho_remf[EW1] = myOneLoopEW->deltaRho_rem_f(f, myMw);
1102  if (flag_order[EW1QCD1])
1103 #ifdef WITHIMTWOLOOPQCD
1104  deltaRho_remf[EW1QCD1] = gslpp::complex(myTwoLoopQCD->deltaRho_rem_f(f, myMw).real(),
1105  myTwoLoopQCD->deltaRho_rem_f(f, myMw).imag(), false);
1106 #else
1107  deltaRho_remf[EW1QCD1] = gslpp::complex(myTwoLoopQCD->deltaRho_rem_f(f, myMw).real(), 0.0, false);
1108 #endif
1109  if (flag_order[EW1QCD2])
1110  deltaRho_remf[EW1QCD2] = gslpp::complex(myThreeLoopQCD->deltaRho_rem_f(f, myMw).real(), 0.0, false);
1111  if (flag_order[EW2])
1112  deltaRho_remf[EW2] = gslpp::complex(myTwoLoopEW->deltaRho_rem_f(f, myMw).real(), 0.0, false);
1113  if (flag_order[EW2QCD1])
1114  deltaRho_remf[EW2QCD1] = gslpp::complex(myThreeLoopEW2QCD->deltaRho_rem_f(f, myMw).real(), 0.0, false);
1115  if (flag_order[EW3])
1116  deltaRho_remf[EW3] = gslpp::complex(myThreeLoopEW->deltaRho_rem_f(f, myMw).real(), 0.0, false);
1117 
1118  /* compute Delta rbar_rem */
1119  double DeltaRbar_rem = 0.0;
1120  if (flag_order[EW1])
1121  DeltaRbar_rem = myOneLoopEW->DeltaRbar_rem(myMw);
1122 
1123  /* Re[rho_Z^f] with or without resummation */
1124  double deltaRho_rem_f_real[orders_EW_size];
1125  for (int j = 0; j < orders_EW_size; ++j)
1126  deltaRho_rem_f_real[j] = deltaRho_remf[j].real();
1127  double ReRhoZf = resumRhoZ(DeltaRho, deltaRho_rem_f_real, DeltaRbar_rem, f.is("BOTTOM"));
1128 
1129  /* Im[rho_Z^f] without resummation */
1130  double ImRhoZf = 0.0;
1131  for (int j = 0; j < orders_EW_size; ++j)
1132  ImRhoZf += deltaRho_remf[j].imag();
1133 
1134  rhoZ_f_cache[f.getIndex()] = gslpp::complex(ReRhoZf, ImRhoZf, false);
1135  useRhoZ_f_cache[f.getIndex()] = true;
1136  return (gslpp::complex(ReRhoZf, ImRhoZf, false));
1137  }
1138 }
1139 
1141 {
1142  if (f.is("TOP")) return (gslpp::complex(0.0, 0.0, false));
1143 
1145  if (useKappaZ_f_cache[f.getIndex()])
1146  return kappaZ_f_cache[f.getIndex()];
1147 
1148  double myMw = Mw();
1149 
1150  double ReKappaZf = 0.0, ImKappaZf = 0.0;
1151  if (FlagKappaZ.compare("APPROXIMATEFORMULA") == 0) {
1152  ReKappaZf = myApproximateFormulae->sin2thetaEff(f) / sW2();
1153  ImKappaZf = myOneLoopEW->deltaKappa_rem_f(f, myMw).imag();
1154 #ifdef WITHIMTWOLOOPQCD
1155  ImKappaZf += myTwoLoopQCD->deltaKappa_rem_f(f, myMw).imag();
1156 
1157  /* TEST */
1158  //ImKappaZf -= myCache->ale()*myCache->alsMz()/24.0/M_PI*(cW2() - sW2())/sW2()/sW2();
1159 #endif
1160  } else {
1161  /* compute Delta rho */
1162  double DeltaRho[orders_EW_size];
1163  ComputeDeltaRho(myMw, DeltaRho);
1164 
1165  /* compute delta kappa_rem^f */
1166  gslpp::complex deltaKappa_remf[orders_EW_size];
1167  deltaKappa_remf[EW1] = gslpp::complex(0.0, 0.0, false);
1168  deltaKappa_remf[EW1QCD1] = gslpp::complex(0.0, 0.0, false);
1169  deltaKappa_remf[EW1QCD2] = gslpp::complex(0.0, 0.0, false);
1170  deltaKappa_remf[EW2] = gslpp::complex(0.0, 0.0, false);
1171  deltaKappa_remf[EW2QCD1] = gslpp::complex(0.0, 0.0, false);
1172  deltaKappa_remf[EW3] = gslpp::complex(0.0, 0.0, false);
1173  if (flag_order[EW1])
1174  deltaKappa_remf[EW1] = myOneLoopEW->deltaKappa_rem_f(f, myMw);
1175  if (flag_order[EW1QCD1])
1176 #ifdef WITHIMTWOLOOPQCD
1177  deltaKappa_remf[EW1QCD1] = gslpp::complex(myTwoLoopQCD->deltaKappa_rem_f(f, myMw).real(),
1178  myTwoLoopQCD->deltaKappa_rem_f(f, myMw).imag(), false);
1179 #else
1180  deltaKappa_remf[EW1QCD1] = gslpp::complex(myTwoLoopQCD->deltaKappa_rem_f(f, myMw).real(), 0.0, false);
1181 #endif
1182  if (flag_order[EW1QCD2])
1183  deltaKappa_remf[EW1QCD2] = gslpp::complex(myThreeLoopQCD->deltaKappa_rem_f(f, myMw).real(), 0.0, false);
1184  if (flag_order[EW2])
1185  deltaKappa_remf[EW2] = gslpp::complex(myTwoLoopEW->deltaKappa_rem_f(f, myMw).real(), 0.0, false);
1186  if (flag_order[EW2QCD1])
1187  deltaKappa_remf[EW2QCD1] = gslpp::complex(myThreeLoopEW2QCD->deltaKappa_rem_f(f, myMw).real(), 0.0, false);
1188  if (flag_order[EW3])
1189  deltaKappa_remf[EW3] = gslpp::complex(myThreeLoopEW->deltaKappa_rem_f(f, myMw).real(), 0.0, false);
1190 
1191  /* compute Delta rbar_rem */
1192  double DeltaRbar_rem = 0.0;
1193  if (flag_order[EW1])
1194  DeltaRbar_rem = myOneLoopEW->DeltaRbar_rem(myMw);
1195 
1196  /* Re[kappa_Z^f] with or without resummation */
1197  double deltaKappa_rem_f_real[orders_EW_size];
1198  for (int j = 0; j < orders_EW_size; ++j)
1199  deltaKappa_rem_f_real[j] = deltaKappa_remf[j].real();
1200 
1201  ReKappaZf = resumKappaZ(DeltaRho, deltaKappa_rem_f_real, DeltaRbar_rem, f.is("BOTTOM"));
1202 
1203  /* O(alpha^2) correction to Re[kappa_Z^f] from the Z-gamma mixing */
1204  ReKappaZf += 35.0 * alphaMz() * alphaMz() / 18.0 / sW2()
1205  *(1.0 - 8.0 / 3.0 * ReKappaZf * sW2());
1206 
1207  /* Im[kappa_Z^f] without resummation */
1208  for (int j = 0; j < orders_EW_size; ++j)
1209  ImKappaZf += deltaKappa_remf[j].imag();
1210  }
1211 
1212  kappaZ_f_cache[f.getIndex()] = gslpp::complex(ReKappaZf, ImKappaZf, false);
1213  useKappaZ_f_cache[f.getIndex()] = true;
1214  return (gslpp::complex(ReKappaZf, ImKappaZf, false));
1215 }
1216 
1218 {
1219  Particle p1 = f, pe = leptons[ELECTRON];
1220 
1221  if (f.is("TOP") || f.is("ELECTRON")) return (gslpp::complex(0.0, 0.0, false));
1222 
1223  /* In the case of BOTTOM, the top contribution has to be subtracted.
1224  * The remaining contribution is the same as that for DOWN and STRANGE. */
1225  if (f.is("BOTTOM")) p1 = quarks[DOWN];
1226 
1227  double myMw = Mw();
1228  double cW2 = myMw * myMw / Mz / Mz, sW2 = 1.0 - cW2;
1229 
1230  gslpp::complex ul = (3.0 * myEWSMcache->v_f(pe, myMw) * myEWSMcache->v_f(pe, myMw)
1231  + myEWSMcache->a_f(pe) * myEWSMcache->a_f(pe)) / 4.0 / cW2 * myOneLoopEW->FZ(Mz*Mz, myMw)
1232  + myOneLoopEW->FW(Mz*Mz, pe, myMw);
1233  gslpp::complex uf = (3.0 * myEWSMcache->v_f(p1, myMw) * myEWSMcache->v_f(p1, myMw)
1234  + myEWSMcache->a_f(p1) * myEWSMcache->a_f(p1)) / 4.0 / cW2 * myOneLoopEW->FZ(Mz*Mz, myMw)
1235  + myOneLoopEW->FW(Mz*Mz, p1, myMw);
1236 
1237  gslpp::complex dRho = 2.0 * (uf - ul);
1238  dRho *= ale / 4.0 / M_PI / sW2;
1239  return dRho;
1240 }
1241 
1243 {
1244  Particle p1 = f, pe = leptons[ELECTRON];
1245 
1246  if (f.is("TOP") || f.is("ELECTRON")) return (gslpp::complex(0.0, 0.0, false));
1247 
1248  /* In the case of BOTTOM, the top contribution has to be subtracted.
1249  * The remaining contribution is the same as that for DOWN and STRANGE. */
1250  if (f.is("BOTTOM")) p1 = quarks[DOWN];
1251 
1252  double myMw = Mw();
1253  double cW2 = myMw * myMw / Mz / Mz, sW2 = 1.0 - cW2;
1254  gslpp::complex ul = (3.0 * myEWSMcache->v_f(pe, myMw) * myEWSMcache->v_f(pe, myMw)
1255  + myEWSMcache->a_f(pe) * myEWSMcache->a_f(pe)) / 4.0 / cW2 * myOneLoopEW->FZ(Mz*Mz, myMw)
1256  + myOneLoopEW->FW(Mz*Mz, pe, myMw);
1257  double deltal = myEWSMcache->delta_f(pe, myMw);
1258  gslpp::complex uf = (3.0 * myEWSMcache->v_f(p1, myMw) * myEWSMcache->v_f(p1, myMw)
1259  + myEWSMcache->a_f(p1) * myEWSMcache->a_f(p1)) / 4.0 / cW2 * myOneLoopEW->FZ(Mz*Mz, myMw)
1260  + myOneLoopEW->FW(Mz*Mz, p1, myMw);
1261  double deltaf = myEWSMcache->delta_f(p1, myMw);
1262 
1263  gslpp::complex dKappa = (deltaf * deltaf - deltal * deltal) / 4.0 / cW2 * myOneLoopEW->FZ(Mz*Mz, myMw)
1264  - uf + ul;
1265  dKappa *= ale / 4.0 / M_PI / sW2;
1266  return dKappa;
1267 }
1268 
1269 
1271 
1273 {
1274  double rhoZe = rhoZ_f(leptons[ELECTRON]).real();
1275  double DeltaRhoPrime = 2.0 * (sqrt(rhoZe) - 1.0);
1276 
1277  return DeltaRhoPrime;
1278 }
1279 
1281 {
1282  double rhoZe = rhoZ_f(leptons[ELECTRON]).real();
1283  double sin2thetaEff = kappaZ_f(leptons[ELECTRON]).real() * sW2();
1284  double DeltaRhoPrime = 2.0 * (sqrt(rhoZe) - 1.0);
1285  double DeltaKappaPrime = sin2thetaEff / s02() - 1.0;
1286  double DeltaRW = 1.0 - M_PI * alphaMz() / (sqrt(2.0) * GF * Mz * Mz * sW2() * cW2());
1287 
1288  return ( c02() * DeltaRhoPrime + s02() * DeltaRW / (c02() - s02())
1289  - 2.0 * s02() * DeltaKappaPrime);
1290 }
1291 
1293 {
1294  double rhoZe = rhoZ_f(leptons[ELECTRON]).real();
1295  double sin2thetaEff = kappaZ_f(leptons[ELECTRON]).real() * sW2();
1296  double DeltaRhoPrime = 2.0 * (sqrt(rhoZe) - 1.0);
1297  double DeltaKappaPrime = sin2thetaEff / s02() - 1.0;
1298 
1299  return ( c02() * DeltaRhoPrime + (c02() - s02()) * DeltaKappaPrime);
1300 }
1301 
1303 {
1304  /* epsilon_b from g_A^b
1305  * see Eq.(13) of IJMP A7, 1031 (1998) by Altarelli et al. */
1306  //double rhoZe = rhoZ_l_SM(StandardModel::ELECTRON).real();
1307  //double rhoZb = rhoZ_q_SM(QCD::BOTTOM).real();
1308  //double DeltaRhoPrime = 2.0*( sqrt(rhoZe) - 1.0 );
1309  //double eps1 = DeltaRhoPrime;
1310  //return ( - 1.0 + sqrt(rhoZb)/(1.0 + eps1/2.0) );
1311 
1312  /* epsilon_b from Re(g_V^b/g_A^b), i.e. Re(kappaZ_b)
1313  * see Eq.(13) of IJMP A7, 1031 (1998) by Altarelli et al. */
1315  gslpp::complex kappaZb = kappaZ_f(quarks[BOTTOM]);
1317  return ( kappaZe.real() / kappaZb.real() - 1.0);
1318  else
1319  return ( (kappaZe.real() + deltaKappaZ_f(quarks[BOTTOM]).real())
1320  / kappaZb.real() - 1.0);
1321 
1322  /* epsilon_b from Gamma_b via Eqs.(11), (12) and (16) of IJMP A7,
1323  * 1031 (1998) by Altarelli et al.
1324  * Note: mb has to be mb=4.7, since Eq.(16) were derived with this value.
1325  */
1326  //double als_Mz = Als(myCache->Mz(), FULLNNLO);
1327  //double delta_als = (als_Mz - 0.119)/M_PI;
1328  //double delta_alpha = (alphaMz() - 1.0/128.90)/myCache->ale();
1329  //double Gamma_b_Born = 0.3798*( 1.0 + delta_als - 0.42*delta_alpha);
1330  //double a = als_Mz/M_PI;
1331  //double RQCD = 1.0 + 1.2*a - 1.1*a*a - 13.0*a*a*a;
1332  //double mb = Mrun(myCache->Mz(), quarks[QCD::BOTTOM].getMass(), FULLNNLO);// This is wrong!
1333  //double mb = 4.7;
1334  //std::cout << "mb = " << mb << std::endl;
1335  //double beta = sqrt(1.0 - 4.0*mb*mb/myCache->Mz()/myCache->Mz());
1336  //double Nc = 3.0;
1337  //double factor = myCache->GF()*myCache->Mz()*myCache->Mz()*myCache->Mz()/6.0/M_PI/sqrt(2.0);
1338  //double Gamma_b = factor*beta*((3.0 - beta*beta)/2.0*gVq_SM(QCD::BOTTOM).abs2()
1339  // + beta*beta*gAq_SM(QCD::BOTTOM).abs2())
1340  // *Nc*RQCD*(1.0 + alphaMz()/12.0/M_PI);
1341  //return ( (Gamma_b/Gamma_b_Born - 1.0 - 1.42*epsilon1_SM()
1342  // + 0.54*epsilon3_SM() )/2.29 );
1343 }
1344 
1345 
1347 
1348 double StandardModel::resumMw(const double Mw_i, const double DeltaRho[orders_EW_size],
1349  const double DeltaR_rem[orders_EW_size]) const
1350 {
1351  if ((FlagMw.compare("APPROXIMATEFORMULA") == 0)
1352  || (DeltaR_rem[EW2QCD1] != 0.0)
1353  || (DeltaR_rem[EW3] != 0.0))
1354  throw std::runtime_error("Error in StandardModel::resumMw()");
1355 
1356  if (!flag_order[EW2] && FlagMw.compare("NORESUM") != 0)
1357  throw std::runtime_error("Error in StandardModel::resumMw()");
1358 
1359  double cW2_TMP = Mw_i * Mw_i / Mz / Mz;
1360  double sW2_TMP = 1.0 - cW2_TMP;
1361 
1362  double f_AlphaToGF, DeltaRho_sum = 0.0, DeltaRho_G = 0.0;
1363  if (FlagMw.compare("NORESUM") == 0) {
1364  for (int j = 0; j < orders_EW_size; ++j) {
1365  DeltaRho_sum += DeltaRho[(orders_EW) j];
1366  }
1367  } else {
1368  // conversion: alpha(0) --> G_F
1369  f_AlphaToGF = sqrt(2.0) * GF * pow(Mz, 2.0) * sW2_TMP * cW2_TMP / M_PI / ale;
1370  DeltaRho_sum = f_AlphaToGF * DeltaRho[EW1]
1371  + f_AlphaToGF * DeltaRho[EW1QCD1]
1372  + f_AlphaToGF * DeltaRho[EW1QCD2]
1373  + pow(f_AlphaToGF, 2.0) * DeltaRho[EW2]
1374  + pow(f_AlphaToGF, 2.0) * DeltaRho[EW2QCD1]
1375  + pow(f_AlphaToGF, 3.0) * DeltaRho[EW3];
1376  DeltaRho_G = f_AlphaToGF * DeltaRho[EW1];
1377  }
1378 
1379  double R;
1380  double DeltaR_rem_sum = 0.0;
1381  double DeltaR_EW1 = 0.0, DeltaR_EW2_rem = 0.0;
1382  if (FlagMw.compare("NORESUM") == 0) {
1383  for (int j = 0; j < orders_EW_size; ++j)
1384  DeltaR_rem_sum += DeltaR_rem[(orders_EW) j];
1385 
1386  // Full EW one-loop contribution (without the full DeltaAlphaL5q)
1387  DeltaR_EW1 = -cW2_TMP / sW2_TMP * DeltaRho[EW1] + DeltaR_rem[EW1];
1388 
1389  // Full EW two-loop contribution without reducible corrections
1390  DeltaR_EW2_rem = myApproximateFormulae->DeltaR_TwoLoopEW_rem(Mw_i);
1391 
1392  // subtract the EW two-loop contributions from DeltaRho_sum and DeltaR_rem_sum
1393  DeltaRho_sum -= DeltaRho[EW2];
1394  DeltaR_rem_sum -= DeltaR_rem[EW2];
1395 
1396  // R = 1 + Delta r, including the full EW two-loop contribution
1397  R = 1.0 + DeltaAlphaL5q() - cW2_TMP / sW2_TMP * DeltaRho_sum
1398  + DeltaR_rem_sum;
1399  R += DeltaAlphaL5q() * DeltaAlphaL5q() + 2.0 * DeltaAlphaL5q() * DeltaR_EW1
1400  + DeltaR_EW2_rem;
1401  } else if (FlagMw.compare("OMSI") == 0) {
1402  // R = 1/(1 - Delta r)
1403  R = 1.0 / (1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum)
1404  / (1.0 - DeltaAlphaL5q()
1405  - DeltaR_rem[EW1] - DeltaR_rem[EW1QCD1] - DeltaR_rem[EW2]);
1406  } else if (FlagMw.compare("INTERMEDIATE") == 0) {
1407  // R = 1/(1 - Delta r)
1408  R = 1.0 / ((1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum)
1409  *(1.0 - DeltaAlphaL5q() - DeltaR_rem[EW1])
1410  - DeltaR_rem[EW1QCD1] - DeltaR_rem[EW2]);
1411  } else if (FlagMw.compare("OMSII") == 0) {
1412  // R = 1/(1 - Delta r)
1413  R = 1.0 / ((1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum)*(1.0 - DeltaAlphaL5q())
1414  - (1.0 + cW2_TMP / sW2_TMP * DeltaRho_G) * DeltaR_rem[EW1]
1415  - DeltaR_rem[EW1QCD1] - DeltaR_rem[EW2]);
1416  } else
1417  throw std::runtime_error("Error in StandardModel::resumMw()");
1418 
1419  if (FlagMw.compare("NORESUM") == 0) {
1420  /* Mzbar and Mwbar are defined in the complex-pole scheme. */
1421 
1422  double tmp = 4.0 * M_PI * ale / sqrt(2.0) / GF / Mzbar() / Mzbar();
1423  if (tmp * R > 1.0) throw std::runtime_error("StandardModel::resumMw(): Negative (1-tmp*R)");
1424  double Mwbar = Mzbar() / sqrt(2.0) * sqrt(1.0 + sqrt(1.0 - tmp * R));
1425 
1426  return MwFromMwbar(Mwbar);
1427  } else {
1428  double tmp = 4.0 * M_PI * ale / sqrt(2.0) / GF / Mz / Mz;
1429  if (tmp * R > 1.0) throw std::runtime_error("StandardModel::resumMw(): Negative (1-tmp*R)");
1430 
1431  return (Mz / sqrt(2.0) * sqrt(1.0 + sqrt(1.0 - tmp * R)));
1432  }
1433 }
1434 
1435 double StandardModel::resumRhoZ(const double DeltaRho[orders_EW_size],
1436  const double deltaRho_rem[orders_EW_size],
1437  const double DeltaRbar_rem, const bool bool_Zbb) const
1438 {
1439  if ((FlagRhoZ.compare("APPROXIMATEFORMULA") == 0)
1440  || (deltaRho_rem[EW1QCD2] != 0.0)
1441  || (deltaRho_rem[EW2QCD1] != 0.0)
1442  || (deltaRho_rem[EW3] != 0.0))
1443  throw std::runtime_error("Error in StandardModel::resumRhoZ()");
1444 
1445  if (!flag_order[EW2] && FlagRhoZ.compare("NORESUM") != 0)
1446  throw std::runtime_error("Error in StandardModel::resumRhoZ()");
1447 
1448  double Mw_TMP = Mw();
1449  double cW2_TMP = cW2();
1450  double sW2_TMP = sW2();
1451 
1452  double f_AlphaToGF, DeltaRho_sum = 0.0, DeltaRho_G;
1453  double DeltaRbar_rem_G, deltaRho_rem_G, deltaRho_rem_G2;
1454  // conversion: alpha(0) --> G_F
1455  f_AlphaToGF = sqrt(2.0) * GF * pow(Mz, 2.0)
1456  * sW2_TMP * cW2_TMP / M_PI / ale;
1457  DeltaRho_sum = f_AlphaToGF * DeltaRho[EW1]
1458  + f_AlphaToGF * DeltaRho[EW1QCD1]
1459  + f_AlphaToGF * DeltaRho[EW1QCD2]
1460  + pow(f_AlphaToGF, 2.0) * DeltaRho[EW2]
1461  + pow(f_AlphaToGF, 2.0) * DeltaRho[EW2QCD1]
1462  + pow(f_AlphaToGF, 3.0) * DeltaRho[EW3];
1463  DeltaRho_G = f_AlphaToGF * DeltaRho[EW1];
1464  DeltaRbar_rem_G = f_AlphaToGF*DeltaRbar_rem;
1465  deltaRho_rem_G = f_AlphaToGF * (deltaRho_rem[EW1]
1466  + deltaRho_rem[EW1QCD1]);
1467  deltaRho_rem_G2 = pow(f_AlphaToGF, 2.0) * deltaRho_rem[EW2];
1468 
1469  /* Real parts */
1470  double rhoZ;
1471  if (!bool_Zbb) {
1472  if (FlagRhoZ.compare("OMSI") == 0) {
1473  rhoZ = (1.0 + deltaRho_rem_G + deltaRho_rem_G2)
1474  / (1.0 - DeltaRho_sum * (1.0 - DeltaRbar_rem_G));
1475  } else if (FlagRhoZ.compare("INTERMEDIATE") == 0) {
1476  rhoZ = (1.0 + deltaRho_rem_G)
1477  / (1.0 - DeltaRho_sum * (1.0 - DeltaRbar_rem_G))
1478  + deltaRho_rem_G2;
1479  } else if (FlagRhoZ.compare("NORESUM") == 0
1480  || FlagRhoZ.compare("OMSII") == 0) {
1481  rhoZ = 1.0 + DeltaRho_sum - DeltaRho_G * DeltaRbar_rem_G
1482  + DeltaRho_G * DeltaRho_G
1483  + deltaRho_rem_G * (1.0 + DeltaRho_G) + deltaRho_rem_G2;
1484  } else
1485  throw std::runtime_error("Error in StandardModel::resumRhoZ()");
1486  } else {
1487  /* Z to bb */
1488  double OnePlusTaub = 1.0 + taub();
1489  double OnePlusTaub2 = OnePlusTaub*OnePlusTaub;
1490  double rhoZbL;
1491  deltaRho_rem_G += f_AlphaToGF * ale / 4.0 / M_PI / sW2_TMP
1492  * pow(mtpole / Mw_TMP, 2.0);
1493  if (FlagRhoZ.compare("NORESUM") == 0) {
1494  rhoZ = (1.0 + DeltaRho_sum - DeltaRho_G * DeltaRbar_rem_G
1495  + DeltaRho_G * DeltaRho_G
1496  + deltaRho_rem_G * (1.0 + DeltaRho_G) + deltaRho_rem_G2)
1497  * OnePlusTaub2;
1498  } else if (FlagRhoZ.compare("OMSI") == 0) {
1499  rhoZbL = OnePlusTaub2 / (1.0 - DeltaRho_sum);
1500  rhoZ = rhoZbL / (1.0 - rhoZbL * deltaRho_rem_G);
1501  } else if (FlagRhoZ.compare("INTERMEDIATE") == 0) {
1502  rhoZbL = OnePlusTaub2 / (1.0 - DeltaRho_sum);
1503  rhoZ = rhoZbL * (1.0 + rhoZbL * deltaRho_rem_G);
1504  } else if (FlagRhoZ.compare("OMSII") == 0) {
1505  rhoZbL = OnePlusTaub2 / (1.0 - DeltaRho_sum);
1506  rhoZ = rhoZbL * (1.0 + deltaRho_rem_G);
1507  } else
1508  throw std::runtime_error("Error in StandardModel::resumRhoZ()");
1509  }
1510 
1511  return rhoZ;
1512 }
1513 
1514 double StandardModel::resumKappaZ(const double DeltaRho[orders_EW_size],
1515  const double deltaKappa_rem[orders_EW_size],
1516  const double DeltaRbar_rem, const bool bool_Zbb) const
1517 {
1518  if ((FlagKappaZ.compare("APPROXIMATEFORMULA") == 0)
1519  || (deltaKappa_rem[EW2QCD1] != 0.0)
1520  || (deltaKappa_rem[EW3] != 0.0))
1521  throw std::runtime_error("Error in StandardModel::resumKappaZ()");
1522 
1523  if (!flag_order[EW2] && FlagKappaZ.compare("NORESUM") != 0)
1524  throw std::runtime_error("Error in StandardModel::resumKappaZ()");
1525 
1526  double Mw_TMP = Mw();
1527  double cW2_TMP = cW2();
1528  double sW2_TMP = sW2();
1529 
1530  double f_AlphaToGF, DeltaRho_sum = 0.0, DeltaRho_G;
1531  double DeltaRbar_rem_G, deltaKappa_rem_G, deltaKappa_rem_G2;
1532  // conversion: alpha(0) --> G_F
1533  f_AlphaToGF = sqrt(2.0) * GF * pow(Mz, 2.0)
1534  * sW2_TMP * cW2_TMP / M_PI / ale;
1535  DeltaRho_sum = f_AlphaToGF * DeltaRho[EW1]
1536  + f_AlphaToGF * DeltaRho[EW1QCD1]
1537  + f_AlphaToGF * DeltaRho[EW1QCD2]
1538  + pow(f_AlphaToGF, 2.0) * DeltaRho[EW2]
1539  + pow(f_AlphaToGF, 2.0) * DeltaRho[EW2QCD1]
1540  + pow(f_AlphaToGF, 3.0) * DeltaRho[EW3];
1541  DeltaRho_G = f_AlphaToGF * DeltaRho[EW1];
1542  DeltaRbar_rem_G = f_AlphaToGF*DeltaRbar_rem;
1543  deltaKappa_rem_G = f_AlphaToGF * (deltaKappa_rem[EW1]
1544  + deltaKappa_rem[EW1QCD1]
1545  + deltaKappa_rem[EW1QCD2]);
1546  deltaKappa_rem_G2 = pow(f_AlphaToGF, 2.0) * deltaKappa_rem[EW2];
1547 
1548  /* Real parts */
1549  double kappaZ;
1550  if (!bool_Zbb) {
1551  if (FlagKappaZ.compare("OMSI") == 0) {
1552  kappaZ = (1.0 + deltaKappa_rem_G + deltaKappa_rem_G2)
1553  *(1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum * (1.0 - DeltaRbar_rem_G));
1554  } else if (FlagKappaZ.compare("INTERMEDIATE") == 0) {
1555  kappaZ = (1.0 + deltaKappa_rem_G)
1556  *(1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum * (1.0 - DeltaRbar_rem_G))
1557  + deltaKappa_rem_G2;
1558  } else if (FlagKappaZ.compare("NORESUM") == 0
1559  || FlagKappaZ.compare("OMSII") == 0) {
1560  kappaZ = 1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum
1561  - cW2_TMP / sW2_TMP * DeltaRho_G * DeltaRbar_rem_G
1562  + deltaKappa_rem_G * (1.0 + cW2_TMP / sW2_TMP * DeltaRho_G)
1563  + deltaKappa_rem_G2;
1564  } else
1565  throw std::runtime_error("Error in StandardModel::resumKappaZ()");
1566  } else {
1567  /* Z to bb */
1568  double OnePlusTaub = 1.0 + taub();
1569  double kappaZbL;
1570  deltaKappa_rem_G -= f_AlphaToGF * ale / 8.0 / M_PI / sW2_TMP
1571  * pow(mtpole / Mw_TMP, 2.0);
1572  if (FlagKappaZ.compare("NORESUM") == 0) {
1573  kappaZ = (1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum
1574  - cW2_TMP / sW2_TMP * DeltaRho_G * DeltaRbar_rem_G
1575  + deltaKappa_rem_G * (1.0 + cW2_TMP / sW2_TMP * DeltaRho_G)
1576  + deltaKappa_rem_G2) / OnePlusTaub;
1577  } else if (FlagKappaZ.compare("OMSI") == 0) {
1578  kappaZbL = (1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum) / OnePlusTaub;
1579  kappaZ = kappaZbL * (1.0 + deltaKappa_rem_G);
1580  } else if (FlagKappaZ.compare("INTERMEDIATE") == 0
1581  || FlagKappaZ.compare("OMSII") == 0) {
1582  kappaZbL = (1.0 + cW2_TMP / sW2_TMP * DeltaRho_sum) / OnePlusTaub;
1583  kappaZ = kappaZbL + deltaKappa_rem_G;
1584  } else
1585  throw std::runtime_error("Error in StandardModel::resumKappaZ()");
1586  }
1587 
1588  return kappaZ;
1589 }
1590 
1591 double StandardModel::taub() const
1592 {
1593  double taub_tmp = 0.0;
1594  double Xt = myEWSMcache->Xt_GF();
1595  if (flag_order[EW1])
1596  taub_tmp += -2.0 * Xt;
1597  if (flag_order[EW1QCD1])
1598  taub_tmp += 2.0 / 3.0 * M_PI * Xt * myEWSMcache->alsMt();
1599  if (flag_order[EW1QCD2])
1600  taub_tmp += 0.0;
1601  if (flag_order[EW2])
1602  taub_tmp += -2.0 * Xt * Xt * myTwoLoopEW->tau_2();
1603  if (flag_order[EW2QCD1])
1604  taub_tmp += 0.0;
1605  if (flag_order[EW3])
1606  taub_tmp += 0.0;
1607 
1608  return taub_tmp;
1609 }
1610 
1612 {
1613  switch (q) {
1614  case QCD::UP:
1615  case QCD::CHARM:
1616  return ( -0.000113);
1617  case QCD::TOP:
1618  return ( 0.0);
1619  case QCD::DOWN:
1620  case QCD::STRANGE:
1621  return ( -0.000160);
1622  case QCD::BOTTOM:
1623  return ( -0.000040);
1624  default:
1625  throw std::runtime_error("Error in StandardModel::Delta_EWQCD");
1626  }
1627 }
1628 
1629 double StandardModel::RVq(const QCD::quark q) const
1630 {
1631  if (q == QCD::TOP) return 0.0;
1632 
1633  double mcMz, mbMz;
1634  mcMz = myEWSMcache->mf(getQuarks(CHARM), Mz, FULLNNLO);
1635  mbMz = myEWSMcache->mf(getQuarks(BOTTOM), Mz, FULLNNLO);
1636  //mcMz = 0.56381685; /* for debug */
1637  //mbMz = 2.8194352; /* for debug */
1638 
1639  double MtPole = mtpole;
1640 
1641  /* electric charge squared */
1642  double Qf2 = pow(quarks[q].getCharge(), 2.0);
1643 
1644  /* s = Mz^2 */
1645  double s = Mz * Mz;
1646 
1647  /* products of the charm and bottom masses at Mz */
1648  double mcMz2 = mcMz*mcMz;
1649  double mbMz2 = mbMz*mbMz;
1650  double mqMz2, mqdash4;
1651  switch (q) {
1652  case QCD::CHARM:
1653  mqMz2 = mcMz*mcMz;
1654  mqdash4 = mbMz2*mbMz2;
1655  break;
1656  case QCD::BOTTOM:
1657  mqMz2 = mbMz*mbMz;
1658  mqdash4 = mcMz2*mcMz2;
1659  break;
1660  default:
1661  mqMz2 = 0.0;
1662  mqdash4 = 0.0;
1663  break;
1664  }
1665 
1666  /* Logarithms */
1667  //double log_t = log(pow(quarks[TOP].getMass(),2.0)/s);
1668  double log_t = log(MtPole * MtPole / s); // the pole mass
1669  double log_c = log(mcMz2 / s);
1670  double log_b = log(mbMz2 / s);
1671  double log_q;
1672  switch (q) {
1673  case QCD::CHARM:
1674  case QCD::BOTTOM:
1675  log_q = log(mqMz2 / s);
1676  break;
1677  default:
1678  log_q = 0.0;
1679  break;
1680  }
1681 
1682  /* the active number of flavour */
1683  double nf = 5.0;
1684 
1685  /* zeta functions */
1686  double zeta2 = getMyEWSMcache()->getZeta2();
1687  double zeta3 = getMyEWSMcache()->getZeta3();
1688  //double zeta4 = getMyCache()->GetZeta4();
1689  double zeta5 = getMyEWSMcache()->getZeta5();
1690 
1691  /* massless non-singlet corrections */
1692  double C02 = 365.0 / 24.0 - 11.0 * zeta3 + (-11.0 / 12.0 + 2.0 / 3.0 * zeta3) * nf;
1693  double C03 = 87029.0 / 288.0 - 121.0 / 8.0 * zeta2 - 1103.0 / 4.0 * zeta3
1694  + 275.0 / 6.0 * zeta5
1695  + (-7847.0 / 216.0 + 11.0 / 6.0 * zeta2 + 262.0 / 9.0 * zeta3
1696  - 25.0 / 9.0 * zeta5) * nf
1697  + (151.0 / 162.0 - zeta2 / 18.0 - 19.0 / 27.0 * zeta3) * nf*nf;
1698  double C04 = -156.61 + 18.77 * nf - 0.7974 * nf * nf + 0.0215 * nf * nf*nf;
1699  //std::cout << "TEST: C02 = " << C02 << std::endl;// TEST (should be 1.40923)
1700  //std::cout << "TEST: C03 = " << C03 << std::endl;// TEST (should be -12.7671)
1701  //std::cout << "TEST: C04 = " << C04 << std::endl;// TEST (should be -80.0075)
1702 
1703  /* quadratic massive corrections */
1704  double C23 = -80.0 + 60.0 * zeta3 + (32.0 / 9.0 - 8.0 / 3.0 * zeta3) * nf;
1705  double C21V = 12.0;
1706  double C22V = 253.0 / 2.0 - 13.0 / 3.0 * nf;
1707  double C23V = 2522.0 - 855.0 / 2.0 * zeta2 + 310.0 / 3.0 * zeta3 - 5225.0 / 6.0 * zeta5
1708  + (-4942.0 / 27.0 + 34.0 * zeta2 - 394.0 / 27.0 * zeta3
1709  + 1045.0 / 27.0 * zeta5) * nf
1710  + (125.0 / 54.0 - 2.0 / 3.0 * zeta2) * nf*nf;
1711 
1712  /* quartic massive corrections */
1713  double C42 = 13.0 / 3.0 - 4.0 * zeta3;
1714  double C40V = -6.0;
1715  double C41V = -22.0;
1716  double C42V = -3029.0 / 12.0 + 162.0 * zeta2 + 112.0 * zeta3
1717  + (143.0 / 18.0 - 4.0 * zeta2 - 8.0 / 3.0 * zeta3) * nf;
1718  double C42VL = -11.0 / 2.0 + nf / 3.0;
1719 
1720  /* power suppressed top-mass correction */
1721  //double xt = s/pow(quarks[TOP].getMass(),2.0);
1722  double xt = s / MtPole / MtPole; // the pole mass
1723  double C2t = xt * (44.0 / 675.0 - 2.0 / 135.0 * (-log_t));
1724 
1725  /* rescaled strong coupling constant */
1726  double AlsMzPi = AlsMz / M_PI;
1727  double AlsMzPi2 = AlsMzPi*AlsMzPi;
1728  double AlsMzPi3 = AlsMzPi2*AlsMzPi;
1729  double AlsMzPi4 = AlsMzPi3*AlsMzPi;
1730 
1731  /* electromagnetic coupling at Mz */
1732  double alpMz = alphaMz();
1733 
1734  /* radiator function to the vector current */
1735  double RVf;
1736  RVf = 1.0 + 3.0 / 4.0 * Qf2 * alpMz / M_PI + AlsMzPi - Qf2 / 4.0 * alpMz / M_PI * AlsMzPi
1737  + (C02 + C2t) * AlsMzPi2 + C03 * AlsMzPi3 + C04 * AlsMzPi4
1738  + (mcMz2 + mbMz2) / s * C23 * AlsMzPi3
1739  + mqMz2 / s * (C21V * AlsMzPi + C22V * AlsMzPi2 + C23V * AlsMzPi3)
1740  + mcMz2 * mcMz2 / s / s * (C42 - log_c) * AlsMzPi2
1741  + mbMz2 * mbMz2 / s / s * (C42 - log_b) * AlsMzPi2
1742  + mqMz2 * mqMz2 / s / s * (C40V + C41V * AlsMzPi + (C42V + C42VL * log_q) * AlsMzPi2)
1743  + 12.0 * mqdash4 / s / s * AlsMzPi2
1744  - mqMz2 * mqMz2 * mqMz2 / s / s / s
1745  * (8.0 + 16.0 / 27.0 * (155.0 + 6.0 * log_q) * AlsMzPi);
1746  return RVf;
1747 }
1748 
1749 double StandardModel::RAq(const QCD::quark q) const
1750 {
1751  if (q == QCD::TOP) return 0.0;
1752 
1753  double mcMz, mbMz;
1754  mcMz = myEWSMcache->mf(getQuarks(CHARM), Mz, FULLNNLO);
1755  mbMz = myEWSMcache->mf(getQuarks(BOTTOM), Mz, FULLNNLO);
1756  //mcMz = 0.56381685; /* for debug */
1757  //mbMz = 2.8194352; /* for debug */
1758 
1759  double MtPole = mtpole;
1760 
1761  /* z-component of isospin */
1762  double I3q = quarks[q].getIsospin();
1763  /* electric charge squared */
1764  double Qf2 = pow(quarks[q].getCharge(), 2.0);
1765 
1766  /* s = Mz^2 */
1767  double s = Mz * Mz;
1768 
1769  /* products of the charm and bottom masses at Mz */
1770  double mcMz2 = mcMz*mcMz;
1771  double mbMz2 = mbMz*mbMz;
1772  double mqMz2, mqdash4;
1773  switch (q) {
1774  case QCD::CHARM:
1775  mqMz2 = mcMz*mcMz;
1776  mqdash4 = mbMz2*mbMz2;
1777  break;
1778  case QCD::BOTTOM:
1779  mqMz2 = mbMz*mbMz;
1780  mqdash4 = mcMz2*mcMz2;
1781  break;
1782  default:
1783  mqMz2 = 0.0;
1784  mqdash4 = 0.0;
1785  break;
1786  }
1787 
1788  /* Logarithms */
1789  //double log_t = log(pow(quarks[TOP].getMass(),2.0)/s);
1790  double log_t = log(MtPole * MtPole / s); // the pole mass
1791  double log_c = log(mcMz2 / s);
1792  double log_b = log(mbMz2 / s);
1793  double log_q;
1794  switch (q) {
1795  case QCD::CHARM:
1796  case QCD::BOTTOM:
1797  log_q = log(mqMz2 / s);
1798  break;
1799  default:
1800  log_q = 0.0;
1801  break;
1802  }
1803 
1804  /* the active number of flavour */
1805  double nf = 5.0;
1806 
1807  /* zeta functions */
1808  double zeta2 = getMyEWSMcache()->getZeta2();
1809  double zeta3 = getMyEWSMcache()->getZeta3();
1810  double zeta4 = getMyEWSMcache()->getZeta4();
1811  double zeta5 = getMyEWSMcache()->getZeta5();
1812 
1813  /* massless non-singlet corrections */
1814  double C02 = 365.0 / 24.0 - 11.0 * zeta3 + (-11.0 / 12.0 + 2.0 / 3.0 * zeta3) * nf;
1815  double C03 = 87029.0 / 288.0 - 121.0 / 8.0 * zeta2 - 1103.0 / 4.0 * zeta3
1816  + 275.0 / 6.0 * zeta5
1817  + (-7847.0 / 216.0 + 11.0 / 6.0 * zeta2 + 262.0 / 9.0 * zeta3
1818  - 25.0 / 9.0 * zeta5) * nf
1819  + (151.0 / 162.0 - zeta2 / 18.0 - 19.0 / 27.0 * zeta3) * nf*nf;
1820  double C04 = -156.61 + 18.77 * nf - 0.7974 * nf * nf + 0.0215 * nf * nf*nf;
1821  //std::cout << "TEST: C02 = " << C02 << std::endl;// TEST (should be 1.40923)
1822  //std::cout << "TEST: C03 = " << C03 << std::endl;// TEST (should be -12.7671)
1823  //std::cout << "TEST: C04 = " << C04 << std::endl;// TEST (should be -80.0075)
1824 
1825  /* quadratic massive corrections */
1826  double C23 = -80.0 + 60.0 * zeta3 + (32.0 / 9.0 - 8.0 / 3.0 * zeta3) * nf;
1827  double C20A = -6.0;
1828  double C21A = -22.0;
1829  double C22A = -8221.0 / 24.0 + 57.0 * zeta2 + 117.0 * zeta3
1830  + (151.0 / 12.0 - 2.0 * zeta2 - 4.0 * zeta3) * nf;
1831  double C23A = -4544045.0 / 864.0 + 1340.0 * zeta2 + 118915.0 / 36.0 * zeta3
1832  - 127.0 * zeta5
1833  + (71621.0 / 162.0 - 209.0 / 2.0 * zeta2 - 216.0 * zeta3
1834  + 5.0 * zeta4 + 55.0 * zeta5) * nf
1835  + (-13171.0 / 1944.0 + 16.0 / 9.0 * zeta2 + 26.0 / 9.0 * zeta3) * nf*nf;
1836 
1837  /* quartic massive corrections */
1838  double C42 = 13.0 / 3.0 - 4.0 * zeta3;
1839  double C40A = 6.0;
1840  double C41A = 10.0;
1841  double C42A = 3389.0 / 12.0 - 162.0 * zeta2 - 220.0 * zeta3
1842  + (-41.0 / 6.0 + 4.0 * zeta2 + 16.0 / 3.0 * zeta3) * nf;
1843  double C42AL = 77.0 / 2.0 - 7.0 / 3.0 * nf;
1844 
1845  /* power suppressed top-mass correction */
1846  //double xt = s/pow(quarks[TOP].getMass(),2.0);
1847  double xt = s / MtPole / MtPole; // the pole mass
1848  double C2t = xt * (44.0 / 675.0 - 2.0 / 135.0 * (-log_t));
1849 
1850  /* singlet axial-vector corrections */
1851  double I2 = -37.0 / 12.0 + (-log_t) + 7.0 / 81.0 * xt + 0.0132 * xt*xt;
1852  double I3 = -5075.0 / 216.0 + 23.0 / 6.0 * zeta2 + zeta3 + 67.0 / 18.0 * (-log_t)
1853  + 23.0 / 12.0 * log_t*log_t;
1854  double I4 = 49.0309 - 17.6637 * (-log_t) + 14.6597 * log_t * log_t
1855  + 3.6736 * (-log_t * log_t * log_t);
1856 
1857  /* rescaled strong coupling constant */
1858  double AlsMzPi = AlsMz / M_PI;
1859  double AlsMzPi2 = AlsMzPi*AlsMzPi;
1860  double AlsMzPi3 = AlsMzPi2*AlsMzPi;
1861  double AlsMzPi4 = AlsMzPi3*AlsMzPi;
1862 
1863  /* electromagnetic coupling at Mz */
1864  double alpMz = alphaMz();
1865 
1866  /* radiator function to the axial-vector current */
1867  double RAf;
1868  RAf = 1.0 + 3.0 / 4.0 * Qf2 * alpMz / M_PI + AlsMzPi - Qf2 / 4.0 * alpMz / M_PI * AlsMzPi
1869  + (C02 + C2t - 2.0 * I3q * I2) * AlsMzPi2
1870  + (C03 - 2.0 * I3q * I3) * AlsMzPi3
1871  + (C04 - 2.0 * I3q * I4) * AlsMzPi4
1872  + (mcMz2 + mbMz2) / s * C23 * AlsMzPi3
1873  + mqMz2 / s * (C20A + C21A * AlsMzPi + C22A * AlsMzPi2
1874  + 6.0 * (3.0 + log_t) * AlsMzPi2 + C23A * AlsMzPi3)
1875  //- 10.0*mqMz2/pow(quarks[TOP].getMass(),2.0)
1876  - 10.0 * mqMz2 / MtPole / MtPole // the pole mass
1877  * (8.0 / 81.0 + log_t / 54.0) * AlsMzPi2
1878  + mcMz2 * mcMz2 / s / s * (C42 - log_c) * AlsMzPi2
1879  + mbMz2 * mbMz2 / s / s * (C42 - log_b) * AlsMzPi2
1880  + mqMz2 * mqMz2 / s / s * (C40A + C41A * AlsMzPi
1881  + (C42A + C42AL * log_q) * AlsMzPi2)
1882  - 12.0 * mqdash4 / s / s*AlsMzPi2;
1883  return RAf;
1884 }
1885 
1886 double StandardModel::RVh() const
1887 {
1888  /* rescaled strong coupling constant */
1889  double AlsMzPi = AlsMz / M_PI;
1890  double AlsMzPi2 = AlsMzPi*AlsMzPi;
1891  double AlsMzPi3 = AlsMzPi2*AlsMzPi;
1892  double AlsMzPi4 = AlsMzPi3*AlsMzPi;
1893 
1894  gslpp::complex gV_sum(0.0, 0.0);
1895  gslpp::complex gV_q;
1896  for (int q = 0; q < 6; q++) {
1897  gV_q = gV_f(QCD::quarks[(QCD::quark)q]);
1898  if (q == (int) (QCD::TOP))
1899  gV_q = 0.0;
1900  gV_sum += gV_q;
1901  }
1902 
1903  // singlet vector corrections
1904  return ( gV_sum.abs2()*(-0.4132 * AlsMzPi3 - 4.9841 * AlsMzPi4));
1905 }
virtual double Gamma_had() const
The hadronic decay width of the boson, .
double computeAlpha() const
The CKM angle .
EWSMThreeLoopEW2QCD * myThreeLoopEW2QCD
A pointer to an object of type EWSMThreeLoopEW2QCD.
double DeltaRho(const double Mw_i) const
Leading three-loop contribution of to , denoted as .
double DeltaAlpha_l(const double s) const
Leptonic contribution of to the electromagnetic coupling , denoted as .
double X_extended(const std::string observable) const
, , , , , , , , , , , or .
double SMparamsForEWPO_cache[NumSMParamsForEWPO]
virtual double epsilon2() const
The SM contribution to the epsilon parameter .
double computeRt() const
.
double computeBeta() const
The CKM angle .
double abs2() const
virtual double epsilon1() const
The SM contribution to the epsilon parameter .
gslpp::matrix< gslpp::complex > Ye
The Yukawa matrix of the charged leptons.
bool isModelSUSY() const
Definition: Model.h:179
void ComputeDeltaR_rem(const double Mw_i, double DeltaR_rem[orders_EW_size]) const
A method to collect computed via subclasses.
double tau_2() const
The function .
double DeltaRho(const double Mw_i) const
Leading one-loop contribution of to , denoted as .
virtual bool PostUpdate()
The post-update method for StandardModel.
gslpp::complex deltaRho_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
virtual bool setFlagStr(const std::string name, const std::string value)
A method to set a flag of StandardModel.
gslpp::matrix< gslpp::complex > UPMNS
The PMNS matrix.
gslpp::matrix< gslpp::complex > VCKM
The CKM matrix.
gslpp::complex deltaKappa_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
static const int NumSMParamsForEWPO
The number of the SM parameters that are relevant to the EW precision observables.
virtual bool Update(const std::map< std::string, double > &DPars)
The update method for StandardModel.
virtual gslpp::complex deltaRhoZ_f(const Particle f) const
Flavour non-universal vertex corrections to , denoted by .
virtual gslpp::complex gA_f(const Particle f) const
The effective leptonic neutral-current axial-vector coupling in the SM.
gslpp::complex computelamc_d() const
The product of the CKM elements .
quark
An enum type for quarks.
Definition: QCD.h:730
bool useRhoZ_f_cache[12]
A class for particles.
Definition: Particle.h:26
virtual double Mw_tree() const
The tree-level mass of the boson, .
A base class for defining operations on matrices, both real and complex.
double getZeta3() const
A get method to access the value of the zeta function .
Definition: EWSMcache.h:146
A class for one-loop corrections to the EW precision observables.
The size of this enum.
double DeltaR_rem(const double Mw_i) const
Remainder contribution of to , denoted as .
A class for three-loop corrections to the EW precision observables.
EWSMThreeLoopEW * myThreeLoopEW
A pointer to an object of type EWSMThreeLoopEW.
double DeltaAlphaLepton_cache
A cache of the value of .
double DeltaAlpha() const
The total corrections to the electromagnetic coupling at the -mass scale, denoted as ...
double AlsMz
The strong coupling constant at the Z-boson mass, .
std::string FlagRhoZ
A string for the model flag RhoZ.
orders
An enum type for orders in QCD.
Definition: OrderScheme.h:31
virtual double epsilonb() const
The SM contribution to the epsilon parameter .
double computeBetas() const
The CKM angle .
bool flag_order[orders_EW_size]
An array of internal flags controlling the inclusions of higher-order corrections.
gslpp::complex deltaKappa_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
gslpp::complex computelamc_s() const
The product of the CKM elements .
static const std::string SMvars[NSMvars]
A string array containing the labels of the model parameters in StandardModel.
complex pow(const complex &z1, const complex &z2)
void setMass(double mass)
A set method to fix the particle mass.
Definition: Particle.h:70
Three-loop of .
gslpp::complex deltaKappa_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
double DeltaAlphaLepton(const double s) const
Leptonic contribution to the electromagnetic coupling , denoted as .
virtual bool CheckFlags() const
A method to check the sanity of the set of model flags.
virtual bool PostUpdate()
The post-update method for QCD.
Definition: QCD.cpp:323
bool requireCKM
An internal flag to control whether the CKM matrix has to be recomputed.
gslpp::matrix< gslpp::complex > Yn
The Yukawa matrix of the neutrinos.
virtual bool setFlagStr(const std::string name, const std::string value)
A method to set a flag of QCD.
Definition: QCD.cpp:822
bool IsFlagWithoutNonUniversalVC() const
A method to retrieve the model flag WithoutNonUniversalVC.
void setFlagCacheInEWSMcache(bool FlagCacheInEWSMcache)
A set method to change the model flag CacheInEWSMcache in StandardModel.
Definition: EWSMcache.h:83
const double & real() const
gslpp::complex deltaKappa_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
gslpp::complex computelamc() const
The product of the CKM elements .
double Als(const double mu, const orders order=FULLNLO) const
Computes the running strong coupling in the scheme. In the cases of LO, NLO and FULLNNLO...
Definition: QCD.cpp:1004
The parent class in Flavour for calculating all the Wilson coefficients for various Flavor Violating ...
Definition: Flavour.h:28
gslpp::complex deltaRho_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
double DeltaAlpha_t(const double s) const
Top-quark contribution of to the electromagnetic coupling , denoted as .
double ale
The fine-structure constant .
double DeltaR_rem(const double Mw_i) const
Remainder contribution of to , denoted as .
void setWolfenstein(double, double, double, double)
Definition: CKM.cpp:71
void setSMupdated()
a member used for the caching for .
Definition: Flavour.h:259
double mf(const Particle f, const double mu=0.0, const orders order=FULLNNLO) const
The mass of an SM fermion.
Definition: EWSMcache.cpp:49
std::string FlagKappaZ
A string for the model flag KappaZ.
double DeltaAlpha_l(const double s) const
Leptonic contribution of to the electromagnetic coupling , denoted as .
virtual double Gamma_inv() const
The invisible partial decay width of the boson, .
virtual double GammaZ(const Particle f) const
The partial decay width, .
bool UpdateError
A boolean set to false if update is successful.
Definition: Model.h:192
EWSMOneLoopEW * myOneLoopEW
A pointer to an object of type EWSMOneLoopEW.
double Delta_EWQCD(const QCD::quark q) const
The non-factorizable EW-QCD corrections to the partial widths for , denoted as .
double DeltaAlpha_l(const double s) const
Leptonic contribution of to the electromagnetic coupling , denoted as .
double RVh() const
The singlet vector corrections to the hadronic -boson width, denoted as .
bool requireYe
An internal flag to control whether the charged-lepton Yukawa matrix has to be recomputed.
virtual bool InitializeModel()
A method to initialize the model.
Definition: QCD.h:731
double computeRts() const
.
void ComputeDeltaRho(const double Mw_i, double DeltaRho[orders_EW_size]) const
A method to collect computed via subclasses.
double GF
The Fermi constant in .
gslpp::complex rhoZ_f_cache[12]
A cache of the value of .
double DeltaAlphaTop(const double s) const
Top-quark contribution to the electromagnetic coupling , denoted as .
double RVq(const QCD::quark q) const
The radiator factor associated with the final-state QED and QCD corrections to the the vector-current...
virtual double sin2thetaEff(const Particle f) const
The effective weak mixing angle for at the the -mass scale.
virtual void computeYukawas()
The method to compute the Yukawa matrices.
int getIndex() const
Definition: Particle.h:160
double sin2thetaEff(const Particle p) const
virtual bool setFlag(const std::string name, const bool value)
A method to set a flag of QCD.
Definition: QCD.cpp:816
double a_f(const Particle f) const
The tree-level axial-vector coupling for , denoted as .
Definition: EWSMcache.h:301
virtual double sigma0_had() const
The hadronic cross section for at the -pole, .
double Xt_GF() const
The quantity with the coupling .
Definition: EWSMcache.h:343
StandardModelMatching * myStandardModelMatching
A pointer to an object of type StandardModelMatching.
virtual bool CheckFlags() const
A method to check the sanity of the set of model flags.
Definition: QCD.cpp:828
gslpp::complex deltaRho_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
static const double GeVminus2_to_nb
double DeltaAlpha_cache
A cache of the value of .
double MwbarFromMw(const double Mw) const
A method to convert the -boson mass in the experimental/running-width scheme to that in the complex-p...
double mHl
The Higgs mass in GeV.
double delSin2th_l
The theoretical uncertainty in , denoted as .
double DeltaR_TwoLoopEW_rem(const double Mw_i) const
.
gslpp::matrix< gslpp::complex > Yu
The Yukawa matrix of the up-type quarks.
gslpp::complex computelamu() const
The product of the CKM elements .
double alsMt() const
The strong coupling at NNLO.
Definition: EWSMcache.h:378
Two-loop of .
A class for the matching in the Standard Model.
Definition: QCD.h:735
EWSMcache * getMyEWSMcache() const
A get method to retrieve the member pointer of type EWSMcache.
double DeltaAlpha_t(const double s) const
Top-quark contribution of to the electromagnetic coupling , denoted as .
double SchemeToDouble(const std::string scheme) const
A method to convert a given scheme name in string form into a floating-point number with double preci...
gslpp::complex deltaRho_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
void setModelInitialized(bool ModelInitialized)
A set method to fix the failure or success of the initialization of the model.
Definition: Model.h:142
virtual double Mw() const
The SM prediction for the -boson mass in the on-shell scheme, .
double DeltaR_rem(const double Mw_i) const
Remainder contribution of to , denoted as .
double rhob
The CKM parameter in the Wolfenstein parameterization.
double DeltaR_rem(const double Mw_i) const
Remainder contribution of to , denoted as .
A class for cache variables used in computing radiative corrections to the EW precision observables...
Definition: EWSMcache.h:40
static const double Mw_error
The target accuracy of the iterative calculation of the -boson mass in units of GeV.
double getZeta5() const
A get method to access the value of the zeta function .
Definition: EWSMcache.h:164
An observable class for the leptonic effective weak mixing angle at the pole.
Definition: sin2thetaEff.h:28
bool is(std::string name_i) const
Definition: Particle.cpp:23
double Mw_cache
A cache of the value of .
double Mz
The mass of the boson in GeV.
virtual ~StandardModel()
The default destructor.
bool IsModelInitialized() const
A method to check if the model is initialized.
Definition: Model.h:133
gslpp::complex kappaZ_f_cache[12]
A cache of the value of .
double DeltaAlpha_l(const double s) const
Leptonic contribution of to the electromagnetic coupling , denoted as .
bool IsFlagNoApproximateGammaZ() const
A method to retrieve the model flag NoApproximateGammaZ.
bool useDeltaAlpha_cache
virtual gslpp::complex rhoZ_f(const Particle f) const
The effective leptonic neutral-current coupling in the SM.
gslpp::complex deltaKappa_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
virtual double epsilon3() const
The SM contribution to the epsilon parameter .
double sW2() const
virtual bool PreUpdate()
The pre-update method for QCD.
Definition: QCD.cpp:296
double dAle5Mz
The five-flavour hadronic contribution to the electromagnetic coupling, .
virtual double v() const
The Higgs vacuum expectation value. where is the Fermi constant, measured through muon decays...
gslpp::complex computelamt_d() const
The product of the CKM elements .
bool requireYn
An internal flag to control whether the neutrino Yukawa matrix has to be recomputed.
double getZeta2() const
A get method to access the value of the zeta function .
Definition: EWSMcache.h:137
void updateSMParameters()
Updates to new Standard Model parameter sets.
double delta_f(const Particle f, const double Mw_i) const
.
Definition: EWSMcache.h:323
double DeltaAlphaL5q() const
The sum of the leptonic and the five-flavour hadronic corrections to the electromagnetic coupling at...
A class for approximate formulae of the EW precision observables.
virtual bool Init(const std::map< std::string, double > &DPars)
A method to initialize the model parameters.
virtual void setParameter(const std::string name, const double &value)
A method to set the value of a parameter of StandardModel.
double getCharge() const
A get method to access the particle charge.
Definition: Particle.h:97
virtual bool PreUpdate()
The pre-update method for StandardModel.
double DeltaAlpha_t(const double s) const
Top-quark contribution of to the electromagnetic coupling , denoted as .
The parent class in LeptonFlavour for calculating all the Wilson coefficients for various Lepton Flav...
Definition: LeptonFlavour.h:32
Definition: OrderScheme.h:33
double muw
A matching scale around the weak scale in GeV.
Flavour * myFlavour
A pointer to an object of the type Flavour.
EWSMcache * myEWSMcache
A pointer to an object of type EWSMcache.
CKM myCKM
An object of type CKM.
virtual bool CheckParameters(const std::map< std::string, double > &DPars)
A method to check if all the mandatory parameters for StandardModel have been provided in model initi...
Definition: QCD.cpp:804
gslpp::complex computelamu_d() const
The product of the CKM elements .
double DeltaRbar_rem(const double Mw_i) const
.
virtual void computeCKM()
The method to compute the CKM matrix.
Definition: QCD.h:732
double lambda
The CKM parameter in the Wolfenstein parameterization.
double rho_GammaW(const Particle fi, const Particle fj, const double Mw_i) const
EW radiative corrections to the width of , denoted as .
virtual gslpp::complex kappaZ_f(const Particle f) const
The effective leptonic neutral-current coupling in the SM.
bool useDeltaAlphaLepton_cache
Particle getQuarks(const quark q) const
A get method to access a quark as an object of the type Particle.
Definition: QCD.h:869
double getZeta4() const
A get method to access the value of the zeta function .
Definition: EWSMcache.h:155
double MwFromMwbar(const double Mwbar) const
A method to convert the -boson mass in the complex-pole/fixed-width scheme to that in the experimenta...
gslpp::complex deltaKappa_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
double resumRhoZ(const double DeltaRho[orders_EW_size], const double deltaRho_rem[orders_EW_size], const double DeltaRbar_rem, const bool bool_Zbb) const
A method to compute the real part of the effective coupling from , and .
gslpp::complex computelamt_s() const
The product of the CKM elements .
void setFlagCacheInStandardModel(bool FlagCacheInStandardModel)
A set method to change the model flag CacheInStandardModel of StandardModel.
double delGammaZ
The theoretical uncertainty in , denoted as , in GeV.
virtual double cW2() const
gslpp::matrix< gslpp::complex > Yd
The Yukawa matrix of the down-type quarks.
double taub() const
Top-mass corrections to the vertex, denoted by .
Three-loop of .
virtual double DeltaRbar() const
The SM prediction for derived from that for the -boson mass.
std::string getName() const
Definition: Particle.h:147
virtual bool CheckParameters(const std::map< std::string, double > &DPars)
A method to check if all the mandatory parameters for StandardModel have been provided in model initi...
One-loop of .
double AlsWithInit(const double mu, const double alsi, const double mu_i, const orders order) const
Computes the running strong coupling from in the scheme, where it is forbidden to across a flavour...
Definition: QCD.cpp:903
Particle leptons[6]
An array of Particle objects for the leptons.
double DeltaAlpha_t(const double s) const
Top-quark contribution of to the electromagnetic coupling , denoted as .
bool checkSMparamsForEWPO()
A method to check whether the parameters relevant to the EWPO are updated.
A class for two-loop corrections to the EW precision observables.
Definition: EWSMTwoLoopEW.h:57
double DeltaAlpha_l(const double s) const
Leptonic contribution of to the electromagnetic coupling , denoted as .
double abs() const
const double & getMass() const
A get method to access the particle mass.
Definition: Particle.h:61
double computeRb() const
.
virtual gslpp::complex deltaKappaZ_f(const Particle f) const
Flavour non-universal vertex corrections to , denoted by .
virtual double AFB(const Particle f) const
An observable class for the -boson mass.
Definition: Mw.h:22
bool FlagCacheInStandardModel
A flag for caching (true by default).
virtual double Gamma_Z() const
The total decay width of the boson, .
double RAq(const QCD::quark q) const
The radiator factor associated with the final-state QED and QCD corrections to the the axial-vector-c...
double Mzbar() const
The -boson mass in the complex-pole/fixed-width scheme.
double c02() const
The square of the cosine of the weak mixing angle defined without weak radiative corrections...
virtual gslpp::complex gV_f(const Particle f) const
The effective leptonic neutral-current vector coupling in the SM.
double etab
The CKM parameter in the Wolfenstein parameterization.
double DeltaAlpha_l(const double s) const
Leptonic contribution of to the electromagnetic coupling , denoted as .
virtual double GammaW() const
The total width of the boson, .
const double & imag() const
virtual double DeltaR() const
The SM prediction for derived from that for the boson mass.
bool FlagWithoutNonUniversalVC
A boolean for the model flag WithoutNonUniversalVC.
virtual double rho_GammaW(const Particle fi, const Particle fj) const
EW radiative corrections to the width of , denoted as .
EWSMTwoFermionsLEP2 * myTwoFermionsLEP2
A pointer to an object of type EWSMTwoFermionsLEP2.
Definition: VCKM.h:13
double DeltaRho(const double Mw_i) const
Leading three-loop QCD contribution of to , denoted as .
EWSMApproximateFormulae * myApproximateFormulae
A pointer to an object of type EWSMApproximateFormulae.
EWSMThreeLoopQCD * myThreeLoopQCD
A pointer to an object of type EWSMThreeLoopQCD.
gslpp::complex FZ(const double s, const double Mw_i) const
The unified form factor .
A class for two-loop corrections to the EW precision observables.
A class for three-loop corrections to the EW precision observables.
complex log(const complex &z)
double ale_OS(const double mu, orders order=FULLNLO) const
The running electromagnetic coupling in the on-shell schem.
double DeltaRho(const double Mw_i) const
Leading three-loop contribution of to , denoted as .
EWSMTwoLoopEW * myTwoLoopEW
A pointer to an object of type EWSMTwoLoopEW.
double DeltaR_rem(const double Mw_i) const
Remainder contribution of to , denoted as .
virtual bool Init(const std::map< std::string, double > &DPars)
Initializes the QCD parameters found in the argument.
Definition: QCD.cpp:287
bool useKappaZ_f_cache[12]
A class for three-loop corrections to the EW precision observables.
LeptonFlavour * myLeptonFlavour
A pointer to an object of the type LeptonFlavour.
virtual double A_f(const Particle f) const
The left-right asymmetry in at the -pole, .
double s02() const
The square of the sine of the weak mixing angle defined without weak radiative corrections.
StandardModel()
The default constructor.
EWSMTwoLoopQCD * myTwoLoopQCD
A pointer to an object of type EWSMTwoLoopQCD.
double GammaW_cache
A cache of the value of .
double DeltaR_rem(const double Mw_i) const
Remainder contribution of to , denoted as .
gslpp::complex deltaRho_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
double v_f(const Particle f, const double Mw_i) const
The tree-level vector coupling for , denoted as .
Definition: EWSMcache.h:290
double delMw
The theoretical uncertainty in , denoted as , in GeV.
double resumKappaZ(const double DeltaRho[orders_EW_size], const double deltaKappa_rem[orders_EW_size], const double DeltaRbar_rem, const bool bool_Zbb) const
A method to compute the real part of the effetvive coupling from , and .
bool FlagNoApproximateGammaZ
A boolean for the model flag NoApproximateGammaZ.
gslpp::complex computelamu_s() const
The product of the CKM elements .
A class for defining operations on and functions of complex numbers.
Definition: gslpp_complex.h:35
virtual double R0_f(const Particle f) const
The ratio .
double alphaMz() const
The electromagnetic coupling at the -mass scale, .
std::string ModelName() const
A method to fetch the name of the model.
Definition: Model.h:56
double DeltaRho(const double Mw_i) const
Leading two-loop contribution of to , denoted as .
bool checkEWPOscheme(const std::string scheme) const
A method to check if a given scheme name in string form is valid.
virtual bool setFlag(const std::string name, const bool value)
A method to set a flag of StandardModel.
Three-loop of .
A class for parameters related to QCD, hadrons and quarks.
Definition: QCD.h:707
static const int NSMvars
The number of the model parameters in StandardModel.
orders_EW
An enumerated type representing perturbative orders of radiative corrections to EW precision observab...
double DeltaAlpha_t(const double s) const
Top-quark contribution of to the electromagnetic coupling , denoted as .
gslpp::complex computelamt() const
The product of the CKM elements .
double A
The CKM parameter in the Wolfenstein parameterization.
std::map< std::string, boost::reference_wrapper< const double > > ModelParamMap
Definition: Model.h:200
double getIsospin() const
A get method to access the particle isospin.
Definition: Particle.h:115
gslpp::complex deltaRho_rem_f(const Particle f, const double Mw_i) const
Remainder contribution of to the effective couplings , denoted as .
gslpp::complex FW(const double s, const Particle f, const double Mw_i) const
The unified form factor for .
void getCKM(gslpp::matrix< gslpp::complex > &) const
Definition: CKM.cpp:58
double DeltaAlpha_t(const double s) const
Top-quark contribution of to the electromagnetic coupling , denoted as .
double computeGamma() const
The CKM angle .
virtual void setParameter(const std::string name, const double &value)=0
A method to set the value of a parameter of the model.
double DeltaRho(const double Mw_i) const
Leading two-loop QCD contribution of to , denoted as .
double Mw() const
The -boson mass with the full two-loop EW corrections.
double resumMw(const double Mw_i, const double DeltaRho[orders_EW_size], const double DeltaR_rem[orders_EW_size]) const
A method to compute the -boson mass from and .
std::string FlagMw
A string for the model flag Mw.
complex sqrt(const complex &z)