ROOT logo
 /***************************************************************************** 
  * Project: RooFit                                                           * 
  *                                                                           * 
  * Copyright (c) 2000-2005, Regents of the University of California          * 
  *                          and Stanford University. All rights reserved.    * 
  *                                                                           * 
  * Redistribution and use in source and binary forms,                        * 
  * with or without modification, are permitted according to the terms        * 
  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             * 
  *****************************************************************************/ 

//////////////////////////////////////////////////////////////////////////////
//
// Class RooLinearMorph is an implementation of the histogram interpolation
// technique described by Alex Read in 'NIM A 425 (1999) 357-369 'Linear interpolation of histograms'
// for continuous functions rather than histograms. The interpolation method, in short,
// works as follows. 
//
//   - Given a p.d.f f1(x) with c.d.f F1(x) and p.d.f f2(x) with c.d.f F2(x)
// 
//   - One finds takes a value 'y' of both c.d.fs and determines the corresponding x
//     values x(1,2) at which F(1,2)(x)==y. 
//
//   - The value of the interpolated p.d.f fbar(x) is then calculated as 
//     fbar(alpha*x1+(1-alpha)*x2) = f1(x1)*f2(x2) / ( alpha*f2(x2) + (1-alpha)*f1(x1) ) ;
// 
// From a technical point of view class RooLinearMorph is a p.d.f that takes
// two input p.d.fs f1(x,p) an f2(x,q) and an interpolation parameter to
// make a p.d.f fbar(x,p,q,alpha). The shapes f1 and f2 are always taken
// to be end the end-points of the parameter alpha, regardless of what
// the those numeric values are. 
//
// Since the value of fbar(x) cannot be easily calculated for a given value
// of x, class RooLinearMorph is an implementation of RooAbsCachedPdf and
// calculates the shape of the interpolated p.d.f. fbar(x) for all values
// of x for a given value of alpha,p,q and caches these values in a histogram
// (as implemented by RooAbsCachedPdf). The binning granularity of the cache
// can be controlled by the binning named "cache" on the RooRealVar representing
// the observable x. The fbar sampling algorithm is based on a recursive division
// mechanism with a built-in precision cutoff: First an initial sampling in
// 64 equally spaced bins is made. Then the value of fbar is calculated in
// the center of each gap. If the calculated value deviates too much from
// the value obtained by linear interpolation from the edge bins, gap
// is recursively divided. This strategy makes it possible to define a very
// fine cache sampling (e.g. 1000 or 10000) bins without incurring a
// corresponding CPU penalty.
//
// Note on numeric stability of the algorithm. Since the algorithm relies
// on a numeric inversion of cumulative distributions functions, some precision
// may be lost at the 'edges' of the same (i.e. at regions in x where the
// c.d.f. value is close to zero or one). The general sampling strategy is
// to start with 64 equally spaces samples in the range y=(0.01-0.99).
// Then the y ranges are pushed outward by reducing y (or the distance of y to 1.0)
// by a factor of sqrt(10) iteratively up to the point where the corresponding
// x value no longer changes significantly. For p.d.f.s with very flat tails
// such as Gaussians some part of the tail may be lost due to limitations
// in numeric precision in the CDF inversion step. 
//
// An effect related to the above limitation in numeric precision should
// be anticipated when floating the alpha parameter in a fit. If a p.d.f
// with such flat tails is fitted, it is likely that the dataset contains
// events in the flat tail region. If the alpha parameter is varied, the
// likelihood contribution from such events may exhibit discontinuities
// in alpha, causing discontinuities in the summed likelihood as well
// that will cause convergence problems in MINUIT. To mitigate this effect
// one can use the setCacheAlpha() method to instruct RooLinearMorph
// to construct a two-dimensional cache for its output values in both
// x and alpha. If linear interpolation is requested on the resulting
// output histogram, the resulting interpolation of the p.d.f in the
// alpha dimension will smooth out the discontinities in the tail regions
// result in a continuous likelihood distribution that can be fitted.
// An added advantage of the cacheAlpha option is that if parameters
// p,q of f1,f2 are fixed, the cached values in RooLinearMorph are
// valid for the entire fit session and do not need to be recalculated
// for each change in alpha, which may result an considerable increase
// in calculation speed.
// 
//

#include "Riostream.h" 

#include "RooLinearMorph.h" 
#include "RooAbsReal.h" 
#include "RooAbsCategory.h" 
#include "RooBrentRootFinder.h"
#include "RooAbsFunc.h"
#include "RooRealVar.h"
#include "RooDataHist.h"
#include "TH1.h"

ClassImp(RooLinearMorph) 


//_____________________________________________________________________________
RooLinearMorph::RooLinearMorph(const char *name, const char *title, 
			       RooAbsReal& _pdf1,
			       RooAbsReal& _pdf2,
			       RooAbsReal& _x,
			       RooAbsReal& _alpha,
			       Bool_t doCacheAlpha) :
  RooAbsCachedPdf(name,title,2), 
  pdf1("pdf1","pdf1",this,_pdf1),
  pdf2("pdf2","pdf2",this,_pdf2),
  x("x","x",this,_x),
  alpha("alpha","alpha",this,_alpha),
  _cacheAlpha(doCacheAlpha),
  _cache(0)
{ 
  // Constructor with observables x, pdf shapes pdf1 and pdf2 which represent
  // the shapes at the end points of the interpolation parameter alpha
  // If doCacheAlpha is true, a two-dimensional cache is constructed in
  // both alpha and x
} 



//_____________________________________________________________________________
RooLinearMorph::RooLinearMorph(const RooLinearMorph& other, const char* name) :  
  RooAbsCachedPdf(other,name), 
  pdf1("pdf1",this,other.pdf1),
  pdf2("pdf2",this,other.pdf2),
  x("x",this,other.x),
  alpha("alpha",this,other.alpha),
  _cacheAlpha(other._cacheAlpha),
  _cache(0)
{ 
  // Copy constructor
} 



//_____________________________________________________________________________
RooArgSet* RooLinearMorph::actualObservables(const RooArgSet& /*nset*/) const 
{
  // Observable to be cached for given choice of normalization.
  // Returns the 'x' observable unless doCacheAlpha is set in which
  // case a set with both x and alpha

  RooArgSet* obs = new RooArgSet ;
  if (_cacheAlpha) {
    obs->add(alpha.arg()) ;
  }
  obs->add(x.arg()) ;
  return obs ;
}



//_____________________________________________________________________________
RooArgSet* RooLinearMorph::actualParameters(const RooArgSet& /*nset*/) const 
{  
  // Parameters of the cache. Returns parameters of both pdf1 and pdf2
  // and parameter cache, in case doCacheAlpha is not set.

  RooArgSet* par1 = pdf1.arg().getParameters(RooArgSet()) ;
  RooArgSet* par2 = pdf2.arg().getParameters(RooArgSet()) ;
  par1->add(*par2,kTRUE) ;
  par1->remove(x.arg(),kTRUE,kTRUE) ;
  if (!_cacheAlpha) {
    par1->add(alpha.arg()) ;
  }
  delete par2 ;
  return par1 ;
}



