Go to the source code of this file.
Functions | |
float | Mdcxprobab (int &ndof, float &chisq) |
float Mdcxprobab | ( | int & | ndof, | |
float & | chisq | |||
) |
Definition at line 4 of file Mdcxprobab.cxx.
References exp(), genRecEmupikp::i, M_PI, and subSeperate::temp.
Referenced by MdcxCosmicSewer::execute(), MdcxFittedHel::Grow(), MdcxFittedHel::IterateFit(), and MdcxFindTracks::process().
00004 { 00005 00006 //constants 00007 static float srtopi = 2.0/sqrt(2.0*M_PI); 00008 static float upl = 100.0; //FIXME 00009 00010 float prob = 0.0; 00011 if(ndof <= 0) return prob; 00012 if(chisq < 0.0) return prob; 00013 if(ndof <= 60) { 00014 //full treatment 00015 if(chisq > upl) return prob; 00016 float sum = exp(-0.5*chisq); 00017 float term = sum; 00018 00019 int m = ndof/2; 00020 if(2*m == ndof) { 00021 if(m == 1) return sum; 00022 for(int i = 2; i <= m; i++) { 00023 term = 0.5*term*chisq/(i-1); 00024 sum += term; 00025 }//(int i=2; i<=m) 00026 return sum; 00027 //even 00028 } else { 00029 //odd 00030 float srty = sqrt(chisq); 00031 float temp = srty/M_SQRT2; 00032 prob = erfc(temp); 00033 if(ndof == 1) return prob; 00034 if(ndof == 3) return (srtopi*srty*sum+prob); 00035 m--; 00036 for(int i = 1; i <= m; i++) { 00037 term = term*chisq/(2*i+1); 00038 sum += term; 00039 }//(int i=1; i<=m; i++) 00040 return (srtopi*srty*sum + prob); 00041 00042 }//(2*m==ndof) 00043 00044 } else { 00045 //asymtotic Gaussian approx 00046 float srty = sqrt(chisq) - sqrt(ndof - 0.5); 00047 if(srty < 12.0) prob=0.5*erfc(srty); 00048 return prob; 00049 00050 }//ndof<30 00051 00052 // cannot reach following line; warning on OSF; so comment it out 00053 // return prob; 00054 }//endof Mdcxprobab