AmpGen 2.1
Loading...
Searching...
No Matches
Minimiser.h
Go to the documentation of this file.
1#ifndef AMPGEN_MINIMISER_H
2#define AMPGEN_MINIMISER_H
3
4// Minimiser class using ROOT::Math::Minimiser
5// allows generic use of Minuit1, Minuit2, other algorithms
6
7#include <functional>
8#include <iostream>
9#include <vector>
10
11#include <TMatrixTSym.h>
12#include <Fit/FitResult.h>
13#include <Minuit2/MinimumState.h>
14#include <Minuit2/MnTraceObject.h>
15#include <Math/IFunction.h>
16#include "AmpGen/MetaUtils.h"
17#include "AmpGen/enum.h"
18#include <TFile.h>
19#include <TGraph.h>
21namespace ROOT
22{
23 namespace Minuit2
24 {
25 class Minuit2Minimizer;
26 }
27}
28class TGraph;
30
31namespace AmpGen
32{
33 declare_enum ( PrintLevel, Quiet, Info, Verbose, VeryVerbose )
35 class MinuitParameter;
37
38 class Minimiser : public ROOT::Minuit2::MnTraceObject
39 {
40 private:
41 def_has_function(getVal)
43
44 public:
45 template <typename TYPE> void setFunction( TYPE& fcn )
46 {
47 if constexpr( has_getVal<TYPE>::value ) m_theFunction = [&fcn]() { return fcn.getVal(); };
48 else { m_theFunction = fcn; }
49
50 if constexpr( std::is_convertible<TYPE*, ROOT::Math::IGradientFunctionMultiDimTempl<double>*>::value ) m_fcnWithGrad = &fcn;
51 }
52
53 template <typename TYPE>
54 Minimiser(TYPE& fitFunction, MinuitParameterSet* mps) :
55 m_parSet(mps)
56 {
57 setFunction(fitFunction);
58 prepare();
59 }
60
61 Minimiser(std::function<double(void)>& fitFunction, MinuitParameterSet* mps) :
62 m_parSet(mps),
63 m_theFunction(fitFunction)
64 {
65 prepare();
66 }
67 ~Minimiser() = default;
68
69 unsigned int nPars() const;
70 void prepare();
71 void gradientTest();
72 bool doFit();
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;
79 double FCN() const;
80 double Edm() const;
81 double NCalls() const;
82 MinuitParameterSet* parSet() const;
83 int status() const;
84 void setPrintLevel( const PrintLevel& printLevel);
85 void minos( MinuitParameter* param );
86 ROOT::Fit::FitResult fitResult() const;
87 private:
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 = {};
93 int m_status = {0};
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};
100 };
101} // namespace AmpGen
102#endif
103//
#define def_has_function(function_name)
#define declare_enum(name,...)
Definition enum.h:7