//_____________________________________________________________________________
const char* RooLinearMorph::inputBaseName() const 
{
  // Return base name component for cache components in this case
  // a string encoding the names of both end point p.d.f.s

  static TString name ;

  name = pdf1.arg().GetName() ;
  name.Append("_MORPH_") ;
  name.Append(pdf2.arg().GetName()) ;
  return name.Data() ;
}

  

//_____________________________________________________________________________
void RooLinearMorph::fillCacheObject(PdfCacheElem& cache) const 
{
  // Fill the cache with the interpolated shape. 

  MorphCacheElem& mcache = static_cast<MorphCacheElem&>(cache) ;
  
  // If cacheAlpha is true employ slice iterator here to fill all slices

  if (!_cacheAlpha) {

    TIterator* dIter = cache.hist()->sliceIterator((RooAbsArg&)x.arg(),RooArgSet()) ;
    mcache.calculate(dIter) ; 
    delete dIter ;

  } else {
    TIterator* slIter = cache.hist()->sliceIterator((RooAbsArg&)alpha.arg(),RooArgSet()) ;

    Double_t alphaSave = alpha ;
    RooArgSet alphaSet(alpha.arg()) ;
    coutP(Eval) << "RooLinearMorph::fillCacheObject(" << GetName() << ") filling multi-dimensional cache" ;
    while(slIter->Next()) {
      alphaSet = (*cache.hist()->get()) ;
      TIterator* dIter = cache.hist()->sliceIterator((RooAbsArg&)x.arg(),RooArgSet(alpha.arg())) ;
      mcache.calculate(dIter) ;     
      ccoutP(Eval) << "." << flush;
      delete dIter ;
    }
    ccoutP(Eval) << endl ;

    delete slIter ;
    const_cast<RooLinearMorph*>(this)->alpha = alphaSave ;
  }
}



//_____________________________________________________________________________
RooAbsCachedPdf::PdfCacheElem* RooLinearMorph::createCache(const RooArgSet* nset) const 
{
  // Create and return a derived MorphCacheElem.

  return new MorphCacheElem(const_cast<RooLinearMorph&>(*this),nset) ;
}



//_____________________________________________________________________________
RooArgList RooLinearMorph::MorphCacheElem::containedArgs(Action action) 
{
  // Return all RooAbsArg components contained in this cache

  RooArgList ret ;
  ret.add(PdfCacheElem::containedArgs(action)) ;
  ret.add(*_self) ;
  ret.add(*_pdf1) ;
  ret.add(*_pdf2) ;
  ret.add(*_x  ) ; 
  ret.add(*_alpha) ;
  ret.add(*_c1) ; 
  ret.add(*_c2) ; 

  return ret ;
}



//_____________________________________________________________________________
RooLinearMorph::MorphCacheElem::MorphCacheElem(RooLinearMorph& self, const RooArgSet* nsetIn) : PdfCacheElem(self,nsetIn)
{
  // Construct of cache element, copy relevant input from RooLinearMorph,
  // create the cdfs from the input p.d.fs and instantiate the root finders
  // on the cdfs to perform the inversion.

  // Mark in base class that normalization of cached pdf is invariant under pdf parameters
  _x = (RooRealVar*)self.x.absArg() ;
  _nset = new RooArgSet(*_x) ;

  _alpha = (RooAbsReal*)self.alpha.absArg() ;
  _pdf1 = (RooAbsPdf*)(self.pdf1.absArg()) ;
  _pdf2 = (RooAbsPdf*)(self.pdf2.absArg()) ;
  _c1 = _pdf1->createCdf(*_x);
  _c2 = _pdf2->createCdf(*_x) ;  
  _cb1 = _c1->bindVars(*_x,_nset) ;
  _cb2 = _c2->bindVars(*_x,_nset) ;  
  _self = &self ;

  _rf1 = new RooBrentRootFinder(*_cb1) ;
  _rf2 = new RooBrentRootFinder(*_cb2) ;
  _ccounter = 0 ;

  _rf1->setTol(1e-12) ;
  _rf2->setTol(1e-12) ;
  _ycutoff = 1e-7 ;
  
  _yatX = 0 ;
  _calcX = 0 ;

}


//_____________________________________________________________________________
RooLinearMorph::MorphCacheElem::~MorphCacheElem() 
{
  // Destructor

  delete[] _yatX ;
  delete[] _calcX ;
}



//_____________________________________________________________________________
Double_t RooLinearMorph::MorphCacheElem::calcX(Double_t y, Bool_t& ok)
{
  // Calculate the x value of the output p.d.f at the given cdf value y.
  // The ok boolean is filled with the success status of the operation.

  if (y<0 || y>1) {
    oocoutW(_self,Eval) << "RooLinearMorph::MorphCacheElem::calcX() WARNING: requested root finding for unphysical CDF value " << y << endl ; 
  }
  Double_t x1,x2 ;    

  Double_t xmax = _x->getMax("cache") ;
  Double_t xmin = _x->getMin("cache") ;

  ok=kTRUE ;
  ok &= _rf1->findRoot(x1,xmin,xmax,y) ;
  ok &= _rf2->findRoot(x2,xmin,xmax,y) ;
  if (!ok) return 0 ;
  _ccounter++ ;

  return _alpha->getVal()*x1 + (1-_alpha->getVal())*x2 ;  
}


//_____________________________________________________________________________
Int_t RooLinearMorph::MorphCacheElem::binX(Double_t X) 
{
  // Return the bin number enclosing the given x value

  Double_t xmax = _x->getMax("cache") ;
  Double_t xmin = _x->getMin("cache") ;
  return (Int_t)(_x->numBins("cache")*(X-xmin)/(xmax-xmin)) ;
}



