00001 #include "TMuCrossPart.h"
00002 #include "TRadGlobal.h"
00003 #include "TKinemCut.h"
00004
00005 TMuCrossPart::TMuCrossPart():TVCrossPart(){
00006 fNPart = 5;
00007
00008 fK = new TMuKFun();
00009 fK->Init(gGlobal->GetDatadir(), gGlobal->GetIntFname());
00010 fD = new TDFun();
00011 fEvent = new TEvent();
00012 std::cout<<"Coloumb factor is "<<fK->Eval_Coloumb_Factor(gGlobal->Get_s())<<std::endl;
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 fVPol = new TVacuumPol();
00027 fVPol->Init(gGlobal->GetDatadir(), gGlobal->GetVpolFname());
00028
00029 fBetaMu = gGlobal->Get_BetaF();
00030 fCompMuSV = (1+fBetaMu*fBetaMu)/(2*fBetaMu)*log((1+fBetaMu)/(1-fBetaMu))-1;
00031
00032
00033
00034 fHardPhoton = true;
00035 fZeroVP = false;
00036 fNoFSR = false;
00037 }
00038
00039 void TMuCrossPart::SetThetaMin(const double &th){
00040 fCosMin = cos(th);
00041 fBetaMu2 = gGlobal->Get_BetaF()*gGlobal->Get_BetaF();
00042 fMax = 2 - fBetaMu2*(1 - fCosMin*fCosMin);
00043 fNorm = 2*fCosMin*(2 - fBetaMu2 + fCosMin*fCosMin*fBetaMu2/3)*
00044 2*gConst->Pi();
00045 }
00046
00047 double TMuCrossPart::MakeCosTheta(){
00048
00049 double c,s2;
00050 do{
00051 c = (2*gRandom->Rndm()-1)*fCosMin;
00052 s2 = 1 - c*c;
00053 }while(2 - fBetaMu2*s2 < fMax*gRandom->Rndm());
00054 fSinTheta2 = s2;
00055 return c;
00056 }
00057
00058 double TMuCrossPart::GetCNorm(){
00059 return fNorm/(2 - fBetaMu2*fSinTheta2);
00060 }
00061
00062 void TMuCrossPart::Init(){
00063 SetThetaMin(gGlobal->Get_ThetaMin());
00064
00065 fD->Init();
00066 fEvent->Init();
00067
00068 fPhD1->Init();
00069 fPhD2->Init();
00070
00071 fPhI1->Init();
00072 fPhI2->Init();
00073
00074 fPhFS->Init();
00075
00076 if(fZeroVP)
00077 fVPol->SetZeroVP();
00078 else
00079 fVPol->SetDefaultVP();
00080 }
00081
00082 TMuCrossPart::~TMuCrossPart(){
00083 delete fK;
00084 delete fD;
00085 delete fEvent;
00086
00087 delete fPhD1;
00088 delete fPhD2;
00089
00090 delete fPhI1;
00091 delete fPhI2;
00092
00093 delete fPhFS;
00094
00095 delete fVPol;
00096 }
00097
00098 double TMuCrossPart::BornShift(const double &z1, const double &z2, const double &c){
00099 double Y1, y1, c1;
00100 fEvent->GetPPar(0,Y1,y1,c1);
00101 double sw = gGlobal->Get_s()*z1*z2;
00102 std::complex<double> vpsw = fVPol->Evals(sw);
00103 double yc = y1*c;
00104 double ym = z1*(Y1-yc);
00105 double yp = z2*(Y1+yc);
00106 double cs = std::abs(vpsw*std::conj(vpsw));
00107 cs*= y1*(ym*ym + yp*yp + 2*z1*z2*(Y1*Y1 - y1*y1))/(z1*z1*z1*z2*z2*z2*(z1 + z2 - (z1 - z2)*c*Y1/y1));
00108
00109
00110
00111 return cs*0.25;
00112 }
00113
00114
00115 #define COMP_I(x) AP*(-(1/x-1+0.5*x)*gGlobal->Get_LnD()+0.5*x)
00116
00117 double TMuCrossPart::GetValue(const unsigned int ipart){
00118 bool IsSoftIE, IsSoftIP;
00119 IsSoftIE = IsSoftIP = true;
00120
00121 bool CompSV, CompIE, CompIP;
00122 CompSV = CompIE = CompIP = false;
00123 double AP = gConst->AlphaPi();
00124
00125 double c = MakeCosTheta();
00126
00127 switch(ipart){
00128 case 0:
00129 IsSoftIE = IsSoftIP = true;
00130 CompSV = true;
00131 break;
00132 case 1:
00133 IsSoftIP = false;
00134 CompIP = true;
00135 break;
00136 case 2:
00137 IsSoftIE = false;
00138 CompIE = true;
00139 break;
00140 case 3:
00141 IsSoftIE = IsSoftIP = false;
00142 break;
00143 case 4:
00144
00145 if(fHardPhoton && fEvent->MakeEvent(c,fPhI1,2)){
00146 double t1 = gConst->Alpha()/(2*gConst->Pi2())*R_e_Gamma();
00147 double norm = fPhI1->GetENorm()*fPhI1->GetThNorm()*fPhI1->GetPhiNorm()*GetCNorm();
00148 return t1*norm;
00149 }
00150 return 0;
00151 break;
00152 default:
00153 return 0;
00154 break;
00155 }
00156
00157 if(!fHardPhoton) CompSV = CompIE = CompIP = false;
00158
00159 double x1g, x2g;
00160 x1g = x2g = 0;
00161
00162 double z1, z2;
00163 z1 = z2 = 1;
00164
00165 if(IsSoftIE)
00166 x1g = fPhD1->GetEnergy();
00167 else
00168 x1g = fPhI1->GetEnergy();
00169 z1 = 1 - x1g;
00170
00171 if(IsSoftIP)
00172 x2g = fPhD2->GetEnergy();
00173 else
00174 x2g = fPhI2->GetEnergy();
00175 z2 = 1 - x2g;
00176
00177 if(fEvent->MakeEvent(c, x1g, x2g)){
00178
00179 double D1, D2, t2 = 0;
00180
00181 if(IsSoftIE)
00182 D1 = fD->EvalSoft(x1g)*fPhD1->GetENorm();
00183 else{
00184 double norm = fPhI1->GetENorm();
00185 D1 = fD->Eval(z1)*norm;
00186 if(CompIE) t2 = COMP_I(x1g)*norm;
00187 }
00188
00189 if(IsSoftIP)
00190 D2 = fD->EvalSoft(x2g)*fPhD2->GetENorm();
00191 else{
00192 double norm = fPhI2->GetENorm();
00193 D2 = fD->Eval(z2)*norm;
00194 if(CompIP) t2 = COMP_I(x2g)*norm;
00195 }
00196
00197 if(CompSV && !fNoFSR ){
00198 t2 = 2*AP*gGlobal->Get_LnDelta()*(fCompMuSV + 2*log((1-fBetaMu*c)/(1+fBetaMu*c)));
00199 }
00200
00201 double kfactor, coloumbfactor;
00202 if(fNoFSR){
00203 kfactor = 2*AP*fK->Eval_a();
00204 coloumbfactor = 1;
00205 }else{
00206 kfactor = 2*AP*fK->Eval(z1*z2*gGlobal->Get_s(),c);
00207 coloumbfactor = fK->Eval_Coloumb_Factor(z1*z2*gGlobal->Get_s());
00208 }
00209 double t1 = coloumbfactor*(1 + kfactor)*D1*D2;
00210
00211 return BornShift(z1,z2,c)*(t1+t2)*GetCNorm();
00212
00213 }
00214 return 0;
00215 }
00216
00217 double TMuCrossPart::R_e_Gamma(){
00218
00219
00220 double em,pm,cm, ep,pp,cp, eg,pg,cg;
00221 fEvent->GetPPar(0,em,pm,cm);
00222 fEvent->GetPPar(1,ep,pp,cp);
00223 fEvent->GetPPar(2,eg,pg,cg);
00224
00225 double s, s1, t, t1, u, u1;
00226 s = 4;
00227 s1 = 4*(1-eg);
00228
00229 double BetaI = gGlobal->Get_BetaI();
00230 t = -2*(em-BetaI*pm*cm);
00231 t1 = -2*(ep+BetaI*pp*cp);
00232
00233 u = -2*(ep-BetaI*pp*cp);
00234 u1 = -2*(em+BetaI*pm*cm);
00235
00236 double chi_m = eg*(1-BetaI*cg);
00237 double chi_p = eg*(1+BetaI*cg);
00238 double ichi_m = 1/chi_m;
00239 double ichi_p = 1/chi_p;
00240
00241 double chi_m_p=0, chi_p_p=0, ichi_m_p=0, ichi_p_p=0;
00242 if(!fNoFSR){
00243 chi_m_p = 2*(1-ep);
00244 chi_p_p = 2*(1-em);
00245 ichi_m_p = 1/chi_m_p;
00246 ichi_p_p = 1/chi_p_p;
00247 }
00248
00249 double is = 1/s;
00250 double is1 = 1/s1;
00251
00252 double mmu2 = gGlobal->Get_MF2();
00253 double me2 = gGlobal->Get_MI2();
00254
00255 double B = (u*u + u1*u1 + t*t + t1*t1)*(0.25*is*is1);
00256 double D_s1_s1 = ((t+u)*(t+u)+(t1+u1)*(t1+u1))*(0.5*ichi_m*ichi_p);
00257 double R_e = s*B*(ichi_m*ichi_p)
00258 - me2*(0.5*ichi_m*ichi_m*is1*is1)*(t1*t1 + u1*u1 + 2*mmu2*s1)
00259 - me2*(0.5*ichi_p*ichi_p*is1*is1)*(t*t + u*u + 2*mmu2*s1)
00260 + mmu2*(is1*is1)*D_s1_s1;
00261
00262 double R_mu = 0;
00263 double R_e_mu = 0;
00264 if(!fNoFSR){
00265 double D_s_s = -(u*u + t1*t1 + 2*s*mmu2)*(0.5*ichi_m_p*ichi_m_p)
00266 -(u1*u1 + t*t + 2*s*mmu2)*(0.5*ichi_p_p*ichi_p_p)
00267 +(s*s1 - s*s + t*u + t1*u1 - 2*s*mmu2)*(ichi_m_p*ichi_p_p);
00268 R_mu = s1*B*(ichi_m_p*ichi_p_p)+mmu2*(is*is)*D_s_s;
00269
00270 double C =
00271 u*(ichi_m*ichi_p_p) + u1*(ichi_p*ichi_m_p) -
00272 t*(ichi_m*ichi_m_p) - t1*(ichi_p*ichi_p_p);
00273 double D_s_s1 = 0.5*(s+s1)*C + 2*(u-t1)*ichi_m_p + 2*(u1-t)*ichi_p_p;
00274 R_e_mu = B*C + mmu2*(is*is1)*D_s_s1;
00275 }
00276
00277 double CosPsi = fEvent->GetCosPsi();
00278 double gamma = eg*pm/(2-eg*(1-em*CosPsi/pm));
00279
00280 std::complex<double> vp_s1 = fVPol->Evals(gGlobal->Get_s()*(1-eg));
00281 double vp_s1_s1 = std::abs(vp_s1*vp_s1);
00282
00283 double vp_s_s = 0;
00284 double vp_s1_cs = 0;
00285 if(!fNoFSR){
00286 std::complex<double> vp_s = fVPol->Evals(gGlobal->Get_s());
00287 vp_s_s = std::abs(vp_s*vp_s);
00288 vp_s1_cs= std::real(vp_s1*std::conj(vp_s));
00289 }
00290
00291 return (vp_s1_s1*R_e + vp_s1_cs*R_e_mu + vp_s_s*R_mu)*gamma;
00292 }
00293
00294 double TMuCrossPart::R_f_Gamma(){
00295 double em,pm,cm, ep,pp,cp, eg,pg,cg;
00296 fEvent->GetPPar(0,em,pm,cm);
00297 fEvent->GetPPar(1,ep,pp,cp);
00298 fEvent->GetPPar(2,eg,pg,cg);
00299
00300 double s, s1, t, t1, u, u1;
00301 s = 4;
00302 s1 = 4*(1-eg);
00303
00304 double BetaI = gGlobal->Get_BetaI();
00305 t = -2*(em-BetaI*pm*cm);
00306 t1 = -2*(ep+BetaI*pp*cp);
00307
00308 u = -2*(ep-BetaI*pp*cp);
00309 u1 = -2*(em+BetaI*pm*cm);
00310
00311 double chi_m, chi_p, chi_m_p, chi_p_p;
00312 chi_m = eg*(1-BetaI*cg);
00313 chi_p = eg*(1+BetaI*cg);
00314 chi_m_p = 2*(1-ep);
00315 chi_p_p = 2*(1-em);
00316
00317 double mmu2 = gGlobal->Get_MF2();
00318 double B = (u*u + u1*u1 + t*t + t1*t1)/(4*s*s1);
00319 double D_s_s = -(u*u + t1*t1 + 2*s*mmu2)/(2*chi_m_p*chi_m_p)
00320 -(u1*u1 + t*t + 2*s*mmu2)/(2*chi_p_p*chi_p_p)
00321 +(s*s1 - s*s + t*u + t1*u1 - 2*s*mmu2)/(chi_m_p*chi_p_p);
00322 double R_mu = s1*B/(chi_m_p*chi_p_p)+mmu2/(s*s)*D_s_s;
00323
00324 double C = u/(chi_m*chi_p_p) + u1/(chi_p*chi_m_p) - t/(chi_m*chi_m_p) - t1/(chi_p*chi_p_p);
00325 double D_s_s1 = 0.5*(s+s1)*C + 2*(u-t1)/chi_m_p + 2*(u1-t)/chi_p_p;
00326 double R_e_mu = B*C + mmu2/(s*s1)*D_s_s1;
00327
00328
00329 double CosPsi = fEvent->GetCosPsi();
00330 double gamma = eg*pm/(2-eg*(1-em*CosPsi/pm));
00331
00332 std::complex<double> vp_s = fVPol->Evals(gGlobal->Get_s());
00333 double vp_s_s = std::abs(vp_s*vp_s);
00334 std::complex<double> vp_s1 = fVPol->Evals(gGlobal->Get_s()*s1*0.25);
00335 double vp_s1_cs= std::real(vp_s1*std::conj(vp_s));
00336
00337 double RG_f = gamma*(vp_s_s*R_mu + vp_s1_cs*R_e_mu);
00338 return RG_f;
00339 }
00340
00341 double TMuCrossPart::R_e_Gamma_t(){
00342 double em,pm,cm, ep,pp,cp, eg,pg,cg;
00343
00344 fEvent->GetPPar(0,em,pm,cm);
00345 fEvent->GetPPar(1,ep,pp,cp);
00346 fEvent->GetPPar(2,eg,pg,cg);
00347
00348 double betam = pm/em;
00349 double betap = pp/ep;
00350
00351 double mmu2 = gGlobal->Get_MF2();
00352 double egamma2 = 1/gGlobal->Get_MI2();
00353
00354 double Ae = mmu2*(1-eg+eg*eg/4*(1+cg*cg))+ep*em*(1-(1-eg)*betap*cp*betam*cm)
00355 +(1-eg)*eg*cg*eg*cg/2+(1-eg/2)*((2-eg)*(1-eg)-2*ep*em);
00356
00357 double Be =-1/(1+egamma2*(1-cg*cg))*((1-eg)*(mmu2*ep*em*(1-betap*cp*betam*cm)-2)+
00358 ep*ep*(1+cg*betap*cp)+
00359 em*em*(1+cg*betam*cm));
00360
00361 double CosPsi = fEvent->GetCosPsi();
00362 double gamma = eg*pm/(2-eg*(1-em*CosPsi/pm));
00363
00364 double BetaI = gGlobal->Get_BetaI();
00365 double RG_i = (Ae+Be)*gamma/((eg*eg*(1-eg)*(1-eg))*(1-BetaI*BetaI*cg*cg));
00366
00367 std::complex<double> vp_s1 = fVPol->Evals(gGlobal->Get_s()*(1-eg));
00368 double vp_s1_s1 = std::abs(vp_s1*vp_s1);
00369
00370 return vp_s1_s1*RG_i;
00371 }
00372
00373 double TMuCrossPart::R_e_mu_Gamma_t(){
00374 TLorentzVector pm(0,0,gGlobal->Get_BetaI(),1.);
00375 TLorentzVector pp(0,0,-gGlobal->Get_BetaI(),1.);
00376 TLorentzVector qm = fEvent->Get4Vector(0);
00377 TLorentzVector qp = fEvent->Get4Vector(1);
00378 TLorentzVector k = fEvent->Get4Vector(2);
00379
00380 double s = (pp + pm)*(pp + pm);
00381 double s1 = (qp + qm)*(qp + qm);
00382
00383 double t = -2*pm*qm;
00384 double t1 = -2*pp*qp;
00385 double u = -2*pm*qp;
00386 double u1 = -2*pp*qm;
00387
00388 double chi_p = pp*k;
00389 double chi_m = pm*k;
00390 double chi_p_p = qp*k;
00391 double chi_m_p = qm*k;
00392
00393 double ichi_m = 1/chi_m;
00394 double ichi_p = 1/chi_p;
00395 double ichi_m_p = 1/chi_m_p;
00396 double ichi_p_p = 1/chi_p_p;
00397
00398 TLorentzVector Q = qm*ichi_m_p - qp*ichi_p_p;
00399 TLorentzVector P = pp*ichi_p - pm*ichi_m;
00400
00401 double mmu2 = gGlobal->Get_MF2();
00402 double me2 = gGlobal->Get_MI2();
00403
00404 double cA = 2*mmu2*s + u*u1 + t*t1;
00405 double cPp = 2*mmu2*chi_p - u1*chi_p_p - t1*chi_m_p;
00406 double cPm = 2*mmu2*chi_m - u *chi_m_p - t *chi_p_p;
00407
00408
00409 double A_e =
00410 0.5*s*ichi_p*ichi_m*cA + ichi_m*cPp + ichi_p*cPm -
00411 0.5*(u1*ichi_p - t*ichi_m)*(u-t1) -
00412 0.5*(t1*ichi_p - u*ichi_m)*(t-u1) -
00413 0.5*s*ichi_p*(2*mmu2 + ichi_m*cPp) -
00414 0.5*s*ichi_m*(2*mmu2 + ichi_p*cPm);
00415
00416 double B_e = -me2*(0.5*(ichi_p*ichi_p + ichi_m*ichi_m)*cA -
00417 ichi_p*ichi_p*cPm - ichi_m*ichi_m*cPp);
00418
00419 double R_e = A_e + B_e; R_e *= s/(s1*s1);
00420
00421
00422 double A_mu =
00423 ((cA - (u1 + t1)*chi_m - (u + t)*chi_p)*qm*qp -
00424 4*mmu2*chi_p*chi_m)*(ichi_p_p*ichi_m_p) -
00425 (t1*chi_m + u*chi_p)*ichi_m_p -
00426 (u1*chi_m + t*chi_p)*ichi_p_p +
00427 0.5*(t1*ichi_p_p - u1*ichi_m_p)*(t-u) +
00428 0.5*(u*ichi_p_p - t*ichi_m_p)*(u1-t1);
00429
00430 double B_mu =
00431 -0.5*cA*mmu2*(ichi_p_p*ichi_p_p + ichi_m_p*ichi_m_p) +
00432 mmu2*((t1*chi_m + u*chi_p)*(ichi_m_p*ichi_m_p) +
00433 (u1*chi_m + t*chi_p)*(ichi_p_p*ichi_p_p));
00434
00435
00436
00437
00438
00439
00440 double C_mu = 0;
00441 double R_mu = A_mu + B_mu + C_mu; R_mu /= s;
00442
00443 double C = u*(ichi_m*ichi_p_p) + u1*(ichi_p*ichi_m_p) -
00444 t*(ichi_m*ichi_m_p) - t1*(ichi_p*ichi_p_p);
00445
00446
00447 double R_e_mu = 0.5*cA*C -
00448 2*( -t - t1 + u + u1 -
00449 0.5*u1*(pm*ichi_m - qp*ichi_p_p )*(Q*chi_p_p + P*chi_m) -
00450 0.5*t1*(pm*ichi_m - qm*ichi_m_p )*(Q*chi_m_p - P*chi_m) -
00451 mmu2*(chi_p + chi_m )*(Q*P) +
00452 mmu2*(ichi_p_p - ichi_m_p )*(chi_m - chi_p) -
00453 0.5*t*(qp*ichi_p_p - pp*ichi_p )*(Q*chi_p_p - P*chi_p) -
00454 0.5*u*(qm*ichi_m_p - pp*ichi_p )*(Q*chi_m_p + P*chi_p) );
00455 R_e_mu /= s1;
00456
00457 double CosPsi = fEvent->GetCosPsi();
00458 double gamma = k.E()*qm.P()/(2-k.E()*(1-qm.E()*CosPsi/qm.P()));
00459
00460 std::complex<double> vp_s1 = fVPol->Evals(gGlobal->Get_s()*s1*0.25);
00461 std::complex<double> vp_s = fVPol->Evals(gGlobal->Get_s());
00462 double vp_s1_s1 = std::abs(vp_s1*vp_s1);
00463 double vp_s_s = std::abs(vp_s*vp_s);
00464 double vp_s1_cs = std::real(vp_s1*std::conj(vp_s));
00465
00466
00467
00468
00469 return gamma*(R_e*vp_s1_s1 + R_mu*vp_s_s + R_e_mu*vp_s1_cs)*0.25;
00470 }