Using TMinuit::SetFCN

I have problem using TMinuit::SetFCN with TMinuit::GetObjectFit() according
to root.cern.ch/root/roottalk/roottalk03/3830.html.
I have included all relevant programs in tar.gz file. I also included an output
from valgrind.

I appreciate any comments.

Michal

P.S. I run root 4.02 on RedHat Fedora Core 1 with gcc 3.3.2
TestMinuitFit.tar.gz (3.09 KB)

Hi,

As usual, please specify which root version and platform !

I tried with 3.10.02 and 4.00.02 on MacOSX and had no problem.
However, the formulation of your objective function is problematic :
You specify f(x) = c_0e^(-c_1x)+c_2e^(-c_3x)
and give as starting values : c_0 = c_2 and c_1 = c_3
which causes Minuit to run into severe problems :

fatman:~/Desktop/TestMinuitFit Folder> ./TestMinuitFit


** 1 **SET ERR 1


PARAMETER DEFINITIONS:
NO. NAME VALUE STEP SIZE LIMITS
1 A0 5.00000e+06 1.00000e-01 no limits
2 B0 5.00000e+06 1.00000e-01 no limits
3 Alpha 1.00000e-03 1.00000e-05 no limits
4 Beta 1.00000e-03 1.00000e-05 no limits


** 2 **MINI 500 1


FIRST CALL TO USER FUNCTION AT NEW START POINT, WITH IFLAG=4.
START MIGRAD MINIMIZATION. STRATEGY 1. CONVERGENCE WHEN EDM .LT. 1.00e-03
FCN=8.05527e+06 FROM MIGRAD STATUS=INITIATE 16 CALLS 17 TOTAL
EDM= unknown STRATEGY= 1 NO ERROR MATRIX
EXT PARAMETER CURRENT GUESS STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 A0 5.00000e+06 1.00000e-01 1.00000e-01 1.61248e+00
2 B0 5.00000e+06 1.00000e-01 1.00000e-01 1.61248e+00
3 Alpha 1.00000e-03 1.00000e-05 1.00000e-05 -1.29248e+10
4 Beta 1.00000e-03 1.00000e-05 1.00000e-05 -1.29248e+10
MIGRAD MINIMIZATION HAS CONVERGED.
MIGRAD WILL VERIFY CONVERGENCE AND ERROR MATRIX.
EIGENVALUES OF SECOND-DERIVATIVE MATRIX:
-1.0581e+00 -3.4557e-02 8.4283e-02 5.0084e+00
MINUIT WARNING IN HESSE
============== MATRIX FORCED POS-DEF BY ADDING 1.063132 TO DIAGONAL.
FCN=3.12765 FROM HESSE STATUS=NOT POSDEF 23 CALLS 97 TOTAL
EDM=0.130913 STRATEGY= 1 ERR MATRIX NOT POS-DEF
EXT PARAMETER APPROXIMATE STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 A0 5.92378e+03 1.37833e+04 3.72483e+00 -2.49666e-08
2 B0 6.02518e+03 1.42713e+04 3.72483e+00 -2.50023e-08
3 Alpha 1.21230e-03 7.12628e-03 7.46164e-07 9.84096e+02
4 Beta 1.21230e-03 6.89929e-03 7.27104e-07 1.00094e+03
MIGRAD MINIMIZATION HAS CONVERGED.
MIGRAD WILL VERIFY CONVERGENCE AND ERROR MATRIX.
COVARIANCE MATRIX CALCULATED SUCCESSFULLY
FCN=0.000149089 FROM MIGRAD STATUS=CONVERGED 250 CALLS 251 TOTAL
EDM=0.000180745 STRATEGY= 1 ERROR MATRIX ACCURATE
EXT PARAMETER STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 A0 1.32495e+03 1.15095e+04 1.80612e-01 -7.68901e-06
2 B0 -2.02746e+03 3.03635e+04 1.25709e+00 -2.50486e-06
3 Alpha -2.87242e-04 2.25913e-03 6.38778e-08 7.62017e+00
4 Beta 8.80309e-04 1.96470e-02 4.16883e-07 -5.52000e+00
EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 4 ERR DEF=1
1.325e+08 1.026e+08 2.548e+01 -1.896e+02
1.026e+08 9.219e+08 9.038e+00 -4.537e+02
2.548e+01 9.038e+00 5.104e-06 -3.221e-05
-1.896e+02 -4.537e+02 -3.221e-05 3.860e-04
PARAMETER CORRELATION COEFFICIENTS
NO. GLOBAL 1 2 3 4
1 0.99949 1.000 0.294 0.980 -0.839
2 0.99542 0.294 1.000 0.132 -0.760
3 0.99823 0.980 0.132 1.000 -0.726
4 0.99903 -0.839 -0.760 -0.726 1.000
FCN=0.000149089 FROM MIGRAD STATUS=CONVERGED 250 CALLS 251 TOTAL
EDM=0.000180745 STRATEGY= 1 ERROR MATRIX ACCURATE
EXT PARAMETER STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 A0 1.32495e+03 1.15095e+04 1.80612e-01 -7.68901e-06
2 B0 -2.02746e+03 3.03635e+04 1.25709e+00 -2.50486e-06
3 Alpha -2.87242e-04 2.25913e-03 6.38778e-08 7.62017e+00
4 Beta 8.80309e-04 1.96470e-02 4.16883e-07 -5.52000e+00

