00001 #include "oscar_source_generator_1d.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
00010 bool COSCARSourceGenerator1d::addOnePair( const COSCARLine& p1, const COSCARLine& p2 ){
00011
00012 int iBin = result.whatBin(rinv,false);
00013 if (iBin>=0 && iBin<result.ndata) {
00014 if ( result.sphrHarm ) {
00015 double r[3];
00016 double weight;
00017 getSideOutLong( r_cm, r );
00018 double rinv2=rinv*rinv;
00019 double binWidth = result.binWidth( iBin );
00020 if (rinv < 1e-6) {
00021 rinv2 = result.midBin( iBin )*result.midBin( iBin );
00022 MESSAGE << "Bad pair, set rinv^2 to " << rinv2 << ENDM_WARN;
00023 }
00024 if (result.realpart) weight = SpherHarmonics::ReYlm(result.l,result.m,r[0],r[1],r[2])/rinv2/binWidth;
00025 else weight = - SpherHarmonics::ImYlm(result.l,result.m,r[0],r[1],r[2])/rinv2/binWidth;
00026 result.data[iBin] += weight;
00027 result.uncert[iBin] += weight*weight;
00028 } else throw MESSAGE << "Building Cartesian Harmonic Sources not implemented"<<ENDM_SEVERE;
00029 }
00030 return true;
00031 }
00032
00033
00034
00035 bool COSCARSourceGenerator1d::postProcessPairs( void ){
00036 cout<<" Normalizing 1D source\n";
00037 result.covmtx_is_active=false;
00038 for (int i=0;i<result.ndata;++i) result.data[i]=result.data[i]/SQRTFOURPI/double(totalPairs);
00039 for (int i=0;i<result.ndata;++i) {
00040 double u = result.uncert[i]/double(totalPairs)/4.0/PI-result.data[i]*result.data[i];
00041 if ( u < -1e-6 ) throw MESSAGE <<"Bad u: "<<u<<ENDM_FATAL;
00042 result.uncert[i]=sqrt(abs(u/double(totalPairs)));
00043 }
00044 double dintegral=0.0, dintegral2=0.0;
00045 if (result.l==0) {
00046 cout << " Cross-checking angle averaged source function integral...\n";
00047 double int_sou=0.0,int_sou2=0.0;
00048 for(int i=0;i<result.ndata;++i){
00049 dintegral += pow(result.uncert[i]*4.0*PI*result.midBin(i)*result.midBin(i)*result.binWidth(i),2.0);
00050 dintegral2 += pow(result.uncert[i]*4.0*PI*(result.midBin(i)*result.midBin(i)+result.binWidth(i)*result.binWidth(i)/12.0),2.0);
00051 int_sou += 4.0*PI*result.midBin(i)*result.midBin(i)*result.binWidth(i)*result.data[i];
00052 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];
00053 }
00054 cout << " Naive integral of source: " << int_sou << " +/- " << dintegral << "\n";
00055 cout << " Not so naive integral of source: " << int_sou2 << " +/- " << dintegral2 << "\n";
00056 cout << " Number of good pairs = "<<totalPairs<<"\n";
00057 }
00058 return true;
00059 }
00060
00061
00062 CSourceFtn1dHisto COSCARSourceGenerator1d::generateSource( vector<COSCARLine> plist, const parameterMap& m ){
00063
00064
00065 parameterMap souMap;
00066 souMap = parameter::getMap( m,"source_settings" );
00067 result.Read(souMap);
00068
00069
00070 Read(m);
00071
00072
00073 filterParticles( plist );
00074
00075
00076 accumulatePairs();
00077
00078 return result;
00079 }