00001 #include <iostream>
00002 #include <fstream>
00003 #include <sstream>
00004 #include <cstdlib>
00005 #include "TVacuumPol.h"
00006
00007 using namespace std;
00008
00009 TVacuumPol::TVacuumPol(){
00010 using namespace std;
00011 fsvtr = NULL;
00012 fsvsr = NULL;
00013 fsvsi = NULL;
00014 fNoVP = false;
00015 }
00016
00017 void TVacuumPol::Init(std::string vpold, std::string vpolf){
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 string vpolfname;
00034 if(vpolf.empty()) vpolfname = "vpol.dat";
00035 else vpolfname = vpolf;
00036
00037 if(! vpold.empty()) {
00038 cout<<"Directory is \""<<vpold<<"\"."<<endl<<flush;
00039 vpolfname = vpold + "/" + vpolfname;
00040 }
00041
00042
00043 cout<<"File name is \""<<vpolfname<<"\"."<<endl<<flush;
00044
00045 ReadVacuumPolData(vpolfname);
00046 }
00047
00048 TVacuumPol::~TVacuumPol(){
00049 delete fsvtr;
00050 delete fsvsr;
00051 delete fsvsi;
00052 }
00053
00054 void TVacuumPol::ReadVacuumPolData(std::string fname){
00055 ifstream IN(fname.c_str());
00056 if(IN.is_open() == false ){
00057 std::cout<<"Can't read \""<<fname<<"\". Vacuum polarization will be zero."
00058 <<std::endl;
00059 std::cout<<"Probably you should tune VACUUM_POL_DIR or VACUUM_POL_FNAME variables."<<std::endl;
00060 fReadSuccessfullyVP = false;
00061 return;
00062 }
00063
00064 const int MAX_NP = 20000;
00065 double *s = new double[MAX_NP];
00066 double *vtr = new double[MAX_NP];
00067 double *vsr = new double[MAX_NP];
00068 double *vsi = new double[MAX_NP];
00069 double *vp = new double[MAX_NP];
00070
00071 int np = 0;
00072 while(!IN.eof()){
00073 IN>>s[np]>>vtr[np]>>vsr[np]>>vsi[np]>>vp[np];
00074 string str;
00075 getline(IN,str);
00076 s[np] *= 1e6;
00077 np++;
00078 }
00079 np--;
00080
00081 double *re_vs = new double[np];
00082 double *im_vs = new double[np];
00083 double *re_vt = new double[np];
00084
00085 for(int i=0;i<np;i++){
00086 std::complex<double> Pi_s(vsr[i],vsi[i]);
00087 std::complex<double> vs = 1./(1.-Pi_s);
00088 re_vs[i] = std::real(vs);
00089 im_vs[i] = std::imag(vs);
00090
00091 std::complex<double> Pi_t(vtr[i],0.);
00092 std::complex<double> vt = 1./(1.-Pi_t);
00093 re_vt[i] = std::real(vt);
00094 }
00095
00096 if(fsvsr) delete fsvsr;
00097 fsvsr = new TRadSpline3("vsr",s,re_vs,np);
00098
00099 if(fsvsi) delete fsvsi;
00100 fsvsi = new TRadSpline3("vsi",s,im_vs,np);
00101
00102 if(fsvtr) delete fsvtr;
00103 fsvtr = new TRadSpline3("vtr",s,re_vt,np);
00104
00105 delete [] re_vs;
00106 delete [] im_vs;
00107 delete [] re_vt;
00108
00109 delete [] s;
00110 delete [] vtr;
00111 delete [] vsr;
00112 delete [] vsi;
00113 delete [] vp;
00114
00115 fReadSuccessfullyVP = true;
00116 }