1#ifndef AMPGEN_MINIMISER_H
2#define AMPGEN_MINIMISER_H
11#include <TMatrixTSym.h>
12#include <Fit/FitResult.h>
13#include <Minuit2/MinimumState.h>
14#include <Minuit2/MnTraceObject.h>
15#include <Math/IFunction.h>
25 class Minuit2Minimizer;
32 make_enum(PrintLevel, Quiet, Info, Verbose, VeryVerbose);
38 class Minimiser :
public Configurable<Minimiser>, ROOT::Minuit2::MnTraceObject {
44 Minimiser() =
default;
45 ~Minimiser() =
default;
47 template <
typename TYPE>
void setFunction(TYPE &fcn) {
48 if constexpr(has_getVal<TYPE>::value)
49 m_theFunction = [&fcn]() {
return fcn.getVal(); };
50 else { m_theFunction = fcn; }
51 if constexpr(std::is_convertible<TYPE *, ROOT::Math::IGradientFunctionMultiDimTempl<double> *>::value) m_fcnWithGrad = &fcn;
53 template <
typename TYPE> Minimiser(TYPE &fitFunction, MinuitParameterSet *mps) : m_parSet(mps) {
54 setFunction(fitFunction);
58 Minimiser(std::function<
double(
void)> &fitFunction, MinuitParameterSet *mps) : m_parSet(mps), m_theFunction(fitFunction) { prepare(); }
60 unsigned int nPars()
const;
64 TGraph *scan(MinuitParameter *param,
const double &min,
const double &max,
const double &step);
65 void addExtendedTerm(ExtendLikelihoodBase *term);
66 TMatrixTSym<double> covMatrix()
const;
67 TMatrixTSym<double> covMatrixFull()
const;
68 double operator()(
const double *par);
69 void operator()(
int i,
const ROOT::Minuit2::MinimumState &state)
override;
72 double NCalls()
const;
73 MinuitParameterSet *parSet()
const;
75 void setPrintLevel(
const PrintLevel &printLevel);
76 void minos(MinuitParameter *param);
77 ROOT::Fit::FitResult fitResult()
const;
80 using GradFcn = ROOT::Math::IGradientFunctionMultiDimTempl<double>;
81 std::vector<ExtendLikelihoodBase *> m_extendedTerms;
82 GradFcn *m_fcnWithGrad{
nullptr};
83 MinuitParameterSet *m_parSet{
nullptr};
84 std::function<double(
void)> m_theFunction{
nullptr};
85 ROOT::Math::Minimizer *m_minimiser{
nullptr};
86 std::vector<double> m_covMatrix{0};
87 std::vector<unsigned> m_mapping{};
89 unsigned m_nParams{0};
91 Property<std::string> m_minimiserTool{
this,
"Minimiser::Minimiser",
"Minuit2"};
92 Property<std::string> m_algorithm{
this,
"Minimiser::Algorithm",
"Migrad"};
93 Property<unsigned> m_maxCalls{
this,
"Minimiser::MaxCalls", 100000};
94 Property<double> m_tolerance{
this,
"Minimiser::Tolerance", 1.0};
95 Property<PrintLevel> m_printLevel{
this,
"Minimiser::PrintLevel", PrintLevel::Info};
96 Property<double> m_precision{
this,
"Minimiser::Precision", 1e-15};
97 Property<unsigned> m_printLevelMinuit2{
this,
"Minimiser::Minuit2MinimizerPrintLevel", m_printLevel == PrintLevel::VeryVerbose ? 3u : 0u};
98 Property<bool> m_runMinos{
this,
"Minimiser::RunMinos",
false};
#define make_enum(name,...)