//_____________________________________________________________________________
void RooLinearMorph::MorphCacheElem::calculate(TIterator* dIter)
{
  // Calculate shape of p.d.f for x,alpha values 
  // defined by dIter iterator over cache histogram

  Double_t xsave = _self->x ;

  if (!_yatX) {
    _yatX = new Double_t[_x->numBins("cache")+1] ;
    _calcX = new Double_t[_x->numBins("cache")+1] ;
  }

  RooArgSet nsetTmp(*_x) ;
  _ccounter = 0 ;
  
  // Get number of bins from PdfCacheElem histogram
  Int_t nbins = _x->numBins("cache") ;

  // Initialize yatX array to 'uncalculated values (-1)'
  for (int i=0 ; i<nbins ; i++) {
    _yatX[i] = -1 ;
    _calcX[i] = 0 ;
  }

  // Find low and high point
  findRange() ;

  // Perform initial scan of 100 points
  for (int i=0 ; i<10 ; i++) {    

    // Take a point in y
    Double_t offset = _yatX[_yatXmin] ;
    Double_t delta = (_yatX[_yatXmax] - _yatX[_yatXmin])/10 ;
    Double_t y = offset + i*delta ;

    // Calculate corresponding X
    Bool_t ok ;
    Double_t X = calcX(y,ok) ;
    if (ok) {
      Int_t iX = binX(X) ;
      _yatX[iX] = y ;           
      _calcX[iX] =  X ;
    }
  }

  // Now take an iteration filling the 'gaps'
  Int_t igapLow = _yatXmin+1 ;
  while(true) {
    // Find next gap
    Int_t igapHigh = igapLow+1 ;
    while(_yatX[igapHigh]<0 && igapHigh<(_yatXmax)) igapHigh++ ;

    // Fill the gap (iteratively and/or using interpolation)
    fillGap(igapLow-1,igapHigh) ;
    
    // Terminate after processing of last gap
    if (igapHigh>=_yatXmax-1) break ;
    igapLow = igapHigh+1 ;
  }

  // Make one more iteration to recalculate Y value at bin centers  
  Double_t xmax = _x->getMax("cache") ;
  Double_t xmin = _x->getMin("cache") ;
  Double_t binw = (xmax-xmin)/_x->numBins("cache") ;
  for (int i=_yatXmin+1 ; i<_yatXmax-1 ; i++) {

    // Calculate additional offset to apply if bin ixlo does not have X value calculated at bin center
    Double_t xBinC = xmin + (i+0.5)*binw ;
    Double_t xOffset = xBinC-_calcX[i] ;
    if (fabs(xOffset/binw)>1e-3) {
      Double_t slope = (_yatX[i+1]-_yatX[i-1])/(_calcX[i+1]-_calcX[i-1]) ;
      Double_t newY = _yatX[i] + slope*xOffset ;
      //cout << "bin " << i << " needs to be recentered " << xOffset/binw << " slope = " << slope << " origY = " << _yatX[i] << " newY = " << newY << endl ;      
      _yatX[i] = newY ;
    } 
  }

  // Zero output histogram below lowest calculable X value
  for (int i=0; i<_yatXmin ; i++) {
    dIter->Next() ;
    //_hist->get(i) ; 
    hist()->set(0) ;
  }
  // Transfer calculated values to histogram
  for (int i=_yatXmin ; i<_yatXmax ; i++) {
    
    Double_t y = _yatX[i] ;
    
    Double_t x1,x2 ;    

    Double_t xMin = _x->getMin("cache") ;
    Double_t xMax = _x->getMax("cache") ;
    _rf1->findRoot(x1,xMin,xMax,y) ;
    _rf2->findRoot(x2,xMin,xMax,y) ;
    
    _x->setVal(x1) ; Double_t f1x1 = _pdf1->getVal(&nsetTmp) ;
    _x->setVal(x2) ; Double_t f2x2 = _pdf2->getVal(&nsetTmp) ;
    Double_t fbarX = f1x1*f2x2 / ( _alpha->getVal()*f2x2 + (1-_alpha->getVal())*f1x1 ) ;

    dIter->Next() ;
    //_hist->get(i) ; 
    hist()->set(fbarX) ;
  }
  // Zero output histogram above highest calculable X value
  for (int i=_yatXmax+1 ; i<nbins ; i++) {
    dIter->Next() ;
    //_hist->get(i) ; 
    hist()->set(0) ;
  }

  pdf()->setUnitNorm(kTRUE) ;
  _self->x = xsave ;

  oocxcoutD(_self,Eval) << "RooLinearMorph::MorphCacheElem::calculate(" << _self->GetName() << ") calculation required " << _ccounter << " samplings of cdfs" << endl ;
}


//_____________________________________________________________________________
void RooLinearMorph::MorphCacheElem::fillGap(Int_t ixlo, Int_t ixhi, Double_t splitPoint) 
{
  // Fill all empty histogram bins between bins ixlo and ixhi. The value of 'splitPoint'
  // defines the split point for the recursive division strategy to fill the gaps
  // If the midpoint value of y is very close to the midpoint in x, use interpolation
  // to fill the gaps, otherwise the intervals again.

  // CONVENTION: _yatX[ixlo] is filled, _yatX[ixhi] is filled, elements in between are empty
  //   cout << "fillGap: gap from _yatX[" << ixlo << "]=" << _yatX[ixlo] << " to _yatX[" << ixhi << "]=" << _yatX[ixhi] << ", size = " << ixhi-ixlo << endl ;
  
  if (_yatX[ixlo]<0) {
    oocoutE(_self,Eval) << "RooLinearMorph::MorphCacheElme::fillGap(" << _self->GetName() << "): ERROR in fillgap " << ixlo << " = " << ixhi 
			<< " splitPoint= " << splitPoint << " _yatX[ixlo] = " << _yatX[ixlo] << endl ;
  }
  if (_yatX[ixhi]<0) {
    oocoutE(_self,Eval) << "RooLinearMorph::MorphCacheElme::fillGap(" << _self->GetName() << "): ERROR in fillgap " << ixlo << " = " << ixhi 
			<< " splitPoint " << splitPoint << " _yatX[ixhi] = " << _yatX[ixhi] << endl ;
  }

  // Determine where half-way Y value lands
  Double_t ymid = _yatX[ixlo]*splitPoint + _yatX[ixhi]*(1-splitPoint) ;
  Bool_t ok ;
  Double_t Xmid = calcX(ymid,ok) ;
  if (!ok) {
    oocoutW(_self,Eval) << "RooLinearMorph::MorphCacheElem::fillGap(" << _self->GetName() << ") unable to calculate midpoint in gap [" 
			<< ixlo << "," << ixhi << "], resorting to interpolation" << endl ;
    interpolateGap(ixlo,ixhi) ;
  }

  Int_t iX = binX(Xmid) ;  
  Double_t cq = (Xmid-_calcX[ixlo])/(_calcX[ixhi]-_calcX[ixlo])-0.5 ;

  // Store midway point
  _yatX[iX] = ymid ;
  _calcX[iX] = Xmid ;


  // Policy: If centration quality is better than 1% OR better than 1/10 of a bin, fill interval with linear interpolation
  if (fabs(cq)<0.01 || fabs(cq*(ixhi-ixlo))<0.1 || ymid<_ycutoff ) {
        
    // Fill remaining gaps on either side with linear interpolation
    if (iX-ixlo>1) {      
      interpolateGap(ixlo,iX) ;
    }
    if (ixhi-iX>1) {
      interpolateGap(iX,ixhi) ;
    }
        
  } else {

    if (iX==ixlo) {

      if (splitPoint<0.95) {
	// Midway value lands on lowest bin, retry split with higher split point
	Double_t newSplit = splitPoint + 0.5*(1-splitPoint) ;
	fillGap(ixlo,ixhi,newSplit) ;
      } else {
	// Give up and resort to interpolation
	interpolateGap(ixlo,ixhi) ;
      }

    } else if (iX==ixhi) {

      // Midway value lands on highest bin, retry split with lower split point      
      if (splitPoint>0.05) {
	Double_t newSplit = splitPoint/2 ;
	fillGap(ixlo,ixhi,newSplit) ;
      } else {
	// Give up and resort to interpolation
	interpolateGap(ixlo,ixhi) ;
      }

    } else {

      // Midway point reasonable, iterate on interval on both sides
      if (iX-ixlo>1) {
	fillGap(ixlo,iX) ;
      }
      if (ixhi-iX>1) {
	fillGap(iX,ixhi) ;
      }    
    }
  }  
}


