00001 #include <math.h>
00002 #include "MdcxReco/Mdcxprobab.h"
00003
00004 extern float Mdcxprobab(int& ndof, float& chisq) {
00005
00006
00007 static float srtopi = 2.0/sqrt(2.0*M_PI);
00008 static float upl = 100.0;
00009
00010 float prob = 0.0;
00011 if(ndof <= 0) return prob;
00012 if(chisq < 0.0) return prob;
00013 if(ndof <= 60) {
00014
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 }
00026 return sum;
00027
00028 } else {
00029
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 }
00040 return (srtopi*srty*sum + prob);
00041
00042 }
00043
00044 } else {
00045
00046 float srty = sqrt(chisq) - sqrt(ndof - 0.5);
00047 if(srty < 12.0) prob=0.5*erfc(srty);
00048 return prob;
00049
00050 }
00051
00052
00053
00054 }
00055