mirror of
https://github.com/aportelli/LatAnalyze.git
synced 2024-11-10 08:55:37 +00:00
improvement of Minuit minimizer
This commit is contained in:
parent
d70d84862d
commit
36ef20c929
@ -25,6 +25,7 @@
|
|||||||
#include <Minuit2/MnPrint.h>
|
#include <Minuit2/MnPrint.h>
|
||||||
#include <Minuit2/MnPlot.h>
|
#include <Minuit2/MnPlot.h>
|
||||||
#include <Minuit2/MnScan.h>
|
#include <Minuit2/MnScan.h>
|
||||||
|
#include <Minuit2/MnSimplex.h>
|
||||||
#include <Minuit2/ScanMinimizer.h>
|
#include <Minuit2/ScanMinimizer.h>
|
||||||
#include <Minuit2/SimplexMinimizer.h>
|
#include <Minuit2/SimplexMinimizer.h>
|
||||||
#include <Minuit2/VariableMetricMinimizer.h>
|
#include <Minuit2/VariableMetricMinimizer.h>
|
||||||
@ -34,6 +35,9 @@ using namespace ROOT;
|
|||||||
using namespace Minuit2;
|
using namespace Minuit2;
|
||||||
using namespace Latan;
|
using namespace Latan;
|
||||||
|
|
||||||
|
static constexpr double initErr = 0.5;
|
||||||
|
static constexpr unsigned int maxTry = 10u;
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* MinuitMinimizer implementation *
|
* MinuitMinimizer implementation *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -71,12 +75,12 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
|
|||||||
|
|
||||||
for (Index i = 0; i < x.size(); ++i)
|
for (Index i = 0; i < x.size(); ++i)
|
||||||
{
|
{
|
||||||
parameters.Add("x_" + strFrom(i), x(i), 0.1*fabs(x(i)));
|
parameters.Add("x_" + strFrom(i), x(i), initErr*fabs(x(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// pre-minimization
|
// pre-minimization
|
||||||
MnMigrad migrad1(minuitF, parameters, 1);
|
MnSimplex preMinimizer(minuitF, parameters, 0);
|
||||||
FunctionMinimum min = migrad1();
|
FunctionMinimum min = preMinimizer();
|
||||||
|
|
||||||
if (verbosity >= Verbosity::Debug)
|
if (verbosity >= Verbosity::Debug)
|
||||||
{
|
{
|
||||||
@ -85,16 +89,17 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
|
|||||||
cout << "--------------------------------------------------------";
|
cout << "--------------------------------------------------------";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
}
|
}
|
||||||
for (unsigned int i = 0; i < x.size(); ++i)
|
parameters = preMinimizer.Parameters();
|
||||||
{
|
|
||||||
parameters.SetValue(i, min.UserParameters().Value(i));
|
|
||||||
parameters.SetError(i, min.UserParameters().Error(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
// minimization and output
|
// minimization and output
|
||||||
MnMigrad migrad2(minuitF, parameters, 2);
|
MnMigrad minimizer(minuitF, parameters, 2);
|
||||||
|
unsigned int iTry = 0;
|
||||||
|
|
||||||
min = migrad2();
|
while ((!min.IsValid())&&(iTry < maxTry))
|
||||||
|
{
|
||||||
|
min = minimizer();
|
||||||
|
iTry++;
|
||||||
|
}
|
||||||
if (!min.IsValid())
|
if (!min.IsValid())
|
||||||
{
|
{
|
||||||
LATAN_WARNING("MINUIT library reported that minimization result is not valid");
|
LATAN_WARNING("MINUIT library reported that minimization result is not valid");
|
||||||
|
@ -48,8 +48,8 @@ private:
|
|||||||
const DoubleFunction *f_;
|
const DoubleFunction *f_;
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
// constructors
|
// constructor
|
||||||
using Minimizer::Minimizer;
|
MinuitMinimizer(void) = default;
|
||||||
// destructor
|
// destructor
|
||||||
virtual ~MinuitMinimizer(void) = default;
|
virtual ~MinuitMinimizer(void) = default;
|
||||||
// minimization
|
// minimization
|
||||||
|
Loading…
Reference in New Issue
Block a user