AmpGen 2.1
Loading...
Searching...
No Matches
MinuitParameter.h
Go to the documentation of this file.
1#ifndef AMPGEN_MINUITPARAMETER_H
2#define AMPGEN_MINUITPARAMETER_H
3
4#include <iostream>
5#include <string>
6#include <set>
7#include "AmpGen/enum.h"
8#include "AmpGen/Expression.h"
9
10namespace AmpGen {
12 class MinuitProxy;
13 declare_enum(Flag, Free, Hide, Fix, CompileTimeConstant, Blind);
14
16 public:
17 MinuitParameter() = default;
18 MinuitParameter(const std::string &name, const Flag &flag, const double &mean, const double &step, const double &min = 0, const double &max = 0);
19 MinuitParameter(const std::string &name, const double &mean, const double &step, const double &min = 0, const double &max = 0);
20 virtual MinuitParameter clone() const { return *this; }
22 Flag flag() const;
23 bool isFixed() const;
24 bool isFree() const;
25 bool isBlind() const;
26 const std::string &name() const;
27
28 double meanInit() const;
29 double stepInit() const;
30 double minInit() const;
31 double maxInit() const;
32 double err() const;
33 double errPos() const;
34 double errNeg() const;
35 double *vp() { return &m_meanResult; }
36
37 void setInit(const double &init, const double &step = -1);
38 void setStepInit(const double &si);
39 void setFree();
40 void scaleStep(const double &sf);
41 void fix();
42 void setCurrentFitVal(double cfv);
43 void setLimits(const double &min, const double &max);
44 void setVal(const double &val);
45 void setResult(double fitMean, double fitErr, double fitErrNeg, double fitErrPos);
47 void setName(const std::string &name);
49 virtual double mean() const;
50 virtual operator double() const { return m_meanResult; }
51 void setFromMinuitState(const double *x) {
53 }
54 void setMinuitIndex(const int &index) { m_minuitIndex = index; }
55 int index() const { return m_minuitIndex; }
56
57 friend class MinuitParameterSet;
58 friend class MinuitProxy;
59
60 void subscribe(MinuitProxy *sub) { m_subscribers.insert(sub); }
61 void unsubscribe(MinuitProxy *sub) { m_subscribers.erase(sub); }
62 void print_proxies() const {
63 std::cout << m_name << "proxies: ";
64 for(auto &p : m_subscribers) std::cout << p << " ";
65 std::cout << std::endl;
66 }
67
68 protected:
69 Flag m_flag;
70 std::string m_name = {""};
71 double m_meanInit = {0};
72 double m_stepInit = {0};
73 double m_minInit = {0};
74 double m_maxInit = {0};
75 double m_meanResult = {0};
76 double m_errPosResult = {0};
77 double m_errNegResult = {0};
78 double m_errResult = {0};
79 int m_minuitIndex = {-1};
80 std::set<MinuitProxy *> m_subscribers;
81 };
82
84 public:
85 void update() {
86 if(m_parameter != nullptr) m_value = m_parameter->mean();
87 }
88 MinuitProxy(const MinuitProxy &other) {
89 m_parameter = other.m_parameter;
90 m_value = other.m_value;
91 if(m_parameter != nullptr) m_parameter->subscribe(this);
92 }
94 if(m_parameter != nullptr) m_parameter->unsubscribe(this);
95 }
97 m_parameter = other.m_parameter;
98 m_value = other.m_value;
99 if(m_parameter != nullptr) m_parameter->subscribe(this);
100 return *this;
101 }
103 m_parameter = other.m_parameter;
104 m_value = other.m_value;
105 if(m_parameter != nullptr) m_parameter->subscribe(this);
106 return *this;
107 }
109 m_parameter = other.m_parameter;
110 m_value = other.m_value;
111 if(m_parameter != nullptr) m_parameter->subscribe(this);
112 }
113 MinuitParameter *ptr() { return m_parameter; }
114 operator double() const {
115 // if( m_value != m_parameter->mean() ) WARNING("Desync'd proxy: " << m_parameter->name() << " " << this );
116 return m_parameter == nullptr ? m_value : m_parameter->mean();
117 }
118 MinuitProxy(MinuitParameter *param = nullptr, const double &value = 0) : m_parameter(param), m_value(value) { update(); }
119 MinuitParameter *operator->() { return m_parameter; }
120 const MinuitParameter *operator->() const { return m_parameter; }
121 MinuitParameter *parameter() { return m_parameter; }
122 const MinuitParameter *parameter() const { return m_parameter; }
123 bool isValid() const { return m_parameter != nullptr; }
124
125 friend class MinuitParameter;
126
127 private:
128 MinuitParameter *m_parameter{nullptr};
129 double m_value;
130 };
131
133 public:
134 ExpressionParameter(const MinuitProxy &proxy) : m_parameter(proxy) {}
135 std::string to_string(const ASTResolver *resolver = nullptr) const override;
136 void resolve(ASTResolver &resolver) const override;
137 complex_t operator()() const override;
138 operator Expression() const;
139 std::string name() const;
140
141 private:
142 MinuitProxy m_parameter;
143 };
144
145 std::ostream &operator<<(std::ostream &os, const MinuitParameter &);
146 std::ostream &operator<<(std::ostream &os, const MinuitProxy &);
147} // namespace AmpGen
148
149#endif
150//
(Internal) class to aide in the resolution of the dependencies of expression trees.
Definition ASTResolver.h:30
Wrapper class for shared_ptrs to virtual expressions for use in conjunction with operators to build e...
Definition Expression.h:135
std::string to_string(const ASTResolver *resolver=nullptr) const override
Called to convert the Expression tree into source code.
ExpressionParameter(const MinuitProxy &proxy)
complex_t operator()() const override
Evaluate the expression using the tree, will generally be very slow but ocassionally useful for debug...
std::string name() const
void resolve(ASTResolver &resolver) const override
Resolve the dependencies of a tree using an ASTResolver, which keeps track of parameters,...
Virtual base class for other expression tree components.
Definition Expression.h:116
virtual MinuitParameter clone() const
double maxInit() const
void setLimits(const double &min, const double &max)
friend class MinuitParameterSet
const std::string & name() const
void setFromMinuitState(const double *x)
void unsubscribe(MinuitProxy *sub)
void setCurrentFitVal(double cfv)
void subscribe(MinuitProxy *sub)
double errPos() const
MinuitParameter(const std::string &name, const double &mean, const double &step, const double &min=0, const double &max=0)
double errNeg() const
std::set< MinuitProxy * > m_subscribers
double stepInit() const
double minInit() const
void setResult(double fitMean, double fitErr, double fitErrNeg, double fitErrPos)
MinuitParameter(const std::string &name, const Flag &flag, const double &mean, const double &step, const double &min=0, const double &max=0)
void setStepInit(const double &si)
virtual double mean() const
void scaleStep(const double &sf)
void setInit(const double &init, const double &step=-1)
void setName(const std::string &name)
void setVal(const double &val)
double meanInit() const
void setMinuitIndex(const int &index)
MinuitProxy(MinuitProxy &&other)
MinuitProxy & operator=(const MinuitProxy &other)
MinuitProxy(MinuitParameter *param=nullptr, const double &value=0)
MinuitParameter * ptr()
MinuitProxy(const MinuitProxy &other)
const MinuitParameter * parameter() const
friend class MinuitParameter
const MinuitParameter * operator->() const
MinuitProxy & operator=(MinuitProxy &other)
MinuitParameter * operator->()
MinuitParameter * parameter()
#define declare_enum(name,...)
Definition enum.h:7
std::complex< real_t > complex_t
Definition Types.h:7
std::ostream & operator<<(std::ostream &os, const CompiledExpressionBase &expression)