00001 #include "oscar_correlation_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 COSCARCorrelationGenerator1d::addOnePair( const COSCARLine& p1, const COSCARLine& p2 ){
00011 double r[3];
00012 double weight;
00013 getSideOutLong( r_cm, r );
00014 if (accumulation_mode=="default"){
00015 int iBin = result.whatBin(qinv,false);
00016 if (iBin>=0 && iBin<result.ndata) {
00017 if ( result.sphrHarm ) {
00018 if (result.realpart) weight = SpherHarmonics::ReYlm(result.l,result.m,r[0],r[1],r[2]);
00019 else weight = - SpherHarmonics::ImYlm(result.l,result.m,r[0],r[1],r[2]);
00020 weight *= (kernelPtr->GetValue(result.l, qinv, rinv));
00021 result.data[iBin] += weight;
00022 result.uncert[iBin] += weight*weight;
00023 pairCount[iBin]+=1;
00024 } else throw MESSAGE << "Building Cartesian Harmonic Correlations not implemented"<<ENDM_FATAL;
00025 }
00026 } else {
00027 for (int iBin=0; iBin<result.ndata; ++iBin ){
00028 double q = result.midBin( iBin );
00029 if (result.realpart) weight = SpherHarmonics::ReYlm(result.l,result.m,r[0],r[1],r[2]);
00030 else weight = - SpherHarmonics::ImYlm(result.l,result.m,r[0],r[1],r[2]);
00031 weight *= (kernelPtr->GetValue(result.l, q, rinv));
00032 result.data[iBin] += weight;
00033 result.uncert[iBin] += weight*weight;
00034 pairCount[iBin] += 1;
00035 }
00036 }
00037 return true;
00038 }
00039
00040
00041
00042 bool COSCARCorrelationGenerator1d::postProcessPairs( void ){
00043 cout<<"Normalizing 1D source\n";
00044 double weight;
00045 result.covmtx_is_active=false;
00046 for (int i=0;i<result.ndata;++i) {
00047 if (result.data[i]!=0.0) {
00048 weight = 1.0/SQRTFOURPI;
00049 result.data[i]=result.data[i]/weight/double(pairCount[i]);
00050 result.uncert[i]=sqrt(abs(result.uncert[i]/double(pairCount[i])/weight/weight - result.data[i]*result.data[i])/double(pairCount[i]));
00051 } else result.uncert[i]=1.0;
00052 if (result.l==0) result.data[i]+=1.0;
00053 }
00054
00055 if (result.l==0) {
00056 cout << "Cross-checking angle averaged correlation function integral...\n";
00057 double int_corr=0.0,int_corr2=0.0;
00058 for(int i=0;i<result.ndata;++i){
00059 int_corr += 4.0*PI*result.midBin(i)*result.midBin(i)*result.binWidth(i)*(result.data[i]-1.0);
00060 int_corr2 += (result.midBin(i)*result.midBin(i)+result.binWidth(i)*result.binWidth(i)/12.0)*result.binWidth(i)*4.0*PI*(result.data[i]-1.0);
00061 }
00062 cout << " Naive integral of correlation: " << int_corr << "\n";
00063 cout << " Not so naive integral of correlation: " << int_corr2 << "\n";
00064 cout << " Number of good pairs = "<<totalPairs<<"\n";
00065 }
00066 return true;
00067 }
00068
00069
00070 CCorrFtn1dHisto COSCARCorrelationGenerator1d::generateCorrelation( vector<COSCARLine> plist, const parameterMap& m ){
00071
00072
00073 Read(m);
00074
00075
00076 parameterMap corrMap;
00077 corrMap = parameter::getMap( m,"correlation_settings" );
00078 result.Read(corrMap);
00079
00080
00081 parameterMap kernelMap;
00082 kernelMap = parameter::getMap(m, "kernel_settings");
00083 set_kernel(kernelMap);
00084
00085
00086 filterParticles( plist );
00087
00088
00089 TNT::Array1D<int> newPairCount(result.ndata,0);
00090 pairCount = newPairCount;
00091
00092
00093 accumulatePairs();
00094
00095 return result;
00096 }