00001 #include "oscar_source_generator_3dsphr.h"
00002 #include "constants.h"
00003 #include "tnt_array1d_utils.h"
00004 #include "misc.h"
00005 #include "message.h"
00006 #include "sf.h"
00007
00008
00009 bool COSCARSourceGenerator3dSphr::Read( const parameterMap& m ){
00010 lmax = parameter::getI(m,"lmax",lmax);
00011 return COSCARSourceGeneratorBase::Read(m);
00012 }
00013
00014
00015
00016 bool COSCARSourceGenerator3dSphr::Write( parameterMap& m){
00017 parameter::set(m,"lmax",lmax);
00018 return COSCARSourceGeneratorBase::Write(m);
00019 }
00020
00021
00022
00023 bool COSCARSourceGenerator3dSphr::addOnePair( const COSCARLine& p1, const COSCARLine& p2 ){
00024
00025 double r[3];
00026 int iBin;
00027 getSideOutLong( r_cm, r );
00028 double rinv2=rinv*rinv;
00029 for ( CSourceFtn3dSphr<CSourceFtn1dHisto>::iterator it = result.begin(); it!=result.end(); ++it ){
00030 iBin = it->second.whatBin(rinv,false);
00031 if ( rinv < 1e-6 ) {
00032 rinv2 = it->second.midBin( iBin );
00033 rinv2 *= rinv2;
00034 MESSAGE << "Bad pair, set rinv^2 to " << rinv2 << ENDM_WARN;
00035 }
00036 if (iBin>=0 && iBin<it->second.ndata) {
00037 if ( it->second.sphrHarm ) {
00038 double weight;
00039 if (it->second.realpart) weight = SpherHarmonics::ReYlm(it->second.l,it->second.m,r[0],r[1],r[2])/rinv2;
00040 else weight = - SpherHarmonics::ImYlm(it->second.l,it->second.m,r[0],r[1],r[2])/rinv2;
00041 it->second.data[iBin] += weight;
00042 it->second.uncert[iBin] += (weight*weight);
00043 } else throw MESSAGE << "Building Cartesian Harmonic Sources for l>0 not implemented"<<ENDM_FATAL;
00044 }
00045 }
00046 return true;
00047 }
00048
00049
00050
00051 bool COSCARSourceGenerator3dSphr::postProcessPairs( void ){
00052
00053 cout<<" Normalizing 1D sources\n";
00054
00055 for ( CSourceFtn3dSphr<CSourceFtn1dHisto>::iterator it = result.begin(); it!=result.end(); ++it ){
00056 it->second.covmtx_is_active=false;
00057 double rweight,rval,dr;
00058 for (int i=0;i<it->second.ndata;++i) {
00059 rval = it->second.midBin(i);
00060 dr = it->second.binWidth(i);
00061
00062 rweight = dr*SQRTFOURPI;
00063 it->second.data[i] = (it->second.data[i])/rweight/double(totalPairs);
00064 double u = it->second.uncert[i] = it->second.uncert[i]/double(totalPairs)/rweight/rweight-it->second.data[i]*it->second.data[i];
00065 if ( u < -1e-6 ) throw MESSAGE <<"Bad u: "<<u<<ENDM_FATAL;
00066 it->second.uncert[i] = sqrt(abs(u/double(totalPairs)));
00067 }
00068
00069 if (it->second.l==0) {
00070 double dintegral=0.0, dintegral2=0.0;
00071 cout << " Cross-checking angle averaged source function integral...\n";
00072 double int_sou=0.0,int_sou2=0.0;
00073 for(int i=0;i<it->second.ndata;++i){
00074 dintegral += pow(it->second.uncert[i]*4.0*PI*it->second.midBin(i)*it->second.midBin(i)*it->second.binWidth(i),2.0);
00075 dintegral2 += pow(it->second.uncert[i]*4.0*PI*(it->second.midBin(i)*it->second.midBin(i)+it->second.binWidth(i)*it->second.binWidth(i)/12.0),2.0);
00076 int_sou += 4.0*PI*(it->second.midBin(i))*(it->second.midBin(i))*(it->second.binWidth(i))*(it->second.data[i]);
00077 int_sou2 += (it->second.midBin(i)*(it->second.midBin(i))+it->second.binWidth(i)*(it->second.binWidth(i))/12.0)*(it->second.binWidth(i))*4.0*PI*(it->second.data[i]);
00078 }
00079 cout << " Naive integral of source: " << int_sou << " +/- " << dintegral << "\n";
00080 cout << " Not so naive integral of source: " << int_sou2 << " +/- " << dintegral2 << "\n";
00081 cout << " Number of good pairs = "<<totalPairs<<"\n";
00082 }
00083 }
00084 return true;
00085 }
00086
00087
00088 CSourceFtn3dSphr<CSourceFtn1dHisto> COSCARSourceGenerator3dSphr::generateSource( vector<COSCARLine> plist, const parameterMap& m ){
00089
00090
00091 parameterMap souMap;
00092 souMap = parameter::getMap( m,"source_settings" );
00093 result.Read(souMap);
00094 result.fillTerms();
00095 for ( CSourceFtn3dSphr< CSourceFtn1dHisto >::iterator it=result.begin(); it!=result.end(); ++it ) it->second.Read(souMap);
00096
00097
00098 Read(m);
00099
00100
00101 filterParticles( plist );
00102
00103
00104 accumulatePairs();
00105
00106 return result;
00107 }