Go to the documentation of this file.00001 #include <stdio.h>
00002 #include <math.h>
00003
00004
00005 class Conv{
00006
00007 public:
00008
00009 Conv(){}
00010
00011
00012 float elec(float t,float vs){
00013 float f;
00014 if (t<=vs){
00015 f=log(t+2.5)-log(2.5);
00016 }
00017 else{
00018 f=log(t+2.5)-log(t-50+2.5);
00019 }
00020 return f;
00021 }
00022
00023
00024
00025 void mkbins(float vs){
00026 int i,k;
00027 float t;
00028 for(i=0;i<120;i++) conve[i]=0.0;
00029 for(i=0;i<120;i++){
00030 for(k=0;k<16;k++){
00031 t=(6.25*i)+(k*0.625);
00032 conve[i]=conve[i]+elec(t,vs);
00033 }
00034 }
00035 }
00036
00037
00038
00039 void convolution(float *xleft_a, float *xleft_b, float *min_left, float *xright_a, float *xright_b, float *min_right, float *pTime){
00040
00041
00042 float max, cross0,cross2,min_l,min_r,sum_x=0.0,sumx2=0.;
00043 float sum_y_left=0.0,sum_y_right=0.0,sum_xy_left=0.0,sum_xy_right=0.0;
00044 float a_left=0.0,a_right=0.0,b_left=0.0,b_right=0.0,chi2_left=0.0,chi2_right=0.0,chi_left=0.0,chi_right=0.0;
00045 float aleft=0.0,aright=0.0,bleft=0.0,bright=0.0;
00046 int i,j,k,l,imax=0;
00047
00048 for(l=0;l<3;l++){
00049 for(i=0;i<119;i++)conv[l][i]=0.0;
00050 for(j=0;j<119;j++){
00051 for(k=0;k<119;k++){
00052 if(j+k<119)conv[l][j+k]=conv[l][j+k]+convd[l][j]*conve[k];
00053 }
00054 }
00055 }
00056 max=0;
00057 min_l=9999999999999999.0;
00058 min_r=9999999999999999.0;
00059 for(i=0;i<119;i++){
00060 if(conv[1][i]>max){
00061 max=conv[1][i];
00062 imax=i;
00063 }
00064 }
00065
00066
00067 float time1=-999.0, time2=-999.0, time3=-999.0;
00068 float data1=-999.0, data2=-999.0, data3=-999.0;
00069 float peakTime=0.0;
00070
00071 time1=imax-1;
00072 time2=imax;
00073 time3=imax+1;
00074
00075 data1=conv[1][imax-1];
00076 data2=conv[1][imax];
00077 data3=conv[1][imax+1];
00078
00079 peakTime=(0.5)*((time1*time1*(data3-data2)+time2*time2*(data1-data3)+time3*time3*(data2-data1))/(time1*(data3-data2)+time2*(data1-data3)+time3*(data2-data1)))*6.25;
00080
00081 for(l=0;l<3;l++){
00082 for(i=0;i<119;i++)conv[l][i]=conv[l][i]/max;
00083 }
00084
00085 int nobs = 0;
00086 for (int j=0; j<119; j++){
00087 if (conv[1][j]>0.6) nobs++;
00088 }
00089
00090 for(i=0;i<119;i++){
00091 cross0=0.0;
00092 cross2=0.0;
00093
00094 if(conv[1][i]>0.6){
00095 cross0=conv[0][i]/(conv[0][i]+conv[1][i]+conv[2][i]);
00096 cross2=conv[2][i]/(conv[0][i]+conv[1][i]+conv[2][i]);
00097
00098 sum_x += i;
00099 sum_y_left += cross0;
00100 sum_y_right += cross2;
00101 sumx2 += i*i;
00102 sum_xy_left += i*cross0;
00103 sum_xy_right += i*cross2;
00104 }
00105 }
00106
00107
00108
00109 bleft = ((nobs*sum_xy_left) - (sum_x * sum_y_left))/((nobs*sumx2) - (sum_x*sum_x));
00110 bright = ((nobs*sum_xy_right) - (sum_x * sum_y_right))/((nobs*sumx2) - (sum_x*sum_x));
00111
00112 aleft = ((sum_y_left*sumx2)-(sum_x*sum_xy_left))/((nobs*sumx2)-(sum_x*sum_x));
00113 aright = ((sum_y_right*sumx2)-(sum_x*sum_xy_right))/((nobs*sumx2)-(sum_x*sum_x));
00114
00115 for(i=0;i<119;i++ ){
00116 chi2_left += (cross0 -(aleft+(bleft*i)))*(cross0 -(aleft+(bleft*i)));
00117 chi2_right += (cross2 -(aright+(bright*i)))*(cross2 -(aright+(bright*i)));
00118 }
00119
00120 if(chi_left<min_l){
00121 min_l=chi_left;
00122 bleft=bleft;
00123 aleft=aleft;
00124 }
00125 if(chi_right<min_r){
00126 min_r=chi_right;
00127 bright=bright;
00128 aright=aright;
00129 }
00130
00131
00132
00133 b_left = bleft/6.25;
00134 b_right = bright/6.25;
00135
00136 a_left = aleft + (bleft*peakTime/6.25);
00137 a_right = aright + (bright*peakTime/6.25);
00138
00139 *xleft_a = a_left;
00140 *xleft_b = b_left;
00141 *min_left = chi2_left;
00142 *xright_a = a_right;
00143 *xright_b = b_right;
00144 *min_right = chi2_right;
00145 *pTime = peakTime;
00146
00147 }
00148
00149 ~Conv(){}
00150
00151
00152 float convd[3][120];
00153 float nconvd[3][120];
00154 float conve[120];
00155 float conv[3][120];
00156
00157 private:
00158
00159
00160
00161 } ;
00162