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
17#include "AmpGen/MetaUtils.h"
18#include "AmpGen/enum.h"
19#include "AmpGen/Property.h"
20#include "AmpGen/Configurable.h"
21
23namespace ROOT {
24 namespace Minuit2 {
25 class Minuit2Minimizer;
26 }
27}
28class TGraph;
30
31namespace AmpGen {
32 make_enum(PrintLevel, Quiet, Info, Verbose, VeryVerbose);
33
35 class MinuitParameter;
37
38 class Minimiser : public Configurable<Minimiser>, ROOT::Minuit2::MnTraceObject {
39 private:
40 def_has_function(getVal);
41 def_has_function(grad);
42
43 public:
44 Minimiser() = default;
45 ~Minimiser() = default;
46
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;
52 }
53 template <typename TYPE> Minimiser(TYPE &fitFunction, MinuitParameterSet *mps) : m_parSet(mps) {
54 setFunction(fitFunction);
55 prepare();
56 }
57
58 Minimiser(std::function<double(void)> &fitFunction, MinuitParameterSet *mps) : m_parSet(mps), m_theFunction(fitFunction) { prepare(); }
59
60 unsigned int nPars() const;
61 void prepare();
62 void gradientTest();
63 bool doFit();
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;
70 double FCN() const;
71 double Edm() const;
72 double NCalls() const;
73 MinuitParameterSet *parSet() const;
74 int status() const;
75 void setPrintLevel(const PrintLevel &printLevel);
76 void minos(MinuitParameter *param);
77 ROOT::Fit::FitResult fitResult() const;
78
79 private:
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{};
88 int m_status{0};
89 unsigned m_nParams{0};
90
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};
99 };
100} // namespace AmpGen
101#endif
102//
#define def_has_function(function_name)
#define make_enum(name,...)
Definition enum.h:25