3 #include "PhotosUtilities.h"
11 using namespace Photospp;
16 double (*PhotosMEforZ::currentVakPol)(
double[4],
double[4],
double[4],
double[4],
double[4], int, int) = default_VakPol;
21 double PHINT(
int idumm);
34 void PhotosMEforZ::GIVIZO(
int IDFERM,
int IHELIC,
double* SIZO3,
double* CHARGE,
int* KOLOR)
37 int IH, IDTYPE, IC, LEPQUA, IUPDOW;
38 if (IDFERM == 0 || abs(IDFERM) > 4 || abs(IHELIC) != 1) {
39 cout <<
"STOP IN GIVIZO: WRONG PARAMS" << endl;
46 LEPQUA = (int)(IDTYPE * 0.4999999);
47 IUPDOW = IDTYPE - 2 * LEPQUA - 1;
48 *CHARGE = (-IUPDOW + 2.0 / 3.0 * LEPQUA) * IC;
49 *SIZO3 = 0.25 * (IC - IH) * (1 - 2 * IUPDOW);
50 *KOLOR = 1 + 2 * LEPQUA;
65 double s, Sw2, MZ, MZ2, GammZ, AlfInv, GFermi;
66 double Ve, Ae, thresh;
67 double xe, yf, xf, ye, ff0, ff1, amx2, amfin, Vf, Af;
68 double ReChiZ, SqChiZ, RaZ;
91 Ve = 2 * T3e - 4 * qe * Sw2;
95 Vf = 2 * T3f - 4 * qf * Sw2;
97 if (fabs(costhe) > 1.0) {
98 cout <<
"+++++STOP in PHBORN: costhe>0 =" << costhe << endl;
102 RaZ = (GFermi * MZ2 * AlfInv) / (sqrt(2.0) * 8.0 * PI);
103 RaZ = 1 / (16.0 * Sw2 * (1.0 - Sw2));
106 if (KeyWidFix == 0) {
107 ReChiZ = (s - MZ2) * s / ((s - MZ2) * (s - MZ2) + (GammZ * s / MZ) * (GammZ * s / MZ)) * RaZ;
108 SqChiZ = s * s / ((s - MZ2) * (s - MZ2) + (GammZ * s / MZ) * (GammZ * s / MZ)) * RaZ * RaZ;
110 ReChiZ = (s - MZ2) * s / ((s - MZ2) * (s - MZ2) + (GammZ * MZ) * (GammZ * MZ)) * RaZ;
111 SqChiZ = s * s / ((s - MZ2) * (s - MZ2) + (GammZ * MZ) * (GammZ * MZ)) * RaZ * RaZ;
113 xe = Ve * Ve + Ae * Ae;
114 xf = Vf * Vf + Af * Af;
117 ff0 = qe * qe * qf * qf + 2 * ReChiZ * qe * qf * Ve * Vf + SqChiZ * xe * xf;
118 ff1 = +2 * ReChiZ * qe * qf * Ae * Af + SqChiZ * ye * yf;
119 Born = (1.0 + costhe * costhe) * ff0 + 2.0 * costhe * ff1;
123 if (svar < 4.0 * amfin * amfin) {
125 }
else if (svar < 16.0 * amfin * amfin) {
126 amx2 = 4.0 * amfin * amfin / svar;
127 thresh = sqrt(1.0 - amx2) * (1.0 + amx2 / 2.0);
132 Born = Born * thresh;
144 double PhotosMEforZ::AFBCALC(
double SVAR,
int IDEE,
int IDFF)
147 double T3e, qe, T3f, qf, A, B;
148 GIVIZO(IDEE, -1, &T3e, &qe, &KOLOR);
149 GIVIZO(IDFF, -1, &T3f, &qf, &KOLOR1);
151 A = PHBORNM(SVAR, 0.5, T3e, qe, T3f, qf, KOLOR * KOLOR1);
152 B = PHBORNM(SVAR, -0.5, T3e, qe, T3f, qf, KOLOR * KOLOR1);
153 return (A - B) / (A + B) * 5.0 / 2.0 * 3.0 / 8.0;
157 int PhotosMEforZ::GETIDEE(
int IDE)
162 if ((IDE == 11) || (IDE == 13) || (IDE == 15)) {
164 }
else if ((IDE == -11) || (IDE == -13) || (IDE == -15)) {
166 }
else if ((IDE == 12) || (IDE == 14) || (IDE == 16)) {
168 }
else if ((IDE == -12) || (IDE == -14) || (IDE == -16)) {
170 }
else if ((IDE == 1) || (IDE == 3) || (IDE == 5)) {
172 }
else if ((IDE == -1) || (IDE == -3) || (IDE == -5)) {
174 }
else if ((IDE == 2) || (IDE == 4) || (IDE == 6)) {
176 }
else if ((IDE == - 2) || (IDE == -4) || (IDE == -6)) {
179 if (IDEE == -555) {cout <<
" ERROR IN GETIDEE of PHOTS Z-ME: I3= &4i" << IDEE << endl;}
208 double PhotosMEforZ::PHASYZ(
double SVAR,
int IDE,
int IDF)
214 IDEE = abs(GETIDEE(IDE));
215 IDFF = abs(GETIDEE(IDF));
216 AFB = -AFBCALC(SVAR, IDEE, IDFF);
218 return 4.0 / 3.0 * AFB;
243 double PhotosMEforZ::Zphwtnlo(
double svar,
double xk,
int IDHEP3,
int IREP,
double qp[4],
double qm[4],
double ph[4],
double pp[4],
244 double pm[4],
double COSTHG,
double BETA,
double th1,
int IDE,
int IDF)
246 double C, s, xkaM, xkaP, t, u, t1, u1, BT, BU;
254 if (IREP == 1) IBREM = -1;
261 if (IBREM == -1) C = -C;
263 s = sqrt(1.0 - C * C);
266 xkaM = (qp[4 - i] * ph[4 - i] - qp[3 - i] * ph[3 - i] - qp[2 - i] * ph[2 - i] - qp[1 - i] * ph[1 - i]) / xk;
267 xkaP = (qm[4 - i] * ph[4 - i] - qm[3 - i] * ph[3 - i] - qm[2 - i] * ph[2 - i] - qm[1 - i] * ph[1 - i]) / xk;
269 xkaP = (qp[4 - i] * ph[4 - i] - qp[3 - i] * ph[3 - i] - qp[2 - i] * ph[2 - i] - qp[1 - i] * ph[1 - i]) / xk;
270 xkaM = (qm[4 - i] * ph[4 - i] - qm[3 - i] * ph[3 - i] - qm[2 - i] * ph[2 - i] - qm[1 - i] * ph[1 - i]) / xk;
284 t = 2 * (qp[4 - i] * pp[4 - i] - qp[3 - i] * pp[3 - i] - qp[2 - i] * pp[2 - i] - qp[1 - i] * pp[1 - i]);
285 u = 2 * (qm[4 - i] * pp[4 - i] - qm[3 - i] * pp[3 - i] - qm[2 - i] * pp[2 - i] - qm[1 - i] * pp[1 - i]);
286 u1 = 2 * (qp[4 - i] * pm[4 - i] - qp[3 - i] * pm[3 - i] - qp[2 - i] * pm[2 - i] - qp[1 - i] * pm[1 - i]);
287 t1 = 2 * (qm[4 - i] * pm[4 - i] - qm[3 - i] * pm[3 - i] - qm[2 - i] * pm[2 - i] - qm[1 - i] * pm[1 - i]);
290 t = t - (qp[4 - i] * qp[4 - i] - qp[3 - i] * qp[3 - i] - qp[2 - i] * qp[2 - i] - qp[1 - i] * qp[1 - i]);
291 u = u - (qm[4 - i] * qm[4 - i] - qm[3 - i] * qm[3 - i] - qm[2 - i] * qm[2 - i] - qm[1 - i] * qm[1 - i]);
292 u1 = u1 - (qp[4 - i] * qp[4 - i] - qp[3 - i] * qp[3 - i] - qp[2 - i] * qp[2 - i] - qp[1 - i] * qp[1 - i]);
293 t1 = t1 - (qm[4 - i] * qm[4 - i] - qm[3 - i] * qm[3 - i] - qm[2 - i] * qm[2 - i] - qm[1 - i] * qm[1 - i]);
296 if (IDE * IDHEP3 > 0) {
297 BT = 1.0 + PHASYZ(svar, IDE, IDF);
298 BU = 1.0 - PHASYZ(svar, IDE, IDF);
300 BT = 1.0 - PHASYZ(svar, IDE, IDF);
301 BU = 1.0 + PHASYZ(svar, IDE, IDF);
303 wagan2 = 2 * (BT * t * t + BU * u * u + BT * t1 * t1 + BU * u1 * u1)
304 / (1 + (1 - xk) * (1 - xk)) * 2.0 / (BT * (1 - C) * (1 - C) + BU * (1 + C) * (1 + C)) / svar / svar;
306 wagan2 = wagan2 * VakPol(qp, qm, ph, pp, pm, IDE, IDF);
309 waga = 2 / (1.0 + COSTHG * BETA) * wagan2;
313 if (wagan2 <= 3.8)
return waga;
319 FILE* PHLUN = stdout;
324 fprintf(PHLUN,
" IDE= %i IDF= %i", IDE, IDF);
325 fprintf(PHLUN,
"bt,bu,bt+bu= %f %f %f", BT, BU, BT + BU);
329 fprintf(PHLUN,
"%i %i <-- IREP,IBREM", IREP, IBREM);
331 fprintf(PHLUN,
"%f %f %f %f qp = ", qp[0], qp[1], qp[2], qp[3]);
332 fprintf(PHLUN,
"%f %f %f %f qm = ", qm[0], qm[1], qm[2], qm[3]);
334 fprintf(PHLUN,
"%f %f %f %f ph = ", ph[0], ph[1], ph[2], ph[3]);
341 fprintf(PHLUN,
" c= %f theta= %f", C, th1);
347 fprintf(PHLUN,
" - ");
348 fprintf(PHLUN,
"t,u = %f %f", t, u);
349 fprintf(PHLUN,
"t1,u1 = %f %f", t1, u1);
350 fprintf(PHLUN,
"sredniaki = %f %f", svar * (1 - C) / 2, svar * (1 + C) / 2);
352 fprintf(PHLUN,
"PHASYZ(svar)=',%f,' svar= %f',' waga= %f", PHASYZ(svar, IDE, IDF), svar, waga);
353 fprintf(PHLUN,
" - ");
354 fprintf(PHLUN,
"BT-part= %f BU-part= %f",
355 2 * (BT * t * t + BT * t1 * t1)
356 / (1 + (1 - xk) * (1 - xk)) * 2.0 / (BT * (1 - C) * (1 - C)) / svar / svar,
357 2 * (BU * u * u + BU * u1 * u1)
358 / (1 + (1 - xk) * (1 - xk)) * 2.0 / (BU * (1 + C) * (1 + C)) / svar / svar);
359 fprintf(PHLUN,
"BT-part*BU-part= %f wagan2= %f",
360 2 * (BT * t * t + BT * t1 * t1)
361 / (1 + (1 - xk) * (1 - xk)) * 2.0 / (BT * (1 - C) * (1 - C)) / svar / svar
362 * 2 * (BU * u * u + BU * u1 * u1)
363 / (1 + (1 - xk) * (1 - xk)) * 2.0 / (BU * (1 + C) * (1 + C)) / svar / svar, wagan2);
365 fprintf(PHLUN,
"wagan2= %f", wagan2);
366 fprintf(PHLUN,
" ################### ");
370 waga = 2 / (1.0 + COSTHG * BETA) * wagan2 ;
380 double PhotosMEforZ::VakPol(
double qp[4],
double qm[4],
double ph[4],
double pp[4],
double pm[4],
int IDE,
int IDF)
382 return PhotosMEforZ::currentVakPol(qp, qm, ph, pp, pm, IDE, IDF);
385 double PhotosMEforZ::default_VakPol(
double qp[4],
double qm[4],
double ph[4],
double pp[4],
double pm[4],
int IDE,
int IDF)
390 void PhotosMEforZ::set_VakPol(
double (*fun)(
double[4],
double[4],
double[4],
double[4],
double[4],
int,
int))
392 if (fun == NULL) PhotosMEforZ::currentVakPol = default_VakPol;
393 else PhotosMEforZ::currentVakPol = fun;
419 double PhotosMEforZ::phwtnlo()
431 int K, L, IDHEP3, IDUM = 0;
433 double QP[4], QM[4], PH[4], QQ[4], PP[4], PM[4], QQS[4];
434 double XK, ENE, svar;
449 XK = 2.0 * pho.phep[pho.nhep - i][4 - i] / pho.phep[1 - i][4 - i];
453 if (pho.nhep <= 4) XK = 0.0;
456 if (XK > 1.0e-10 && (pho.idhep[1 - i] == 22 || pho.idhep[1 - i] == 23)) {
471 for (K = 1; K < 5; K++) {
472 PP[K - i] = pho.phep[1 - i][K - i];
473 PM[K - i] = pho.phep[2 - i][K - i];
474 QP[K - i] = pho.phep[3 - i][K - i];
475 QM[K - i] = pho.phep[4 - i][K - i];
476 PH[K - i] = pho.phep[pho.nhep - i][K - i];
478 QQS[K - i] = QP[K - i] + QM[K - i];
482 PP[4 - i] = (pho.phep[1 - i][4 - i] + pho.phep[2 - i][4 - i]) / 2.0;
483 PM[4 - i] = (pho.phep[1 - i][4 - i] + pho.phep[2 - i][4 - i]) / 2.0;
484 PP[3 - i] = PP[4 - i];
485 PM[3 - i] = -PP[4 - i];
487 for (L = 5; L <= pho.nhep - 1; L++) {
488 for (K = 1; K < 5; K++) {
489 QQ [K - i] = QQ [K - i] + pho.phep[L - i][K - i];
490 QQS[K - i] = QQS[K - i] + pho.phep[L - i][K - i];
498 ENE = (QP[4 - i] + QM[4 - i] + QQ[4 - i]) / 2;
501 if (phopro.irep == 1) {
502 double a = sqrt(ENE * ENE - pho.phep[3 - i][5 - i] * pho.phep[3 - i][5 - i]) / sqrt(QM[4 - i] * QM[4 - i] - pho.phep[3 - i][5 - i]
503 * pho.phep[3 - i][5 - i]);
504 QM[1 - i] = QM[1 - i] * a;
505 QM[2 - i] = QM[2 - i] * a;
506 QM[3 - i] = QM[3 - i] * a;
507 QP[1 - i] = -QM[1 - i];
508 QP[2 - i] = -QM[2 - i];
509 QP[3 - i] = -QM[3 - i];
511 double a = sqrt(ENE * ENE - pho.phep[3 - i][5 - i] * pho.phep[3 - i][5 - i]) / sqrt(QP[4 - i] * QP[4 - i] - pho.phep[3 - i][5 - i]
512 * pho.phep[3 - i][5 - i]);
513 QP[1 - i] = QP[1 - i] * a;
514 QP[2 - i] = QP[2 - i] * a;
515 QP[3 - i] = QP[3 - i] * a;
516 QM[1 - i] = -QP[1 - i];
517 QM[2 - i] = -QP[2 - i];
518 QM[3 - i] = -QP[3 - i];
527 svar = pho.phep[1 - i][4 - i] * pho.phep[1 - i][4 - i];
529 IDE = hep.idhep[1 - i];
530 IDF = hep.idhep[4 - i];
531 if (abs(hep.idhep[4 - i]) == abs(hep.idhep[3 - i])) IDF = hep.idhep[3 - i];
533 IDHEP3 = pho.idhep[3 - i];
534 return Zphwtnlo(svar, XK, IDHEP3, phopro.irep, QP, QM, PH, PP, PM, phophs.costhg, phwt.beta, phorest.th1, IDE, IDF);
static double Zphwtnlo(double svar, double xk, int IDHEP3, int IREP, double qp[4], double qm[4], double ph[4], double pp[4], double pm[4], double COSTHG, double BETA, double th1, int IDE, int IDF)
static double PHBORNM(double svar, double costhe, double T3e, double qe, double T3f, double qf, int Ncf)