64 int n,
float* a,
float* b,
float* chisq,
float* siga,
66 if ( part > 2 || part < 0 )
68 cout <<
"BAD part id from MucRecLineFit" << endl;
73 float c, d, sigc, sigd;
77 for (
int i = 0; i <
n; i++ )
84 status =
LineFit( x, y,
w,
n, a, b, chisq, siga, sigb );
92 for (
int i = 0; i <
n; i++ )
97 status =
LineFit( y, x,
w,
n, &c, &d, chisq, &sigc, &sigd );
106 *siga = 1 / c / c * sigc;
113 if ( seg == 0 || seg == 4 )
116 for (
int i = 0; i <
n; i++ ) { x[i] -= gap0x; }
117 status =
LineFit( x, y,
w,
n, a, b, chisq, siga, sigb );
119 else if ( seg == 2 || seg == 6 )
122 for (
int i = 0; i <
n; i++ ) { y[i] -= gap0y; }
123 status =
LineFit( y, x,
w,
n, &c, &d, chisq, &sigc, &sigd );
127 *siga = 1 / c / c * sigc;
133 for (
int i = 0; i <
n; i++ )
135 float temp = ( y[i] + x[i] ) / sqrt( 2.0 );
136 y[i] = ( y[i] - x[i] ) / sqrt( 2.0 );
140 if ( seg == 1 || seg == 5 )
142 for (
int i = 0; i <
n; i++ )
148 status =
LineFit( x, y,
w,
n, a, b, chisq, siga, sigb );
150 else if ( seg == 3 || seg == 7 )
152 for (
int i = 0; i <
n; i++ )
158 status =
LineFit( y, x,
w,
n, a, b, chisq, siga, sigb );
168 float* chisq,
float* siga,
float* sigb )
171 double sum, sx, sy, sxx, sxy, syy, det;
184 cout <<
"utiLineFit-W: Too few points for line fit \n" << endl;
197 for ( i = 0; i <
n; i++ )
201 sx = sx +
w[i] * x[i];
202 sy = sy +
w[i] * y[i];
203 sxx = sxx +
w[i] * x[i] * x[i];
204 sxy = sxy +
w[i] * x[i] * y[i];
205 syy = syy +
w[i] * y[i] * y[i];
208 det = sum * sxx - sx * sx;
209 if ( fabs( det ) < 1.0e-20 )
221 *a = ( sum * sxy - sx * sy ) / det;
222 *b = ( sy * sxx - sxy * sx ) / det;
227 for ( i = 0; i <
n; i++ )
230 chi + (
w[i] ) * ( ( y[i] ) - *a * ( x[i] ) - *b ) * ( ( y[i] ) - *a * ( x[i] ) - *b );
233 *siga = sqrt( fabs( sum / det ) );
234 *sigb = sqrt( fabs( sxx / det ) );
MucGeoGap * GetGap(const int part, const int seg, const int gap) const
Get a pointer to the gap identified by (part,seg,gap).
int LineFit(float x[], float y[], float w[], int n, float *a, float *b, float *chisq, float *siga, float *sigb)