//_____________________________________________________________________________
void RooLinearMorph::MorphCacheElem::interpolateGap(Int_t ixlo, Int_t ixhi)
{
  // Fill empty histogram bins between ixlo and ixhi with values obtained
  // from linear interpolation of ixlo,ixhi elements. 

  //cout << "filling gap with linear interpolation ixlo=" << ixlo << " ixhi=" << ixhi << endl ;

  Double_t xmax = _x->getMax("cache") ;
  Double_t xmin = _x->getMin("cache") ;
  Double_t binw = (xmax-xmin)/_x->numBins("cache") ;

  // Calculate deltaY in terms of actuall X difference calculate, not based on nominal bin width
  Double_t deltaY = (_yatX[ixhi]-_yatX[ixlo])/((_calcX[ixhi]-_calcX[ixlo])/binw) ;

  // Calculate additional offset to apply if bin ixlo does not have X value calculated at bin center
  Double_t xBinC = xmin + (ixlo+0.5)*binw ;
  Double_t xOffset = xBinC-_calcX[ixlo] ;
  
  for (int j=ixlo+1 ; j<ixhi ; j++) {
    _yatX[j] = _yatX[ixlo]+(xOffset+(j-ixlo))*deltaY ;
    _calcX[j] = xmin + (j+0.5)*binw ;
  } 

}



//_____________________________________________________________________________
void RooLinearMorph::MorphCacheElem::findRange()
{
  // Determine which range of y values can be mapped to x values
  // from the numeric inversion of the input c.d.fs.
  // Start with a y rannge of [0.1-0.9] and push boundaries
  // outward with a factor of 1/sqrt(10). Stop iteration if
  // inverted x values no longer change
  
  Double_t xmin = _x->getMin("cache") ;
  Double_t xmax = _x->getMax("cache") ;
  Int_t nbins = _x->numBins("cache") ;

  Double_t x1,x2 ;      
  Bool_t ok = kTRUE ;
  Double_t ymin=0.1,yminSave(-1) ;
  Double_t Xsave(-1),Xlast=xmax ;

  // Find lowest Y value that can be measured
  // Start at 0.1 and iteratively lower limit by sqrt(10)
  while(true) {
    ok &= _rf1->findRoot(x1,xmin,xmax,ymin) ;
    ok &= _rf2->findRoot(x2,xmin,xmax,ymin) ;
    oocxcoutD(_self,Eval) << "RooLinearMorph::MorphCacheElem::findRange(" << _self->GetName() << ") findMin: x1 = " << x1 << " x2 = " << x2 << " ok = " << (ok?"T":"F") << endl ;

    // Terminate in case of non-convergence
    if (!ok) break ;

    // Terminate if value of X no longer moves by >0.1 bin size
    Double_t X = _alpha->getVal()*x1 + (1-_alpha->getVal())*x2 ;
    if (fabs(X-Xlast)/(xmax-xmin)<0.0001) {
      break ;
    } 
    Xlast=X ;

    // Store new Y value
    _yatXmin = (Int_t)(nbins*(X-xmin)/(xmax-xmin)) ;
    _yatX[_yatXmin] = ymin ;
    _calcX[_yatXmin] = X ;
    yminSave = ymin ;
    Xsave=X ;

    // Reduce ymin by half an order of magnitude
    ymin /=sqrt(10.) ;

    // Emergency break
    if (ymin<_ycutoff) break ;
  }
  _yatX[_yatXmin] = yminSave ;
  _calcX[_yatXmin] = Xsave ;

  // Find highst Y value that can be measured
  // Start at 1 - 0.1 and iteratively lower delta by sqrt(10)
  ok = kTRUE ;
  Double_t deltaymax=0.1, deltaymaxSave(-1) ;
  Xlast=xmin ;
  while(true) {
    ok &= _rf1->findRoot(x1,xmin,xmax,1-deltaymax) ;
    ok &= _rf2->findRoot(x2,xmin,xmax,1-deltaymax) ;

    oocxcoutD(_self,Eval) << "RooLinearMorph::MorphCacheElem::findRange(" << _self->GetName() << ") findMax: x1 = " << x1 << " x2 = " << x2 << " ok = " << (ok?"T":"F") << endl ;

    // Terminate in case of non-convergence
    if (!ok) break ;

    // Terminate if value of X no longer moves by >0.1 bin size
    Double_t X = _alpha->getVal()*x1 + (1-_alpha->getVal())*x2 ;
    if (fabs(X-Xlast)/(xmax-xmin)<0.0001) {
      break ;
    } 
    Xlast=X ;

    // Store new Y value
    _yatXmax = (Int_t)(nbins*(X-xmin)/(xmax-xmin)) ;    
    _yatX[_yatXmax] = 1-deltaymax ;
    _calcX[_yatXmax] = X ;
    deltaymaxSave = deltaymax ;
    Xsave=X ;

    // Reduce ymin by half an order of magnitude
    deltaymax /=sqrt(10.) ;

    // Emergency break
    if (deltaymax<_ycutoff) break ;
  }

  _yatX[_yatXmax] = 1-deltaymaxSave ;
  _calcX[_yatXmax] = Xsave ;

   
  // Initialize values out of range to 'out-of-range' (-2)
  for (int i=0 ; i<_yatXmin ; i++)  _yatX[i] = -2 ;
  for (int i=_yatXmax+1 ; i<nbins; i++) _yatX[i] = -2 ;
  oocxcoutD(_self,Eval) << "RooLinearMorph::findRange(" << _self->GetName() << "): ymin = " << _yatX[_yatXmin] << " ymax = " << _yatX[_yatXmax] << endl; 
  oocxcoutD(_self,Eval) << "RooLinearMorph::findRange(" << _self->GetName() << "): xmin = " << _calcX[_yatXmin] << " xmax = " << _calcX[_yatXmax] << endl; 
}



//_____________________________________________________________________________
Double_t RooLinearMorph::evaluate() const 
{ 
  // Dummy
  return 0 ;
} 



