00001 #include <iostream>
00002 #include "TEPCrossPart.h"
00003 #include "TRadGlobal.h"
00004 #include "TKinemCut.h"
00005 #include "TEKFun.h"
00006 #include "TLi2.h"
00007 using namespace std;
00008 double maxmtr = -1;
00009
00010 TEPCrossPart::TEPCrossPart():TVCrossPart(){
00011 fNPart = 18;
00012
00013 fK = new TEKFun();
00014 fD = new TDFun();
00015 fEvent = new TEvent();
00016
00017
00018 fPhD1 = new TPhotonD();
00019 fPhD2 = new TPhotonD();
00020 fPhD3 = new TPhotonD();
00021 fPhD4 = new TPhotonD();
00022
00023
00024 fPhI1 = new TPhotonI();
00025 fPhI2 = new TPhotonI();
00026 fPhF3 = new TPhotonF();
00027 fPhF4 = new TPhotonF();
00028
00029
00030 fVPol = new TVacuumPol();
00031 fVPol->Init(gGlobal->GetDatadir(), gGlobal->GetVpolFname());
00032
00033 fHardPhoton = true;
00034 fZeroVP = false;
00035 }
00036
00037 void TEPCrossPart::SetThetaMin(const double &th){
00038 fCosMin = cos(th);
00039 fSinMin2 = 1 - fCosMin*fCosMin;
00040
00041
00042
00043
00044 fNorm = 2*fCosMin/fSinMin2*
00045 2*gConst->Pi();
00046 }
00047
00048 double TEPCrossPart::MakeCosTheta(){
00049
00050
00051
00052
00053
00054
00055 fCosTheta = 1 - fSinMin2/(1+fCosMin*(2*gRandom->Rndm() - 1));
00056 return fCosTheta;
00057 }
00058
00059 double TEPCrossPart::GetCNorm(){
00060
00061 double s = 1 - fCosTheta;
00062 double norm = s*s*fNorm;
00063 return norm;
00064 }
00065
00066 void TEPCrossPart::Init(){
00067 SetThetaMin((gCut->ThetaMinM()<M_PI-gCut->ThetaMaxM())?gCut->ThetaMinM():M_PI-gCut->ThetaMaxM());
00068
00069 fK->Init();
00070 fD->Init();
00071 fEvent->Init();
00072
00073 fPhD1->Init();
00074 fPhD2->Init();
00075 fPhD3->Init();
00076 fPhD4->Init();
00077
00078 fPhI1->Init();
00079 fPhI2->Init();
00080 fPhF3->Init();
00081 fPhF4->Init();
00082
00083 if(fZeroVP)
00084 fVPol->SetZeroVP();
00085 else
00086 fVPol->SetDefaultVP();
00087 }
00088
00089 TEPCrossPart::~TEPCrossPart(){
00090 delete fK;
00091 delete fD;
00092 delete fEvent;
00093
00094 delete fPhD1;
00095 delete fPhD2;
00096 delete fPhD3;
00097 delete fPhD4;
00098
00099 delete fPhI1;
00100 delete fPhI2;
00101 delete fPhF3;
00102 delete fPhF4;
00103
00104 delete fVPol;
00105 }
00106
00107 double TEPCrossPart::BornShift(const double &z1, const double &z2, const double &c){
00108 double Y1 = fEvent->GetY(0);
00109 double sw = gGlobal->Get_s()*z1*z2;
00110 double tw = -0.5*gGlobal->Get_s()*z1*Y1*(1.-c);
00111 double a = z1+z2-(z1-z2)*c;
00112 double a2 = a*a;
00113 std::complex<double> vptw = fVPol->Evalt(tw);
00114 std::complex<double> vpsw = fVPol->Evals(sw);
00115
00116 double p1 = z1*(1-c);
00117 double p12 = p1*p1;
00118 double p2 = z2*(1+c);
00119 double p22 = p2*p2;
00120 double cs =
00121 std::abs(vptw*vptw)*(a2+p22)/(2*p12) +
00122 std::abs(vpsw*vpsw)*(p12+p22)/(2*a2) -
00123 std::real(vptw*std::conj(vpsw))*p22/(a*p1);
00124
00125 cs *= 4/a2;
00126
00127 return cs;
00128 }
00129
00130
00131 #define COMP_I(x) AP*((1/x-1+0.5*x)*(-gGlobal->Get_LnD())+0.5*x)
00132
00133
00134 #define COMP_F(x) AP*((1/x-1+0.5*x)*(-gGlobal->Get_LnD()+2*log(1-x))+0.5*x)
00135
00136 double TEPCrossPart::GetValue(const unsigned int ipart){
00137 bool IsSoftIE, IsSoftIP, IsSoftFE, IsSoftFP;
00138 IsSoftIE = IsSoftIP = IsSoftFE = IsSoftFP = true;
00139
00140 bool CompSV, CompIE, CompIP, CompFE, CompFP;
00141 CompSV = CompIE = CompIP = CompFE = CompFP = false;
00142 #ifdef OLDSTYLE
00143 double b = gGlobal->Get_b();
00144 #endif
00145 double AP = gConst->AlphaPi();
00146
00147 #ifdef FIXP
00148 double c = 0.3;
00149 fCosTheta = c;
00150 #else
00151 double c = MakeCosTheta();
00152 #endif
00153
00154 switch(ipart){
00155 case 0:
00156 IsSoftIE = IsSoftIP = IsSoftFE = IsSoftFP = true;
00157 CompSV = true;
00158 break;
00159 case 1:
00160 IsSoftFP = false;
00161 CompFP = true;
00162 break;
00163 case 2:
00164 IsSoftFE = false;
00165 CompFE = true;
00166 break;
00167 case 3:
00168 IsSoftFP = IsSoftFE = false;
00169 break;
00170 case 4:
00171 IsSoftIP = false;
00172 CompIP = true;
00173 break;
00174 case 5:
00175 IsSoftIP = IsSoftFP = false;
00176 break;
00177 case 6:
00178 IsSoftIP = IsSoftFE = false;
00179 break;
00180 case 7:
00181 IsSoftIP = IsSoftFE = IsSoftFP = false;
00182 break;
00183 case 8:
00184 IsSoftIE = false;
00185 CompIE = true;
00186 break;
00187 case 9:
00188 IsSoftIE = IsSoftFP = false;
00189 break;
00190 case 10:
00191 IsSoftIE = IsSoftFE = false;
00192 break;
00193 case 11:
00194 IsSoftIE = IsSoftFE = IsSoftFP = false;
00195 break;
00196 case 12:
00197 IsSoftIE = IsSoftIP = false;
00198 break;
00199 case 13:
00200 IsSoftIE = IsSoftIP = IsSoftFP = false;
00201 break;
00202 case 14:
00203 IsSoftIE = IsSoftIP = IsSoftFE = false;
00204 break;
00205 case 15:
00206 IsSoftIE = IsSoftIP = IsSoftFE = IsSoftFP = false;
00207 break;
00208 case 16:
00209
00210 if(fHardPhoton && fEvent->MakeEvent(c,fPhI1,1)){
00211 double t1 = gConst->Alpha()/(2*gConst->Pi2())*RGamma();
00212 double norm = fPhI1->GetENorm()*fPhI1->GetThNorm()*fPhI1->GetPhiNorm()*GetCNorm();
00213 return t1*norm;
00214 }
00215 return 0;
00216 break;
00217 case 17:
00218
00219 if(fHardPhoton && fEvent->MakeEvent(c,fPhF3,0)){
00220
00221 double t1 = gConst->Alpha()/(2*gConst->Pi2())*RGamma();
00222 double norm = fPhF3->GetENorm()*fPhF3->GetThNormF()*fPhF3->GetPhiNorm()*GetCNorm();
00223
00224
00225
00226
00227
00228
00229
00230
00231 return t1*norm;
00232 }
00233 return 0;
00234 break;
00235 case 18:
00236
00237 if(fEvent->MakeEvent(c,0,0,0,0)){
00238 double lde = gGlobal->Get_LnDelta();
00239 return BornShift(1,1,c)*
00240 (1
00241 + 2*AP*(gGlobal->Get_L()-1)*(2*lde + 1.5)
00242 - 4*AP*log((1+c)/(1-c))*lde
00243 + AP*fK->Eval(1,1,c)
00244 )*GetCNorm();
00245 }
00246 return 0;
00247 break;
00248 case 19:
00249
00250 if(fEvent->MakeEvent(c,0,0,0,0)){
00251 double lde = gGlobal->Get_LnDelta();
00252 double rho = gGlobal->Get_L();
00253 double z = c;
00254 double z2 = z*z;
00255 double z3 = z2*z;
00256 double z4 = z3*z;
00257 #define F(x) TLi2::Eval(x)
00258 return BornShift(1,1,c)*
00259 (1
00260 + 2*AP*
00261 (
00262 2*(rho - 1 - log((1+z)/(1-z)))*lde - F(0.5*(1+z)) + F(0.5*(1-z)) - 23./9. +
00263 11./6.*rho +
00264 0.5*pow(3+z2,-2)*(
00265 M_PI*M_PI/3.*(2*z4 - 3*z3 - 15*z) +
00266 0.5*(2*z4-3*z3+9*z2+3*z+21)*pow(log(0.5*(1-z)),2)-
00267 (z4+z2-2*z)*pow(log(0.5*(1+z)),2) -
00268 (z3+4*z2+5*z+6)*pow(log((1+z)/(1-z)),2)+
00269 1./3.*(11*z3+33*z2+21*z+111)*log(0.5*(1-z))+
00270 (z3-3*z2+7*z-5)*log(0.5*(1+z))
00271 )
00272 )
00273 )*GetCNorm();
00274 #undef F
00275 }
00276
00277 return 0;
00278 break;
00279 case 20:
00280
00281 if(fHardPhoton && fEvent->MakeEvent(c,fPhI1,1)){
00282 double t1 = gConst->Alpha()/(2*gConst->Pi2())*RGamma_kuraev_eidelman();
00283 double norm = fPhI1->GetENorm()*fPhI1->GetThNorm()*fPhI1->GetPhiNorm()*GetCNorm();
00284 return t1*norm;
00285 }
00286 return 0;
00287 break;
00288 case 21:
00289
00290 if(fHardPhoton && fEvent->MakeEvent(c,fPhF3,0)){
00291 double t1 = gConst->Alpha()/(2*gConst->Pi2())*RGamma_kuraev_eidelman();
00292 double norm = fPhF3->GetENorm()*fPhF3->GetThNormF()*fPhF3->GetPhiNorm()*GetCNorm();
00293
00294 if(t1*norm>maxmtr){
00295 maxmtr = t1*norm;
00296 fEvent->Print();
00297 RGamma_kuraev_eidelman(true);
00298 cout<<maxmtr<<" "<<t1<<" "<<norm<<endl<<flush;
00299 }
00300
00301 return t1*norm;
00302 }
00303 return 0;
00304 break;
00305 default:
00306 return 0;
00307 break;
00308 }
00309
00310 if(!fHardPhoton) CompSV = CompIE = CompIP = CompFE = CompFP = false;
00311
00312 double RedCut = 1e-10;
00313
00314 double x1g, x2g, x3g, x4g;
00315 x1g = x2g = x3g = x4g = 0;
00316
00317 double z1, z2, z3, z4;
00318 z1 = z2 = z3 = z4 = 1;
00319
00320 if(IsSoftIE)
00321 x1g = fPhD1->GetEnergy();
00322 else
00323 x1g = fPhI1->GetEnergy();
00324 z1 = 1 - x1g;
00325
00326 if(IsSoftIP)
00327 x2g = fPhD2->GetEnergy();
00328 else
00329 x2g = fPhI2->GetEnergy();
00330 z2 = 1 - x2g;
00331
00332 if(fEvent->MakeEvent(c,x1g,x2g,0,0)){
00333
00334 double Beta2_m, D0_m;
00335 if(IsSoftFE){
00336 gGlobal->Get_VarPar(1, Beta2_m, D0_m);
00337
00338 x3g = fPhD3->GetEnergy(gGlobal->Get_XMin(), Beta2_m);
00339 }else
00340 x3g = fPhF3->GetEnergy();
00341 z3 = 1 - x3g;
00342
00343 double Beta2_p, D0_p;
00344 if(IsSoftFP){
00345 gGlobal->Get_VarPar(1, Beta2_p, D0_p);
00346
00347 x4g = fPhD4->GetEnergy(gGlobal->Get_XMin(), Beta2_p);
00348 }else
00349 x4g = fPhF4->GetEnergy();
00350 z4 = 1 - x4g;
00351
00352 if(fEvent->MakeEventN(x3g,x4g)){
00353
00354 double D1, D2, D3, D4, t2 = 0;
00355
00356 if(IsSoftIE){
00357 #ifdef OLDSTYLE
00358 D1 = b;
00359 #else
00360 if(x1g>RedCut)
00361 D1 = fD->EvalSoft(x1g)*fPhD1->GetENorm();
00362 else
00363 D1 = fD->EvalSoft(RedCut)*fPhD1->GetENorm();
00364 #endif
00365 }else{
00366 double norm = fPhI1->GetENorm();
00367 D1 = fD->Eval(z1)*norm;
00368 if(CompIE) t2 = COMP_I(x1g)*norm;
00369 }
00370
00371 if(IsSoftIP)
00372 #ifdef OLDSTYLE
00373 D2 = b;
00374 #else
00375 if(x2g>RedCut)
00376 D2 = fD->EvalSoft(x2g)*fPhD2->GetENorm();
00377 else
00378 D2 = fD->EvalSoft(RedCut)*fPhD2->GetENorm();
00379 #endif
00380 else{
00381 double norm = fPhI2->GetENorm();
00382 D2 = fD->Eval(z2)*norm;
00383 if(CompIP) t2 = COMP_I(x2g)*norm;
00384 }
00385
00386 if(IsSoftFE)
00387 #ifdef OLDSTYLE
00388 D3 = b;
00389 #else
00390 if(x3g>RedCut)
00391 D3 = fD->EvalSoft(x3g, Beta2_m, D0_m)*fPhD3->GetENorm();
00392 else
00393 D3 = fD->EvalSoft(RedCut, Beta2_m, D0_m)*fPhD3->GetENorm();
00394 #endif
00395 else{
00396 gGlobal->Get_VarPar(fEvent->GetY(0), Beta2_m, D0_m);
00397 double norm = fPhF3->GetENorm();
00398 D3 = fD->Eval(z3, Beta2_m, D0_m)*norm;
00399 if(CompFE) t2 = COMP_F(x3g)*norm;
00400 }
00401
00402 if(IsSoftFP){
00403 #ifdef OLDSTYLE
00404 D4 = b;
00405 #else
00406 if(x4g>RedCut)
00407 D4 = fD->EvalSoft(x4g, Beta2_p, D0_p)*fPhD4->GetENorm();
00408 else
00409 D4 = fD->EvalSoft(RedCut, Beta2_p, D0_p)*fPhD4->GetENorm();
00410 #endif
00411 }else{
00412 gGlobal->Get_VarPar(fEvent->GetY(1), Beta2_p, D0_p);
00413 double norm = fPhF4->GetENorm();
00414 D4 = fD->Eval(z4, Beta2_p, D0_p)*norm;
00415 if(CompFP) t2 = COMP_F(x4g)*norm;
00416 }
00417
00418 if(CompSV)
00419 t2 = -4*AP*log((1+c)/(1-c))*gGlobal->Get_LnDelta();
00420 double Ksv;
00421 if(fHardPhoton)
00422 Ksv = fK->Eval(z1,z2,c);
00423 else
00424 Ksv = 0;
00425 double t1 = (1 + AP*Ksv)*D1*D2*D3*D4;
00426
00427 return BornShift(z1,z2,c)*(t1+t2)*GetCNorm();
00428 }
00429 }
00430 return 0;
00431 }
00432
00433 double TEPCrossPart::RGamma(){
00434 double em,pm,cm, ep,pp,cp, eg,pg,cg;
00435 fEvent->GetPPar(0,em,pm,cm);
00436 fEvent->GetPPar(1,ep,pp,cp);
00437 fEvent->GetPPar(2,eg,pg,cg);
00438
00439 double s, s1, t, t1, u, u1;
00440 s = 4;
00441 s1 = 4*(1 - eg);
00442
00443 double BetaI = gGlobal->Get_BetaI();
00444 t = -2*(em - BetaI*pm*cm);
00445 t1 = -2*(ep + BetaI*pp*cp);
00446
00447 u = -2*(ep - BetaI*pp*cp);
00448 u1 = -2*(em + BetaI*pm*cm);
00449
00450 double is = 1/s;
00451 double is1 = 1/s1;
00452 double it = 1/t;
00453 double it1 = 1/t1;
00454
00455 double s_ev = gGlobal->Get_s()*0.25;
00456 std::complex<double> vpt,vpt1,vps,vps1;
00457 vpt = fVPol->Evalt(s_ev*t);
00458 vpt1 = fVPol->Evalt(s_ev*t1);
00459 vps = fVPol->Evals(s_ev*s);
00460 vps1 = fVPol->Evals(s_ev*s1);
00461
00462
00463 double vpss, vps1s1, vptt, vpt1t1, vptct1, vpscs1, vptcs, vpt1cs1, vpt1cs, vptcs1;
00464 vpss = std::real(vps*std::conj(vps));
00465 vps1s1 = std::real(vps1*std::conj(vps1));
00466 vptt = std::real(vpt*std::conj(vpt));
00467 vpt1t1 = std::real(vpt1*std::conj(vpt1));
00468
00469 vptct1 = std::real(vpt*std::conj(vpt1));
00470 vpscs1 = std::real(vps*std::conj(vps1));
00471 vptcs = std::real(vpt*std::conj(vps));
00472 vpt1cs1 = std::real(vpt1*std::conj(vps1));
00473 vpt1cs = std::real(vpt1*std::conj(vps));
00474 vptcs1 = std::real(vpt*std::conj(vps1));
00475
00476 double chi_m,chi_p,chi_m_p,chi_p_p;
00477 chi_m = eg*(1 - BetaI*cg);
00478 chi_p = eg*(1 + BetaI*cg);
00479 chi_m_p = 2*(1 - ep);
00480 chi_p_p = 2*(1 - em);
00481
00482 double ichi_m = 1/chi_m;
00483 double ichi_p = 1/chi_p;
00484 double ichi_m_p = 1/chi_m_p;
00485 double ichi_p_p = 1/chi_p_p;
00486
00487 double SS,S1S1,SS1,TT,T1T1,TT1,TS,TS1,T1S,T1S1;
00488 SS = t*t + t1*t1 + u*u + u1*u1;
00489 S1S1 = SS;
00490 SS1 = SS*(t*chi_p*chi_p_p + t1*chi_m*chi_m_p - u*chi_p*chi_m_p - u1*chi_m*chi_p_p);
00491 TT = s*s + s1*s1 + u*u + u1*u1;
00492 T1T1 = TT;
00493 TT1 = TT*(u*chi_p*chi_m_p + u1*chi_m*chi_p_p + s*chi_m_p*chi_p_p + s1*chi_m*chi_p);
00494 TS = -0.5*( u*u + u1*u1 )*( s *(t + s1) + t *(s + t1) - u*u1 );
00495 TS1 = -0.5*( u*u + u1*u1 )*( t *(s1 + t1) + s1*(s + t ) - u*u1 );
00496 T1S = 0.5*( u*u + u1*u1 )*( t1*(s + t ) + s *(s1 + t1) - u*u1 );
00497 T1S1 = 0.5*( u*u + u1*u1 )*( s1*(s + t1) + t1*(s1 + t ) - u*u1 );
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512 double R =
00513 vpss*SS*(is*ichi_m_p*ichi_p_p) +
00514 vps1s1*S1S1*(is1*ichi_m*ichi_p) -
00515 vptt*TT*(it*ichi_p*ichi_p_p) -
00516 vpt1t1*T1T1*(it1*ichi_m*ichi_m_p) +
00517 (vptct1*TT1*(it*it1) - vpscs1*SS1*(is*is1))*(ichi_m*ichi_m_p*ichi_p*ichi_p_p) +
00518 vptcs*TS*(it*is*ichi_m_p*ichi_p*ichi_p_p) +
00519 vpt1cs1*T1S1*(it1*is1*ichi_m*ichi_m_p*ichi_p) -
00520 vpt1cs*T1S*(it1*is*ichi_m*ichi_m_p*ichi_p_p) -
00521 vptcs1*TS1*(it*is1*ichi_m*ichi_p*ichi_p_p);
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537 double me2 = gGlobal->Get_MI2();
00538 double st2 = (s+t)*(s+t);
00539 double b1 = 0.5*(vptt *( s*s + st2)*it *it + vpss *( st2 + t*t )* is*is ) + vptcs *st2 *is *it;
00540 double st12 = (s+t1)*(s+t1);
00541 double b2 = 0.5*(vpt1t1*( s*s + st12)*it1*it1 + vpss *( st12 + t1*t1)* is*is ) + vptcs *st12*is *it1;
00542 double s1t2 = (s1+t)*(s1+t);
00543 double b3 = 0.5*(vptt *(s1*s1 + s1t2)*it *it + vps1s1*(s1t2 + t*t )*is1*is1) + vptcs1 *s1t2*is1*it;
00544 double s1t12 = (s1+t)*(s1+t1);
00545 double b4 = 0.5*(vpt1t1*(s1*s1 +s1t12)*it1*it1 + vps1s1*(s1t12 + t1*t1)*is1*is1) + vpt1cs1*s1t12*is1*it1;
00546 R -= 4*me2*(
00547 (ichi_p_p*ichi_p_p)*b1 +
00548 (ichi_m_p*ichi_m_p)*b2 +
00549 (ichi_p *ichi_p )*b3 +
00550 (ichi_m *ichi_m )*b4
00551 );
00552
00553 double CosPsi = fEvent->GetCosPsi();
00554 double gamma = eg*pm/(2 - eg*(1 - em*CosPsi/pm));
00555
00556 return R*gamma*0.25;
00557 }
00558
00559 #define DB(x) #x<<"="<<x<<", "
00560 double TEPCrossPart::RGamma_kuraev_eidelman(const bool &print){
00561
00562 double em,pm,cm, ep,pp,cp, eg,pg,cg;
00563 fEvent->GetPPar(0,em,pm,cm);
00564 fEvent->GetPPar(1,ep,pp,cp);
00565 fEvent->GetPPar(2,eg,pg,cg);
00566
00567 double s = 4;
00568 double s1 = s*(1 - eg);
00569
00570 double u1 = s*(-1. + 0.5*em*(1.-cm));
00571 double t1 = -0.5*s*em*(1.+cm);
00572 double t = -0.5*s*em*(1.-cm);
00573 double u = s*(-1 + eg + 0.5*em*(1+cm));
00574 double utilde = s*(-1 + 0.5*em*(1+cm));
00575 double t1tilde = s*(-1 + eg +0.5*em*(1-cm));
00576
00577 double BetaI = gGlobal->Get_BetaI();
00578 double chi_m = eg*(1 - BetaI*cg);
00579 double chi_p = eg*(1 + BetaI*cg);
00580 double chi_m_p = 2*(1 - ep);
00581 double chi_p_p = 2*(1 - em);
00582 double me2 = gGlobal->Get_MI2();
00583 double R_i =
00584 0.5*(u *u1*pow(1/t1+1/s1,2) + s*s1/pow(t1 ,2) +
00585 t*t1 /pow(s1,2))*s*(-me2*(1-eg)/pow(chi_m,2) + (1+pow(1-eg,2))/(eg*chi_m)) +
00586 0.5*(utilde*u1*pow(1/t +1/s1,2) + s*s1/pow(t1tilde,2) +
00587 t*t1tilde/pow(s1,2))*s*(-me2*(1-eg)/pow(chi_p,2) + (1+pow(1-eg,2))/(eg*chi_p));
00588
00589 double R_f = pow((3+cm*cm)/(1-cm),2)*s*(-me2/(4*pow(chi_p_p,2))-me2/(4*pow(chi_m_p,2)) +
00590 (1+pow(1-eg,2))/(4*eg)*(1/chi_m_p + 1/chi_p_p));
00591
00592 double R = R_i + R_f;
00593
00594 double CosPsi = fEvent->GetCosPsi();
00595 double gamma = eg*pm/(2 - eg*(1 - em*CosPsi/pm));
00596 if(print)cout<<DB(R_i)<<DB(R_f)<<DB(gamma)<<DB(u)<<DB(u1)<<DB(utilde)<<DB(t)<<DB(t1)<<DB(t1tilde)<<DB(chi_m)<<DB(chi_p)<<DB(chi_m_p)<<DB(chi_p_p)<<endl<<flush;
00597 return R*gamma*0.25;
00598 }