00001 #include <iostream>
00002 #define DB(x) #x<<"="<<x<<", "
00003 #include "TPiCrossPart.h"
00004 #include "TPiFormFactor.h"
00005 #include "TRadGlobal.h"
00006
00007 TPiCrossPart::TPiCrossPart():TVCrossPart(){
00008 fNPart = 5;
00009
00010 fK = new TPiKFun();
00011 fD = new TDFun();
00012 fEvent = new TEvent();
00013
00014
00015 fPhD1 = new TPhotonD();
00016 fPhD2 = new TPhotonD();
00017
00018
00019 fPhI1 = new TPhotonI();
00020 fPhI2 = new TPhotonI();
00021
00022
00023 fPhFS = new TPhotonFS();
00024
00025
00026 fFpi = new TPiFormFactor();
00027
00028 fBetaPi = gGlobal->Get_BetaF();
00029
00030 fCompPiSV = (1+fBetaPi*fBetaPi)/(2*fBetaPi)*log((1+fBetaPi)/(1-fBetaPi))-1;
00031
00032 fHardPhoton = true;
00033 fZeroVP = false;
00034 fNoFSR = false;
00035
00036
00037
00038
00039
00040
00041 }
00042
00043 void TPiCrossPart::SetThetaMin(const double &th){
00044 fCosMin = cos(th);
00045
00046 fNorm = 2*fCosMin*(1 - fCosMin*fCosMin/3)*
00047 2*gConst->Pi();
00048 }
00049
00050 double TPiCrossPart::MakeCosTheta(){
00051
00052 double c;
00053 do{
00054 c = (2*gRandom->Rndm()-1)*fCosMin;
00055 }while(1 - c*c < gRandom->Rndm());
00056 fSinTheta2 = 1 - c*c;
00057 return c;
00058 }
00059
00060 double TPiCrossPart::GetCNorm(){
00061 return fNorm/fSinTheta2;
00062 }
00063
00064 void TPiCrossPart::Init(){
00065 SetThetaMin(gGlobal->Get_ThetaMin());
00066
00067 fD->Init();
00068 fEvent->Init();
00069
00070 fPhD1->Init();
00071 fPhD2->Init();
00072
00073 fPhI1->Init();
00074 fPhI2->Init();
00075
00076 fPhFS->Init();
00077
00078 fFpi->Init();
00079
00080 if(fZeroVP)
00081 fFpi->SetUnitFF();
00082 else
00083 fFpi->SetDefaultFF();
00084 }
00085
00086 TPiCrossPart::~TPiCrossPart(){
00087 delete fK;
00088 delete fD;
00089 delete fEvent;
00090
00091 delete fPhD1;
00092 delete fPhD2;
00093
00094 delete fPhI1;
00095 delete fPhI2;
00096
00097 delete fPhFS;
00098
00099 delete fFpi;
00100 }
00101
00102 double r_abs_max = 0, r_rel_max = 0;
00103 double TPiCrossPart::BornShift(const double &z1, const double &z2, const double &c){
00104 double Y1, y1, c1;
00105 fEvent->GetPPar(0,Y1,y1,c1);
00106 std::complex<double> Fpi = fFpi->Eval(gGlobal->Get_s()*z1*z2);
00107 double Fpi2 = std::abs(Fpi*std::conj(Fpi));
00108 double cs = Fpi2*y1*y1*y1*(1-c*c)/(z1*z1*z2*z2*(z1+z2+(z2-z1)*c*Y1/y1));
00109 return cs*0.25;
00110 }
00111
00112
00113 #define COMP_I(x) AP*(-(1/x-1+0.5*x)*gGlobal->Get_LnD()+0.5*x)
00114
00115 double TPiCrossPart::GetValue(const unsigned int ipart){
00116 bool IsSoftIE, IsSoftIP;
00117 IsSoftIE = IsSoftIP = true;
00118
00119 bool CompSV, CompIE, CompIP;
00120 CompSV = CompIE = CompIP = false;
00121 double AP = gConst->AlphaPi();
00122
00123 double c = MakeCosTheta();
00124
00125 switch(ipart){
00126 case 0:
00127 IsSoftIE = IsSoftIP = true;
00128 CompSV = true;
00129 break;
00130 case 1:
00131 IsSoftIP = false;
00132 CompIP = true;
00133 break;
00134 case 2:
00135 IsSoftIE = false;
00136 CompIE = true;
00137 break;
00138 case 3:
00139 IsSoftIE = IsSoftIP = false;
00140 break;
00141 case 4:
00142
00143 if(fHardPhoton && fEvent->MakeEvent(c,fPhI1,2)){
00144
00145 #ifdef TEST
00146 double r0 = R_Gamma();
00147
00148 double r1 = R_Gamma_kuraev_eidelman();
00149 if(r_abs_max<fabs(r1-r0)||r_rel_max<fabs((r1-r0)/r0)){
00150 std::cout<<DB(r0)<<DB(r1)<<DB(r1-r0)<<DB((r1-r0)/r0)<<std::endl;
00151 if(r_abs_max<fabs(r1-r0))r_abs_max = fabs(r1-r0);
00152 if(r_rel_max<fabs((r1-r0)/r0))r_rel_max = fabs((r1-r0)/r0);
00153 }
00154 double t1 = gConst->Alpha()/(2*gConst->Pi2())*r1;
00155 #else
00156 double t1 = gConst->Alpha()/(2*gConst->Pi2())*R_Gamma();
00157 #endif
00158 double norm = fPhI1->GetENorm()*fPhI1->GetThNorm()*fPhI1->GetPhiNorm()*GetCNorm();
00159 return t1*norm;
00160 }
00161 return 0;
00162 break;
00163 case 5:
00164
00165 if(fEvent->MakeEvent(c,(double)0.,(double)0.)){
00166 double lde = gGlobal->Get_LnDelta();
00167 double Ae = (gGlobal->Get_L()-1)*(lde + 3./4.);
00168
00169 double Api = (fCompPiSV + 2*log((1 - fBetaPi*c)/(1 + fBetaPi*c)))*lde
00170 + fK->Eval(gGlobal->Get_s(),c);
00171
00172 return BornShift(1,1,c)*(1 + 2*AP*(Ae + Api))*GetCNorm();
00173 }
00174 return 0;
00175 break;
00176 case 6:
00177
00178 if(fEvent->MakeEvent(c,(double)0.,(double)0.)){
00179 double lde = gGlobal->Get_LnDelta();
00180 double rho_e = gGlobal->Get_L();
00181 return BornShift(1,1,c)*
00182 (1 + 2*AP*((rho_e-1)*lde+13./12.*rho_e - 14./9. + M_PI*M_PI/6.))*GetCNorm();
00183 }
00184 return 0;
00185 break;
00186 case 7:
00187
00188 if(fHardPhoton && fEvent->MakeEvent(c,fPhI1,2)){
00189 double t1 = gConst->Alpha()/(2*gConst->Pi2())*R_Gamma_kuraev_eidelman();
00190 double norm = fPhI1->GetENorm()*fPhI1->GetThNorm()*fPhI1->GetPhiNorm()*GetCNorm();
00191 return t1*norm;
00192 }
00193 return 0;
00194 break;
00195 default:
00196 return 0;
00197 break;
00198 }
00199
00200 if(!fHardPhoton) CompSV = CompIE = CompIP = false;
00201
00202 double x1g, x2g;
00203 x1g = x2g = 0;
00204
00205 double z1, z2;
00206 z1 = z2 = 1;
00207
00208 if(IsSoftIE)
00209 x1g = fPhD1->GetEnergy();
00210 else
00211 x1g = fPhI1->GetEnergy();
00212 z1 = 1 - x1g;
00213
00214 if(IsSoftIP)
00215 x2g = fPhD2->GetEnergy();
00216 else
00217 x2g = fPhI2->GetEnergy();
00218 z2 = 1 - x2g;
00219
00220 if(fEvent->MakeEvent(c, x1g, x2g)){
00221
00222 double D1, D2, t2 = 0;
00223
00224 if(IsSoftIE)
00225 D1 = fD->EvalSoft(x1g)*fPhD1->GetENorm();
00226 else{
00227 double norm = fPhI1->GetENorm();
00228 D1 = fD->Eval(z1)*norm;
00229 if(CompIE) t2 = COMP_I(x1g)*norm;
00230 }
00231
00232 if(IsSoftIP)
00233 D2 = fD->EvalSoft(x2g)*fPhD2->GetENorm();
00234 else{
00235 double norm = fPhI2->GetENorm();
00236 D2 = fD->Eval(z2)*norm;
00237 if(CompIP) t2 = COMP_I(x2g)*norm;
00238 }
00239
00240 if(CompSV && !fNoFSR) t2 = 2*AP*gGlobal->Get_LnDelta()*
00241 (fCompPiSV + 2*log((1 - fBetaPi*c)/(1 + fBetaPi*c)));
00242
00243 double Ksv = 0;
00244 if(fNoFSR)
00245 Ksv = fK->Eval_a();
00246 else
00247 Ksv = fK->Eval(z1*z2*gGlobal->Get_s(),c);
00248
00249 double t1 = (1 + 2*AP*Ksv)*D1*D2;
00250
00251 return BornShift(z1,z2,c)*(t1+t2)*GetCNorm();
00252
00253 }
00254 return 0;
00255 }
00256
00257 double TPiCrossPart::R_Gamma(){
00258 double em,pm,cm, ep,pp,cp, eg,pg,cg;
00259 fEvent->GetPPar(0,em,pm,cm);
00260 fEvent->GetPPar(1,ep,pp,cp);
00261 fEvent->GetPPar(2,eg,pg,cg);
00262
00263 double s, s1, t, t1, u, u1;
00264 s = 4;
00265 s1 = 4*(1-eg);
00266
00267 double BetaI = gGlobal->Get_BetaI();
00268 t = -2*(em-BetaI*pm*cm);
00269 t1 = -2*(ep+BetaI*pp*cp);
00270
00271 u = -2*(ep-BetaI*pp*cp);
00272 u1 = -2*(em+BetaI*pm*cm);
00273
00274 double chi_m,chi_p,chi_m_p,chi_p_p;
00275 chi_m = eg*(1-BetaI*cg);
00276 chi_p = eg*(1+BetaI*cg);
00277 chi_m_p = 2*(1-ep);
00278 chi_p_p = 2*(1-em);
00279
00280 double ichi_m = 1/chi_m;
00281 double ichi_p = 1/chi_p;
00282 double ichi_m_p = 1/chi_m_p;
00283 double ichi_p_p = 1/chi_p_p;
00284 double is = 1/s;
00285 double is1 = 1/s1;
00286
00287
00288
00289 double mpi2 = gGlobal->Get_MF2();
00290 double me2 = gGlobal->Get_MI2();
00291
00292 double D_s1_s1, D_s_s, D_s_s1;
00293 D_s1_s1 = D_s_s = D_s_s1 = 0;
00294 double R_s1_s1, R_s_s, R_s_s1;
00295 R_s1_s1 = R_s_s = R_s_s1 = 0;
00296
00297 double A = (t*u + t1*u1)*(is*is1);
00298 D_s1_s1 =-4*( (t+u)*(t+u) + (t1+u1)*(t1+u1) )*(is1*is1*ichi_m*ichi_p);
00299 R_s1_s1 = 4*s*A*(ichi_m*ichi_p) + mpi2*D_s1_s1
00300 -8*me2*(is1*is1)*( t1*u1*(ichi_m*ichi_m) + t*u*(ichi_p*ichi_p))
00301 +8*mpi2*me2*is1*((ichi_m*ichi_m) + (ichi_p*ichi_p));
00302
00303
00304
00305
00306
00307
00308
00309 if(!fNoFSR){
00310 D_s_s = 2*mpi2*(s-s1)*(s-s1)*is*(ichi_m_p*ichi_m_p*ichi_p_p*ichi_p_p)+
00311 8*is*is*(t*t1+u*u1-s*s-s*s1)*(ichi_m_p*ichi_p_p);
00312 R_s_s = 4*s1*A*(ichi_m_p*ichi_p_p) + mpi2*D_s_s
00313 -8*mpi2*(is*is)*( t*u1*(ichi_p_p*ichi_p_p) + t1*u*(ichi_m_p*ichi_m_p) );
00314
00315 double C =
00316 t*ichi_m*ichi_m_p + t1*ichi_p*ichi_p_p -
00317 u*ichi_m*ichi_p_p - u1*ichi_p*ichi_m_p;
00318 D_s_s1 = 8*is*is1*((2*(t1 - u) + u1 - t)*chi_m_p + (2*(t - u1) + u - t1)*ichi_p_p +
00319 0.5*(u1 + t1 - s)*ichi_m*( u*ichi_p_p - t*ichi_m_p) +
00320 0.5*(u + t - s)*ichi_p*(u1*ichi_m_p - t1*ichi_p_p));
00321 R_s_s1 = -4*A*C + mpi2*D_s_s1;
00322 }
00323
00324 double CosPsi = fEvent->GetCosPsi();
00325 double gamma = eg*pm/( 2 - eg*(1 - em*CosPsi/pm) );
00326
00327 std::complex<double> Fpi_s1 = fFpi->Eval(gGlobal->Get_s()*(1-eg));
00328 double Fpi_s1_s1 = std::abs(Fpi_s1*Fpi_s1);
00329
00330 double Fpi_s_s, Fpi_s_cs1;
00331 Fpi_s_s = Fpi_s_cs1 = 0;
00332 if(!fNoFSR){
00333 std::complex<double> Fpi_s = fFpi->Eval(gGlobal->Get_s());
00334 Fpi_s_s = std::abs(Fpi_s*Fpi_s);
00335 Fpi_s_cs1= std::real(Fpi_s*std::conj(Fpi_s1));
00336 }
00337
00338
00339 return (Fpi_s1_s1*R_s1_s1 + Fpi_s_s*R_s_s + Fpi_s_cs1*R_s_s1)*gamma/16;
00340 }
00341
00342 #define Prod(a,b,c,d) ( (a##b)*(c##d) + (a##d)*(b##c) - (a##c)*(b##d) )
00343 #define Dot(a,b) double a##b = a*b; double b##a = a##b
00344 double TPiCrossPart::R_Gamma_t(){
00345
00346 TLorentzVector pm(0,0,gGlobal->Get_BetaI(),1.);
00347 TLorentzVector pp(0,0,-gGlobal->Get_BetaI(),1.);
00348 TLorentzVector qm = fEvent->Get4Vector(0);
00349 TLorentzVector qp = fEvent->Get4Vector(1);
00350 TLorentzVector k = fEvent->Get4Vector(2);
00351
00352 double s = (pp + pm)*(pp + pm);
00353 double s1 = (qp + qm)*(qp + qm);
00354
00355 double chi_p = pp*k;
00356 double chi_m = pm*k;
00357 double chi_p_p = qp*k;
00358 double chi_m_p = qm*k;
00359
00360 double ichi_m = 1/chi_m;
00361 double ichi_p = 1/chi_p;
00362 double ichi_m_p = 1/chi_m_p;
00363 double ichi_p_p = 1/chi_p_p;
00364
00365
00366 Dot(pp,pm);
00367 double ipppm = 1/pppm;
00368
00369 Dot(qp,qm);
00370
00371 TLorentzVector Q = 0.5*(qp - qm);
00372 TLorentzVector kp = k - pp*chi_m*ipppm;
00373 TLorentzVector km = k - pm*chi_p*ipppm;
00374
00375 double QQ = Q*Q;
00376 double kk = k*k;
00377 Dot(k,Q);
00378
00379 Dot(pp,Q);
00380 Dot(pm,Q);
00381
00382 Dot(kp,Q);
00383 Dot(km,Q);
00384
00385 Dot(qp,Q);
00386 Dot(qm,Q);
00387
00388 Dot(qp,k);
00389 Dot(qm,k);
00390
00391 Dot(pp,k);
00392 Dot(pm,k);
00393
00394 Dot(pp,km);
00395 Dot(pm,kp);
00396
00397 Dot(pm,qp);
00398 Dot(pp,qp);
00399
00400 Dot(pm,qm);
00401 Dot(pp,qm);
00402
00403 double mpi2 = gGlobal->Get_MF2();
00404 double me2 = gGlobal->Get_MI2();
00405 double is = 1/s;
00406 double is1 = 1/s1;
00407
00408 std::complex<double> Fpi_s1 = fFpi->Eval(gGlobal->Get_s()*s1*0.25);
00409 double Fpi_s1_s1 = std::abs(Fpi_s1*Fpi_s1);
00410 double Fpi_s_s, Fpi_s_cs1;
00411 Fpi_s_s = Fpi_s_cs1 = 0;
00412 if(!fNoFSR){
00413 std::complex<double> Fpi_s = fFpi->Eval(gGlobal->Get_s());
00414 Fpi_s_s = std::abs(Fpi_s*Fpi_s);
00415 Fpi_s_cs1= std::real(Fpi_s*std::conj(Fpi_s1));
00416 }
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427 double R_1 = s*(is1*is1)*Fpi_s1_s1*
00428 ( (Prod(pp,Q,pm,Q)*(pppm*ichi_p*ichi_m - 2*ichi_m + 2*chi_p*is*ichi_m) + Prod(pp,Q,k,Q)*me2*ichi_m*ichi_m) +
00429 (Prod(pm,Q,pp,Q)*(pppm*ichi_p*ichi_m - 2*ichi_p + 2*chi_m*is*ichi_p) + Prod(pm,Q,k,Q)*me2*ichi_p*ichi_p)
00430 );
00431
00432 double R_2 = Prod(pp,Q,pm,Q)*
00433 (
00434 is*Fpi_s_s*
00435 (
00436 (qpqm*(ichi_p_p*ichi_m_p) - mpi2*(ichi_p_p*ichi_p_p)) +
00437 (qpqm*(ichi_p_p*ichi_m_p) - mpi2*(ichi_m_p*ichi_m_p))
00438 )
00439
00440 +
00441
00442 2*is1*Fpi_s_cs1*(pp*ichi_p - pm*ichi_m) * (qp*ichi_p_p - qm*ichi_m_p)
00443 );
00444
00445 double R_3 =
00446 s*is1*is1*Fpi_s1_s1*
00447 (Prod(pp,Q,km,Q)*ichi_m + Prod(pm,Q,kp,Q)*ichi_p + 2*Qk*(ichi_m*ichi_p)*Prod(pp,Q,pm,k))
00448
00449 +
00450
00451 is*Fpi_s_s*
00452 (
00453 -0.5*chi_p*chi_m*(ichi_p_p*ichi_m_p)*qpqm - 0.25*mpi2*(ichi_p_p*ichi_p_p)*
00454 (Prod(pp,k,pm,k) + 2*Prod(pp,Q,pm,k) + 2*Prod(pp,k,pm,Q)) +
00455 ichi_p_p*(chi_p*pmqp + chi_m*ppqp + 2*Prod(pm,Q,pp,qp))
00456
00457 +
00458
00459 -0.5*chi_p*chi_m*(ichi_p_p*ichi_m_p)*qpqm - 0.25*mpi2*(ichi_m_p*ichi_m_p)*
00460 (Prod(pp,k,pm,k) - 2*Prod(pp,Q,pm,k) - 2*Prod(pp,k,pm,Q)) +
00461 ichi_m_p*(chi_p*pmqm + chi_m*ppqm - 2*Prod(pm,Q,pp,qm))
00462 )
00463
00464 +
00465
00466 is1*Fpi_s_cs1*
00467 (
00468 (
00469 Prod(pp,Q,pm,k)*ichi_p_p*(qppp*ichi_p - qppm*ichi_m) + 2*(ppQ - pmQ)
00470 - ichi_p_p*(Prod(pp,Q,qp,k)-Prod(pm,Q,qp,k))
00471 + 2*Qk*Qpp*pmqp*(ichi_p_p*ichi_m) - 2*Qpm*Qk*ppqp*(ichi_p_p*ichi_p)
00472 - QQ*chi_p*qppm*(ichi_p_p*ichi_m) + QQ*ppqm*ichi_p_p + QQ*chi_m*ppqp*(ichi_p_p*ichi_p)
00473 - QQ*pmqm*ichi_p_p
00474 )
00475
00476 -
00477
00478 (
00479 -Prod(pp,Q,pm,k)*ichi_m_p*(qmpp*ichi_p - qmpm*ichi_m) - 2*(ppQ - pmQ)
00480 + ichi_m_p*(Prod(pp,Q,qm,k)-Prod(pm,Q,qm,k))
00481 + 2*Qk*Qpp*pmqm*(ichi_m_p*ichi_m) - 2*Qpm*Qk*ppqm*(ichi_m_p*ichi_p)
00482 - QQ*chi_p*qmpm*(ichi_m_p*ichi_m) + QQ*ppqp*ichi_m_p + QQ*chi_m*ppqm*(ichi_m_p*ichi_p)
00483 - QQ*pmqp*ichi_m_p
00484 )
00485 )
00486 ;
00487
00488 double CosPsi = fEvent->GetCosPsi();
00489 double gamma = k.E()*qm.P()/(2-k.E()*(1-qm.E()*CosPsi/qm.P()));
00490
00491 return gamma*(R_1 + R_2 + R_3 )*0.25;
00492 }
00493
00494 #ifdef Dot
00495 # undef Dot
00496 #endif
00497
00498 double TPiCrossPart::R_Gamma_kuraev_eidelman(){
00499
00500
00501 TLorentzVector pm(0,0, gGlobal->Get_BetaI(),1.);
00502 TLorentzVector pp(0,0,-gGlobal->Get_BetaI(),1.);
00503 TLorentzVector qm = fEvent->Get4Vector(0);
00504 TLorentzVector k = fEvent->Get4Vector(2);
00505 double x = k.E();
00506
00507 double s = (pp + pm)*(pp + pm);
00508 double s1 = s*(1-x);
00509 double is1 = 1/s1;
00510
00511 double ichi_m = 1/(pp*k);
00512 double ichi_p = 1/(pm*k);
00513
00514 double mpi2 = gGlobal->Get_MF2();
00515 double me2 = gGlobal->Get_MI2();
00516
00517 double z = pm.Vect().Dot(qm.Vect())/(pm.P()*qm.P());
00518 double xm = qm.E();
00519 double betam = qm.P();
00520 double t = mpi2 - s*(1 - x - xm*0.5*(1+betam*z));
00521 double u = mpi2 - s*(1 - xm*0.5*(1-betam*z));
00522 double t1 = mpi2 - s*xm*0.5*(1-betam*z);
00523 double u1 = mpi2 - s*xm*0.5*(1+betam*z);
00524 double utilde = u + s*x;
00525 double ttilde = t - s*x;
00526
00527 std::complex<double> Fpi_s1 = fFpi->Eval(gGlobal->Get_s()*s1*0.25);
00528 double Fpi_s1_s1 = std::abs(Fpi_s1*Fpi_s1);
00529
00530 double R_pi = Fpi_s1_s1*0.125*is1*is1*
00531 ((s*(s1-4*mpi2)-(u1-t)*(u-t1))*
00532 (-me2*s*(1-x)*ichi_m*ichi_m + s*ichi_m*(1 + pow(1 - x, 2))/x) +
00533 (s*(s1-4*mpi2)-(u1-ttilde)*(utilde-t1))*
00534 (-me2*s*(1-x)*ichi_p*ichi_p + s*ichi_p*(1 + pow(1 - x, 2))/x));
00535
00536 double CosPsi = fEvent->GetCosPsi();
00537 double gamma = k.E()*qm.P()/(2-k.E()*(1-qm.E()*CosPsi/qm.P()));
00538
00539 return gamma*R_pi*0.25;
00540 }