00001 #include "oscar.h"
00002 #include "constants.h"
00003 #include "misc.h"
00004 #include "message.h"
00005 #include <fstream>
00006
00007
00009 vector<COSCARLine> readOSCARFile(string oscarFile){
00010 if ( !file_exists( oscarFile ) )
00011 throw MESSAGE << "OSCAR file "<< oscarFile <<" not found. Halting!!"<<ENDM_FATAL;
00012 vector<COSCARLine> result;
00013 ifstream iFile(oscarFile.c_str());
00014 char dummy_header[80],endline_tester;
00015 cout << "Reading in "<<oscarFile<<"\n";
00016 cout << " " << "Header info:\n";
00017 for(int i=0;i<3;++i)
00018 {
00019 iFile.get(dummy_header,80,'\n');
00020 if (iFile.get(endline_tester) && endline_tester!='\n')
00021 MESSAGE<< "Line a little too long, so read-in screwed up. Halting. \n"<<ENDM_FATAL;
00022 cout << " " << dummy_header<<"\n";
00023 }
00024 int num_particles,n1;
00025 {
00026 double dummy1, dummy2;
00027
00028 iFile >> n1 >> num_particles >> dummy1 >> dummy2;
00029 cout << " " << n1 << " " << num_particles << " " << dummy1 << " " << dummy2 << "\n";
00030 }
00031 while (iFile.good()) {
00032 COSCARLine newLine;
00033 iFile>>newLine;
00034 result.push_back(newLine);
00035 }
00036 return result;
00037 }
00038
00039
00041 vector<COSCARLine> filterPID(vector<COSCARLine> lines, int pid){
00042 for (vector<COSCARLine>::iterator itr=lines.begin(); itr!=lines.end(); ++itr){
00043 if (pid!=itr->pid) itr = lines.erase(itr);
00044 }
00045 return lines;
00046 }
00047
00048
00050 CSourceFtn1dHisto getOSCARSource1d(vector<COSCARLine> lines, parameterMap p){
00051
00052
00053 CSourceFtn1dHisto result;
00054 parameterMap souMap;
00055 if (p.find("source_settings")!=p.end()) souMap = parameter::getMap( p,"source_settings" );
00056 else souMap = p;
00057 result.Read(souMap);
00058 double q_cut_oscar = parameter::getD(p,"q_cut_oscar",0.060);
00059 int max_number_pairs = parameter::getI(p,"max_number_pairs",1000000);
00060 int totalPairs = 0;
00061
00062
00063 double q_lab[4],q_cm[4],P[4],beta[4],sep_lab[4],sep_cm[4];
00064 double sqr_beta(0.), sqr_q_cm(0.);
00065 bool good_boost;
00066 double rsep_cm;
00067
00068 cout<<" Zeroing 1D source array\n";
00069 for (int i=0;i<result.ndata;++i) {result.data[i]=0;}
00070
00071 cout<<" Constructing 1D source\n";
00072
00073 for (vector<COSCARLine>::iterator p1=lines.begin(); p1!=lines.end(); ++p1){
00074 vector<COSCARLine>::iterator p2=p1;
00075 ++p2;
00076 while ( (totalPairs<max_number_pairs) && (p2!=lines.end()) ) {
00077 for (int i=0;i<4;++i){
00078 q_lab[i]=0.5*(p1->p[i]-p2->p[i]);
00079 P[i]=p1->p[i]+p2->p[i];
00080 beta[i]=P[i]/P[0];
00081 sep_lab[i]=(p1->x[i]-p2->x[i]);
00082 }
00083 Misc::lorentz(beta,q_lab,q_cm);
00084 sqr_beta=beta[0]*beta[0];
00085 sqr_q_cm=q_cm[0]*q_cm[0];
00086 for (int i=1; i<4; ++i) {
00087 sqr_beta -= beta[i]*beta[i];
00088 sqr_q_cm -= q_cm[i]*q_cm[i];
00089 }
00090 good_boost=(sqr_beta >= 0.);
00091
00092 if ((-sqr_q_cm<q_cut_oscar) && good_boost ){
00093 totalPairs+=1;
00094
00095 Misc::lorentz(beta,sep_lab,sep_cm);
00096
00097 rsep_cm=sqrt(sep_cm[1]*sep_cm[1]+sep_cm[2]*sep_cm[2]+sep_cm[3]*sep_cm[3]);
00098 int iBin = result.whatBin(rsep_cm,false);
00099 if (iBin>=0 && iBin<result.ndata) result.data[iBin]+=1;
00100 }
00101 ++p2;
00102 }
00103 }
00104
00105 cout<<" Normalizing 1D source\n";
00106 double numPairs1D,rweight,rval,dr;
00107 for (int i=0;i<result.ndata;++i) {
00108 rval = result.midBin(i);
00109 dr = result.binWidth(i);
00110 rweight = (rval*rval+dr*dr/12.0)*dr*4.0*PI;
00111 numPairs1D = result.data[i];
00112 result.data[i]=result.data[i]/rweight/totalPairs;
00113 if (result.data[i]>0.) result.uncert[i]=result.data[i]
00114 *sqrt(1.0/double(numPairs1D)+1.0/double(numPairs1D)/double(numPairs1D)/double(totalPairs));
00115 }
00116
00117 cout << " Cross-checking angle averaged source function integral...\n";
00118 double int_sou=0.0,int_sou2=0.0;
00119 for(int i=0;i<result.ndata;++i){
00120 int_sou += 4.0*PI*result.midBin(i)*result.midBin(i)*result.binWidth(i)*result.data[i];
00121 int_sou2 += (result.midBin(i)*result.midBin(i)+result.binWidth(i)*result.binWidth(i)/12.0)*result.binWidth(i)*4.0*PI*result.data[i];
00122 }
00123 cout << " Naive integral of source: " << int_sou << "\n";
00124 cout << " Not so naive integral of source: " << int_sou2 << "\n";
00125 cout << " Number of good pairs = "<<totalPairs<<"\n";
00126 return result;
00127 }
00128
00129
00131 CSourceFtn3dHisto getOSCARSource3d(vector<COSCARLine> lines, parameterMap p){
00132
00133
00134 CSourceFtn3dHisto result;
00135 result.Read(p);
00136 double q_cut_oscar = parameter::getD(p,"q_cut_oscar",0.060);
00137 int max_number_pairs = parameter::getI(p,"max_number_pairs",1000000);
00138 int totalPairs = 0;
00139
00140
00141 int iSide = parameter::getI(p,"cartesian_side_index",0);
00142 int iOut = parameter::getI(p,"cartesian_out_index",1);
00143 int iLong = parameter::getI(p,"cartesian_long_index",2);
00144
00145
00146 double r[3], S[3], O[3], L[3];
00147 L[0]=0.0;L[1]=0.0;L[2]=1.0;
00148 double q_lab[4],q_cm[4],P[4],beta[4],sep_lab[4],sep_cm[4];
00149 double sqr_beta(0.), sqr_q_cm(0.);
00150 bool good_boost;
00151 double rS,rO,rL,maxS,minS,maxO,minO,maxL,minL;
00152
00153 cout<<"Zeroing 3D source array\n";
00154 for (int i=0;i<result.ndata;++i) {result.data[i]=0;}
00155
00156 cout<<"Constructing 3D source\n";
00157
00158 for (vector<COSCARLine>::iterator p1=lines.begin(); p1!=lines.end(); ++p1){
00159 vector<COSCARLine>::iterator p2=p1;
00160 while ( (totalPairs<max_number_pairs) && (p2!=lines.end()) ) {
00161 p2++;
00162 for (int i=0;i<4;++i){
00163 q_lab[i]=0.5*(p1->p[i]-p2->p[i]);
00164 P[i]=p1->p[i]+p2->p[i];
00165 beta[i]=P[i]/P[0];
00166 sep_lab[i]=(p1->x[i]-p2->x[i]);
00167 }
00168 Misc::lorentz(beta,q_lab,q_cm);
00169 sqr_beta=beta[0]*beta[0];
00170 sqr_q_cm=q_cm[0]*q_cm[0];
00171 for (int i=1; i<4; ++i) {
00172 sqr_beta -= beta[i]*beta[i];
00173 sqr_q_cm -= q_cm[i]*q_cm[i];
00174 }
00175 good_boost=(sqr_beta >= 0.);
00176
00177 if ((-sqr_q_cm<q_cut_oscar) && good_boost ){
00178 totalPairs+=1;
00179
00180 Misc::lorentz(beta,sep_lab,sep_cm);
00181
00182
00183
00184 O[0]=P[1];O[1]=P[2];O[2]=0.0;
00185 double Omag = sqrt(O[0]*O[0]+O[1]*O[1]);
00186 O[0]/=Omag;O[1]/=Omag;
00187
00188 S[0]=O[1];S[1]=-O[0];S[2]=0.0;
00189
00190
00191 rS=0.0;rO=0.0;rL=0.0;
00192 for (int i=0;i<3;++i) {
00193 rS+=sep_cm[i+1]*S[i];
00194 rO+=sep_cm[i+1]*O[i];
00195 rL+=sep_cm[i+1]*L[i];
00196 }
00197
00198 r[iSide] = rS;
00199 r[iOut] = rO;
00200 r[iLong] = rL;
00201
00202 result.data[result.whatBin(r[0],r[1],r[2])]+=1;
00203
00204 maxS=std::max(rS,maxS);
00205 minS=std::min(rS,minS);
00206 maxO=std::max(rO,maxO);
00207 minO=std::min(rO,minO);
00208 maxL=std::max(rL,maxL);
00209 minL=std::min(rL,minL);
00210 }
00211 }
00212 break;
00213 }
00214
00215 cout << "Normalizing 3D source function...\n";
00216 double rweight=result.binVolume();
00217 double npairs;
00218 for (int i=0;i<result.ndata;++i) {
00219 result.uncert[i]=0.0;
00220 if (result.data[i]>0) {
00221 npairs=result.data[i];
00222 result.data[i]/=double(totalPairs)*rweight;
00223 result.uncert[i]=result.data[i]*sqrt(1.0/npairs+1.0/npairs/npairs/double(totalPairs));
00224 }
00225 }
00226 cout << "Some parameters from the legal pairs:\n";
00227 cout << " maxS:" << maxS << ", minS:" << minS << "\n";
00228 cout << " maxO:" << maxO << ", minO:" << minO << "\n";
00229 cout << " maxL:" << maxL << ", minL:" << minL << "\n";
00230 return result;
00231 }
00232
00233
00235 istream& operator>>(istream& i, COSCARLine& line){
00236 i >> line.index >> line.pid
00237 >> line.p[1] >> line.p[2] >> line.p[3] >> line.p[0]
00238 >> line.mass
00239 >> line.x[1] >> line.x[2] >> line.x[3] >> line.x[0];
00240 line.p[0]*=1000.0;line.p[1]*=1000.0;line.p[2]*=1000.0;line.p[3]*=1000.0;
00241 return i;
00242 }