109 pdf1(
"pdf1",
"pdf1",this,_pdf1),
110 pdf2(
"pdf2",
"pdf2",this,_pdf2),
112 alpha(
"alpha",
"alpha",this,_alpha),
113 _cacheAlpha(doCacheAlpha),
123 pdf1(
"pdf1",this,other.pdf1),
124 pdf2(
"pdf2",this,other.pdf2),
126 alpha(
"alpha",this,other.alpha),
127 _cacheAlpha(other._cacheAlpha),
173 name.Append(
"_MORPH_") ;
198 coutP(Eval) <<
"RooIntegralMorph::fillCacheObject(" <<
GetName() <<
") filling multi-dimensional cache" ;
199 while(slIter->
Next()) {
200 alphaSet = (*cache.
hist()->
get()) ;
203 ccoutP(Eval) <<
"." << flush;
227 ret.
add(PdfCacheElem::containedArgs(action)) ;
295 oocoutW(_self,Eval) <<
"RooIntegralMorph::MorphCacheElem::calcX() WARNING: requested root finding for unphysical CDF value " <<
y << endl ;
308 return _alpha->getVal()*
x1 + (1-_alpha->getVal())*
x2 ;
334 _yatX.resize(_x->numBins(
"cache")+1);
335 _calcX.resize(_x->numBins(
"cache")+1);
341 Int_t nbins = _x->numBins(
"cache") ;
344 for (
int i=0 ; i<nbins ; i++) {
353 for (
int i=0 ; i<10 ; i++) {
357 Double_t delta = (_yatX[_yatXmax] - _yatX[_yatXmin])/10 ;
371 Int_t igapLow = _yatXmin+1 ;
374 Int_t igapHigh = igapLow+1 ;
375 while(igapHigh<(_yatXmax) && _yatX[igapHigh]<0) igapHigh++ ;
378 fillGap(igapLow-1,igapHigh) ;
381 if (igapHigh>=_yatXmax-1) break ;
382 igapLow = igapHigh+1 ;
389 for (
int i=_yatXmin+1 ; i<_yatXmax-1 ; i++) {
393 Double_t xOffset = xBinC-_calcX[i] ;
394 if (fabs(xOffset/binw)>1
e-3) {
395 Double_t slope = (_yatX[i+1]-_yatX[i-1])/(_calcX[i+1]-_calcX[i-1]) ;
396 Double_t newY = _yatX[i] + slope*xOffset ;
403 for (
int i=0; i<_yatXmin ; i++) {
409 for (
int i=_yatXmin ; i<_yatXmax ; i++) {
415 Double_t xMin = _x->getMin(
"cache") ;
416 Double_t xMax = _x->getMax(
"cache") ;
417 _rf1->findRoot(
x1,xMin,xMax,
y) ;
418 _rf2->findRoot(
x2,xMin,xMax,
y) ;
420 _x->setVal(
x1) ;
Double_t f1x1 = _pdf1->getVal(&nsetTmp) ;
421 _x->setVal(
x2) ;
Double_t f2x2 = _pdf2->getVal(&nsetTmp) ;
422 Double_t fbarX = f1x1*f2x2 / ( _alpha->getVal()*f2x2 + (1-_alpha->getVal())*f1x1 ) ;
429 for (
int i=_yatXmax+1 ; i<nbins ; i++) {
435 pdf()->setUnitNorm(
kTRUE) ;
438 oocxcoutD(_self,Eval) <<
"RooIntegralMorph::MorphCacheElem::calculate(" << _self->GetName() <<
") calculation required " << _ccounter <<
" samplings of cdfs" << endl ;
453 oocoutE(_self,Eval) <<
"RooIntegralMorph::MorphCacheElme::fillGap(" << _self->GetName() <<
"): ERROR in fillgap " << ixlo <<
" = " << ixhi
454 <<
" splitPoint= " << splitPoint <<
" _yatX[ixlo] = " << _yatX[ixlo] << endl ;
457 oocoutE(_self,Eval) <<
"RooIntegralMorph::MorphCacheElme::fillGap(" << _self->GetName() <<
"): ERROR in fillgap " << ixlo <<
" = " << ixhi
458 <<
" splitPoint " << splitPoint <<
" _yatX[ixhi] = " << _yatX[ixhi] << endl ;
462 Double_t ymid = _yatX[ixlo]*splitPoint + _yatX[ixhi]*(1-splitPoint) ;
466 oocoutW(_self,Eval) <<
"RooIntegralMorph::MorphCacheElem::fillGap(" << _self->GetName() <<
") unable to calculate midpoint in gap ["
467 << ixlo <<
"," << ixhi <<
"], resorting to interpolation" << endl ;
468 interpolateGap(ixlo,ixhi) ;
471 Int_t iX = binX(Xmid) ;
472 Double_t cq = (Xmid-_calcX[ixlo])/(_calcX[ixhi]-_calcX[ixlo])-0.5 ;
480 if (fabs(cq)<0.01 || fabs(cq*(ixhi-ixlo))<0.1 || ymid<_ycutoff ) {
484 interpolateGap(ixlo,iX) ;
487 interpolateGap(iX,ixhi) ;
494 if (splitPoint<0.95) {
496 Double_t newSplit = splitPoint + 0.5*(1-splitPoint) ;
497 fillGap(ixlo,ixhi,newSplit) ;
500 interpolateGap(ixlo,ixhi) ;
503 }
else if (iX==ixhi) {
506 if (splitPoint>0.05) {
508 fillGap(ixlo,ixhi,newSplit) ;
511 interpolateGap(ixlo,ixhi) ;
540 Double_t deltaY = (_yatX[ixhi]-_yatX[ixlo])/((_calcX[ixhi]-_calcX[ixlo])/binw) ;
544 Double_t xOffset = xBinC-_calcX[ixlo] ;
546 for (
int j=ixlo+1 ; j<ixhi ; j++) {
547 _yatX[j] = _yatX[ixlo]+(xOffset+(j-ixlo))*deltaY ;
548 _calcX[j] =
xmin + (j+0.5)*binw ;
564 Int_t nbins = _x->numBins(
"cache") ;
576 oocxcoutD(_self,Eval) <<
"RooIntegralMorph::MorphCacheElem::findRange(" << _self->GetName() <<
") findMin: x1 = " <<
x1 <<
" x2 = " <<
x2 <<
" ok = " << (ok?
"T":
"F") << endl ;
582 Double_t X = _alpha->getVal()*
x1 + (1-_alpha->getVal())*
x2 ;
583 if (fabs(X-Xlast)/(
xmax-
xmin)<0.0001) {
590 _yatX[_yatXmin] =
ymin ;
591 _calcX[_yatXmin] = X ;
599 if (
ymin<_ycutoff) break ;
601 _yatX[_yatXmin] = yminSave ;
602 _calcX[_yatXmin] = Xsave ;
607 Double_t deltaymax=0.1, deltaymaxSave(-1) ;
610 ok &= _rf1->findRoot(
x1,
xmin,
xmax,1-deltaymax) ;
611 ok &= _rf2->findRoot(
x2,
xmin,
xmax,1-deltaymax) ;
613 oocxcoutD(_self,Eval) <<
"RooIntegralMorph::MorphCacheElem::findRange(" << _self->GetName() <<
") findMax: x1 = " <<
x1 <<
" x2 = " <<
x2 <<
" ok = " << (ok?
"T":
"F") << endl ;
619 Double_t X = _alpha->getVal()*
x1 + (1-_alpha->getVal())*
x2 ;
620 if (fabs(X-Xlast)/(
xmax-
xmin)<0.0001) {
627 _yatX[_yatXmax] = 1-deltaymax ;
628 _calcX[_yatXmax] = X ;
629 deltaymaxSave = deltaymax ;
633 deltaymax /=
sqrt(10.) ;
636 if (deltaymax<_ycutoff) break ;
639 _yatX[_yatXmax] = 1-deltaymaxSave ;
640 _calcX[_yatXmax] = Xsave ;
644 for (
int i=0 ; i<_yatXmin ; i++) _yatX[i] = -2 ;
645 for (
int i=_yatXmax+1 ; i<nbins; i++) _yatX[i] = -2 ;
646 oocxcoutD(_self,Eval) <<
"RooIntegralMorph::findRange(" << _self->GetName() <<
"): ymin = " << _yatX[_yatXmin] <<
" ymax = " << _yatX[_yatXmax] << endl;
647 oocxcoutD(_self,Eval) <<
"RooIntegralMorph::findRange(" << _self->GetName() <<
"): xmin = " << _calcX[_yatXmin] <<
" xmax = " << _calcX[_yatXmax] << endl;
668 orderedObs.
add(obs) ;
671 orderedObs.
remove(*obsX) ;
672 orderedObs.
add(*obsX) ;
static const double x2[5]
static const double x1[5]
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
RooArgSet * getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooAbsCachedPdf is the abstract base class for p.d.f.s that need or want to cache their evaluate() ou...
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove the specified argument from our list.
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsReal * createCdf(const RooArgSet &iset, const RooArgSet &nset=RooArgSet())
Create a cumulative distribution function of this p.d.f in terms of the observables listed in iset.
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
RooAbsFunc * bindVars(const RooArgSet &vars, const RooArgSet *nset=0, Bool_t clipInvalid=kFALSE) const
Create an interface adaptor f(vars) that binds us to the specified variables (in arbitrary order).
virtual Double_t offset() const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * absArg() const
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE) override
Add element to non-owning set.
Implement the abstract 1-dimensional root finding interface using the Brent-Decker method.
void setTol(Double_t tol)
TIterator * sliceIterator(RooAbsArg &sliceArg, const RooArgSet &otherArgs)
Create an iterator over all bins in a slice defined by the subset of observables listed in sliceArg.
const RooArgSet * get() const override
Get bin centre of current bin.
void setUnitNorm(Bool_t flag)
void fillGap(Int_t ixlo, Int_t ixhi, Double_t splitPoint=0.5)
Fill all empty histogram bins between bins ixlo and ixhi.
void calculate(TIterator *iter)
Calculate shape of p.d.f for x,alpha values defined by dIter iterator over cache histogram.
void interpolateGap(Int_t ixlo, Int_t ixhi)
Fill empty histogram bins between ixlo and ixhi with values obtained from linear interpolation of ixl...
MorphCacheElem(RooIntegralMorph &self, const RooArgSet *nset)
Construct of cache element, copy relevant input from RooIntegralMorph, create the cdfs from the input...
RooBrentRootFinder * _rf2
RooBrentRootFinder * _rf1
Int_t binX(Double_t x)
Return the bin number enclosing the given x value.
void findRange()
Determine which range of y values can be mapped to x values from the numeric inversion of the input c...
~MorphCacheElem()
Destructor.
virtual RooArgList containedArgs(Action)
Return all RooAbsArg components contained in this cache.
Double_t calcX(Double_t y, Bool_t &ok)
Calculate the x value of the output p.d.f at the given cdf value y.
Class RooIntegralMorph is an implementation of the histogram interpolation technique described by Ale...
Double_t evaluate() const
Dummy.
virtual PdfCacheElem * createCache(const RooArgSet *nset) const
Create and return a derived MorphCacheElem.
virtual RooArgSet * actualParameters(const RooArgSet &nset) const
Parameters of the cache.
virtual void preferredObservableScanOrder(const RooArgSet &obs, RooArgSet &orderedObs) const
Indicate to the RooAbsCachedPdf base class that for the filling of the cache the traversal of the x s...
virtual const char * inputBaseName() const
Return base name component for cache components in this case a string encoding the names of both end ...
virtual void fillCacheObject(PdfCacheElem &cache) const
Fill the cache with the interpolated shape.
virtual RooArgSet * actualObservables(const RooArgSet &nset) const
Observable to be cached for given choice of normalization.
RooRealVar represents a variable that can be changed from the outside.
const T & arg() const
Return reference to object held in proxy.
Iterator abstract base class.
virtual TObject * Next()=0
virtual const char * GetName() const
Returns name of object.