1
0
mirror of https://github.com/aportelli/LatAnalyze.git synced 2024-09-20 05:25:37 +01:00

Minuit precsion fix

This commit is contained in:
Antonin Portelli 2016-04-15 18:23:45 +01:00
parent 0bd347d010
commit 1f7dba7779

View File

@ -61,6 +61,7 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
DVec &x = getState(); DVec &x = getState();
int printLevel = 0; int printLevel = 0;
EMinimizerType minuitAlg = kCombined; EMinimizerType minuitAlg = kCombined;
double prec = getPrecision();
// convert Latan parameters to Minuit parameters // convert Latan parameters to Minuit parameters
switch (getVerbosity()) switch (getVerbosity())
@ -75,16 +76,21 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
printLevel = 3; printLevel = 3;
break; break;
} }
// The factor of 0.002 here is to compensate the dirty hack in Minuit
// source used to match the C++ and F77 versions
// (cf. VariableMetricBuilder.cxx)
switch (getAlgorithm()) switch (getAlgorithm())
{ {
case Algorithm::migrad: case Algorithm::migrad:
minuitAlg = kMigrad; minuitAlg = kMigrad;
prec /= 0.002;
break; break;
case Algorithm::simplex: case Algorithm::simplex:
minuitAlg = kSimplex; minuitAlg = kSimplex;
break; break;
case Algorithm::combined: case Algorithm::combined:
minuitAlg = kCombined; minuitAlg = kCombined;
prec /= 0.002;
break; break;
} }
@ -99,7 +105,7 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
min.SetStrategy(2); min.SetStrategy(2);
min.SetMaxFunctionCalls(getMaxIteration()); min.SetMaxFunctionCalls(getMaxIteration());
min.SetTolerance(getPrecision()); min.SetTolerance(prec);
min.SetPrintLevel(printLevel); min.SetPrintLevel(printLevel);
// set function and variables // set function and variables
@ -146,7 +152,7 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
min.Minimize(); min.Minimize();
status = min.Status(); status = min.Status();
n++; n++;
} while (status and (n < getMaxPass())); } while ((status >= 2) and (n < getMaxPass()));
if (getVerbosity() >= Verbosity::Normal) if (getVerbosity() >= Verbosity::Normal)
{ {
cout << "=================================================" << endl; cout << "=================================================" << endl;
@ -154,7 +160,8 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
switch (status) switch (status)
{ {
case 1: case 1:
LATAN_WARNING("invalid minimum: covariance matrix was made positive"); // covariance matrix was made positive, the minimum is still good
// it just means that Minuit error analysis is inaccurate
break; break;
case 2: case 2:
LATAN_WARNING("invalid minimum: Hesse analysis is not valid"); LATAN_WARNING("invalid minimum: Hesse analysis is not valid");