Eddy

[quote=“ml”]I have problem using TMinuit::SetFCN with TMinuit::GetObjectFit() according
to root.cern.ch/root/roottalk/roottalk03/3830.html.
I have included all relevant programs in tar.gz file. I also included an output
from valgrind.

I appreciate any comments.

Michal

P.S. I run root 4.02 on RedHat Fedora Core 1 with gcc 3.3.2[/quote]

Eddy,

Thank you for your response.

if I modify FitChiSquare function by adding couts

void FitChiSquare(Int_t &nrPar, Double_t *grad, Double_t &ChiSquare,
Double_t *par, Int_t flag)
{
// Minimization function using a Chisquare method

 const MyFitClass *fit = (MyFitClass *)
 gMinuit -> GetObjectFit();
 const Int_t NPoints = fit->GetN();
 const Int_t NVar    = fit->GetNrVar();
 const Double_t *x   = (fit->GetX()).GetArray();
 cout << " *x " << *x << endl;
 const Double_t *y   = (fit->GetY()).GetArray();
 cout << " *y " << *y << endl;
 const Double_t *ey  = (fit->GetEY()).GetArray();
 cout << " *ey " << *ey << endl;
 cout << " NPoints " << NPoints << " NVar " << NVar << " *x " << *x << " *y " << *y << " *ey " << *ey << endl;

 Double_t Chisq = 0.0;
 Double_t Delta;
 Double_t *xp = (Double_t *) x;
 Double_t *yp = (Double_t *) y;
 Double_t *eyp = (Double_t *) ey;
 cout << "                  " << " *xp " << *xp << " *yp " << *yp << " *eyp " << *eyp << endl;
 for (Int_t ii = 0; ii < NPoints; ii++) {
    Double_t xx = *xp;
    Double_t yy = *yp;
    Double_t eyy = *eyp;
    Delta  = (yy - func(xx, par)) / eyy ;
    Chisq += Delta * Delta;
    xp++;
    yp++;
    eyp++;
 }
 ChiSquare = Chisq;

// cout << " ChiSquare " << ChiSquare << endl;
}

I am getting the following output


** 1 **SET ERR 1


PARAMETER DEFINITIONS:
NO. NAME VALUE STEP SIZE LIMITS
1 A0 2.00000e+06 1.00000e-01 no limits
2 B0 7.00000e+06 1.00000e-01 no limits
3 Alpha 1.00000e-03 1.00000e-05 no limits
4 Beta 1.00000e-03 1.00000e-05 no limits


** 2 **MINI 500 1


FIRST CALL TO USER FUNCTION AT NEW START POINT, WITH IFLAG=4.
*x 2
*y 5.43527e+06
*ey 3261.17
NPoints 9 NVar 4 *x 3261.17 *y 3261.17 *ey 3261.17 WHAT IS GOING ON HERE ???
*xp 3261.17 *yp 3261.17 *eyp 3261.17 !!!
START MIGRAD MINIMIZATION. STRATEGY 1. CONVERGENCE WHEN EDM .LT. 1.00e-03
*x 2
*y 5.43527e+06
*ey 3261.17
NPoints 9 NVar 4 *x 3261.17 *y 3261.17 *ey 3261.17
*xp 3261.17 *yp 3261.17 *eyp 3261.17
*x 2
*y 5.43527e+06
*ey 3261.17
NPoints 9 NVar 4 *x 3261.17 *y 3261.17 *ey 3261.17
*xp 3261.17 *yp 3261.17 *eyp 3261.17

Michal

Well, your MyFitClass is not written very well :

For instance:

const TArrayD GetX() const {return fX;} should be
const TArrayD & GetX() const {return fX;}

otherwise a statement like

const Double_t *x = (fit->GetX()).GetArray(); will not be meaningful .

void SetX(TArrayD X); should be
void SetX(const TArrayD &X); so pass a reference, otherwise you copy
the whole array each time you call SetX

Eddy