00001 #include <cmath> 00002 00003 #include "ParticleID/TofPID.h" 00004 #include "ParticleID/Tof1PID.h" 00005 #include "ParticleID/Tof2PID.h" 00006 00007 #ifndef BEAN 00008 #include "EvtRecEvent/EvtRecTrack.h" 00009 #include "MdcRecEvent/RecMdcTrack.h" 00010 #include "TofRecEvent/RecTofTrack.h" 00011 #endif 00012 00013 00014 TofPID * TofPID::m_pointer = 0; 00015 TofPID * TofPID::instance() { 00016 if(!m_pointer) m_pointer = new TofPID(); 00017 return m_pointer; 00018 } 00019 00020 TofPID::TofPID():ParticleIDBase() { 00021 ; 00022 } 00023 00024 void TofPID::init() { 00025 for(int i = 0; i < 5; i++) { 00026 m_chi[i] = 99.0; 00027 m_prob[i] = -1.0; 00028 m_sigma[i] = 1; 00029 m_offset[i] = 99.0; 00030 } 00031 m_chimin = 99.; 00032 m_pdfmin = 99.; 00033 m_ndof = 0; 00034 } 00035 00036 double TofPID :: chilayer1(int n) const { 00037 double chi = 99; 00038 if(val_tof1) chi = m_tof1pid->chi(n); 00039 return chi; 00040 } 00041 00042 double TofPID :: chilayer2(int n) const { 00043 double chi = 99; 00044 if(val_tof2) chi = m_tof2pid->chi(n); 00045 return chi; 00046 } 00047 00048 void TofPID::calculate() { 00049 if(particleIDCalculation() == 0) m_ndof=1; 00050 } 00051 00052 00053 00054 int TofPID::particleIDCalculation() { 00055 int irc=-1; 00056 EvtRecTrack* recTrk = PidTrk(); 00057 m_tof1pid = Tof1PID::instance(); 00058 m_tof1pid->init(); 00059 m_tof1pid->setRecTrack(recTrk); 00060 m_tof1pid->setChiMinCut(chiMinCut()); 00061 m_tof1pid->setPdfMinSigmaCut(pdfMinSigmaCut()); 00062 m_tof1pid->calculate(); 00063 val_tof1 = m_tof1pid->IsPidInfoValid(); 00064 m_tof2pid = Tof2PID::instance(); 00065 m_tof2pid->init(); 00066 m_tof2pid->setRecTrack(recTrk); 00067 m_tof2pid->setChiMinCut(chiMinCut()); 00068 m_tof2pid->setPdfMinSigmaCut(pdfMinSigmaCut()); 00069 m_tof2pid->calculate(); 00070 val_tof2 = m_tof2pid->IsPidInfoValid(); 00071 double chitemp = 99.; 00072 double pdftemp = 0; 00073 for(int i=0; i<5; i++) { 00074 double t_tof1 = m_tof1pid->offset(i); 00075 double t_tof2 = m_tof2pid->offset(i); 00076 double m_sigma1 = m_tof1pid->sigma(i); 00077 double m_sigma2 = m_tof2pid->sigma(i); 00078 // double weight1,weight2; 00079 if(val_tof1==1&&val_tof2==1) { 00080 weight1 = (m_sigma2*m_sigma2-0.041*0.041)/(m_sigma1*m_sigma1+m_sigma2*m_sigma2-2*0.041*0.041); 00081 weight2 = (m_sigma1*m_sigma1-0.041*0.041)/(m_sigma1*m_sigma1+m_sigma2*m_sigma2-2*0.041*0.041); 00082 m_sigma[i] = sqrt((m_sigma1*m_sigma1*m_sigma2*m_sigma2 - 0.041*0.041*0.041*0.041)/(m_sigma1*m_sigma1+m_sigma2*m_sigma2-2*0.041*0.041)); 00083 m_offset[i] = weight1*t_tof1+weight2*t_tof2; 00084 m_chi[i] = m_offset[i]/m_sigma[i]; 00085 } 00086 if(val_tof1==1&&val_tof2==0) { 00087 weight1=1; 00088 weight2=0; 00089 m_sigma[i] = m_tof1pid->sigma(i); 00090 m_offset[i] = t_tof1; 00091 m_chi[i] = m_tof1pid->chi(i); 00092 } 00093 00094 if(val_tof1==0&&val_tof2==1) { 00095 weight1=0; 00096 weight2=1; 00097 m_sigma[i] = m_tof2pid->sigma(i); 00098 m_offset[i] = t_tof2; 00099 m_chi[i] = m_tof2pid->chi(i); 00100 } 00101 00102 if(val_tof1==0&&val_tof2==0) return irc; 00103 if(fabs(m_chi[i]) < chitemp) chitemp = fabs(m_chi[i]); 00104 double ppp = pdfCalculate(m_chi[i],1); 00105 if(fabs(ppp) > pdftemp) pdftemp = fabs(ppp); 00106 } 00107 00108 m_chimin = chitemp; 00109 m_pdfmin = pdftemp; 00110 if(pdftemp < pdfCalculate(pdfMinSigmaCut(),1)) return irc; 00111 if(m_chimin > chiMinCut()) return irc; 00112 for(int i = 0; i < 5; i++) 00113 m_prob[i] = probCalculate(m_chi[i]*m_chi[i], 1); 00114 irc = 0; 00115 return irc; 00116 } 00117 00118 00119