159 int ii=correspdim[0];
160 int jj=correspdim[1];
161 double determinant= -matrix[jj][ii]*matrix[ii][jj] +matrix[ii][ii]*matrix[jj][jj];
162 double i00 = matrix[ii][ii];
163 matrix[ii][ii] = matrix[jj][jj]/determinant;
164 matrix[jj][jj] = i00/determinant;
165 matrix[ii][jj] = -matrix[ii][jj]/determinant;
166 matrix[jj][ii] = matrix[ii][jj];
171 double sm12 = matrix[0][1]*matrix[0][1];
172 double sm13 = matrix[0][2]*matrix[0][2];
173 double sm23 = matrix[1][2]*matrix[1][2];
174 double determinant = matrix[0][0]*matrix[1][1]*matrix[2][2]
175 -matrix[0][0]*sm23-sm12*matrix[2][2]
176 +2.*matrix[0][1]*matrix[0][2]*matrix[1][2]
179 double i00 = matrix[1][1]*matrix[2][2]-sm23;
180 double i11 = matrix[0][0]*matrix[2][2]-sm13;
181 double i22 = matrix[0][0]*matrix[1][1]-sm12;
183 matrix[1][0] = (matrix[0][2]*matrix[1][2]-matrix[2][2]*matrix[0][1])/determinant;
184 matrix[2][0] = (matrix[0][1]*matrix[1][2]-matrix[0][2]*matrix[1][1])/determinant;
185 matrix[2][1] = (matrix[0][1]*matrix[0][2]-matrix[0][0]*matrix[1][2])/determinant;
186 matrix[0][1] = matrix[1][0];
187 matrix[0][2] = matrix[2][0];
188 matrix[1][2] = matrix[2][1];
189 matrix[0][0] = i00/determinant;
190 matrix[1][1] = i11/determinant;
191 matrix[2][2] = i22/determinant;
198 printf(
"this is not a 2x2 or 3x3 matrix\n");
328 double Determinant = W[0][3]*W[0][3]*W[1][2]*W[1][2] - 2.*W[0][2]*W[0][3]*W[1][2]*W[1][3]
329 +W[0][2]*W[0][2]*W[1][3]*W[1][3]-W[0][3]*W[0][3]*W[1][1]*W[2][2] + 2.*W[0][1]*W[0][3]*W[1][3]*W[2][2] - W[0][0]*W[1][3]*W[1][3]*W[2][2]+2.*W[0][2]*W[0][3]*W[1][1]*W[2][3]
330 - 2.*W[0][1]*W[0][3]*W[1][2]*W[2][3] - 2.*W[0][1]*W[0][2]*W[1][3]*W[2][3]+2.*W[0][0]*W[1][2]*W[1][3]*W[2][3]+W[0][1]*W[0][1]*W[2][3]*W[2][3]-W[0][0]*W[1][1]*W[2][3]*W[2][3]-W[0][2]*W[0][2]*W[1][1]*W[3][3]+2.*W[0][1]*W[0][2]*W[1][2]*W[3][3]-W[0][0]*W[1][2]*W[1][2]*W[3][3]-W[0][1]*W[0][1]*W[2][2]*W[3][3]+W[0][0]*W[1][1]*W[2][2]*W[3][3];
332 W[0][1] = W[3][0]*W[3][1]*W[2][2]-W[3][0]*W[2][1]*W[3][2] - W[2][0]*W[3][1]*W[3][2]+W[1][0]*W[3][2]*W[3][2]+W[2][0]*W[2][1]*W[3][3]-W[1][0]*W[2][2]*W[3][3];
333 W[0][2] = -W[3][0]*W[2][1]*W[3][1]+W[2][0]*W[3][1]*W[3][1]+W[3][0]*W[1][1]*W[3][2]-W[1][0]*W[3][1]*W[3][2]-W[2][0]*W[1][1]*W[3][3]+W[1][0]*W[2][1]*W[3][3];
334 W[0][3] = W[3][0]*W[2][1]*W[2][1]-W[2][0]*W[2][1]*W[3][1]-W[3][0]*W[1][1]*W[2][2]+W[1][0]*W[3][1]*W[2][2]+W[2][0]*W[1][1]*W[3][2]-W[1][0]*W[2][1]*W[3][2];
335 W[1][2] = W[3][0]*W[3][0]*W[2][1]-W[2][0]*W[3][0]*W[3][1]-W[1][0]*W[3][0]*W[3][2]+W[0][0]*W[3][1]*W[3][2]+W[1][0]*W[2][0]*W[3][3]-W[0][0]*W[2][1]*W[3][3];
337 W[1][3] = -W[2][0]*W[3][0]*W[2][1]+W[2][0]*W[2][0]*W[3][1]+W[1][0]*W[3][0]*W[2][2]-W[0][0]*W[3][1]*W[2][2]-W[1][0]*W[2][0]*W[3][2]+W[0][0]*W[2][1]*W[3][2];
338 W[2][3] = W[2][0]*W[3][0]*W[1][1]-W[1][0]*W[3][0]*W[2][1]-W[1][0]*W[2][0]*W[3][1]+W[0][0]*W[2][1]*W[3][1]+W[1][0]*W[1][0]*W[3][2]-W[0][0]*W[1][1]*W[3][2];
340 double W00 = -W[3][1]*W[3][1]*W[2][2]+2.*W[2][1]*W[3][1]*W[3][2]-W[1][1]*W[3][2]*W[3][2]-W[2][1]*W[2][1]*W[3][3]+W[1][1]*W[2][2]*W[3][3];
341 double W11 = -W[3][0]*W[3][0]*W[2][2]+2.*W[2][0]*W[3][0]*W[3][2]-W[0][0]*W[3][2]*W[3][2]-W[2][0]*W[2][0]*W[3][3]+W[0][0]*W[2][2]*W[3][3];
342 double W22 = -W[3][0]*W[3][0]*W[1][1]+2.*W[1][0]*W[3][0]*W[3][1]-W[0][0]*W[3][1]*W[3][1]-W[1][0]*W[1][0]*W[3][3]+W[0][0]*W[1][1]*W[3][3];
343 double W33 = -W[2][0]*W[2][0]*W[1][1]+2.*W[1][0]*W[2][0]*W[2][1]-W[0][0]*W[2][1]*W[2][1]-W[1][0]*W[1][0]*W[2][2]+W[0][0]*W[1][1]*W[2][2];
351 W[i][j] = W[i][j]/Determinant;
355 W[0][0] = W00/Determinant;
356 W[1][1] = W11/Determinant;
357 W[2][2] = W22/Determinant;
358 W[3][3] = W33/Determinant;
365 const int maxIter = 7;
367 double fitTolerance0 = 0.10;
368 double fitTolerance1 = 0.01;
370 double p0[3][1]={{0.}};
372 p0[j][0] = initValues[j];
375 double m[4][1]={{0.}};
377 double W[4][4]={{0.}};
384 W[0][1] = 0.03*ex*ex;
385 W[0][2] = -0.411*ex*ex;
386 W[0][3] = -0.188*ex*ex;
387 W[1][2] = 0.0275*ex*ex;
388 W[1][3] = -0.4303*ex*ex;
403 double fp[4][1]={{0.}};
405 double A[4][3]={{0.}};
411 bool converged=
false;
412 double amplitudeChangeOld = 0.;
413 bool diverganceCandidate =
false;
418 double weight[3][3]={{0.}};
424 double residFactor[3][4]={{0.}};
425 while(!converged && counter<maxIter)
432 double helpmatrix[4][3]={{0.}};
433 for(
int i=0;i<imeas;i++)
436 for(
int j=0;j<ipar;j++)
439 for(
int k=0;k<imeas;k++)
442 helpmatrix[ii][jj] += W[ii][kk]*
A[kk][jj];
446 for(
int i=0;i<ipar;i++)
449 for(
int j=i;j<ipar;j++)
453 for(
int k=0;k<imeas;k++)
456 weight[ii][jj] +=
A[kk][ii]*helpmatrix[kk][jj];
459 weight[jj][ii] =weight[ii][jj];
468 double helpmatrix2[3][4]={{0.}};
469 for(
int i=0;i<ipar;i++)
472 for(
int j=0;j<imeas;j++)
475 for(
int k=0;k<imeas;k++)
478 helpmatrix2[ii][jj] +=
A[kk][ii] * W[kk][jj];
483 for(
int i=0;i<ipar;i++)
486 for(
int j=0;j<imeas;j++)
489 residFactor[ii][jj]=0.;
490 for(
int k=0;k<ipar;k++)
493 residFactor[ii][jj] += weight[ii][kk]*helpmatrix2[kk][jj];
499 double paramDiff[3] = {0.};
500 for(
int i=0;i<ipar;i++)
505 for(
int j=0;j<imeas;j++)
508 paramDiff[ii] += residFactor[ii][jj]*(m[jj][0]-fp[jj][0]);
510 p0[ii][0] += paramDiff[ii];
513 if(p0[1][0]>1. || p0[1][0]<-3.)
514 p0[1][0] = initValues[1];
516 double amplitudeChangeNew = std::abs(paramDiff[0]);
517 if(std::abs(paramDiff[0])<fitTolerance0 && std::abs(paramDiff[1])<fitTolerance1)
521 double residual[4]= {0.};
522 for(
int i=0;i<imeas;i++)
525 residual[i] = m[ii][0]-fp[ii][0];
529 double helpmatrixchi2[4][1]={{0.}};
530 for(
int i=0;i<imeas;i++)
533 for(
int k=0;k<imeas;k++)
536 helpmatrixchi2[ii][0] += W[ii][kk]*residual[kk];
539 for(
int k=0;k<imeas;k++)
542 tmpChi2 += residual[kk]*helpmatrixchi2[kk][0];
546 else if(counter>4 && (amplitudeChangeNew>4.*amplitudeChangeOld))
548 if(diverganceCandidate)
552 printf(
"Diverging fit\n");
556 diverganceCandidate =
true;
571 fitTolerance1 = 0.05;
573 amplitudeChangeOld = amplitudeChangeNew;
int Fit(double *x, const double ex, const double pedestal, const double predefinedwidth, double *result, double *errors, double *chi2)
int TheFitter(double *x, const double ex, double *initValues, int imeas, int *meas, int ipar, int *par, double *chi2, double *result)