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;
33 declare_enum ( PrintLevel, Quiet, Info, Verbose, VeryVerbose )
35 class MinuitParameter;
38 class Minimiser :
public ROOT::Minuit2::MnTraceObject
45 template <
typename TYPE>
void setFunction( TYPE& fcn )
47 if constexpr( has_getVal<TYPE>::value ) m_theFunction = [&fcn]() {
return fcn.getVal(); };
48 else { m_theFunction = fcn; }
50 if constexpr( std::is_convertible<TYPE*, ROOT::Math::IGradientFunctionMultiDimTempl<double>*>::value ) m_fcnWithGrad = &fcn;
53 template <
typename TYPE>
54 Minimiser(TYPE& fitFunction, MinuitParameterSet* mps) :
57 setFunction(fitFunction);
61 Minimiser(std::function<
double(
void)>& fitFunction, MinuitParameterSet* mps) :
63 m_theFunction(fitFunction)
67 ~Minimiser() =
default;
69 unsigned int nPars()
const;
73 TGraph* scan( MinuitParameter* param,
const double& min,
const double& max,
const double& step );
74 void addExtendedTerm( ExtendLikelihoodBase* term );
75 TMatrixTSym<double> covMatrix()
const;
76 TMatrixTSym<double> covMatrixFull()
const;
77 double operator()(
const double* par );
78 void operator()(
int i,
const ROOT::Minuit2::MinimumState & state)
override;
81 double NCalls()
const;
82 MinuitParameterSet* parSet()
const;
84 void setPrintLevel(
const PrintLevel& printLevel);
85 void minos( MinuitParameter* param );
86 ROOT::Fit::FitResult fitResult()
const;
88 MinuitParameterSet* m_parSet = {
nullptr};
89 std::function<double(
void)> m_theFunction = {
nullptr};
90 ROOT::Math::Minimizer* m_minimiser = {
nullptr};
91 std::vector<double> m_covMatrix = {0};
92 std::vector<unsigned> m_mapping = {};
94 unsigned m_nParams = {0};
95 PrintLevel m_printLevel = {PrintLevel::Info};
96 double m_ll_zero = {0};
97 bool m_normalise = {
false};
98 std::vector<ExtendLikelihoodBase*> m_extendedTerms;
99 ROOT::Math::IGradientFunctionMultiDimTempl<double>* m_fcnWithGrad = {
nullptr};
#define declare_enum(name,...)