00001 #ifndef __INCLUDE_SOURCECALC_OSCAR
00002 #define __INCLUDE_SOURCECALC_OSCAR
00003 #include "sourcecalc.h"
00004
00005 using namespace std;
00006
00007 CSourceCalc_OSCAR::CSourceCalc_OSCAR(){
00008 InitSPars();
00009 parameter::PrintPars(spars);
00010 }
00011
00012 CSourceCalc_OSCAR::CSourceCalc_OSCAR(string sparsfilename){
00013 InitSPars();
00014 parameter::ReadParsFromFile(spars,sparsfilename);
00015 parameter::PrintPars(spars);
00016 }
00017
00018 void CSourceCalc_OSCAR::InitSPars(){
00019
00020 parameter::set(spars,"PT",600.0);
00021 parameter::set(spars,"DELPT",20.0);
00022 parameter::set(spars,"PHIMIN_DEG",0.0);
00023 parameter::set(spars,"PHIMAX_DEG",360.0);
00024 parameter::set(spars,"YMIN",-1.0);
00025 parameter::set(spars,"YMAX",1.0);
00026 parameter::set(spars,"NMAX",20000);
00027 parameter::set(spars,"OSCARfilename","UNDEFINED");
00028 parameter::set(spars,"NEVENTSMAX",10000);
00029 }
00030
00031 void CSourceCalc_OSCAR::SetSPars(double PT_set,double DELPT_set,double PHIMIN_DEG_set,double PHIMAX_DEG_set,double YMIN_set,double YMAX_set){
00032 parameter::set(spars,"PT",PT_set);
00033 parameter::set(spars,"DELPT",DELPT_set);
00034 parameter::set(spars,"PHIMIN_DEG",PHIMIN_DEG_set);
00035 parameter::set(spars,"PHIMAX_DEG",PHIMAX_DEG_set);
00036 parameter::set(spars,"YMIN",YMIN_set);
00037 parameter::set(spars,"YMAX",YMAX_set);
00038 }
00039
00040 void CSourceCalc_OSCAR::SetIDs(int *idlista,int nida,int *idlistb,int nidb){
00041 idlist_a=idlista;
00042 nid_a=nida;
00043 nid_b=nidb;
00044 idlist_b=idlistb;
00045 }
00046
00047 void CSourceCalc_OSCAR::CalcS(CMCList *&lista,CMCList *&listb){
00048 double **ra,**rb;
00049 int ia,ib,na=0,nb=0;
00050 bool AEQUALB=parameter::getB(spars,"AEQUALB",true);
00051 int NMAX=parameter::getI(spars,"NMAX",50000);
00052
00053 ra=new double *[NMAX];
00054 for(ia=0;ia<NMAX;ia++) ra[ia]=new double[4];
00055 if(AEQUALB){
00056 rb=ra;
00057 }
00058 else{
00059 rb=new double *[NMAX];
00060 for(ib=0;ib<NMAX;ib++) rb[ib]=new double[4];
00061 }
00062 ReadR(ra,na,rb,nb);
00063
00064 if(lista==NULL) lista=new CMCList(na);
00065 else if(lista->GetNMC()!=na) lista->Resize(na);
00066 if(!AEQUALB){
00067 if(listb==NULL) listb=new CMCList(nb);
00068 else if(listb->GetNMC()!=nb) listb->Resize(nb);
00069 }
00070
00071 for(int i=0;i<na;i++) lista->SetR(i,ra[i]);
00072 if(lista!=listb){
00073 for(int i=0;i<nb;i++) listb->SetR(i,rb[i]);
00074 }
00075
00076 for(ia=0;ia<NMAX;ia++){
00077 delete [] ra[ia];
00078 }
00079 delete [] ra;
00080 if(!AEQUALB){
00081 for(ib=0;ib<NMAX;ib++){
00082 delete [] rb[ib];
00083 }
00084 delete [] rb;
00085 }
00086 printf("______ FINISHED CREATING MCLISTS ___________\n");
00087
00088 }
00089
00090 void CSourceCalc_OSCAR::ReadR(double **ra,int &na,double **rb,int &nb){
00091 FILE *oscarfile;
00092 double r[4],p[4];
00093 double MA=parameter::getD(spars,"MA",139.57);
00094 double MB=parameter::getD(spars,"MB",139.57);
00095 double mass,rdummy1,rdummy2;
00096 int ident,idummy,i,alpha;
00097 int ndummy_header=3,ndummy_betweenevents=0;
00098 int npart,npartmax,ipart,ievent;
00099 int NEVENTSMAX=parameter::getI(spars,"NEVENTSMAX",100);
00100 string OSCARfilename=parameter::getS(spars,"OSCARfilename","UNDEFINED");
00101 bool AEQUALB=parameter::getB(spars,"AEQUALB",false);
00102 char dummy[160];
00103 na=nb=0;
00104 printf("Opening %s\n",OSCARfilename.c_str());
00105 oscarfile=fopen(OSCARfilename.c_str(),"r");
00106
00107 for(i=0;i<ndummy_header;i++){
00108 fgets(dummy,120,oscarfile);
00109
00110 }
00111
00112
00113 ievent=0;
00114 do{
00115 ievent+=1;
00116 fscanf(oscarfile,"%d %d %lf %lf",&idummy,&npartmax,&rdummy1,&rdummy2);
00117 fgets(dummy,120,oscarfile);
00118
00119 for(npart=0;npart<npartmax;npart++){
00120 fscanf(oscarfile,"%d %d %lf %lf %lf %lf %lf %lf %lf %lf %lf",
00121 &ipart,&ident,&p[1],&p[2],&p[3],&p[0],&mass,&r[1],&r[2],&r[3],&r[0]);
00122 for(alpha=0;alpha<4;alpha++) p[alpha]*=1000.0;
00123
00124 if(IDMatch(ident,idlist_a,nid_a)) Check(p,r,MA,ra,na);
00125 if(!AEQUALB) if(IDMatch(ident,idlist_b,nid_b)) Check(p,r,MB,rb,nb);
00126 }
00127 for(i=0;i<ndummy_betweenevents;i++){
00128 if(!feof(oscarfile)) fgets(dummy,120,oscarfile);
00129
00130 }
00131 } while(ievent<NEVENTSMAX && !feof(oscarfile));
00132 fclose(oscarfile);
00133 if(AEQUALB) nb=na;
00134 printf("OSCAR file read: %d events, na=%d, nb=%d\n",ievent,na,nb);
00135 }
00136
00137 bool CSourceCalc_OSCAR::Check(double *p,double *r,double m,double **ra,int &n){
00138 double PT=parameter::getD(spars,"PT",600.0);
00139 double DELPT=parameter::getD(spars,"DELPT",20.0);
00140 double YMIN=parameter::getD(spars,"YMIN",-1.0);
00141 double YMAX=parameter::getD(spars,"YMAX",1.0);
00142 double PHIMIN=2.0*PI*parameter::getD(spars,"PHIMIN_DEG",0.0)/360.0;
00143 double PHIMAX=2.0*PI*parameter::getD(spars,"PHIMAX_DEG",0.0)/360.0;
00144 double MA=parameter::getD(spars,"MA",139.57);
00145 double MB=parameter::getD(spars,"MB",139.57);
00146 double pt,phi;
00147 double gammav=PT/(MA+MB);
00148 double gamma=sqrt(1.0+gammav*gammav);
00149 double pttarget=PT*m/(MA+MB);
00150 double rout,rlong,rside,sinhy,coshy,tau,vperp,y;
00151 const double TAUCOMPARE=12.0;
00152 int NMAX=parameter::getI(spars,"NMAX",50000);
00153 bool success=false;
00154
00155 pt=sqrt(p[1]*p[1]+p[2]*p[2]);
00156 if(fabs(pt-pttarget)<DELPT){
00157 phi=atan2(p[1],p[2]);
00158 if( (PHIMIN<PHIMAX)&&(phi>PHIMIN && phi<PHIMAX)
00159 || (PHIMIN>PHIMAX)&&(phi>PHIMIN||phi<PHIMAX) ){
00160 y=atanh(p[3]/p[0]);
00161 if(y>YMIN && y<YMAX){
00162 p[0]=sqrt(pt*pt+p[3]*p[3]+m*m);
00163 rout=(p[1]*r[1]+p[2]*r[2])/pt;
00164 rside=(p[1]*r[2]-p[2]*r[1])/pt;
00165 sinhy=sinh(y);
00166 coshy=cosh(y);
00167 rlong=coshy*r[3]-sinhy*r[0];
00168 tau=coshy*r[0]-sinhy*r[3];
00169 printf("%g %g %g %g\n",tau,rout,rside,rlong);
00170 vperp=pt/sqrt(m*m+pt*pt);
00171 rout=rout-vperp*(tau-TAUCOMPARE);
00172 tau=TAUCOMPARE;
00173 rout=gamma*rout-gammav*tau;
00174 ra[n][0]=0.0;
00175 ra[n][1]=rout;
00176 ra[n][2]=rside;
00177 ra[n][3]=rlong;
00178 n+=1;
00179 success=true;
00180 if(n==NMAX){
00181 printf("TOO MANY PARTICLES FIT CRITERIA, increase parameter NMAX=%d\n",NMAX);
00182 exit(1);
00183 }
00184 }
00185 }
00186 }
00187 return success;
00188 }
00189
00190 bool CSourceCalc_OSCAR::IDMatch(int ident,int *idlist,int nid){
00191 int i;
00192 bool answer=false;
00193 for(i=0;i<nid;i++) if(ident==idlist[i]) answer=true;
00194 return answer;
00195 }
00196
00197 #endif