91 using std::flush, std::endl;
 
  107  pdf1(
"pdf1",
"pdf1",
this,_pdf1),
 
  108  pdf2(
"pdf2",
"pdf2",
this,_pdf2),
 
  110  alpha(
"alpha",
"alpha",
this,_alpha),
 
 
  124  _cacheAlpha(
other._cacheAlpha)
 
 
  169  name.Append(
"_MORPH_") ;
 
 
  193    coutP(Eval) << 
"RooIntegralMorph::fillCacheObject(" << 
GetName() << 
") filling multi-dimensional cache" ;
 
  198      ccoutP(Eval) << 
"." << flush;
 
  200    ccoutP(Eval) << std::endl;
 
 
  220  ret.add(PdfCacheElem::containedArgs(
action)) ;
 
 
  251  _nset = std::make_unique<RooArgSet>(*
_x);
 
  255  _cb1 = std::unique_ptr<RooAbsFunc>{
_c1->bindVars(*
_x,
_nset.get())};
 
  256  _cb2 = std::unique_ptr<RooAbsFunc>{
_c2->bindVars(*
_x,
_nset.get())};
 
  258  _rf1 = std::make_unique<RooBrentRootFinder>(*
_cb1);
 
  259  _rf2 = std::make_unique<RooBrentRootFinder>(*
_cb2);
 
  261  _rf1->setTol(1
e-12) ;
 
  262  _rf2->setTol(1
e-12) ;
 
 
  285    oocoutW(_self,Eval) << 
"RooIntegralMorph::MorphCacheElem::calcX() WARNING: requested root finding for unphysical CDF value " << 
y << std::endl ;
 
  290  double xmax = _x->getMax(
"cache") ;
 
  291  double xmin = _x->getMin(
"cache") ;
 
  299  return _alpha->getVal()*
