363{
364
366
367 double fitTolerance0 = 0.10;
368 double fitTolerance1 = 0.01;
369
370 double p0[3][1]={{0.}};
371 for(int j=0;j<3;j++)
372 p0[j][0] = initValues[j];
373
374
375 double m[4][1]={{0.}};
376
377 double W[4][4]={{0.}};
379 {
382 }
383
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;
396
397
399
400
401
402
403 double fp[4][1]={{0.}};
404
405 double A[4][3]={{0.}};
406
407
408
409
411 bool converged=false;
412 double amplitudeChangeOld = 0.;
413 bool diverganceCandidate = false;
414
415
416
417
418 double weight[3][3]={{0.}};
422
423
424 double residFactor[3][4]={{0.}};
425 while(!converged && counter<maxIter)
426 {
428
429
430
431
432 double helpmatrix[4][3]={{0.}};
433 for(
int i=0;
i<imeas;
i++)
434 {
436 for(int j=0;j<ipar;j++)
437 {
439 for(
int k=0;
k<imeas;
k++)
440 {
442 helpmatrix[ii][jj] +=
W[ii][
kk]*
A[
kk][jj];
443 }
444 }
445 }
446 for(
int i=0;
i<ipar;
i++)
447 {
449 for(int j=i;j<ipar;j++)
450 {
453 for(
int k=0;
k<imeas;
k++)
454 {
457 }
458
460 }
461 }
462
463
465
466
467
468 double helpmatrix2[3][4]={{0.}};
469 for(
int i=0;
i<ipar;
i++)
470 {
472 for(int j=0;j<imeas;j++)
473 {
474 int jj=meas[j];
475 for(
int k=0;
k<imeas;
k++)
476 {
478 helpmatrix2[ii][jj] +=
A[
kk][ii] *
W[
kk][jj];
479 }
480 }
481 }
482
483 for(
int i=0;
i<ipar;
i++)
484 {
486 for(int j=0;j<imeas;j++)
487 {
488 int jj=meas[j];
489 residFactor[ii][jj]=0.;
490 for(
int k=0;
k<ipar;
k++)
491 {
493 residFactor[ii][jj] +=
weight[ii][
kk]*helpmatrix2[
kk][jj];
494 }
495
496 }
497 }
498
499 double paramDiff[3] = {0.};
500 for(
int i=0;
i<ipar;
i++)
501 {
503
504
505 for(int j=0;j<imeas;j++)
506 {
507 int jj = meas[j];
508 paramDiff[ii] += residFactor[ii][jj]*(
m[jj][0]-
fp[jj][0]);
509 }
510 p0[ii][0] += paramDiff[ii];
511 }
512
513 if(p0[1][0]>1. || p0[1][0]<-3.)
514 p0[1][0] = initValues[1];
515
516 double amplitudeChangeNew = std::abs(paramDiff[0]);
517 if(std::abs(paramDiff[0])<fitTolerance0 && std::abs(paramDiff[1])<fitTolerance1)
518 {
519 converged = true;
520
522 for(
int i=0;
i<imeas;
i++)
523 {
526 }
527
528 double tmpChi2 = 0.;
529 double helpmatrixchi2[4][1]={{0.}};
530 for(
int i=0;
i<imeas;
i++)
531 {
533 for(
int k=0;
k<imeas;
k++)
534 {
537 }
538 }
539 for(
int k=0;
k<imeas;
k++)
540 {
543 }
544 (*chi2) = tmpChi2;
545 }
546 else if(counter>4 && (amplitudeChangeNew>4.*amplitudeChangeOld))
547 {
548 if(diverganceCandidate)
549 {
550
551
552 printf("Diverging fit\n");
553 return 4;
554 }
555 else
556 diverganceCandidate = true;
557 }
558 if(p0[0][0]<0.)
559 {
560
561
562
563 return 4;
564 }
565
566
567
568 if(p0[0][0]<20.)
569 {
570 fitTolerance0 = 0.1;
571 fitTolerance1 = 0.05;
572 }
573 amplitudeChangeOld = amplitudeChangeNew;
575 }
579
580 if(counter==maxIter)
581 return 3;
582 return 0;
583}
void InvertSymmetric4x4(double W[][4])
void InvertMatrix(double matrix[][3], const int dim, int *)
void Derivative(double A[][3], double fp[][1], double p0[][1], int imeas, int *meas)