00001 #include "oscar_accumulator.h"
00002 #include "misc.h"
00003
00004
00005 bool COSCARAccumulator::Read( const parameterMap& m ){
00006 pid1 = parameter::getI( m, "pid1", 211 );
00007 pid2 = parameter::getI( m, "pid2", 211 );
00008 max_number_pairs = parameter::getI( m, "max_number_pairs", 1000000 );
00009
00010 iSide = parameter::getI(m, "cartesian_side_index", iSide);
00011 iOut = parameter::getI(m, "cartesian_out_index", iOut);
00012 iLong = parameter::getI(m, "cartesian_long_index", iLong);
00013 return true;
00014 }
00015
00016
00017 bool COSCARAccumulator::Write( parameterMap& m){
00018 parameter::set( m, "pid1", pid1 );
00019 parameter::set( m, "pid2", pid2 );
00020 parameter::set( m, "max_number_pairs", max_number_pairs );
00021 parameter::set(m,"cartesian_side_index",iSide);
00022 parameter::set(m,"cartesian_out_index", iOut);
00023 parameter::set(m,"cartesian_long_index",iLong);
00024 return true;
00025 }
00026
00027
00028 void COSCARAccumulator::filterParticles( vector<COSCARLine> plist ){
00029 cout << " Filtering out all particles that do not have PID = "<<pid1;
00030 if (pid1 == pid2) {
00031 particleList1 = filterPID( plist, pid1 );
00032 particleList2.clear();
00033 } else {
00034 cout << " or PID = "<<pid2;
00035 particleList1 = filterPID( plist, pid1 );
00036 particleList2 = filterPID( plist, pid2 );
00037 }
00038 cout << " ... done."<<endl;
00039 cout << " There are "<<particleList1.size()<<" particles in list 1 and "
00040 <<particleList2.size()<<" particles in list 2. "<<endl;
00041 return;
00042 }
00043
00044
00045 void COSCARAccumulator::accumulatePairs( void ){
00046 totalPairs = 0;
00047
00048 for (vector<COSCARLine>::iterator p1=particleList1.begin(); p1!=particleList1.end(); ++p1){
00049 vector<COSCARLine>::iterator p2, p2_begin, p2_end;
00050 if (pid1==pid2) {
00051 p2_begin = p1;++p2_begin;
00052 p2_end = particleList1.end();
00053 } else {
00054 p2_begin = particleList2.begin();
00055 p2_end = particleList2.end();
00056 }
00057 p2 = p2_begin;
00058 while ( (totalPairs<max_number_pairs) && (p2!=p2_end) ) {
00059
00060 this->setCOMVariables( *p1, *p2 );
00061 if ( this->pairIsGood( *p1, *p2 ) ){
00062 totalPairs+=1;
00063 this->addOnePair( *p1, *p2 );
00064 }
00065 ++p2;
00066 }
00067 if (totalPairs>=max_number_pairs) break;
00068 }
00069 cout << " totalPairs: " << totalPairs << " out of " << max_number_pairs<<" allowed"<<endl;
00070 this->postProcessPairs();
00071 }
00072
00073
00074 bool COSCARAccumulator::likePair( void ){ return pid1==pid2; }
00075
00076
00077 void COSCARAccumulator::getSideOutLong( double* inVec, double* outVec ){
00078
00079
00080 O[0]=P_lab[1];O[1]=P_lab[2];O[2]=0.0;
00081 double Omag = sqrt(O[0]*O[0]+O[1]*O[1]);
00082 O[0]/=Omag;O[1]/=Omag;
00083
00084 S[0]=O[1];S[1]=-O[0];S[2]=0.0;
00085
00086
00087 double rS,rO,rL;
00088 rS=0.0;rO=0.0;rL=0.0;
00089 for (int i=0;i<3;++i) {
00090 rS+=inVec[i+1]*S[i];
00091 rO+=inVec[i+1]*O[i];
00092 rL+=inVec[i+1]*L[i];
00093 }
00094
00095 outVec[iSide] = rS;
00096 outVec[iOut] = rO;
00097 outVec[iLong] = rL;
00098 }
00099
00100
00101 void COSCARAccumulator::setCOMVariables( const COSCARLine& p1, const COSCARLine& p2 ){
00102 double PSquared=0.0;
00103 double g[4]={1.,-1.,-1.,-1.};
00104 for (int i=0;i<4;++i){
00105 q_lab[i] = 0.5*(p1.p[i]-p2.p[i]);
00106 P_lab[i] = p1.p[i]+p2.p[i];
00107 r_lab[i] = (p1.x[i]-p2.x[i]);
00108 r_cm[i] = 0.0;
00109 q_cm[i] = 0.0;
00110 PSquared += P_lab[i]*P_lab[i]*g[i];
00111 }
00112 for(int i=0;i<4;++i){beta[i] = g[i]*P_lab[i]/sqrt(PSquared);}
00113 Misc::lorentz( beta, q_lab, q_cm );
00114 Misc::lorentz( beta, r_lab, r_cm );
00115
00116 sqr_q_cm = q_cm[0]*q_cm[0]*g[0];
00117 rinv = 0.0;
00118 for (int i=1; i<4; ++i) {
00119 sqr_q_cm += q_cm[i]*q_cm[i]*g[i];
00120 rinv += r_cm[i]*r_cm[i];
00121 }
00122 rinv = sqrt( abs(rinv) );
00123 qinv = sqrt( abs(sqr_q_cm) );
00124 }