8 #include "StandardModel.h"
22 const int AlphaStrong::NITER = 10;
25 const double AlphaStrong::MC = 1.5;
26 const double AlphaStrong::MB = 4.8;
27 const double AlphaStrong::MZ = 91.188;
31 const double AlphaStrong::SAFETYMARGIN1 = 1.07;
32 const double AlphaStrong::SAFETYMARGIN2 = 1.33;
38 void AlphaStrong::init(
double valueIn,
int orderIn) {
42 order = max( 0, min( 2, orderIn ) );
46 Lambda3Save = Lambda4Save = Lambda5Save = scale2Min = 0.;
49 }
else if (order == 1) {
50 Lambda5Save = MZ * exp( -6. * M_PI / (23. * valueRef) );
51 Lambda4Save = Lambda5Save * pow(MB/Lambda5Save, 2./25.);
52 Lambda3Save = Lambda4Save * pow(MC/Lambda4Save, 2./27.);
53 scale2Min = pow2(SAFETYMARGIN1 * Lambda3Save);
57 double b15 = 348. / 529.;
58 double b14 = 462. / 625.;
59 double b13 = 64. / 81.;
60 double b25 = 224687. / 242208.;
61 double b24 = 548575. / 426888.;
62 double b23 = 938709. / 663552.;
63 double logScale, loglogScale, correction, valueIter;
66 Lambda5Save = MZ * exp( -6. * M_PI / (23. * valueRef) );
67 for (
int iter = 0; iter < NITER; ++iter) {
68 logScale = 2. * log(MZ/Lambda5Save);
69 loglogScale = log(logScale);
70 correction = 1. - b15 * loglogScale / logScale
71 + pow2(b15 / logScale) * (pow2(loglogScale - 0.5) + b25 - 1.25);
72 valueIter = valueRef / correction;
73 Lambda5Save = MZ * exp( -6. * M_PI / (23. * valueIter) );
77 double logScaleB = 2. * log(MB/Lambda5Save);
78 double loglogScaleB = log(logScaleB);
79 double valueB = 12. * M_PI / (23. * logScaleB)
80 * (1. - b15 * loglogScaleB / logScaleB
81 + pow2(b15 / logScaleB) * (pow2(loglogScaleB - 0.5) + b25- 1.25) );
82 Lambda4Save = Lambda5Save;
83 for (
int iter = 0; iter < NITER; ++iter) {
84 logScale = 2. * log(MB/Lambda4Save);
85 loglogScale = log(logScale);
86 correction = 1. - b14 * loglogScale / logScale
87 + pow2(b14 / logScale) * (pow2(loglogScale - 0.5) + b24 - 1.25);
88 valueIter = valueB / correction;
89 Lambda4Save = MB * exp( -6. * M_PI / (25. * valueIter) );
93 double logScaleC = 2. * log(MC/Lambda4Save);
94 double loglogScaleC = log(logScaleC);
95 double valueC = 12. * M_PI / (25. * logScaleC)
96 * (1. - b14 * loglogScaleC / logScaleC
97 + pow2(b14 / logScaleC) * (pow2(loglogScaleC - 0.5) + b24 - 1.25) );
98 Lambda3Save = Lambda4Save;
99 for (
int iter = 0; iter < NITER; ++iter) {
100 logScale = 2. * log(MC/Lambda3Save);
101 loglogScale = log(logScale);
102 correction = 1. - b13 * loglogScale / logScale
103 + pow2(b13 / logScale) * (pow2(loglogScale - 0.5) + b23 - 1.25);
104 valueIter = valueC / correction;
105 Lambda3Save = MC * exp( -6. * M_PI / (27. * valueIter) );
107 scale2Min = pow2(SAFETYMARGIN2 * Lambda3Save);
113 Lambda3Save2 = pow2(Lambda3Save);
114 Lambda4Save2 = pow2(Lambda4Save);
115 Lambda5Save2 = pow2(Lambda5Save);
126 double AlphaStrong::alphaS(
double scale2) {
129 if (!isInit)
return 0.;
130 if (scale2 < scale2Min) scale2 = scale2Min;
133 if (scale2 == scale2Now && (order < 2 || lastCallToFull))
return valueNow;
135 lastCallToFull =
true;
142 }
else if (order == 1) {
144 valueNow = 12. * M_PI / (23. * log(scale2/Lambda5Save2));
145 else if (scale2 > mc2)
146 valueNow = 12. * M_PI / (25. * log(scale2/Lambda4Save2));
147 else valueNow = 12. * M_PI / (27. * log(scale2/Lambda3Save2));
151 double Lambda2, b0, b1, b2;
153 Lambda2 = Lambda5Save2;
156 b2 = 224687. / 242208.;
157 }
else if (scale2 > mc2) {
158 Lambda2 = Lambda4Save2;
161 b2 = 548575. / 426888.;
163 Lambda2 = Lambda3Save2;
166 b2 = 938709. / 663552.;
168 double logScale = log(scale2/Lambda2);
169 double loglogScale = log(logScale);
170 valueNow = 12. * M_PI / (b0 * logScale)
171 * ( 1. - b1 * loglogScale / logScale
172 + pow2(b1 / logScale) * (pow2(loglogScale - 0.5) + b2 - 1.25) );
185 double AlphaStrong::alphaS1Ord(
double scale2) {
188 if (!isInit)
return 0.;
189 if (scale2 < scale2Min) scale2 = scale2Min;
192 if (scale2 == scale2Now && (order < 2 || !lastCallToFull))
return valueNow;
194 lastCallToFull =
false;
203 valueNow = 12. * M_PI / (23. * log(scale2/Lambda5Save2));
204 else if (scale2 > mc2)
205 valueNow = 12. * M_PI / (25. * log(scale2/Lambda4Save2));
206 else valueNow = 12. * M_PI / (27. * log(scale2/Lambda3Save2));
218 double AlphaStrong::alphaS2OrdCorr(
double scale2) {
221 if (!isInit)
return 1.;
222 if (scale2 < scale2Min) scale2 = scale2Min;
225 if (order < 2)
return 1.;
228 double Lambda2, b1, b2;
230 Lambda2 = Lambda5Save2;
232 b2 = 224687. / 242208.;
233 }
else if (scale2 > mc2) {
234 Lambda2 = Lambda4Save2;
236 b2 = 548575. / 426888.;
238 Lambda2 = Lambda3Save2;
240 b2 = 938709. / 663552.;
242 double logScale = log(scale2/Lambda2);
243 double loglogScale = log(logScale);
244 return ( 1. - b1 * loglogScale / logScale
245 + pow2(b1 / logScale) * (pow2(loglogScale - 0.5) + b2 - 1.25) );
258 const double AlphaEM::MZ = 91.188;
261 const double AlphaEM::Q2STEP[5] = {0.26e-6, 0.011, 0.25, 3.5, 90.};
265 const double AlphaEM::BRUNDEF[5] = {0.1061, 0.2122, 0.460, 0.700, 0.725};
271 void AlphaEM::init(
int orderIn, Settings* settingsPtr) {
275 alpEM0 = settingsPtr->parm(
"StandardModel:alphaEM0");
276 alpEMmZ = settingsPtr->parm(
"StandardModel:alphaEMmZ");
280 if (order <= 0)
return;
281 for (
int i = 0; i < 5; ++i) bRun[i] = BRUNDEF[i];
284 alpEMstep[4] = alpEMmZ / ( 1. + alpEMmZ * bRun[4]
285 * log(mZ2 / Q2STEP[4]) );
286 alpEMstep[3] = alpEMstep[4] / ( 1. - alpEMstep[4] * bRun[3]
287 * log(Q2STEP[3] / Q2STEP[4]) );
290 alpEMstep[0] = alpEM0;
291 alpEMstep[1] = alpEMstep[0] / ( 1. - alpEMstep[0] * bRun[0]
292 * log(Q2STEP[1] / Q2STEP[0]) );
293 alpEMstep[2] = alpEMstep[1] / ( 1. - alpEMstep[1] * bRun[1]
294 * log(Q2STEP[2] / Q2STEP[1]) );
297 bRun[2] = (1./alpEMstep[3] - 1./alpEMstep[2])
298 / log(Q2STEP[2] / Q2STEP[3]);
306 double AlphaEM::alphaEM(
double scale2) {
309 if (order == 0)
return alpEM0;
310 if (order < 0)
return alpEMmZ;
313 for (
int i = 4; i >= 0; --i)
if (scale2 > Q2STEP[i])
314 return alpEMstep[i] / (1. - bRun[i] * alpEMstep[i]
315 * log(scale2 / Q2STEP[i]) );
327 const double CoupSM::efSave[20] = { 0., -1./3., 2./3., -1./3., 2./3., -1./3.,
328 2./3., -1./3., 2./3., 0., 0., -1., 0., -1., 0., -1., 0., -1., 0., 0.};
329 const double CoupSM::afSave[20] = { 0., -1., 1., -1., 1., -1., 1., -1., 1.,
330 0., 0., -1., 1., -1., 1., -1., 1., -1., 1., 0.};
336 void CoupSM::init(Settings& settings, Rndm* rndmPtrIn) {
342 double alphaSvalue = settings.parm(
"SigmaProcess:alphaSvalue");
343 int alphaSorder = settings.mode(
"SigmaProcess:alphaSorder");
344 alphaSlocal.init( alphaSvalue, alphaSorder);
347 int order = settings.mode(
"SigmaProcess:alphaEMorder");
348 alphaEMlocal.init( order, &settings);
351 s2tW = settings.parm(
"StandardModel:sin2thetaW");
353 s2tWbar = settings.parm(
"StandardModel:sin2thetaWbar");
354 GFermi = settings.parm(
"StandardModel:GF");
357 for (
int i = 0; i < 20; ++i) {
358 vfSave[i] = afSave[i] - 4. * s2tWbar * efSave[i];
359 lfSave[i] = afSave[i] - 2. * s2tWbar * efSave[i];
360 rfSave[i] = - 2. * s2tWbar * efSave[i];
361 ef2Save[i] = pow2(efSave[i]);
362 vf2Save[i] = pow2(vfSave[i]);
363 af2Save[i] = pow2(afSave[i]);
364 efvfSave[i] = efSave[i] * vfSave[i];
365 vf2af2Save[i] = vf2Save[i] + af2Save[i];
369 VCKMsave[1][1] = settings.parm(
"StandardModel:Vud");
370 VCKMsave[1][2] = settings.parm(
"StandardModel:Vus");
371 VCKMsave[1][3] = settings.parm(
"StandardModel:Vub");
372 VCKMsave[2][1] = settings.parm(
"StandardModel:Vcd");
373 VCKMsave[2][2] = settings.parm(
"StandardModel:Vcs");
374 VCKMsave[2][3] = settings.parm(
"StandardModel:Vcb");
375 VCKMsave[3][1] = settings.parm(
"StandardModel:Vtd");
376 VCKMsave[3][2] = settings.parm(
"StandardModel:Vts");
377 VCKMsave[3][3] = settings.parm(
"StandardModel:Vtb");
380 VCKMsave[1][4] = settings.parm(
"FourthGeneration:VubPrime");
381 VCKMsave[2][4] = settings.parm(
"FourthGeneration:VcbPrime");
382 VCKMsave[3][4] = settings.parm(
"FourthGeneration:VtbPrime");
383 VCKMsave[4][1] = settings.parm(
"FourthGeneration:VtPrimed");
384 VCKMsave[4][2] = settings.parm(
"FourthGeneration:VtPrimes");
385 VCKMsave[4][3] = settings.parm(
"FourthGeneration:VtPrimeb");
386 VCKMsave[4][4] = settings.parm(
"FourthGeneration:VtPrimebPrime");
389 for(
int i = 1; i < 5; ++i)
for(
int j = 1; j < 5; ++j)
390 V2CKMsave[i][j] = pow2(VCKMsave[i][j]);
393 V2CKMout[1] = V2CKMsave[1][1] + V2CKMsave[2][1];
394 V2CKMout[2] = V2CKMsave[1][1] + V2CKMsave[1][2] + V2CKMsave[1][3];
395 V2CKMout[3] = V2CKMsave[1][2] + V2CKMsave[2][2];
396 V2CKMout[4] = V2CKMsave[2][1] + V2CKMsave[2][2] + V2CKMsave[2][3];
397 V2CKMout[5] = V2CKMsave[1][3] + V2CKMsave[2][3];
398 V2CKMout[6] = V2CKMsave[3][1] + V2CKMsave[3][2] + V2CKMsave[3][3];
399 V2CKMout[7] = V2CKMsave[1][4] + V2CKMsave[2][4];
400 V2CKMout[8] = V2CKMsave[4][1] + V2CKMsave[4][2] + V2CKMsave[4][3];
401 for (
int i = 11; i <= 18; ++i) V2CKMout[i] = 1.;
409 double CoupSM::VCKMid(
int id1,
int id2) {
412 int id1Abs = abs(id1);
413 int id2Abs = abs(id2);
414 if (id1Abs == 0 || id2Abs == 0 || (id1Abs + id2Abs)%2 != 1)
return 0.;
417 if (id1Abs%2 == 1) swap(id1Abs, id2Abs);
418 if (id1Abs <= 8 && id2Abs <= 8)
return VCKMsave[id1Abs/2][(id2Abs + 1)/2];
419 if ( (id1Abs == 12 || id1Abs == 14 || id1Abs == 16 || id1Abs == 18)
420 && id2Abs == id1Abs - 1 )
return 1.;
431 double CoupSM::V2CKMid(
int id1,
int id2) {
434 int id1Abs = abs(id1);
435 int id2Abs = abs(id2);
436 if (id1Abs == 0 || id2Abs == 0 || (id1Abs + id2Abs)%2 != 1)
return 0.;
439 if (id1Abs%2 == 1) swap(id1Abs, id2Abs);
440 if (id1Abs <= 8 && id2Abs <= 8)
return V2CKMsave[id1Abs/2][(id2Abs + 1)/2];
441 if ( (id1Abs == 12 || id1Abs == 14 || id1Abs == 16 || id1Abs == 18)
442 && id2Abs == id1Abs - 1 )
return 1.;
453 int CoupSM::V2CKMpick(
int id) {
460 if (idIn >= 1 && idIn <= 8) {
461 double V2CKMrndm = rndmPtr->flat() * V2CKMout[idIn];
462 if (idIn == 1) idOut = (V2CKMrndm < V2CKMsave[1][1]) ? 2 : 4;
463 else if (idIn == 2) idOut = (V2CKMrndm < V2CKMsave[1][1]) ? 1
464 : ( (V2CKMrndm < V2CKMsave[1][1] + V2CKMsave[1][2]) ? 3 : 5 );
465 else if (idIn == 3) idOut = (V2CKMrndm < V2CKMsave[1][2]) ? 2 : 4;
466 else if (idIn == 4) idOut = (V2CKMrndm < V2CKMsave[2][1]) ? 1
467 : ( (V2CKMrndm < V2CKMsave[2][1] + V2CKMsave[2][2]) ? 3 : 5 );
468 else if (idIn == 5) idOut = (V2CKMrndm < V2CKMsave[1][3]) ? 2 : 4;
469 else if (idIn == 6) idOut = (V2CKMrndm < V2CKMsave[3][1]) ? 1
470 : ( (V2CKMrndm < V2CKMsave[3][1] + V2CKMsave[3][2]) ? 3 : 5 );
471 else if (idIn == 7) idOut = (V2CKMrndm < V2CKMsave[1][4]) ? 2 : 4;
472 else if (idIn == 8) idOut = (V2CKMrndm < V2CKMsave[4][1]) ? 1
473 : ( (V2CKMrndm < V2CKMsave[4][1] + V2CKMsave[4][2]) ? 3 : 5 );
476 }
else if (idIn >= 11 && idIn <= 18) {
477 if (idIn%2 == 1) idOut = idIn + 1;
478 else idOut = idIn - 1;
482 return ( (
id > 0) ? idOut : -idOut );