00001 #include "message.h"
00002 #include "parametermap.h"
00003 #include "general_imager1d.h"
00004 #include "kernel_chooser.h"
00005 #include "tnt_array1d_utils.h"
00006
00007 using namespace TNT;
00008 using namespace std;
00009
00010
00011
00012
00013
00014 bool CGeneralImager1d::Read( const parameterMap& m ){
00015
00016 parameterMap corrMap, souMap;
00017 ndata_corr = parameter::getI( m, "ndata_corr", ndata_corr );
00018 ndata_sou = parameter::getI( m, "ndata_sou", ndata_sou );
00019 if ( m.find("source_settings")!=m.end() ){
00020 souMap = parameter::getMap( m, "source_settings" );
00021 ndata_sou = parameter::getI(souMap,"ndata",ndata_sou);
00022 rmax = parameter::getD(souMap,"xmax",rmax);
00023 rmin = parameter::getD(souMap,"xmin",rmin);
00024 }
00025 if ( m.find("correlation_settings")!=m.end() ) {
00026 corrMap = parameter::getMap( m, "correlation_settings" );
00027 ndata_corr = parameter::getI(corrMap,"ndata",ndata_corr);
00028 qmax = parameter::getD(corrMap,"xmax",qmax);
00029 qmin = parameter::getD(corrMap,"xmin",qmin);
00030 }
00031 rmax = parameter::getD(m,"rmax",rmax);
00032 rmin = parameter::getD(m,"rmin",rmin);
00033 qmax = parameter::getD(m,"qmax",qmax);
00034 qmin = parameter::getD(m,"qmin",qmin);
00035 dq = parameter::getD(corrMap,"dx",(qmax-qmin)/ndata_corr);
00036 q0 = parameter::getD(corrMap,"xoffset",qmin);
00037 bigQ = parameter::getB(corrMap,"bigQ",false);
00038 if ( m.find("override_kernel")!=m.end() ) {
00039 kernel_particle1 = parameter::getS(m,"kernel_particle1",kernel_particle1);
00040 kernel_particle2 = parameter::getS(m,"kernel_particle2",kernel_particle2);
00041 }
00042 return true;
00043 }
00044
00045
00046
00047 bool CGeneralImager1d::Write( parameterMap& m ){
00048
00049 parameterMap corrMap, souMap;
00050 parameter::set(corrMap,"xmax",qmax);
00051 parameter::set(souMap,"xmax",rmax);
00052 parameter::set(corrMap,"xmin",qmin);
00053 parameter::set(souMap,"xmin",rmin);
00054 parameter::set(corrMap,"dx",dq);
00055 parameter::set(corrMap,"xoffset",q0);
00056 parameter::set(corrMap,"bigQ",bigQ);
00057 parameter::set(m,"source_settings",souMap);
00058 parameter::set(m,"correlation_settings",corrMap);
00059 parameter::set(corrMap,"ndata_corr",ndata_corr);
00060 parameter::set(souMap,"ndata_sou",ndata_sou);
00061 parameter::set(m,"kernel_particle1",kernel_particle1);
00062 parameter::set(m,"kernel_particle2",kernel_particle2);
00063 return true;
00064 }
00065
00066
00067 void CGeneralImager1d::get_usable_data(const CCorrFtn1dHisto& corrin){
00068
00069
00070 int iqmin = std::max(corrin.whatBin(qmin),0);
00071 int iqmax = std::min(corrin.whatBin(qmax),corrin.ndata-1);
00072 ndata_corr = iqmax-iqmin+1;
00073 if (ndata_corr<=1) {
00074 cout << " No usable data in dataset, ndata_corr = "<<ndata_corr<<endl;
00075 return;
00076 }
00077 else if (ndata_corr == corrin.ndata) {
00078 cout << " Using all " << ndata_corr << " are from this dataset" << endl;
00079 corrwork.CopyState( corrin );
00080 if (corrwork.covmtx_is_active) corrwork.syncUncert();
00081 else corrwork.syncCovMtx();
00082 return;
00083 }
00084 cout << " Using ndata_corr = " << ndata_corr << " data points from dataset" << endl;
00085
00086
00087 corrwork.CopyState( corrin );
00088 corrwork.xmin=corrin.leftBinEdge(iqmin);
00089 corrwork.xmax=corrin.rightBinEdge(iqmax);
00090 Array1D<double> __data( ndata_corr, 0.0 );
00091 Array1D<double> __uncert( ndata_corr, 0.0 );
00092 Array2D<double> __covmtx( ndata_corr, ndata_corr, 0.0 );
00093 for (int i=0;i<ndata_corr;++i){
00094 if (l==0) __data[i]=corrin.data[i+iqmin]-1.0;
00095 else __data[i]=corrin.data[i+iqmin];
00096 if (corrin.covmtx_is_active) {
00097 for (int j=0;j<ndata_corr;++j) __covmtx[i][j]=corrin.covmtx[i+iqmin][j+iqmin];
00098 __uncert[i]=__covmtx[i][i];
00099 } else {
00100 __uncert[i]=corrin.uncert[i+iqmin];
00101 __covmtx[i][i]=corrin.uncert[i+iqmin]*corrin.uncert[i+iqmin];
00102 }
00103 }
00104 corrwork.ndata = ndata_corr;
00105 corrwork.data = __data;
00106 corrwork.uncert = __uncert;
00107 corrwork.covmtx = __covmtx;
00108
00109
00110 if ( ( l!=0 )&&( iqmin==0 ) ) {
00111 for (int i=0;i<corrwork.ndata;++i){
00112 corrwork.covmtx[0][i]=0.0;
00113 corrwork.covmtx[i][0]=0.0;
00114 }
00115 corrwork.covmtx[0][0]=1.0;
00116 corrwork.data[0]=0.0;
00117 corrwork.uncert[0]=0.0;
00118 }
00119 }
00120
00121
00122 void CGeneralImager1d::set_kernel( const parameterMap& m ){
00123
00124 kernelPtr = chooseKernel( kernel_particle1, kernel_particle2, m );
00125 }
00126
00127
00128 void CGeneralImager1d::set_kernel( const CKernel* _kernelPtr ){
00129 kernelPtr = _kernelPtr;
00130 }
00131
00132
00133 bool CGeneralImager1d::initialize_source( const CCorrFtn1dHisto& corrin, CSourceFtnBase& souout, const parameterMap& m ){
00134
00135 CObject1d* souPtr = dynamic_cast<CObject1d*>(&souout);
00136 if (souPtr==NULL) throw MESSAGE<<"Source argument must derive from CObject1d"<<ENDM_FATAL;
00137 souPtr->CObject1d::CopyState( corrin );
00138 souPtr->Read(m);
00139 souout.particle1 = corrin.particle1;
00140 souout.particle2 = corrin.particle2;
00141 if ( ndata_corr <= 1 ) {
00142 set_no_data( souout );
00143 return false;
00144 }
00145 return true;
00146 }
00147
00148
00149 bool CGeneralImager1d::initialize_correlation( const CSourceFtnBase& souin, CCorrFtn1dHisto& corrout, const parameterMap& m ){
00150
00151 const CObject1d* souPtr = dynamic_cast<const CObject1d*>(&souin);
00152 if (souPtr==NULL) throw MESSAGE<<"Source argument must derive from CObject1d"<<ENDM_FATAL;
00153 corrout.CObject1d::CopyState( *souPtr );
00154 corrout.Read(m);
00155 corrout.particle1 = souin.particle1;
00156 corrout.particle2 = souin.particle2;
00157 return true;
00158 }