00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "EGS.h"
00015 #include "PEGSData.h"
00016 #include "Random.h"
00017
00018
00019 void EGS::bhabha(const PEGSData& mat)
00020 {
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 double peip = this->e,
00032 prm = rm,
00033 pekin=peip-prm;
00034 float ekin =pekin,
00035 br,
00036
00037 t0 = ekin/rm,
00038 e0 = t0+1.,
00039 yy = 1./(t0+2.),
00040 e02= e0*e0,
00041 betai2=e02/(e02-1.),
00042 ep0 = mat.te/ekin,
00043 ep0c=1.-ep0,
00044 y2=yy*yy,
00045 yp=1.-2.*yy;
00046 float yp2=yp*yp,
00047 b4 =yp2*yp,
00048 b3 =b4+yp2,
00049 b2 =yp*(3.+y2),
00050 b1 =2.-y2;
00051
00052
00053 for(;;)
00054 { float rnno03 = Random::flat();
00055 br=ep0/(1.-ep0c*rnno03);
00056
00057 float rnno04 = Random::flat();
00058 float rejf2=ep0c*(betai2-br*(b1-br*(b2-br*(b3-br*b4))));
00059 if ( rnno04<=rejf2) break ;
00060 }
00061
00062
00063
00064 double pekse2=br*ekin;
00065 double pese1=peip-pekse2;
00066 double pese2=pekse2+prm;
00067
00068
00069
00070 double h1=(peip+prm)/pekin;
00071
00072
00073 float phi = Random::flat(2.*M_PI);
00074 double dcosth=h1*(pese1-prm)/(pese1+prm);
00075 float costhe = sqrt(dcosth);
00076 rotate(costhe, phi);
00077 this->e = pese1;
00078
00079 EGS& el2 = *new EGS(this);
00080 el2.iq=-1;
00081 el2.e = pese2;
00082 dcosth=h1*(pese2-prm)/(pese2+prm);
00083 costhe= sqrt(dcosth);
00084 el2.rotate(costhe, phi+M_PI);
00085
00086 }
00087