I first posted this topic on the general forum [cannot add link due to being a new user], but did so at the beginning of the Christmas holidays and got no replies. I am afraid it might have been automatically locked before the relevant people could see it. I hope posting it again here is not frowned upon (moderators could remove the previous topic if it helps?).
I am running into an issue when running Minuit2 “Contour” function, in which the output points do not have the desired “height”, which I previously set with SetErrorDef(). I am changing ErrorDef based on my weak attempt at interpreting the code - the documentation itself refers to ErrorUp, but it does not appear anywhere else, as far as I can tell.
Here is a snippet of code to ilustrate what I am trying to do:
/*** Initialize minimizer, variables ***/ ROOT::Math::Minimizer* rootmin = ROOT::Math::Factory::CreateMinimizer("Minuit2","Combined"); rootmin->SetMaxFunctionCalls(100000); rootmin->SetMaxIterations(100000); rootmin->SetTolerance(0.02); rootmin->SetFunction(LFunc); //LFunc is a log-likelihood ( -2*log(L) ) function/functor defined earlier in the code rootmin->SetLimitedVariable(0,"Variable0",pars,0.1,0.01, 1e4); rootmin->SetLimitedVariable(1,"Variable1",pars,0.1,0.01, 1e4); rootmin->SetLimitedVariable(2,"Variable2",pars,0.1,0.01, 1e4); rootmin->SetLimitedVariable(3,"Variable3",pars,0.1,0.01, 1e4); //pars, holding initial guesses for fit, is also defined earlier /*** Run minimiser, contour ***/ double Delta2LogL = 2.7; rootmin->SetErrorDef(Delta2LogL); rootmin->Minimize(); cout << " Value of minimum log-Likelihood : " << rootmin->MinValue() << endl; double varcont0_pts[npointscont]; double varcont1_pts[npointscont]; unsigned int npoints = 100; rootmin->Contour(0, 1, npoints, varcont0_pts, varcont1_pts);
So now varcont0_pts and varcont1_pts hold the coordinates of the contour, which I would expect all have a minimum log-likelihood that is Delta2LogL points above the minimum found by the minimiser.
However, if I do the following:
size_t i_cont = 0; //choose any value between 0 and 99 rootmin->SetVariableValue(0, varcont0_pts[i_cont]); rootmin->FixVariable(0); rootmin->SetVariableValue(1, varcont1_pts[i_cont]); rootmin->FixVariable(1); rootmin->Minimize(); cout << " Value of log-Likelihood at contour : " << rootmin->MinValue() << endl;
I find that the difference in log-likelihood (between the minimum and the points in the contour) is not what I asked for with SetErrorDef(). In fact, I find the same contour points no matter what value I request for the difference.
I assume I am not using the minimizer properly somehow, but I don’t know how to proceed from here. Could anyone help me?
Thank you for your time!