00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <iostream>
00014 #include <math.h>
00015 #include "MucRecEvent/MucRecQuadFit.h"
00016 #include <CLHEP/Matrix/Matrix.h>
00017
00018 using namespace std;
00019 using namespace CLHEP;
00020
00021 MucRecQuadFit::MucRecQuadFit()
00022 {
00023
00024 }
00025
00026 MucRecQuadFit::~MucRecQuadFit()
00027 {
00028
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 int
00067 MucRecQuadFit::QuadFit(float x[],
00068 float y[],
00069 float w[],
00070 int n,
00071 float *a,
00072 float *b,
00073 float *c,
00074 int *half,
00075 float *chisq,
00076 float *siga,
00077 float *sigb,
00078 float *sigc)
00079
00080 {
00081 double sumx, sumx2, sumx3, sumx4,sumy, sumyx, sumyx2, det;
00082 float chi;
00083
00084
00085
00086
00087 long i;
00088
00089 chi = 99999999.0;
00090 *a = 0; *b = 0; *c = 0;
00091 *half = 0;
00092
00093
00094 if (n < 3)
00095 {
00096
00097 return -1;
00098 }
00099
00100
00101 sumx = 0.0;
00102 sumx2 = 0.0;
00103 sumx3 = 0.0;
00104 sumx4 = 0.0;
00105 sumy = 0.0;
00106 sumyx = 0.0;
00107 sumyx2 = 0.0;
00108
00109
00110
00111 for (i = 0; i < n; i++)
00112 {
00113 sumx = sumx + w[i] * x[i];
00114 sumx2 = sumx2 + w[i] * x[i] * x[i];
00115 sumx3 = sumx3 + w[i] * x[i] * x[i] * x[i];
00116 sumx4 = sumx4 + w[i] * x[i] * x[i] * x[i] * x[i];
00117 sumy = sumy + w[i] * y[i];
00118 sumyx = sumyx + w[i] * y[i] * x[i];
00119 sumyx2 = sumyx2 + w[i] * y[i] * x[i] * x[i];
00120
00121
00122 }
00123
00124
00125
00126
00127
00128 HepMatrix D(3,3,1);
00129 HepMatrix C(3,1), ABC(3,1);
00130 D(1,1) = sumx4; D(1,2) = D(2,1) = sumx3; D(1,3) = D(3,1) = D(2,2) = sumx2;
00131 D(3,2) = D(2,3) = sumx; D(3,3) = n;
00132 C(1,1) = sumyx2; C(2,1) = sumyx; C(3,1) = sumy;
00133
00134 int ierr;
00135 ABC = (D.inverse(ierr))*C;
00136
00137 *a = ABC(1,1);
00138 *b = ABC(2,1);
00139 *c = ABC(3,1);
00140
00141
00142 float center = *b/(-2*(*a));
00143 float mean_x;
00144 for(i = 0; i < n; i++){
00145 mean_x += x[i]/n;
00146 }
00147
00148 if(mean_x > center) *half = 2;
00149 else *half = 1;
00150
00151
00152
00153
00154 chi = 0.0;
00155 for (i=0; i<n; i++)
00156 {
00157 chi = chi+(w[i])*((y[i])-*a*(x[i])-*b)*
00158 ((y[i])-*a*(x[i])-*b);
00159 }
00160
00161
00162
00163
00164 *chisq = chi;
00165 return 1;
00166 }
00167