//_____________________________________________________________________________
void RooLinearMorph::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 should be in the innermost loop, to minimize
  // recalculation of the one-dimensional internal cache for a fixed value of alpha

  // Put x last to minimize cache faulting
  orderedObs.removeAll() ;

  orderedObs.add(obs) ;
  RooAbsArg* obsX = obs.find(x.arg().GetName()) ;
  if (obsX) {
    orderedObs.remove(*obsX) ;
    orderedObs.add(*obsX) ;
  }  
}



 RooLinearMorph.cxx:1
 RooLinearMorph.cxx:2
 RooLinearMorph.cxx:3
 RooLinearMorph.cxx:4
 RooLinearMorph.cxx:5
 RooLinearMorph.cxx:6
 RooLinearMorph.cxx:7
 RooLinearMorph.cxx:8
 RooLinearMorph.cxx:9
 RooLinearMorph.cxx:10
 RooLinearMorph.cxx:11
 RooLinearMorph.cxx:12
 RooLinearMorph.cxx:13
 RooLinearMorph.cxx:14
 RooLinearMorph.cxx:15
 RooLinearMorph.cxx:16
 RooLinearMorph.cxx:17
 RooLinearMorph.cxx:18
 RooLinearMorph.cxx:19
 RooLinearMorph.cxx:20
 RooLinearMorph.cxx:21
 RooLinearMorph.cxx:22
 RooLinearMorph.cxx:23
 RooLinearMorph.cxx:24
 RooLinearMorph.cxx:25
 RooLinearMorph.cxx:26
 RooLinearMorph.cxx:27
 RooLinearMorph.cxx:28
 RooLinearMorph.cxx:29
 RooLinearMorph.cxx:30
 RooLinearMorph.cxx:31
 RooLinearMorph.cxx:32
 RooLinearMorph.cxx:33
 RooLinearMorph.cxx:34
 RooLinearMorph.cxx:35
 RooLinearMorph.cxx:36
 RooLinearMorph.cxx:37
 RooLinearMorph.cxx:38
 RooLinearMorph.cxx:39
 RooLinearMorph.cxx:40
 RooLinearMorph.cxx:41
 RooLinearMorph.cxx:42
 RooLinearMorph.cxx:43
 RooLinearMorph.cxx:44
 RooLinearMorph.cxx:45
 RooLinearMorph.cxx:46
 RooLinearMorph.cxx:47
 RooLinearMorph.cxx:48
 RooLinearMorph.cxx:49
 RooLinearMorph.cxx:50
 RooLinearMorph.cxx:51
 RooLinearMorph.cxx:52
 RooLinearMorph.cxx:53
 RooLinearMorph.cxx:54
 RooLinearMorph.cxx:55
 RooLinearMorph.cxx:56
 RooLinearMorph.cxx:57
 RooLinearMorph.cxx:58
 RooLinearMorph.cxx:59
 RooLinearMorph.cxx:60
 RooLinearMorph.cxx:61
 RooLinearMorph.cxx:62
 RooLinearMorph.cxx:63
 RooLinearMorph.cxx:64
 RooLinearMorph.cxx:65
 RooLinearMorph.cxx:66
 RooLinearMorph.cxx:67
 RooLinearMorph.cxx:68
 RooLinearMorph.cxx:69
 RooLinearMorph.cxx:70
 RooLinearMorph.cxx:71
 RooLinearMorph.cxx:72
 RooLinearMorph.cxx:73
 RooLinearMorph.cxx:74
 RooLinearMorph.cxx:75
 RooLinearMorph.cxx:76
 RooLinearMorph.cxx:77
 RooLinearMorph.cxx:78
 RooLinearMorph.cxx:79
 RooLinearMorph.cxx:80
 RooLinearMorph.cxx:81
 RooLinearMorph.cxx:82
 RooLinearMorph.cxx:83
 RooLinearMorph.cxx:84
 RooLinearMorph.cxx:85
 RooLinearMorph.cxx:86
 RooLinearMorph.cxx:87
 RooLinearMorph.cxx:88
 RooLinearMorph.cxx:89
 RooLinearMorph.cxx:90
 RooLinearMorph.cxx:91
 RooLinearMorph.cxx:92
 RooLinearMorph.cxx:93
 RooLinearMorph.cxx:94
 RooLinearMorph.cxx:95
 RooLinearMorph.cxx:96
 RooLinearMorph.cxx:97
 RooLinearMorph.cxx:98
 RooLinearMorph.cxx:99
 RooLinearMorph.cxx:100
 RooLinearMorph.cxx:101
 RooLinearMorph.cxx:102
 RooLinearMorph.cxx:103
 RooLinearMorph.cxx:104
 RooLinearMorph.cxx:105
 RooLinearMorph.cxx:106
 RooLinearMorph.cxx:107
 RooLinearMorph.cxx:108
 RooLinearMorph.cxx:109
 RooLinearMorph.cxx:110
 RooLinearMorph.cxx:111
 RooLinearMorph.cxx:112
 RooLinearMorph.cxx:113
 RooLinearMorph.cxx:114
 RooLinearMorph.cxx:115
 RooLinearMorph.cxx:116
 RooLinearMorph.cxx:117
 RooLinearMorph.cxx:118
 RooLinearMorph.cxx:119
 RooLinearMorph.cxx:120
 RooLinearMorph.cxx:121
 RooLinearMorph.cxx:122
 RooLinearMorph.cxx:123
 RooLinearMorph.cxx:124
 RooLinearMorph.cxx:125
 RooLinearMorph.cxx:126
 RooLinearMorph.cxx:127
 RooLinearMorph.cxx:128
 RooLinearMorph.cxx:129
 RooLinearMorph.cxx:130
 RooLinearMorph.cxx:131
 RooLinearMorph.cxx:132
 RooLinearMorph.cxx:133
 RooLinearMorph.cxx:134
 RooLinearMorph.cxx:135
 RooLinearMorph.cxx:136
 RooLinearMorph.cxx:137
 RooLinearMorph.cxx:138
 RooLinearMorph.cxx:139
 RooLinearMorph.cxx:140
 RooLinearMorph.cxx:141
 RooLinearMorph.cxx:142
 RooLinearMorph.cxx:143
 RooLinearMorph.cxx:144
 RooLinearMorph.cxx:145
 RooLinearMorph.cxx:146
 RooLinearMorph.cxx:147
 RooLinearMorph.cxx:148
 RooLinearMorph.cxx:149
 RooLinearMorph.cxx:150
 RooLinearMorph.cxx:151
 RooLinearMorph.cxx:152
 RooLinearMorph.cxx:153
 RooLinearMorph.cxx:154
 RooLinearMorph.cxx:155
 RooLinearMorph.cxx:156
 RooLinearMorph.cxx:157
 RooLinearMorph.cxx:158
 RooLinearMorph.cxx:159
 RooLinearMorph.cxx:160
 RooLinearMorph.cxx:161
 RooLinearMorph.cxx:162
 RooLinearMorph.cxx:163
 RooLinearMorph.cxx:164
 RooLinearMorph.cxx:165
 RooLinearMorph.cxx:166
 RooLinearMorph.cxx:167
 RooLinearMorph.cxx:168
 RooLinearMorph.cxx:169
 RooLinearMorph.cxx:170
 RooLinearMorph.cxx:171
 RooLinearMorph.cxx:172
 RooLinearMorph.cxx:173
 RooLinearMorph.cxx:174
 RooLinearMorph.cxx:175
 RooLinearMorph.cxx:176
 RooLinearMorph.cxx:177
 RooLinearMorph.cxx:178
 RooLinearMorph.cxx:179
 RooLinearMorph.cxx:180
 RooLinearMorph.cxx:181
 RooLinearMorph.cxx:182
 RooLinearMorph.cxx:183
 RooLinearMorph.cxx:184
 RooLinearMorph.cxx:185
 RooLinearMorph.cxx:186
 RooLinearMorph.cxx:187
 RooLinearMorph.cxx:188
 RooLinearMorph.cxx:189
 RooLinearMorph.cxx:190
 RooLinearMorph.cxx:191
 RooLinearMorph.cxx:192
 RooLinearMorph.cxx:193
 RooLinearMorph.cxx:194
 RooLinearMorph.cxx:195
 RooLinearMorph.cxx:196
 RooLinearMorph.cxx:197
 RooLinearMorph.cxx:198
 RooLinearMorph.cxx:199
 RooLinearMorph.cxx:200
 RooLinearMorph.cxx:201
 RooLinearMorph.cxx:202
 RooLinearMorph.cxx:203
 RooLinearMorph.cxx:204
 RooLinearMorph.cxx:205
 RooLinearMorph.cxx:206
 RooLinearMorph.cxx:207
 RooLinearMorph.cxx:208
 RooLinearMorph.cxx:209
 RooLinearMorph.cxx:210
 RooLinearMorph.cxx:211
 RooLinearMorph.cxx:212
 RooLinearMorph.cxx:213
 RooLinearMorph.cxx:214
 RooLinearMorph.cxx:215
 RooLinearMorph.cxx:216
 RooLinearMorph.cxx:217
 RooLinearMorph.cxx:218
 RooLinearMorph.cxx:219
 RooLinearMorph.cxx:220
 RooLinearMorph.cxx:221
 RooLinearMorph.cxx:222
 RooLinearMorph.cxx:223
 RooLinearMorph.cxx:224
 RooLinearMorph.cxx:225
 RooLinearMorph.cxx:226
 RooLinearMorph.cxx:227
 RooLinearMorph.cxx:228
 RooLinearMorph.cxx:229
 RooLinearMorph.cxx:230
 RooLinearMorph.cxx:231
 RooLinearMorph.cxx:232
 RooLinearMorph.cxx:233
 RooLinearMorph.cxx:234
 RooLinearMorph.cxx:235
 RooLinearMorph.cxx:236
 RooLinearMorph.cxx:237
 RooLinearMorph.cxx:238
 RooLinearMorph.cxx:239
 RooLinearMorph.cxx:240
 RooLinearMorph.cxx:241
 RooLinearMorph.cxx:242
 RooLinearMorph.cxx:243
 RooLinearMorph.cxx:244
 RooLinearMorph.cxx:245
 RooLinearMorph.cxx:246
 RooLinearMorph.cxx:247
 RooLinearMorph.cxx:248
 RooLinearMorph.cxx:249
 RooLinearMorph.cxx:250
 RooLinearMorph.cxx:251
 RooLinearMorph.cxx:252
 RooLinearMorph.cxx:253
 RooLinearMorph.cxx:254
 RooLinearMorph.cxx:255
 RooLinearMorph.cxx:256
 RooLinearMorph.cxx:257
 RooLinearMorph.cxx:258
 RooLinearMorph.cxx:259
 RooLinearMorph.cxx:260
 RooLinearMorph.cxx:261
 RooLinearMorph.cxx:262
 RooLinearMorph.cxx:263
 RooLinearMorph.cxx:264
 RooLinearMorph.cxx:265
 RooLinearMorph.cxx:266
 RooLinearMorph.cxx:267
 RooLinearMorph.cxx:268
 RooLinearMorph.cxx:269
 RooLinearMorph.cxx:270
 RooLinearMorph.cxx:271
 RooLinearMorph.cxx:272
 RooLinearMorph.cxx:273
 RooLinearMorph.cxx:274
 RooLinearMorph.cxx:275
 RooLinearMorph.cxx:276
 RooLinearMorph.cxx:277
 RooLinearMorph.cxx:278
 RooLinearMorph.cxx:279
 RooLinearMorph.cxx:280
 RooLinearMorph.cxx:281
 RooLinearMorph.cxx:282
 RooLinearMorph.cxx:283
 RooLinearMorph.cxx:284
 RooLinearMorph.cxx:285
 RooLinearMorph.cxx:286
 RooLinearMorph.cxx:287
 RooLinearMorph.cxx:288
 RooLinearMorph.cxx:289
 RooLinearMorph.cxx:290
 RooLinearMorph.cxx:291
 RooLinearMorph.cxx:292
 RooLinearMorph.cxx:293
 RooLinearMorph.cxx:294
 RooLinearMorph.cxx:295
 RooLinearMorph.cxx:296
 RooLinearMorph.cxx:297
 RooLinearMorph.cxx:298
 RooLinearMorph.cxx:299
 RooLinearMorph.cxx:300
 RooLinearMorph.cxx:301
 RooLinearMorph.cxx:302
 RooLinearMorph.cxx:303
 RooLinearMorph.cxx:304
 RooLinearMorph.cxx:305
 RooLinearMorph.cxx:306
 RooLinearMorph.cxx:307
 RooLinearMorph.cxx:308
 RooLinearMorph.cxx:309
 RooLinearMorph.cxx:310
 RooLinearMorph.cxx:311
 RooLinearMorph.cxx:312
 RooLinearMorph.cxx:313
 RooLinearMorph.cxx:314
 RooLinearMorph.cxx:315
 RooLinearMorph.cxx:316
 RooLinearMorph.cxx:317
 RooLinearMorph.cxx:318
 RooLinearMorph.cxx:319
 RooLinearMorph.cxx:320
 RooLinearMorph.cxx:321
 RooLinearMorph.cxx:322
 RooLinearMorph.cxx:323
 RooLinearMorph.cxx:324
 RooLinearMorph.cxx:325
 RooLinearMorph.cxx:326
 RooLinearMorph.cxx:327
 RooLinearMorph.cxx:328
 RooLinearMorph.cxx:329
 RooLinearMorph.cxx:330
 RooLinearMorph.cxx:331
 RooLinearMorph.cxx:332
 RooLinearMorph.cxx:333
 RooLinearMorph.cxx:334
 RooLinearMorph.cxx:335
 RooLinearMorph.cxx:336
 RooLinearMorph.cxx:337
 RooLinearMorph.cxx:338
 RooLinearMorph.cxx:339
 RooLinearMorph.cxx:340
 RooLinearMorph.cxx:341
 RooLinearMorph.cxx:342
 RooLinearMorph.cxx:343
 RooLinearMorph.cxx:344
 RooLinearMorph.cxx:345
 RooLinearMorph.cxx:346
 RooLinearMorph.cxx:347
 RooLinearMorph.cxx:348
 RooLinearMorph.cxx:349
 RooLinearMorph.cxx:350
 RooLinearMorph.cxx:351
 RooLinearMorph.cxx:352
 RooLinearMorph.cxx:353
 RooLinearMorph.cxx:354
 RooLinearMorph.cxx:355
 RooLinearMorph.cxx:356
 RooLinearMorph.cxx:357
 RooLinearMorph.cxx:358
 RooLinearMorph.cxx:359
 RooLinearMorph.cxx:360
 RooLinearMorph.cxx:361
 RooLinearMorph.cxx:362
 RooLinearMorph.cxx:363
 RooLinearMorph.cxx:364
 RooLinearMorph.cxx:365
 RooLinearMorph.cxx:366
 RooLinearMorph.cxx:367
 RooLinearMorph.cxx:368
 RooLinearMorph.cxx:369
 RooLinearMorph.cxx:370
 RooLinearMorph.cxx:371
 RooLinearMorph.cxx:372
 RooLinearMorph.cxx:373
 RooLinearMorph.cxx:374
 RooLinearMorph.cxx:375
 RooLinearMorph.cxx:376
 RooLinearMorph.cxx:377
 RooLinearMorph.cxx:378
 RooLinearMorph.cxx:379
 RooLinearMorph.cxx:380
 RooLinearMorph.cxx:381
 RooLinearMorph.cxx:382
 RooLinearMorph.cxx:383
 RooLinearMorph.cxx:384
 RooLinearMorph.cxx:385
 RooLinearMorph.cxx:386
 RooLinearMorph.cxx:387
 RooLinearMorph.cxx:388
 RooLinearMorph.cxx:389
 RooLinearMorph.cxx:390
 RooLinearMorph.cxx:391
 RooLinearMorph.cxx:392
 RooLinearMorph.cxx:393
 RooLinearMorph.cxx:394
 RooLinearMorph.cxx:395
 RooLinearMorph.cxx:396
 RooLinearMorph.cxx:397
 RooLinearMorph.cxx:398
 RooLinearMorph.cxx:399
 RooLinearMorph.cxx:400
 RooLinearMorph.cxx:401
 RooLinearMorph.cxx:402
 RooLinearMorph.cxx:403
 RooLinearMorph.cxx:404
 RooLinearMorph.cxx:405
 RooLinearMorph.cxx:406
 RooLinearMorph.cxx:407
 RooLinearMorph.cxx:408
 RooLinearMorph.cxx:409
 RooLinearMorph.cxx:410
 RooLinearMorph.cxx:411
 RooLinearMorph.cxx:412
 RooLinearMorph.cxx:413
 RooLinearMorph.cxx:414
 RooLinearMorph.cxx:415
 RooLinearMorph.cxx:416
 RooLinearMorph.cxx:417
 RooLinearMorph.cxx:418
 RooLinearMorph.cxx:419
 RooLinearMorph.cxx:420
 RooLinearMorph.cxx:421
 RooLinearMorph.cxx:422
 RooLinearMorph.cxx:423
 RooLinearMorph.cxx:424
 RooLinearMorph.cxx:425
 RooLinearMorph.cxx:426
 RooLinearMorph.cxx:427
 RooLinearMorph.cxx:428
 RooLinearMorph.cxx:429
 RooLinearMorph.cxx:430
 RooLinearMorph.cxx:431
 RooLinearMorph.cxx:432
 RooLinearMorph.cxx:433
 RooLinearMorph.cxx:434
 RooLinearMorph.cxx:435
 RooLinearMorph.cxx:436
 RooLinearMorph.cxx:437
 RooLinearMorph.cxx:438
 RooLinearMorph.cxx:439
 RooLinearMorph.cxx:440
 RooLinearMorph.cxx:441
 RooLinearMorph.cxx:442
 RooLinearMorph.cxx:443
 RooLinearMorph.cxx:444
 RooLinearMorph.cxx:445
 RooLinearMorph.cxx:446
 RooLinearMorph.cxx:447
 RooLinearMorph.cxx:448
 RooLinearMorph.cxx:449
 RooLinearMorph.cxx:450
 RooLinearMorph.cxx:451
 RooLinearMorph.cxx:452
 RooLinearMorph.cxx:453
 RooLinearMorph.cxx:454
 RooLinearMorph.cxx:455
 RooLinearMorph.cxx:456
 RooLinearMorph.cxx:457
 RooLinearMorph.cxx:458
 RooLinearMorph.cxx:459
 RooLinearMorph.cxx:460
 RooLinearMorph.cxx:461
 RooLinearMorph.cxx:462
 RooLinearMorph.cxx:463
 RooLinearMorph.cxx:464
 RooLinearMorph.cxx:465
 RooLinearMorph.cxx:466
 RooLinearMorph.cxx:467
 RooLinearMorph.cxx:468
 RooLinearMorph.cxx:469
 RooLinearMorph.cxx:470
 RooLinearMorph.cxx:471
 RooLinearMorph.cxx:472
 RooLinearMorph.cxx:473
 RooLinearMorph.cxx:474
 RooLinearMorph.cxx:475
 RooLinearMorph.cxx:476
 RooLinearMorph.cxx:477
 RooLinearMorph.cxx:478
 RooLinearMorph.cxx:479
 RooLinearMorph.cxx:480
 RooLinearMorph.cxx:481
 RooLinearMorph.cxx:482
 RooLinearMorph.cxx:483
 RooLinearMorph.cxx:484
 RooLinearMorph.cxx:485
 RooLinearMorph.cxx:486
 RooLinearMorph.cxx:487
 RooLinearMorph.cxx:488
 RooLinearMorph.cxx:489
 RooLinearMorph.cxx:490
 RooLinearMorph.cxx:491
 RooLinearMorph.cxx:492
 RooLinearMorph.cxx:493
 RooLinearMorph.cxx:494
 RooLinearMorph.cxx:495
 RooLinearMorph.cxx:496
 RooLinearMorph.cxx:497
 RooLinearMorph.cxx:498
 RooLinearMorph.cxx:499
 RooLinearMorph.cxx:500
 RooLinearMorph.cxx:501
 RooLinearMorph.cxx:502
 RooLinearMorph.cxx:503
 RooLinearMorph.cxx:504
 RooLinearMorph.cxx:505
 RooLinearMorph.cxx:506
 RooLinearMorph.cxx:507
 RooLinearMorph.cxx:508
 RooLinearMorph.cxx:509
 RooLinearMorph.cxx:510
 RooLinearMorph.cxx:511
 RooLinearMorph.cxx:512
 RooLinearMorph.cxx:513
 RooLinearMorph.cxx:514
 RooLinearMorph.cxx:515
 RooLinearMorph.cxx:516
 RooLinearMorph.cxx:517
 RooLinearMorph.cxx:518
 RooLinearMorph.cxx:519
 RooLinearMorph.cxx:520
 RooLinearMorph.cxx:521
 RooLinearMorph.cxx:522
 RooLinearMorph.cxx:523
 RooLinearMorph.cxx:524
 RooLinearMorph.cxx:525
 RooLinearMorph.cxx:526
 RooLinearMorph.cxx:527
 RooLinearMorph.cxx:528
 RooLinearMorph.cxx:529
 RooLinearMorph.cxx:530
 RooLinearMorph.cxx:531
 RooLinearMorph.cxx:532
 RooLinearMorph.cxx:533
 RooLinearMorph.cxx:534
 RooLinearMorph.cxx:535
 RooLinearMorph.cxx:536
 RooLinearMorph.cxx:537
 RooLinearMorph.cxx:538
 RooLinearMorph.cxx:539
 RooLinearMorph.cxx:540
 RooLinearMorph.cxx:541
 RooLinearMorph.cxx:542
 RooLinearMorph.cxx:543
 RooLinearMorph.cxx:544
 RooLinearMorph.cxx:545
 RooLinearMorph.cxx:546
 RooLinearMorph.cxx:547
 RooLinearMorph.cxx:548
 RooLinearMorph.cxx:549
 RooLinearMorph.cxx:550
 RooLinearMorph.cxx:551
 RooLinearMorph.cxx:552
 RooLinearMorph.cxx:553
 RooLinearMorph.cxx:554
 RooLinearMorph.cxx:555
 RooLinearMorph.cxx:556
 RooLinearMorph.cxx:557
 RooLinearMorph.cxx:558
 RooLinearMorph.cxx:559
 RooLinearMorph.cxx:560
 RooLinearMorph.cxx:561
 RooLinearMorph.cxx:562
 RooLinearMorph.cxx:563
 RooLinearMorph.cxx:564
 RooLinearMorph.cxx:565
 RooLinearMorph.cxx:566
 RooLinearMorph.cxx:567
 RooLinearMorph.cxx:568
 RooLinearMorph.cxx:569
 RooLinearMorph.cxx:570
 RooLinearMorph.cxx:571
 RooLinearMorph.cxx:572
 RooLinearMorph.cxx:573
 RooLinearMorph.cxx:574
 RooLinearMorph.cxx:575
 RooLinearMorph.cxx:576
 RooLinearMorph.cxx:577
 RooLinearMorph.cxx:578
 RooLinearMorph.cxx:579
 RooLinearMorph.cxx:580
 RooLinearMorph.cxx:581
 RooLinearMorph.cxx:582
 RooLinearMorph.cxx:583
 RooLinearMorph.cxx:584
 RooLinearMorph.cxx:585
 RooLinearMorph.cxx:586
 RooLinearMorph.cxx:587
 RooLinearMorph.cxx:588
 RooLinearMorph.cxx:589
 RooLinearMorph.cxx:590
 RooLinearMorph.cxx:591
 RooLinearMorph.cxx:592
 RooLinearMorph.cxx:593
 RooLinearMorph.cxx:594
 RooLinearMorph.cxx:595
 RooLinearMorph.cxx:596
 RooLinearMorph.cxx:597
 RooLinearMorph.cxx:598
 RooLinearMorph.cxx:599
 RooLinearMorph.cxx:600
 RooLinearMorph.cxx:601
 RooLinearMorph.cxx:602
 RooLinearMorph.cxx:603
 RooLinearMorph.cxx:604
 RooLinearMorph.cxx:605
 RooLinearMorph.cxx:606
 RooLinearMorph.cxx:607
 RooLinearMorph.cxx:608
 RooLinearMorph.cxx:609
 RooLinearMorph.cxx:610
 RooLinearMorph.cxx:611
 RooLinearMorph.cxx:612
 RooLinearMorph.cxx:613
 RooLinearMorph.cxx:614
 RooLinearMorph.cxx:615
 RooLinearMorph.cxx:616
 RooLinearMorph.cxx:617
 RooLinearMorph.cxx:618
 RooLinearMorph.cxx:619
 RooLinearMorph.cxx:620
 RooLinearMorph.cxx:621
 RooLinearMorph.cxx:622
 RooLinearMorph.cxx:623
 RooLinearMorph.cxx:624
 RooLinearMorph.cxx:625
 RooLinearMorph.cxx:626
 RooLinearMorph.cxx:627
 RooLinearMorph.cxx:628
 RooLinearMorph.cxx:629
 RooLinearMorph.cxx:630
 RooLinearMorph.cxx:631
 RooLinearMorph.cxx:632
 RooLinearMorph.cxx:633
 RooLinearMorph.cxx:634
 RooLinearMorph.cxx:635
 RooLinearMorph.cxx:636
 RooLinearMorph.cxx:637
 RooLinearMorph.cxx:638
 RooLinearMorph.cxx:639
 RooLinearMorph.cxx:640
 RooLinearMorph.cxx:641
 RooLinearMorph.cxx:642
 RooLinearMorph.cxx:643
 RooLinearMorph.cxx:644
 RooLinearMorph.cxx:645
 RooLinearMorph.cxx:646
 RooLinearMorph.cxx:647
 RooLinearMorph.cxx:648
 RooLinearMorph.cxx:649
 RooLinearMorph.cxx:650
 RooLinearMorph.cxx:651
 RooLinearMorph.cxx:652
 RooLinearMorph.cxx:653
 RooLinearMorph.cxx:654
 RooLinearMorph.cxx:655
 RooLinearMorph.cxx:656
 RooLinearMorph.cxx:657
 RooLinearMorph.cxx:658
 RooLinearMorph.cxx:659
 RooLinearMorph.cxx:660
 RooLinearMorph.cxx:661
 RooLinearMorph.cxx:662
 RooLinearMorph.cxx:663
 RooLinearMorph.cxx:664
 RooLinearMorph.cxx:665
 RooLinearMorph.cxx:666
 RooLinearMorph.cxx:667
 RooLinearMorph.cxx:668
 RooLinearMorph.cxx:669
 RooLinearMorph.cxx:670
 RooLinearMorph.cxx:671
 RooLinearMorph.cxx:672
 RooLinearMorph.cxx:673
 RooLinearMorph.cxx:674
 RooLinearMorph.cxx:675
 RooLinearMorph.cxx:676
 RooLinearMorph.cxx:677
 RooLinearMorph.cxx:678
 RooLinearMorph.cxx:679
 RooLinearMorph.cxx:680
 RooLinearMorph.cxx:681
 RooLinearMorph.cxx:682
 RooLinearMorph.cxx:683
 RooLinearMorph.cxx:684
 RooLinearMorph.cxx:685
 RooLinearMorph.cxx:686
 RooLinearMorph.cxx:687
 RooLinearMorph.cxx:688
 RooLinearMorph.cxx:689
 RooLinearMorph.cxx:690
 RooLinearMorph.cxx:691
 RooLinearMorph.cxx:692