Hello everybody!
I have a problem with TMinuit. The code should generate N angles following a certain function. The second step is to perform a Maximum Lilelihood minimization to find the three parameters of the function. Here I report only the section of the code in which I implement TMinuit.
double x[N], y[N]; // variables for MC events
void fcn(int &npar, double *deriv, double &f, double *par, int iflag){
double lnL = 0.;
for(int i = 0; i < N; i++){
lnL += log(0.2388 * (0.5*(1-par[0]) + 0.5*(3*par[0]-1)*pow(cos(x[i]),2) - par[1]*pow(sin(x[i]),2)*pow(cos(2*y[i]),2)
- sqrt(2)*par[2]*sin(2*y[i])*cos(y[i])));
}
f = -lnL;
}
int main(int argc, char** argv) {
/*MonteCarlo generator. This is not a problem since it works.
I report it just fot the sake of completeness. */
srand(time(NULL));
TNtuple cas ("cas", "cas", "x:y");
for(int i = 0; i < N; i++){
auto casuale = rand_TAC(0, 6.28, 0, 6.28, 0, 1);
cas.Fill(get<0>(casuale), get<1>(casuale));
x[i] = get<0>(casuale);
y[i]= get<1>(casuale);
}
//TMinuit
double arglist[10];
int ierflg = 0;
TMinuit minuit (3);
minuit.SetFCN(fcn);
arglist[0] = 0.5;
minuit.mnparm(0, "alpha", 0.40, 0.05, 0.0, 0.0, ierflg);
minuit.mnparm(1, "beta", 0.01, 0.01, 0.0, 0.0, ierflg);
minuit.mnparm(2, "gamma", -0.10, -0.01, 0.00, 0.0, ierflg);
minuit.mnexcm("MIGRAD", arglist, 0, ierflg);
return 0;
}
My problem is about the output:
PARAMETER DEFINITIONS:
NO. NAME VALUE STEP SIZE LIMITS
1 alpha 4.00000e-01 5.00000e-02 no limits
2 beta 1.00000e-02 1.00000e-02 no limits
3 gamma -1.00000e-01 constant
**********
** 1 **MIGRAD
**********
FIRST CALL TO USER FUNCTION AT NEW START POINT, WITH IFLAG=4.
START MIGRAD MINIMIZATION. STRATEGY 1. CONVERGENCE WHEN EDM .LT. 1.00e-04
FCN=119989 FROM MIGRAD STATUS=INITIATE 8 CALLS 9 TOTAL
EDM= unknown STRATEGY= 1 NO ERROR MATRIX
EXT PARAMETER CURRENT GUESS STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 alpha 4.00000e-01 5.00000e-02 5.00000e-02 -6.18671e+04
2 beta 1.00000e-02 1.00000e-02 1.00000e-02 2.38230e+04
3 gamma -1.00000e-01 constant
MIGRAD FAILS TO FIND IMPROVEMENT
COVARIANCE MATRIX CALCULATED SUCCESSFULLY
FCN=92233.7 FROM HESSE STATUS=OK 10 CALLS 49 TOTAL
EDM=18768.6 STRATEGY= 1 ERROR MATRIX ACCURATE
EXT PARAMETER STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 alpha 7.90493e-01 6.33068e-03 9.37632e-04 -2.92199e+04
2 beta -6.60789e-01 1.53865e-02 2.27887e-03 1.25535e+04
3 gamma -1.00000e-01 constant
MIGRAD FAILS TO FIND IMPROVEMENT
MIGRAD TERMINATED WITHOUT CONVERGENCE.
FCN=92233.7 FROM MIGRAD STATUS=FAILED 59 CALLS 60 TOTAL
EDM=18768.6 STRATEGY= 1 ERR MATRIX APPROXIMATE
EXT PARAMETER APPROXIMATE STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 alpha 7.90493e-01 6.33068e-03 0.00000e+00 -2.92199e+04
2 beta -6.60789e-01 1.53865e-02 -0.00000e+00 1.25535e+04
3 gamma -1.00000e-01 constant
EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 2 ERR DEF=1
4.008e-05 -4.836e-06
-4.836e-06 2.367e-04
ERR MATRIX APPROXIMATE
PARAMETER CORRELATION COEFFICIENTS
NO. GLOBAL 1 2
1 0.04964 1.000 -0.050
2 0.04964 -0.050 1.000
ERR MATRIX APPROXIMATE
Something does not work. I think the main problem is “MIGRAD FAILS TO FIND IMPROVEMENT”.
Is there someone who can help me, please?
_ROOT Version: 6.16/00
_Platform: Ubuntu 18
_Compiler: g++