00001 #include "oscar_correlation_generator_3dcart.h"
00002 #include "constants.h"
00003 #include "tnt_array1d_utils.h"
00004 #include "misc.h"
00005 #include "cheezyparser.h"
00006
00007
00008
00009
00010 bool COSCARCorrelationGenerator3dCart::Read( const parameterMap& m ){
00011 bool result = COSCARCorrelationGeneratorBase::Read(m);
00012 fold[iSide] = parameter::getB( m, "fold_side", fold[iSide] );
00013 fold[iOut] = parameter::getB( m, "fold_out", fold[iOut] );
00014 fold[iLong] = parameter::getB( m, "fold_long", fold[iLong] );
00015 return result;
00016 }
00017
00018
00019
00020 bool COSCARCorrelationGenerator3dCart::Write( parameterMap& m){
00021 bool result = COSCARCorrelationGeneratorBase::Write(m);
00022 parameter::set( m, "fold_side", fold[iSide] );
00023 parameter::set( m, "fold_out", fold[iOut] );
00024 parameter::set( m, "fold_long", fold[iLong] );
00025 return result;
00026 }
00027
00028
00029
00030 bool COSCARCorrelationGenerator3dCart::addOnePair( const COSCARLine& p1, const COSCARLine& p2 ){
00031
00032
00033 double r[3];
00034 double weight;
00035 double q_dot_r;
00036 double costheta;
00037 getSideOutLong( r_cm, r );
00038
00039 if (accumulation_mode=="default"){
00040 double q[3];
00041 getSideOutLong( q_cm, q );
00042 q_dot_r = (q[0]*r[0]+q[1]*r[1]+q[2]*r[2]);
00043 costheta = q_dot_r/qinv/rinv;
00044
00045 maxS = std::max( q[iSide], maxS );
00046 minS = std::min( q[iSide], minS );
00047 maxO = std::max( q[iOut], maxO );
00048 minO = std::min( q[iOut], minO );
00049 maxL = std::max( q[iLong], maxL );
00050 minL = std::min( q[iLong], minL );
00051
00052 for (int i=0;i<3;++i) if (fold[i]) q[i]=abs(q[i]);
00053 int iBin = result.whatBin(q[0],q[1],q[2]);
00054 if (iBin>=0 && iBin<result.ndata) {
00055 weight = (kernelPtr->GetPsiSquared(qinv, rinv, costheta));
00056 result.data[iBin] += weight;
00057 result.uncert[iBin] += weight*weight;
00058 pairCount[iBin] += 1;
00059 }
00060
00061 } else {
00062 int iBin;
00063 for (int i = 0; i < 10; ++i ){
00064 iBin = static_cast<int>( ranGen.iran(result.ndata) );
00065 Array1D< double > q = result.binCenter( iBin );
00066 q_dot_r = (q[0]*r[0]+q[1]*r[1]+q[2]*r[2]);
00067 double new_qinv=sqrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]);
00068 costheta = q_dot_r/rinv/new_qinv;
00069 maxS=std::max(q[0],maxS);
00070 minS=std::min(q[0],minS);
00071 maxO=std::max(q[1],maxO);
00072 minO=std::min(q[1],minO);
00073 maxL=std::max(q[2],maxL);
00074 minL=std::min(q[2],minL);
00075 weight = (kernelPtr->GetPsiSquared(new_qinv, rinv, costheta));
00076 result.data[iBin] += weight;
00077 result.uncert[iBin] += weight*weight;
00078 pairCount[iBin] += 1;
00079 }
00080 }
00081 return true;
00082 }
00083
00084
00085
00086 bool COSCARCorrelationGenerator3dCart::postProcessPairs( void ){
00087 cout << " Normalizing 3D correlation function...\n";
00088 result.covmtx_is_active=false;
00089 for (int i=0;i<result.ndata;++i) {
00090 if ( pairCount[i] > 1 ) {
00091 result.data[i] = 1.0+result.data[i]/double(pairCount[i]);
00092 result.uncert[i] = sqrt(abs(result.uncert[i]/double(pairCount[i]) - result.data[i]*result.data[i])/double(pairCount[i]));
00093 } else {
00094 result.data[i] = 1.0;
00095 result.uncert[i] = 1.0;
00096 }
00097 }
00098 cout << " Some parameters from the legal pairs:\n";
00099 cout << " maxS:" << maxS << ", minS:" << minS << "\n";
00100 cout << " maxO:" << maxO << ", minO:" << minO << "\n";
00101 cout << " maxL:" << maxL << ", minL:" << minL << "\n";
00102 return true;
00103 }
00104
00105
00106 CCorrFtn3dHisto COSCARCorrelationGenerator3dCart::generateCorrelation( vector<COSCARLine> plist, const parameterMap& m ){
00107
00108
00109 Read(m);
00110
00111
00112 parameterMap corrMap;
00113 corrMap = parameter::getMap( m,"correlation_settings" );
00114 result.Read(corrMap);
00115
00116
00117 parameterMap kernelMap;
00118 kernelMap = parameter::getMap(m, "kernel_settings");
00119 set_kernel(kernelMap);
00120
00121
00122 filterParticles( plist );
00123
00124
00125 TNT::Array1D<int> newPairCount(result.ndata,0);
00126 pairCount = newPairCount;
00127
00128
00129 accumulatePairs();
00130
00131 return result;
00132 }