7 #ifndef ROOMOMENTMORPHND
8 #define ROOMOMENTMORPHND
26 class RooChangeTracker;
28 class RooMomentMorphND :
public RooAbsPdf {
34 Grid(
const Grid &other);
35 Grid(
const RooAbsBinning &binning_x) { _grid.push_back(binning_x.clone()); };
36 Grid(
const RooAbsBinning &binning_x,
const RooAbsBinning &binning_y)
38 _grid.push_back(binning_x.clone());
39 _grid.push_back(binning_y.clone());
41 Grid(
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 Grid(
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 RooAbsPdf &pdf,
int bin_x);
57 void addPdf(
const RooAbsPdf &pdf,
int bin_x,
int bin_y);
58 void addPdf(
const RooAbsPdf &pdf,
int bin_x,
int bin_y,
int bin_z);
59 void addPdf(
const RooAbsPdf &pdf, 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;
71 class CacheElem :
public RooAbsCacheElement {
73 CacheElem(RooAbsPdf &sumPdf, RooChangeTracker &tracker,
const RooArgList &flist)
74 : _sumPdf(&sumPdf), _tracker(&tracker)
78 void operModeHook(RooAbsArg::OperMode){};
80 virtual RooArgList containedArgs(Action);
82 RooChangeTracker *_tracker;
85 RooRealVar *frac(
int i);
86 const RooRealVar *frac(
int i)
const;
87 void calculateFractions(
const RooMomentMorphND &
self, Bool_t verbose = kTRUE)
const;
91 enum Setting { Linear, SineLinear, NonLinear, NonLinearPosFractions, NonLinearLinFractions };
94 RooMomentMorphND(
const char *name,
const char *title, RooAbsReal &_m,
const RooArgList &varList,
95 const RooArgList &pdfList,
const RooArgList &mrefList, Setting setting);
96 RooMomentMorphND(
const char *name,
const char *title,
const RooArgList &parList,
const RooArgList &obsList,
97 const Grid &referenceGrid,
const Setting &setting);
98 RooMomentMorphND(
const RooMomentMorphND &other,
const char *name = 0);
99 RooMomentMorphND(
const char *name,
const char *title, RooAbsReal &_m,
const RooArgList &varList,
100 const RooArgList &pdfList,
const TVectorD &mrefpoints, Setting setting);
101 virtual ~RooMomentMorphND();
102 virtual TObject *clone(
const char *newname)
const {
return new RooMomentMorphND(*
this, newname); }
104 void setMode(
const Setting &setting) { _setting = setting; }
105 virtual Bool_t selfNormalized()
const {
return kTRUE; }
106 Bool_t setBinIntegrator(RooArgSet &allVars);
107 void useHorizontalMorphing(Bool_t val) { _useHorizMorph = val; }
109 Double_t evaluate()
const;
110 virtual Double_t getVal(
const RooArgSet *set = 0)
const;
114 void initializeParameters(
const RooArgList &parList);
115 void initializeObservables(
const RooArgList &obsList);
117 RooAbsPdf *sumPdf(
const RooArgSet *nset);
118 CacheElem *getCache(
const RooArgSet *nset)
const;
120 void findShape(
const std::vector<double> &x)
const;
122 friend class CacheElem;
125 mutable RooObjCacheManager _cacheMgr;
126 mutable RooArgSet *_curNormSet;
128 RooListProxy _parList;
129 RooSetProxy _obsList;
133 mutable Grid _referenceGrid;
134 RooListProxy _pdfList;
136 mutable TMatrixD *_M;
137 mutable TMatrixD *_MSqr;
138 mutable std::vector<std::vector<double>> _squareVec;
139 mutable std::vector<int> _squareIdx;
142 Bool_t _useHorizMorph;
144 inline int sij(
const int &i,
const int &j)
const {
return (i * _obsList.getSize() + j); }
146 ClassDef(RooMomentMorphND, 1)