/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Generator/Mcgpj/Mcgpj-00-01-04/src/code/src/TMuCrossPart.C

Go to the documentation of this file.
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   // soft photons 
00015   fPhD1  = new TPhotonD();
00016   fPhD2  = new TPhotonD();
00017 
00018   // initial hard photons
00019   fPhI1  = new TPhotonI();
00020   fPhI2  = new TPhotonI();
00021   
00022   // final hard photons with spherical angle distribution
00023   fPhFS  = new TPhotonFS();
00024 
00025   // vacuum polarization
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   //  cout<<DB(fBetaMu)<<DB(fCompMuSV)<<endl;
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)* // Theta norm
00044     2*gConst->Pi(); // Phi norm  
00045 }
00046 
00047 double TMuCrossPart::MakeCosTheta(){
00048   // generate distribution (2 - beta^2 sin^2(theta))dcos(theta)
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   //  if(cs<0)
00109   //#define DB(x) #x<<"="<<x<<", "
00110   //  std::cout<<DB(Y1)<<DB(y1)<<DB(c1)<<DB(z1)<<DB(z2)<<DB(c)<<std::endl;
00111   return cs*0.25;
00112 }
00113 
00114 // define compensator term for initial particles
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     // one photon out of the narrow cones with singularity around initial particles
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   // Equation 2.12
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   // Equation 2.9
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   // Equation 2.10
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   // Equation 2.13
00436   double C_mu = me2*( 2*mmu2*s1*ichi_p_p*ichi_m_p 
00437                       + (t + u1)*ichi_m_p + (t1 + u)*ichi_p_p 
00438                       + 4*mmu2*(ichi_m_p + ichi_p_p));
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   // Equation 2.11
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   //  cout<<DB(gamma*R_e_mu*0.25)<<endl;
00467   //  return gamma*R_e_mu*vp_s1_cs*0.25;
00468 
00469   return gamma*(R_e*vp_s1_s1 + R_mu*vp_s_s + R_e_mu*vp_s1_cs)*0.25;
00470 }

Generated on Tue Nov 29 23:12:42 2016 for BOSS_7.0.2 by  doxygen 1.4.7