forked from root-project/root
-
Notifications
You must be signed in to change notification settings - Fork 1
/
RooMomentMorphFuncND.h
147 lines (118 loc) · 5 KB
/
RooMomentMorphFuncND.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*****************************************************************************
* Project: RooFit *
* *
* This code was autogenerated by RooClassFactory *
*****************************************************************************/
#ifndef ROOMOMENTMORPHFUNCND
#define ROOMOMENTMORPHFUNCND
#include "RooAbsPdf.h"
#include "RooRealProxy.h"
#include "RooCategoryProxy.h"
#include "RooAbsReal.h"
#include "RooAbsCategory.h"
#include "RooSetProxy.h"
#include "RooListProxy.h"
#include "RooArgList.h"
#include "RooBinning.h"
#include "TMatrixD.h"
#include "TMap.h"
#include <vector>
#include <map>
class RooChangeTracker;
class RooMomentMorphFuncND : public RooAbsReal {
public:
class Grid2 {
public:
Grid2(){};
Grid2(const Grid2 &other);
Grid2(const RooAbsBinning &binning_x) { _grid.push_back(binning_x.clone()); };
Grid2(const RooAbsBinning &binning_x, const RooAbsBinning &binning_y)
{
_grid.push_back(binning_x.clone());
_grid.push_back(binning_y.clone());
};
Grid2(const RooAbsBinning &binning_x, const RooAbsBinning &binning_y, const RooAbsBinning &binning_z)
{
_grid.push_back(binning_x.clone());
_grid.push_back(binning_y.clone());
_grid.push_back(binning_z.clone());
};
Grid2(const std::vector<RooAbsBinning *> binnings)
{
for (unsigned int i = 0; i < binnings.size(); i++) {
_grid.push_back(binnings[i]->clone());
}
};
virtual ~Grid2();
void addPdf(const RooAbsReal &func, int bin_x);
void addPdf(const RooAbsReal &func, int bin_x, int bin_y);
void addPdf(const RooAbsReal &func, int bin_x, int bin_y, int bin_z);
void addPdf(const RooAbsReal &func, std::vector<int> bins);
void addBinning(const RooAbsBinning &binning) { _grid.push_back(binning.clone()); };
mutable std::vector<RooAbsBinning *> _grid;
mutable RooArgList _pdfList;
mutable std::map<std::vector<int>, int> _pdfMap;
mutable std::vector<std::vector<double>> _nref;
mutable std::vector<int> _nnuis;
ClassDef(RooMomentMorphFuncND::Grid2, 1)
};
protected:
class CacheElem : public RooAbsCacheElement {
public:
CacheElem(RooAbsReal &sumFunc, RooChangeTracker &tracker, const RooArgList &flist)
: _sumFunc(&sumFunc), _tracker(&tracker)
{
_frac.add(flist);
};
~CacheElem() override;
RooArgList containedArgs(Action) override;
RooAbsReal *_sumFunc;
RooChangeTracker *_tracker;
RooArgList _frac;
RooRealVar *frac(int i);
const RooRealVar *frac(int i) const;
void calculateFractions(const RooMomentMorphFuncND &self, bool verbose = true) const;
};
public:
enum Setting { Linear, SineLinear, NonLinear, NonLinearPosFractions, NonLinearLinFractions };
RooMomentMorphFuncND();
RooMomentMorphFuncND(const char *name, const char *title, RooAbsReal &_m, const RooArgList &varList,
const RooArgList &pdfList, const RooArgList &mrefList, Setting setting);
RooMomentMorphFuncND(const char *name, const char *title, const RooArgList &parList, const RooArgList &obsList,
const Grid2 &referenceGrid, const Setting &setting);
RooMomentMorphFuncND(const RooMomentMorphFuncND &other, const char *name = nullptr);
RooMomentMorphFuncND(const char *name, const char *title, RooAbsReal &_m, const RooArgList &varList,
const RooArgList &pdfList, const TVectorD &mrefpoints, Setting setting);
~RooMomentMorphFuncND() override;
TObject *clone(const char *newname) const override { return new RooMomentMorphFuncND(*this, newname); }
void setMode(const Setting &setting) { _setting = setting; }
virtual bool selfNormalized() const { return true; }
bool setBinIntegrator(RooArgSet &allVars);
void useHorizontalMorphing(bool val) { _useHorizMorph = val; }
double evaluate() const override;
virtual double getVal(const RooArgSet *set = nullptr) const;
protected:
void initialize();
void initializeParameters(const RooArgList &parList);
void initializeObservables(const RooArgList &obsList);
RooAbsReal *sumFunc(const RooArgSet *nset);
CacheElem *getCache(const RooArgSet *nset) const;
void findShape(const std::vector<double> &x) const;
friend class CacheElem;
friend class Grid2;
mutable RooObjCacheManager _cacheMgr; ///<! Transient cache manager
mutable RooArgSet *_curNormSet;
RooListProxy _parList;
RooSetProxy _obsList;
mutable Grid2 _referenceGrid;
RooListProxy _pdfList;
mutable TMatrixD *_M;
mutable TMatrixD *_MSqr;
mutable std::vector<std::vector<double>> _squareVec;
mutable std::vector<int> _squareIdx;
Setting _setting;
bool _useHorizMorph;
inline int sij(const int &i, const int &j) const { return (i * _obsList.getSize() + j); }
ClassDefOverride(RooMomentMorphFuncND, 2)
};
#endif