00001 using namespace std;
00002
00003 #include "sourcecalc.h"
00004
00005 CSourceCalc_EllipticBlast::CSourceCalc_EllipticBlast(){
00006 InitSPars();
00007 randy=new CRandom(-1234);
00008 }
00009
00010 void CSourceCalc_EllipticBlast::InitSPars(){
00011
00012 parameter::set(spars,"Rx",13);
00013 parameter::set(spars,"Ry",13);
00014 parameter::set(spars,"Tau",12);
00015 parameter::set(spars,"BetaX",0.7);
00016 parameter::set(spars,"BetaY",0.7);
00017 parameter::set(spars,"T",110);
00018 parameter::set(spars,"Pt",600);
00019 parameter::set(spars,"Phi",0.0);
00020 parameter::set(spars,"EtaG",2.0);
00021 parameter::set(spars,"Ma",938.28);
00022 parameter::set(spars,"Mb",139.58);
00023 parameter::set(spars,"Nsample",1000);
00024 }
00025
00026 void CSourceCalc_EllipticBlast::SetSPars(double Rxset,double Ryset,double Tauset,
00027 double BetaXset,double BetaYset,
00028 double Tset,double Ptset,
00029 double Phiset,double EtaGset,
00030 double Maset,double Mbset){
00031 InitSPars();
00032 parameter::set(spars,"Rx",Rxset);
00033 parameter::set(spars,"Ry",Ryset);
00034 parameter::set(spars,"Tau",Tauset);
00035 parameter::set(spars,"BetaX",BetaXset);
00036 parameter::set(spars,"BetaY",BetaYset);
00037 parameter::set(spars,"T",Tset);
00038 parameter::set(spars,"Pt",Ptset);
00039 parameter::set(spars,"Phi",Phiset);
00040 parameter::set(spars,"EtaG",EtaGset);
00041 parameter::set(spars,"Ma",Maset);
00042 parameter::set(spars,"Mb",Mbset);
00043
00044 }
00045
00046 void CSourceCalc_EllipticBlast::SetSPars(double Rset,double Tauset,
00047 double Betaset,double Tset,double Ptset){
00048
00049 InitSPars();
00050 parameter::set(spars,"Rx",Rset);
00051 parameter::set(spars,"Ry",Rset);
00052 parameter::set(spars,"Tau",Tauset);
00053 parameter::set(spars,"BetaX",Betaset);
00054 parameter::set(spars,"BetaY",Betaset);
00055 parameter::set(spars,"T",Tset);
00056 parameter::set(spars,"Pt",Ptset);
00057
00058 }
00059
00060 void CSourceCalc_EllipticBlast::CalcS(CCHArray *A){
00061 int alpha;
00062 double pa[4],pb[4],ptot[4];
00063 double cphi,sphi,ma,mb,phi,Pt,T,tau,volume,delr;
00064 int nsample;
00065 double rcm[4],**ra,**rb;
00066 int ir,imc,ia,ib,nbmax,nrmax;
00067 double x,y,z,xbar,ybar,zbar,x2bar,y2bar,z2bar,ex,ey,ez,snorm,r;
00068 bool SameMass;
00069 const double PI=4.0*atan(1.0);
00070 delr=A->GetRADSTEP();
00071 nrmax=A->GetNRADIAL();
00072
00073 nsample=parameter::getI(spars,"Nsample",1000);
00074 ma=parameter::getD(spars,"Ma",-999);
00075 mb=parameter::getD(spars,"Mb",-999);
00076 SameMass=0;
00077 if(fabs(ma-mb)<1.0) SameMass=1;
00078 pa[3]=pb[3]=0.0;
00079 phi=parameter::getD(spars,"Phi",-999);
00080 Pt=parameter::getD(spars,"Pt",-999);
00081 T=parameter::getD(spars,"T",-999);
00082 tau=parameter::getD(spars,"Tau",-999);
00083 sphi=sin(phi);
00084 cphi=cos(phi);
00085 pa[1]=cphi*Pt*ma/(ma+mb);
00086 pb[1]=cphi*Pt*mb/(ma+mb);
00087 pa[2]=sphi*Pt*ma/(ma+mb);
00088 pb[2]=sphi*Pt*mb/(ma+mb);
00089 pa[0]=sqrt(ma*ma+pa[1]*pa[1]+pa[2]*pa[2]+pa[3]*pa[3]);
00090 pb[0]=sqrt(mb*mb+pb[1]*pb[1]+pb[2]*pb[2]+pb[3]*pb[3]);
00091 for(alpha=0;alpha<4;alpha++) ptot[alpha]=pa[alpha]+pb[alpha];
00092
00093 ra=new double *[nsample];
00094 for(imc=0;imc<nsample;imc++) ra[imc]=new double[4];
00095 Get_r(pa,nsample,ra);
00096 if(SameMass){
00097 rb=ra;
00098 }
00099 else{
00100 rb=new double *[nsample];
00101 for(imc=0;imc<nsample;imc++) rb[imc]=new double[4];
00102 Get_r(pb,nsample,rb);
00103 }
00104
00105 rcm[0]=0.0;
00106 xbar=ybar=zbar=x2bar=y2bar=z2bar=0.0;
00107 for(ia=0;ia<nsample;ia++){
00108 nbmax=nsample;
00109 if(SameMass) nbmax=ia-1;
00110 for(ib=0;ib<nbmax;ib++){
00111 rcm[1]=ra[ia][1]-rb[ib][1];
00112 rcm[2]=ra[ia][2]-rb[ib][2];
00113 rcm[3]=ra[ia][3]-rb[ib][3];
00114
00115 r=sqrt(rcm[1]*rcm[1]+rcm[2]*rcm[2]+rcm[3]*rcm[3]);
00116 x=rcm[1];
00117 y=rcm[2];
00118 z=rcm[3];
00119 xbar+=x;
00120 x2bar+=x*x;
00121 ybar+=y;
00122 y2bar+=y*y;
00123 zbar+=z;
00124 z2bar+=z*z;
00125
00126 ir=int(floor(r/delr));
00127 if(ir<nrmax){
00128 ex=x/r; ey=y/r; ez=z/r;
00129 A->IncrementAExpArrayFromE(ex,ey,ez,1.0,ir);
00130 }
00131 }
00132 if(10*(ia+1)%nsample==0)
00133 printf("finished %g percent\n",100*double(ia+1)/double(nsample));
00134 }
00135 A->FillRemainderX();
00136 if(SameMass) snorm=2.0/double(nsample*(nsample-1));
00137 else snorm=1.0/double(nsample*nsample);
00138 xbar*=snorm;
00139 x2bar*=snorm;
00140 ybar*=snorm;
00141 y2bar*=snorm;
00142 zbar*=snorm;
00143 z2bar*=snorm;
00144 x2bar=x2bar-xbar*xbar;
00145 y2bar=y2bar-ybar*ybar;
00146 z2bar=z2bar-zbar*zbar;
00147
00148 printf("xbar=%g, ybar=%g, zbar=%g\n",xbar,ybar,zbar);
00149 printf("Effective Gaussian Radii: Rout=%g, Rside=%g, Rlong=%g\n",
00150 sqrt(0.5*x2bar),sqrt(0.5*y2bar),sqrt(0.5*z2bar));
00151
00152 for(ir=0;ir<nrmax;ir++){
00153 volume=(4.0*PI/3)*(pow((ir+1)*delr,3)
00154 -pow(double(ir)*delr,3));
00155 A->ScaleArray(snorm/volume,ir);
00156 }
00157
00158 for(imc=0;imc<nsample;imc++){
00159 delete ra[imc];
00160 if(!SameMass) delete rb[imc];
00161 }
00162 delete ra;
00163 delete rb;
00164
00165 }
00166
00167 void CSourceCalc_EllipticBlast::Get_r(double *p,int nsample,double **r){
00168 double phi,eta,arg,etaG,u[4],x,y,z,t,Rx,Ry,weight;
00169 double uxmax,uymax,betaxmax,betaymax,eprime,eu,T,tau;
00170 double pt,gamma,gammav,rap,rout,rlong,rside,sinhy,coshy;
00171 int imc;
00172 const double PI=4.0*atan(1.0);
00173 double m=sqrt(p[0]*p[0]-p[1]*p[1]-p[2]*p[2]-p[3]*p[3]);
00174 etaG=parameter::getD(spars,"EtaG",-999);
00175 Rx=parameter::getD(spars,"Rx",-999);
00176 Ry=parameter::getD(spars,"Ry",-999);
00177 T=parameter::getD(spars,"T",-999);
00178 tau=parameter::getD(spars,"Tau",-999);
00179 betaxmax=parameter::getD(spars,"BetaX",-999);
00180 betaymax=parameter::getD(spars,"BetaY",-999);
00181 uxmax=betaxmax/sqrt(1.0-betaxmax*betaxmax);
00182 uymax=betaymax/sqrt(1.0-betaymax*betaymax);
00183 rap=atanh(p[3]/p[0]);
00184 pt=sqrt(p[1]*p[1]+p[2]*p[2]);
00185 gammav=pt/m;
00186 gamma=sqrt(1.0+gammav*gammav);
00187
00188 for(imc=0;imc<nsample;imc++){
00189 do{
00190 eta=etaG*randy->gauss();
00191 TRY_AGAIN:
00192 x=(1.0-2.0*randy->ran());
00193 y=(1.0-2.0*randy->ran());
00194 if(x*x+y*y>1.0) goto TRY_AGAIN;
00195 u[1]=uxmax*x;
00196 u[2]=uymax*y;
00197 x=x*Rx;
00198 y=y*Ry;
00199 u[3]=sinh(eta);
00200 u[0]=sqrt(1.0+u[1]*u[1]+u[2]*u[2]+u[3]*u[3]);
00201
00202 eprime=p[0]*cosh(eta)-p[3]*u[3];
00203 eu=u[0]*p[0]-u[1]*p[1]-u[2]*p[2]-u[3]*p[3];
00204
00205 weight=(eprime/p[0])*exp(-(eu-m)/T);
00206 if(weight>1.0){
00207 printf("DISASTER! weight > 1.0\n");
00208 exit(1);
00209 }
00210 } while(weight<randy->ran());
00211
00212 z=tau*sinh(eta);
00213 t=tau*cosh(eta);
00214
00215 rout=(p[1]*x+p[2]*y)/pt;
00216 rside=(p[1]*y-p[2]*x)/pt;
00217 sinhy=sinh(rap);
00218 coshy=cosh(rap);
00219 rlong=coshy*z-sinhy*t;
00220 t=coshy*t-sinhy*z;
00221 r[imc][0]=gamma*t-gammav*rout;
00222 r[imc][1]=gamma*rout-gammav*t;
00223 r[imc][2]=rside;
00224 r[imc][3]=rlong;
00225
00226 }
00227 }