00001 #include <string>
00002 #include "convolution.h"
00003 #include "soubase.h"
00004 #include "kernel_chooser.h"
00005 #include "cheezyparser.h"
00006 #include "sf.h"
00007
00008 #define USE_SCOTTS_KERNEL
00009
00010 #ifndef PI
00011 #define PI 3.1415926535
00012 #endif
00013
00014 using namespace std;
00015 using namespace TNT;
00016
00017 double CConvoluterIntegrand1d::getValue(void* me, double r){
00018 CConvoluterIntegrand1d* metoo = (CConvoluterIntegrand1d*)me;
00019 #ifdef USE_SCOTTS_KERNEL
00020 return 4.0*PI*r*r*
00021 (metoo->kernelPtr->GetValue(metoo->l,metoo->q,r))*
00022 (metoo->sourcePtr->getValue(r));
00023 #else
00024 return 4.0*PI*r*r*
00025 Bessel::jn(metoo->l,2.0*r*(metoo->q)/197.3269602)*
00026 (metoo->sourcePtr->getValue(r));
00027 #endif
00028 }
00029 double CConvoluterIntegrand1d::integrate(double rmin, double rmax){
00030 return integrator.compute(rmin,rmax);
00031 }
00032
00033 CCorrFtn1dHisto convolute(const CObject1d& sourceFtn, const parameterMap& m){
00034 const CSourceFtnBase* sPtr = dynamic_cast<const CSourceFtnBase*>(&sourceFtn);
00035 string p1(""), p2("");
00036 if ( sPtr != NULL )
00037 {
00038 p1 = sPtr->particle1;
00039 p2 = sPtr->particle2;
00040 }
00041 p1 = parameter::getS(m,"particle1",p1);
00042 p2 = parameter::getS(m,"particle2",p2);
00043 parameterMap convMap, corrMap;
00044 corrMap = parameter::getMap(m,"correlation_settings");
00045 double dx = parameter::getD(corrMap,"dx");
00046 double xoffset = parameter::getD(corrMap,"xoffset");
00047 int ndata = parameter::getI(corrMap,"ndata");
00048 convMap = parameter::getMap(m,"convoluter_settings");
00049 double rmin = parameter::getD(convMap,"rmin",0.0);
00050 double rmax = parameter::getD(convMap,"rmax",50.0);
00051 cout << " _____Convolutor parameters_____"<<m<<endl<<endl;
00052 CKernel* kernelPtr = NULL;
00053 if (m.find("kernel_settings")!=m.end()) {
00054 kernelPtr = chooseKernel(p1,p2,parameter::getMap(m,"kernel_settings"));
00055 }
00056 else kernelPtr = chooseKernel(p1,p2,m);
00057 CCorrFtn1dHisto corrOut( p1, p2, false, sourceFtn.l, sourceFtn.m, true, ndata );
00058 corrOut.setFixedWidthBins(dx,xoffset);
00059 corrOut.covmtx_is_active=false;
00060 CConvoluterIntegrand1d integrand( kernelPtr, &sourceFtn );
00061 for (int n=0;n<corrOut.ndata;++n){
00062 integrand.q = corrOut.midBin(n);
00063 corrOut.data[n]=integrand.integrate(rmin,rmax);
00064 if (sourceFtn.l==0) corrOut.data[n]+=1.0;
00065 corrOut.uncert[n]=0.0;
00066 }
00067 return corrOut;
00068 }