x1 + (1-_alpha->getVal())*
x2 ;
 
 
  307  double xmax = _x->getMax(
"cache") ;
 
  308  double xmin = _x->getMin(
"cache") ;
 
 
  318  double xsave = _self->x ;
 
  325 _yatX.resize(_x->numBins(
"cache")+1);
 
  326 _calcX.resize(_x->numBins(
"cache")+1);
 
  331  Int_t nbins = _x->numBins(
"cache") ;
 
  334  for (
int i=0 ; i<nbins ; i++) {
 
  343  for (
int i=0 ; i<10 ; i++) {
 
  346    double offset = _yatX[_yatXmin] ;
 
  347    double delta = (_yatX[_yatXmax] - _yatX[_yatXmin])/10 ;
 
  352    double X = calcX(
y,ok) ;
 
  376  double xmax = _x->getMax(
"cache") ;
 
  377  double xmin = _x->getMin(
"cache") ;
 
  379  for (
int i=_yatXmin+1 ; i<_yatXmax-1 ; i++) {
 
  385      double slope = (_yatX[i+1]-_yatX[i-1])/(_calcX[i+1]-_calcX[i-1]) ;
 
  393  for (
int i=0; i<_yatXmin ; i++) {
 
  399  double x1 = _x->getMin(
"cache");
 
  400  double x2 = _x->getMin(
"cache");
 
  402  double xMax = _x->getMax(
"cache");
 
  405  for (
int i=_yatXmin ; i<_yatXmax ; i++) {
 
  407    double y = _yatX[i] ;
 
  417    double f1x1 = _pdf1->getVal(_nset.get());
 
  419    double f2x2 = _pdf2->getVal(_nset.get());
 
  427  for (
int i=_yatXmax+1 ; i<nbins ; i++) {
 
  433  pdf()->setUnitNorm(
true) ;
 
  436  oocxcoutD(_self,Eval) << 
"RooIntegralMorph::MorphCacheElem::calculate(" << _self->GetName() << 
") calculation required " << _ccounter << 
" samplings of cdfs" << std::endl ;
 
 
  451    oocoutE(_self,Eval) << 
"RooIntegralMorph::MorphCacheElme::fillGap(" << _self->GetName() << 
"): ERROR in fillgap " << 
ixlo << 
" = " << 
ixhi 
  452         << 
" splitPoint= " << 
splitPoint << 
" _yatX[ixlo] = " << _yatX[
ixlo] << std::endl ;
 
  455    oocoutE(_self,Eval) << 
"RooIntegralMorph::MorphCacheElme::fillGap(" << _self->GetName() << 
"): ERROR in fillgap " << 
ixlo << 
" = " << 
ixhi 
  456         << 
" splitPoint " << 
splitPoint << 
" _yatX[ixhi] = " << _yatX[
ixhi] << std::endl ;
 
  464    oocoutW(_self,Eval) << 
"RooIntegralMorph::MorphCacheElem::fillGap(" << _self->GetName() << 
") unable to calculate midpoint in gap [" 
  465         << 
ixlo << 
"," << 
ixhi << 
"], resorting to interpolation" << std::endl ;
 
 
  533  double xmax = _x->getMax(
"cache") ;
 
  534  double xmin = _x->getMin(
"cache") ;
 
 
  560  double xmin = _x->getMin(
"cache") ;
 
  561  double xmax = _x->getMax(
"cache") ;
 
  562  Int_t nbins = _x->numBins(
"cache") ;
 
  577    oocxcoutD(_self,Eval) << 
"RooIntegralMorph::MorphCacheElem::findRange(" << _self->GetName() << 
") findMin: x1 = " << 
x1 << 
" x2 = " << 
x2 << 
" ok = " << (ok?
"T":
"F") << std::endl ;
 
  583    double X = _alpha->getVal()*
x1 + (1-_alpha->getVal())*
x2 ;
 
  591    _yatX[_yatXmin] = 
ymin ;
 
  592    _calcX[_yatXmin] = 
X ;
 
  603  _calcX[_yatXmin] = 
Xsave ;
 
  615    oocxcoutD(_self,Eval) << 
"RooIntegralMorph::MorphCacheElem::findRange(" << _self->GetName() << 
") findMax: x1 = " << 
x1 << 
" x2 = " << 
x2 << 
" ok = " << (ok?
"T":
"F") << std::endl ;
 
  621    double X = _alpha->getVal()*
x1 + (1-_alpha->getVal())*
x2 ;
 
  630    _calcX[_yatXmax] = 
X ;
 
  642  _calcX[_yatXmax] = 
Xsave ;
 
  646  for (
int i=0 ; i<_yatXmin ; i++)  _yatX[i] = -2 ;
 
  647  for (
int i=_yatXmax+1 ; i<nbins; i++) _yatX[i] = -2 ;
 
  648  oocxcoutD(_self,Eval) << 
"RooIntegralMorph::findRange(" << _self->GetName() << 
"): ymin = " << _yatX[_yatXmin] << 
" ymax = " << _yatX[_yatXmax] << std::endl;
 
  649  oocxcoutD(_self,Eval) << 
"RooIntegralMorph::findRange(" << _self->GetName() << 
"): xmin = " << _calcX[_yatXmin] << 
" xmax = " << _calcX[_yatXmax] << std::endl;
 
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooFit::OwningPtr< 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...
Abstract base class for p.d.f.s that need or want to cache their evaluate() output in a RooHistPdf de...
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract interface for all probability density functions.
RooFit::OwningPtr< 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.
Abstract base class for objects that represent a real value and implements functionality common to al...
virtual double offset() const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
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 flag)
~MorphCacheElem() override
Destructor.
std::unique_ptr< RooBrentRootFinder > _rf1
std::unique_ptr< RooAbsReal > _c1
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...
std::unique_ptr< RooAbsFunc > _cb2
void fillGap(Int_t ixlo, Int_t ixhi, double splitPoint=0.5)
Fill all empty histogram bins between bins ixlo and ixhi.
std::unique_ptr< RooArgSet > _nset
void findRange()
Determine which range of y values can be mapped to x values from the numeric inversion of the input c...
std::unique_ptr< RooAbsFunc > _cb1
std::unique_ptr< RooBrentRootFinder > _rf2
RooArgList containedArgs(Action) override
Return all RooAbsArg components contained in this cache.
std::unique_ptr< RooAbsReal > _c2
double calcX(double y, bool &ok)
Calculate the x value of the output p.d.f at the given cdf value y.
Int_t binX(double x)
Return the bin number enclosing the given x value.
Class RooIntegralMorph is an implementation of the histogram interpolation technique described by Ale...
RooIntegralMorph()=default
RooFit::OwningPtr< RooArgSet > actualObservables(const RooArgSet &nset) const override
Observable to be cached for given choice of normalization.
friend class MorphCacheElem
PdfCacheElem * createCache(const RooArgSet *nset) const override
Create and return a derived MorphCacheElem.
const char * inputBaseName() const override
Return base name component for cache components in this case a string encoding the names of both end ...
void preferredObservableScanOrder(const RooArgSet &obs, RooArgSet &orderedObs) const override
Indicate to the RooAbsCachedPdf base class that for the filling of the cache the traversal of the x s...
void fillCacheObject(PdfCacheElem &cache) const override
Fill the cache with the interpolated shape.
double evaluate() const override
Dummy.
RooFit::OwningPtr< RooArgSet > actualParameters(const RooArgSet &nset) const override
Parameters of the cache.
Variable that can be changed from the outside.
const T & arg() const
Return reference to object held in proxy.
Iterator abstract base class.
const char * GetName() const override
Returns name of object.
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.