7 #ifndef ROOMOMENTMORPHFUNCND
8 #define ROOMOMENTMORPHFUNCND
26 class RooChangeTracker;
28 class RooMomentMorphFuncND :
public RooAbsReal {
34 Grid2(
const Grid2 &other);
35 Grid2(
const RooAbsBinning &binning_x) { _grid.push_back(binning_x.clone()); };
36 Grid2(
const RooAbsBinning &binning_x,
const RooAbsBinning &binning_y)
38 _grid.push_back(binning_x.clone());
39 _grid.push_back(binning_y.clone());
41 Grid2(
const RooAbsBinning &binning_x,
const RooAbsBinning &binning_y,
const RooAbsBinning &binning_z)
43 _grid.push_back(binning_x.clone());
44 _grid.push_back(binning_y.clone());
45 _grid.push_back(binning_z.clone());
47 Grid2(
const std::vector<RooAbsBinning *> binnings)
49 for (
unsigned int i = 0; i < binnings.size(); i++) {
50 _grid.push_back(binnings[i]->clone());
56 void addPdf(
const RooAbsReal &func,
int bin_x);
57 void addPdf(
const RooAbsReal &func,
int bin_x,
int bin_y);
58 void addPdf(
const RooAbsReal &func,
int bin_x,
int bin_y,
int bin_z);
59 void addPdf(
const RooAbsReal &func, std::vector<int> bins);
60 void addBinning(
const RooAbsBinning &binning) { _grid.push_back(binning.clone()); };
62 mutable std::vector<RooAbsBinning *> _grid;
63 mutable RooArgList _pdfList;
64 mutable std::map<std::vector<int>,
int> _pdfMap;
66 mutable std::vector<std::vector<double>> _nref;
67 mutable std::vector<int> _nnuis;
69 ClassDef(RooMomentMorphFuncND::Grid2, 1)
73 class CacheElem :
public RooAbsCacheElement {
75 CacheElem(RooAbsReal &sumFunc, RooChangeTracker &tracker,
const RooArgList &flist)
76 : _sumFunc(&sumFunc), _tracker(&tracker)
80 void operModeHook(RooAbsArg::OperMode){};
82 virtual RooArgList containedArgs(Action);
84 RooChangeTracker *_tracker;
87 RooRealVar *frac(
int i);
88 const RooRealVar *frac(
int i)
const;
89 void calculateFractions(
const RooMomentMorphFuncND &
self, Bool_t verbose = kTRUE)
const;
93 enum Setting { Linear, SineLinear, NonLinear, NonLinearPosFractions, NonLinearLinFractions };
95 RooMomentMorphFuncND();
96 RooMomentMorphFuncND(
const char *name,
const char *title, RooAbsReal &_m,
const RooArgList &varList,
97 const RooArgList &pdfList,
const RooArgList &mrefList, Setting setting);
98 RooMomentMorphFuncND(
const char *name,
const char *title,
const RooArgList &parList,
const RooArgList &obsList,
99 const Grid2 &referenceGrid,
const Setting &setting);
100 RooMomentMorphFuncND(
const RooMomentMorphFuncND &other,
const char *name = 0);
101 RooMomentMorphFuncND(
const char *name,
const char *title, RooAbsReal &_m,
const RooArgList &varList,
102 const RooArgList &pdfList,
const TVectorD &mrefpoints, Setting setting);
103 virtual ~RooMomentMorphFuncND();
104 virtual TObject *clone(
const char *newname)
const {
return new RooMomentMorphFuncND(*
this, newname); }
106 void setMode(
const Setting &setting) { _setting = setting; }
107 virtual Bool_t selfNormalized()
const {
return kTRUE; }
108 Bool_t setBinIntegrator(RooArgSet &allVars);
109 void useHorizontalMorphing(Bool_t val) { _useHorizMorph = val; }
111 Double_t evaluate()
const;
112 virtual Double_t getVal(
const RooArgSet *set = 0)
const;
116 void initializeParameters(
const RooArgList &parList);
117 void initializeObservables(
const RooArgList &obsList);
119 RooAbsReal *sumFunc(
const RooArgSet *nset);
120 CacheElem *getCache(
const RooArgSet *nset)
const;
122 template <
typename T>
124 typename std::vector<T>::const_iterator begin;
125 typename std::vector<T>::const_iterator end;
126 typename std::vector<T>::const_iterator me;
129 template <
typename T>
130 static void cartesian_product(std::vector<std::vector<T>> &out, std::vector<std::vector<T>> &in);
131 template <
typename Iterator>
132 static bool next_combination(
const Iterator first, Iterator k,
const Iterator last);
133 void findShape(
const std::vector<double> &x)
const;
135 friend class CacheElem;
138 mutable RooObjCacheManager _cacheMgr;
139 mutable RooArgSet *_curNormSet;
141 RooListProxy _parList;
142 RooSetProxy _obsList;
146 mutable Grid2 _referenceGrid;
147 RooListProxy _pdfList;
149 mutable TMatrixD *_M;
150 mutable TMatrixD *_MSqr;
151 mutable std::vector<std::vector<double>> _squareVec;
152 mutable std::vector<int> _squareIdx;
155 Bool_t _useHorizMorph;
157 inline int sij(
const int &i,
const int &j)
const {
return (i * _obsList.getSize() + j); }
159 ClassDef(RooMomentMorphFuncND, 1)