ROOT logo
/***************************************************************************** 
 * Project: RooFit                                                           * 
 * author: Max Baak (mbaak@cern.ch)                                          *
 *****************************************************************************/ 

// Written by Max Baak (mbaak@cern.ch)
// 2-dimensional morph function between a list of function-numbers as a function of two input parameter (m1 and m2).
// The matrix mrefpoints assigns a function value to each m1,m2 coordinate.
// Morphing can be set to be linear or non-linear, or mixture of the two.

#include "Riostream.h" 

#include "Roo2DMomentMorphFunction.h" 
#include "RooAbsReal.h" 
#include "RooAbsCategory.h" 
#include <math.h> 
#include "TMath.h" 
#include "TTree.h"


/*
  // Example usage:

  TMatrixD foo(9,3);
  
  foo(0,0) =   0;      // coordinate of variable m1
  foo(0,1) =   0;      // coordinate of variable m2
  foo(0,2) =   0**2;   // function value at (m1,m2) = 0,0
  foo(1,0) = 100;
  foo(1,1) =   0;
  foo(1,2) =   1**2;
  foo(2,0) = 200;
  foo(2,1) =   0;
  foo(2,2) =   2**2;
  
  foo(3,0) = 0;
  foo(3,1) = 150;
  foo(3,2) = 4**2;
  foo(4,0) = 100;
  foo(4,1) = 150;
  foo(4,2) = 5**2;
  foo(5,0) = 200;
  foo(5,1) = 150;
  foo(5,2) = 8**2;
  
  foo(6,0) = 0;
  foo(6,1) = 300;
  foo(6,2) = 8**2;
  foo(7,0) = 100;
  foo(7,1) = 300;
  foo(7,2) = 8.5**2;
  foo(8,0) = 200;
  foo(8,1) = 300;
  foo(8,2) = 9**2;
  
  // need to provide at least 4 coordinates to Roo2DMomentMorphFunction for 2d extrapolation
  
  foo.Print();
  
  RooRealVar m1("m1","m1",50,0,200);
  RooRealVar m2("m2","m2",50,0,300);
  Roo2DMomentMorphFunction bar("bar","bar", m1, m2, foo );
  
  bar.Print();
*/


using namespace std;

ClassImp(Roo2DMomentMorphFunction) 


//_____________________________________________________________________________
Roo2DMomentMorphFunction::Roo2DMomentMorphFunction(const char *name, const char *title, 
                        		       RooAbsReal& _m1, RooAbsReal& _m2,
                                               const TMatrixD& mrefpoints, const Setting& setting, const Bool_t& verbose ) :
  RooAbsReal(name,title), 
  m1("m1","m1",this,_m1),
  m2("m2","m2",this,_m2),
  _setting(setting),
  _verbose(verbose),
  _npoints( mrefpoints.GetNrows() ),
  _mref(mrefpoints)
{
  // cross-check that we have enough reference points
  if ( mrefpoints.GetNrows()<4 ) {
    cerr << "Roo2DMomentMorphFunction::constructor(" << GetName() << ") ERROR: less than four reference points provided." << endl ;
    assert(0);
  }
  // cross-check that we have enough reference points
  if ( mrefpoints.GetNcols()!=3 ) {
    cerr << "RooPolyMorph2D::constructor(" << GetName() << ") ERROR: no reference values provided." << endl ;
    assert(0);
  }

  // recast matrix into more useful form
  _frac.ResizeTo( _npoints );

  initialize();
} 


//_____________________________________________________________________________
Roo2DMomentMorphFunction::Roo2DMomentMorphFunction( const char *name, const char *title,
					       RooAbsReal& _m1, RooAbsReal& _m2,
					       const Int_t& nrows, const Double_t* dm1arr, const Double_t* dm2arr, const Double_t* dvalarr, 
					       const Setting& setting, const Bool_t& verbose ) :
  RooAbsReal(name,title),
  m1("m1","m1",this,_m1),
  m2("m2","m2",this,_m2),
  _setting(setting),
  _verbose( verbose ),
  _npoints( nrows )
{
  // cross-check that we have enough reference points
  if ( nrows<4 ) {
    cerr << "Roo2DMomentMorphFunction::constructor(" << GetName() << ") ERROR: less than four reference points provided." << endl ;
    assert(0);
  }

  // recast tree into more useful form
  _mref.ResizeTo( _npoints,3 );
  _frac.ResizeTo( _npoints );

  for (int i=0; i<_npoints; ++i) {
    _mref(i,0) = dm1arr[i] ;
    _mref(i,1) = dm2arr[i]  ;
    _mref(i,2) = dvalarr[i] ;
  }

  initialize();
}


//_____________________________________________________________________________
Roo2DMomentMorphFunction::Roo2DMomentMorphFunction(const Roo2DMomentMorphFunction& other, const char* name) :  
  RooAbsReal(other,name), 
  m1("m1",this,other.m1),
  m2("m2",this,other.m2),
  _setting(other._setting),
  _verbose(other._verbose),
  _npoints(other._npoints),
  _mref(other._mref),
  _frac(other._frac)
{ 
  initialize();
} 


//_____________________________________________________________________________
Roo2DMomentMorphFunction::~Roo2DMomentMorphFunction()
{
}


//_____________________________________________________________________________
void 
Roo2DMomentMorphFunction::initialize() 
{
  Double_t xmin(1e300), xmax(-1e300), ymin(1e300), ymax(-1e300);

  // transformation matrix for non-linear extrapolation, needed in evaluate()
  for (Int_t k=0; k<_npoints; ++k) {
    if (_mref(k,0)<xmin) { xmin=_mref(k,0); _ixmin=k; }
    if (_mref(k,0)>xmax) { xmax=_mref(k,0); _ixmax=k; }
    if (_mref(k,1)<ymin) { ymin=_mref(k,1); _iymin=k; }
    if (_mref(k,1)>ymax) { ymax=_mref(k,1); _iymax=k; }
  }

  // resize
  _MSqr.ResizeTo(4,4);
  _squareVec.ResizeTo(4,2);
}


//_____________________________________________________________________________
Double_t 
Roo2DMomentMorphFunction::evaluate() const 
{ 
  if (_verbose) { cout << "Now in evaluate." << endl; }
  if (_verbose)  { cout << "x = " << m1 << " ; y = " << m2 << endl; }

  calculateFractions(_verbose); // verbose turned off
  
  Double_t ret = 0.0;
  for (Int_t i=0; i<4; ++i) { ret += ( _mref(_squareIdx[i],2) * _frac[_squareIdx[i]] ) ; }

  if (_verbose) { cout << "End of evaluate : " << ret << endl; }

  //return (ret>0 ? ret : 0) ;
  return ret;
} 


//_____________________________________________________________________________
void 
Roo2DMomentMorphFunction::calculateFractions(Bool_t verbose) const
{
  double sumfrac(0.);

  if (_setting == Linear || _setting == LinearPosFractions) {
    // reset all fractions
    for (Int_t i=0; i<_npoints; ++i) { _frac[i]=0.0; }

    // this sets _squareVec and _squareIdx quantities and MSqr
    (void) findSquare(m1,m2); 
  
    std::vector<double> deltavec(4,1.0);
    deltavec[1] = m1-_squareVec(0,0) ;
    deltavec[2] = m2-_squareVec(0,1) ;
    deltavec[3] = deltavec[1]*deltavec[2] ;

    for (Int_t i=0; i<4; ++i) {
      double ffrac=0.;
      for (Int_t j=0; j<4; ++j) { ffrac += _MSqr(j,i) * deltavec[j]; }

      // set fractions 
      _frac[_squareIdx[i]] = ffrac;
      if (ffrac>0) sumfrac += ffrac;

      if (verbose) { 
        cout << _squareIdx[i] << " " << ffrac << " " << _squareVec(i,0) << " " << _squareVec(i,1) << endl; 
      }
    }  
  }

  if (_setting == LinearPosFractions) {
    for (Int_t i=0; i<4; ++i) {
      if (_frac[_squareIdx[i]]<0) { _frac[_squareIdx[i]] = 0; }
      _frac[_squareIdx[i]] *= (1.0/sumfrac) ;
    } 
  }
}


//_____________________________________________________________________________
Bool_t 
Roo2DMomentMorphFunction::findSquare(const double& x, const double& y) const
{
  bool squareFound(false);

  std::vector< std::pair<int,double> > idvec;

  Double_t xspacing = (_mref(_ixmax,0)-_mref(_ixmin,0)) / TMath::Sqrt(_npoints) ;
  Double_t yspacing = (_mref(_iymax,1)-_mref(_iymin,1)) / TMath::Sqrt(_npoints) ; 

  Double_t dx(0), dy(0), delta(0);
  for (Int_t k=0; k<_npoints; ++k) {
    dx = (x-_mref(k,0))/xspacing ;
    dy = (y-_mref(k,1))/yspacing ;
    delta = TMath::Sqrt(dx*dx+dy*dy) ;
    idvec.push_back( std::pair<int,double>(k,delta) );
  }

  // order points closest to (x,y)
  sort(idvec.begin(),idvec.end(),SorterL2H());
  std::vector< std::pair<int,double> >::iterator itr = idvec.begin();
  std::vector<int> cidx;
  for(; itr!=idvec.end(); ++itr) { 
    cidx.push_back(itr->first);
  }

  // 1. point falls outside available ref points: pick three square points.
  //    fall-back option
  _squareVec(0,0) = _mref(cidx[0],0);
  _squareVec(0,1) = _mref(cidx[0],1);
  _squareIdx[0] = cidx[0];
  _squareVec(1,0) = _mref(cidx[1],0);
  _squareVec(1,1) = _mref(cidx[1],1);
  _squareIdx[1] = cidx[1];
  _squareVec(2,0) = _mref(cidx[2],0);
  _squareVec(2,1) = _mref(cidx[2],1);
  _squareIdx[2] = cidx[2];
  _squareVec(3,0) = _mref(cidx[3],0);
  _squareVec(3,1) = _mref(cidx[3],1);
  _squareIdx[3] = cidx[3];

  // 2. try to find square enclosing square
  if ( x>_mref(_ixmin,0) &&
       x<_mref(_ixmax,0) &&
       y>_mref(_iymin,1) &&
       y<_mref(_iymax,1) )
  {
    for (unsigned int i=0; i<cidx.size() && !squareFound; ++i) 
      for (unsigned int j=i+1; j<cidx.size() && !squareFound; ++j)
        for (unsigned int k=j+1; k<cidx.size() && !squareFound; ++k) 
          for (unsigned int l=k+1; l<cidx.size() && !squareFound; ++l) { 
            if ( isAcceptableSquare(_mref(cidx[i],0),_mref(cidx[i],1),_mref(cidx[j],0),_mref(cidx[j],1),_mref(cidx[k],0),_mref(cidx[k],1),_mref(cidx[l],0),_mref(cidx[l],1)) ) {
              if (  pointInSquare(x,y,_mref(cidx[i],0),_mref(cidx[i],1),_mref(cidx[j],0),_mref(cidx[j],1),_mref(cidx[k],0),_mref(cidx[k],1),_mref(cidx[l],0),_mref(cidx[l],1)) ) {
                _squareVec(0,0) = _mref(cidx[i],0);  
                _squareVec(0,1) = _mref(cidx[i],1);  
                _squareIdx[0] = cidx[i];
                _squareVec(1,0) = _mref(cidx[j],0);  
                _squareVec(1,1) = _mref(cidx[j],1);  
                _squareIdx[1] = cidx[j];
                _squareVec(2,0) = _mref(cidx[k],0);  
                _squareVec(2,1) = _mref(cidx[k],1);  
                _squareIdx[2] = cidx[k];
                _squareVec(3,0) = _mref(cidx[l],0);  
                _squareVec(3,1) = _mref(cidx[l],1); 
                _squareIdx[3] = cidx[l];
                squareFound=true;
              }
            }
          }
  }

  // construct transformation matrix for linear extrapolation
  TMatrixD M(4,4);
  for (Int_t k=0; k<4; ++k) {
    dx = _squareVec(k,0) - _squareVec(0,0) ;
    dy = _squareVec(k,1) - _squareVec(0,1) ;
    M(k,0) = 1.0 ;
    M(k,1) = dx ;
    M(k,2) = dy ;
    M(k,3) = dx*dy ;
  }

  _MSqr = M.Invert();

  return squareFound;
}


//_____________________________________________________________________________
Bool_t Roo2DMomentMorphFunction::onSameSide(const double& p1x, const double& p1y, const double& p2x, const double& p2y, const double& ax, const double& ay, const double& bx, const double& by) const
{   
  // p1 and p2 on same side of line b-a ?
  Double_t cp1 = myCrossProduct(bx-ax, by-ay, p1x-ax, p1y-ay);
  Double_t cp2 = myCrossProduct(bx-ax, by-ay, p2x-ax, p2y-ay);
  if (cp1*cp2 >= 0) return true;
  else return false;
}


//_____________________________________________________________________________
Bool_t 
Roo2DMomentMorphFunction::pointInSquare(const double& px, const double& py, const double& ax, const double& ay, const double& bx, const double& by, const double& cx, const double& cy, const double& dx, const double& dy) const
{   
  bool insquare(false);

  int ntri(0);
  if (ntri<2) ntri += static_cast<int>( pointInTriangle(px,py,ax,ay,bx,by,cx,cy) );
  if (ntri<2) ntri += static_cast<int>( pointInTriangle(px,py,ax,ay,bx,by,dx,dy) );
  if (ntri<2) ntri += static_cast<int>( pointInTriangle(px,py,ax,ay,cx,cy,dx,dy) );
  if (ntri<2) ntri += static_cast<int>( pointInTriangle(px,py,bx,by,cx,cy,dx,dy) );

  if (ntri>=2) insquare=true;
  else insquare=false;

  return insquare;
}


//_____________________________________________________________________________
Bool_t 
Roo2DMomentMorphFunction::pointInTriangle(const double& px, const double& py, const double& ax, const double& ay, const double& bx, const double& by, const double& cx, const double& cy) const
{
  if (onSameSide(px,py,ax,ay,bx,by,cx,cy) && onSameSide(px,py,bx,by,ax,ay,cx,cy) && onSameSide(px,py,cx,cy,ax,ay,bx,by)) return true;
  else return false;
}


//_____________________________________________________________________________
Double_t 
Roo2DMomentMorphFunction::myCrossProduct(const double& ax, const double& ay, const double& bx, const double& by) const
{
  return ( ax*by - bx*ay );
}


//_____________________________________________________________________________
Bool_t 
Roo2DMomentMorphFunction::isAcceptableSquare(const double& ax, const double& ay, const double& bx, const double& by, const double& cx, const double& cy, const double& dx, const double& dy) const
{
  // reject kinked shapes
  if ( pointInTriangle(dx,dy,ax,ax,bx,by,cx,cy) ||
       pointInTriangle(cx,cy,ax,ay,bx,by,dx,dy) ||
       pointInTriangle(bx,by,ax,ay,cx,cy,dx,dy) ||
       pointInTriangle(ax,ay,bx,by,cx,cy,dx,dy) ) return false;
  else return true;
}


void
Roo2DMomentMorphFunction::Summary() const
{
  for( Int_t i=0; i<_npoints; i++ ){
    cout << this << " " << i << " " << _mref(i,0) << " " << _mref(i,1) << " " << _mref(i,2) << endl;
  }
}

 Roo2DMomentMorphFunction.cxx:1
 Roo2DMomentMorphFunction.cxx:2
 Roo2DMomentMorphFunction.cxx:3
 Roo2DMomentMorphFunction.cxx:4
 Roo2DMomentMorphFunction.cxx:5
 Roo2DMomentMorphFunction.cxx:6
 Roo2DMomentMorphFunction.cxx:7
 Roo2DMomentMorphFunction.cxx:8
 Roo2DMomentMorphFunction.cxx:9
 Roo2DMomentMorphFunction.cxx:10
 Roo2DMomentMorphFunction.cxx:11
 Roo2DMomentMorphFunction.cxx:12
 Roo2DMomentMorphFunction.cxx:13
 Roo2DMomentMorphFunction.cxx:14
 Roo2DMomentMorphFunction.cxx:15
 Roo2DMomentMorphFunction.cxx:16
 Roo2DMomentMorphFunction.cxx:17
 Roo2DMomentMorphFunction.cxx:18
 Roo2DMomentMorphFunction.cxx:19
 Roo2DMomentMorphFunction.cxx:20
 Roo2DMomentMorphFunction.cxx:21
 Roo2DMomentMorphFunction.cxx:22
 Roo2DMomentMorphFunction.cxx:23
 Roo2DMomentMorphFunction.cxx:24
 Roo2DMomentMorphFunction.cxx:25
 Roo2DMomentMorphFunction.cxx:26
 Roo2DMomentMorphFunction.cxx:27
 Roo2DMomentMorphFunction.cxx:28
 Roo2DMomentMorphFunction.cxx:29
 Roo2DMomentMorphFunction.cxx:30
 Roo2DMomentMorphFunction.cxx:31
 Roo2DMomentMorphFunction.cxx:32
 Roo2DMomentMorphFunction.cxx:33
 Roo2DMomentMorphFunction.cxx:34
 Roo2DMomentMorphFunction.cxx:35
 Roo2DMomentMorphFunction.cxx:36
 Roo2DMomentMorphFunction.cxx:37
 Roo2DMomentMorphFunction.cxx:38
 Roo2DMomentMorphFunction.cxx:39
 Roo2DMomentMorphFunction.cxx:40
 Roo2DMomentMorphFunction.cxx:41
 Roo2DMomentMorphFunction.cxx:42
 Roo2DMomentMorphFunction.cxx:43
 Roo2DMomentMorphFunction.cxx:44
 Roo2DMomentMorphFunction.cxx:45
 Roo2DMomentMorphFunction.cxx:46
 Roo2DMomentMorphFunction.cxx:47
 Roo2DMomentMorphFunction.cxx:48
 Roo2DMomentMorphFunction.cxx:49
 Roo2DMomentMorphFunction.cxx:50
 Roo2DMomentMorphFunction.cxx:51
 Roo2DMomentMorphFunction.cxx:52
 Roo2DMomentMorphFunction.cxx:53
 Roo2DMomentMorphFunction.cxx:54
 Roo2DMomentMorphFunction.cxx:55
 Roo2DMomentMorphFunction.cxx:56
 Roo2DMomentMorphFunction.cxx:57
 Roo2DMomentMorphFunction.cxx:58
 Roo2DMomentMorphFunction.cxx:59
 Roo2DMomentMorphFunction.cxx:60
 Roo2DMomentMorphFunction.cxx:61
 Roo2DMomentMorphFunction.cxx:62
 Roo2DMomentMorphFunction.cxx:63
 Roo2DMomentMorphFunction.cxx:64
 Roo2DMomentMorphFunction.cxx:65
 Roo2DMomentMorphFunction.cxx:66
 Roo2DMomentMorphFunction.cxx:67
 Roo2DMomentMorphFunction.cxx:68
 Roo2DMomentMorphFunction.cxx:69
 Roo2DMomentMorphFunction.cxx:70
 Roo2DMomentMorphFunction.cxx:71
 Roo2DMomentMorphFunction.cxx:72
 Roo2DMomentMorphFunction.cxx:73
 Roo2DMomentMorphFunction.cxx:74
 Roo2DMomentMorphFunction.cxx:75
 Roo2DMomentMorphFunction.cxx:76
 Roo2DMomentMorphFunction.cxx:77
 Roo2DMomentMorphFunction.cxx:78
 Roo2DMomentMorphFunction.cxx:79
 Roo2DMomentMorphFunction.cxx:80
 Roo2DMomentMorphFunction.cxx:81
 Roo2DMomentMorphFunction.cxx:82
 Roo2DMomentMorphFunction.cxx:83
 Roo2DMomentMorphFunction.cxx:84
 Roo2DMomentMorphFunction.cxx:85
 Roo2DMomentMorphFunction.cxx:86
 Roo2DMomentMorphFunction.cxx:87
 Roo2DMomentMorphFunction.cxx:88
 Roo2DMomentMorphFunction.cxx:89
 Roo2DMomentMorphFunction.cxx:90
 Roo2DMomentMorphFunction.cxx:91
 Roo2DMomentMorphFunction.cxx:92
 Roo2DMomentMorphFunction.cxx:93
 Roo2DMomentMorphFunction.cxx:94
 Roo2DMomentMorphFunction.cxx:95
 Roo2DMomentMorphFunction.cxx:96
 Roo2DMomentMorphFunction.cxx:97
 Roo2DMomentMorphFunction.cxx:98
 Roo2DMomentMorphFunction.cxx:99
 Roo2DMomentMorphFunction.cxx:100
 Roo2DMomentMorphFunction.cxx:101
 Roo2DMomentMorphFunction.cxx:102
 Roo2DMomentMorphFunction.cxx:103
 Roo2DMomentMorphFunction.cxx:104
 Roo2DMomentMorphFunction.cxx:105
 Roo2DMomentMorphFunction.cxx:106
 Roo2DMomentMorphFunction.cxx:107
 Roo2DMomentMorphFunction.cxx:108
 Roo2DMomentMorphFunction.cxx:109
 Roo2DMomentMorphFunction.cxx:110
 Roo2DMomentMorphFunction.cxx:111
 Roo2DMomentMorphFunction.cxx:112
 Roo2DMomentMorphFunction.cxx:113
 Roo2DMomentMorphFunction.cxx:114
 Roo2DMomentMorphFunction.cxx:115
 Roo2DMomentMorphFunction.cxx:116
 Roo2DMomentMorphFunction.cxx:117
 Roo2DMomentMorphFunction.cxx:118
 Roo2DMomentMorphFunction.cxx:119
 Roo2DMomentMorphFunction.cxx:120
 Roo2DMomentMorphFunction.cxx:121
 Roo2DMomentMorphFunction.cxx:122
 Roo2DMomentMorphFunction.cxx:123
 Roo2DMomentMorphFunction.cxx:124
 Roo2DMomentMorphFunction.cxx:125
 Roo2DMomentMorphFunction.cxx:126
 Roo2DMomentMorphFunction.cxx:127
 Roo2DMomentMorphFunction.cxx:128
 Roo2DMomentMorphFunction.cxx:129
 Roo2DMomentMorphFunction.cxx:130
 Roo2DMomentMorphFunction.cxx:131
 Roo2DMomentMorphFunction.cxx:132
 Roo2DMomentMorphFunction.cxx:133
 Roo2DMomentMorphFunction.cxx:134
 Roo2DMomentMorphFunction.cxx:135
 Roo2DMomentMorphFunction.cxx:136
 Roo2DMomentMorphFunction.cxx:137
 Roo2DMomentMorphFunction.cxx:138
 Roo2DMomentMorphFunction.cxx:139
 Roo2DMomentMorphFunction.cxx:140
 Roo2DMomentMorphFunction.cxx:141
 Roo2DMomentMorphFunction.cxx:142
 Roo2DMomentMorphFunction.cxx:143
 Roo2DMomentMorphFunction.cxx:144
 Roo2DMomentMorphFunction.cxx:145
 Roo2DMomentMorphFunction.cxx:146
 Roo2DMomentMorphFunction.cxx:147
 Roo2DMomentMorphFunction.cxx:148
 Roo2DMomentMorphFunction.cxx:149
 Roo2DMomentMorphFunction.cxx:150
 Roo2DMomentMorphFunction.cxx:151
 Roo2DMomentMorphFunction.cxx:152
 Roo2DMomentMorphFunction.cxx:153
 Roo2DMomentMorphFunction.cxx:154
 Roo2DMomentMorphFunction.cxx:155
 Roo2DMomentMorphFunction.cxx:156
 Roo2DMomentMorphFunction.cxx:157
 Roo2DMomentMorphFunction.cxx:158
 Roo2DMomentMorphFunction.cxx:159
 Roo2DMomentMorphFunction.cxx:160
 Roo2DMomentMorphFunction.cxx:161
 Roo2DMomentMorphFunction.cxx:162
 Roo2DMomentMorphFunction.cxx:163
 Roo2DMomentMorphFunction.cxx:164
 Roo2DMomentMorphFunction.cxx:165
 Roo2DMomentMorphFunction.cxx:166
 Roo2DMomentMorphFunction.cxx:167
 Roo2DMomentMorphFunction.cxx:168
 Roo2DMomentMorphFunction.cxx:169
 Roo2DMomentMorphFunction.cxx:170
 Roo2DMomentMorphFunction.cxx:171
 Roo2DMomentMorphFunction.cxx:172
 Roo2DMomentMorphFunction.cxx:173
 Roo2DMomentMorphFunction.cxx:174
 Roo2DMomentMorphFunction.cxx:175
 Roo2DMomentMorphFunction.cxx:176
 Roo2DMomentMorphFunction.cxx:177
 Roo2DMomentMorphFunction.cxx:178
 Roo2DMomentMorphFunction.cxx:179
 Roo2DMomentMorphFunction.cxx:180
 Roo2DMomentMorphFunction.cxx:181
 Roo2DMomentMorphFunction.cxx:182
 Roo2DMomentMorphFunction.cxx:183
 Roo2DMomentMorphFunction.cxx:184
 Roo2DMomentMorphFunction.cxx:185
 Roo2DMomentMorphFunction.cxx:186
 Roo2DMomentMorphFunction.cxx:187
 Roo2DMomentMorphFunction.cxx:188
 Roo2DMomentMorphFunction.cxx:189
 Roo2DMomentMorphFunction.cxx:190
 Roo2DMomentMorphFunction.cxx:191
 Roo2DMomentMorphFunction.cxx:192
 Roo2DMomentMorphFunction.cxx:193
 Roo2DMomentMorphFunction.cxx:194
 Roo2DMomentMorphFunction.cxx:195
 Roo2DMomentMorphFunction.cxx:196
 Roo2DMomentMorphFunction.cxx:197
 Roo2DMomentMorphFunction.cxx:198
 Roo2DMomentMorphFunction.cxx:199
 Roo2DMomentMorphFunction.cxx:200
 Roo2DMomentMorphFunction.cxx:201
 Roo2DMomentMorphFunction.cxx:202
 Roo2DMomentMorphFunction.cxx:203
 Roo2DMomentMorphFunction.cxx:204
 Roo2DMomentMorphFunction.cxx:205
 Roo2DMomentMorphFunction.cxx:206
 Roo2DMomentMorphFunction.cxx:207
 Roo2DMomentMorphFunction.cxx:208
 Roo2DMomentMorphFunction.cxx:209
 Roo2DMomentMorphFunction.cxx:210
 Roo2DMomentMorphFunction.cxx:211
 Roo2DMomentMorphFunction.cxx:212
 Roo2DMomentMorphFunction.cxx:213
 Roo2DMomentMorphFunction.cxx:214
 Roo2DMomentMorphFunction.cxx:215
 Roo2DMomentMorphFunction.cxx:216
 Roo2DMomentMorphFunction.cxx:217
 Roo2DMomentMorphFunction.cxx:218
 Roo2DMomentMorphFunction.cxx:219
 Roo2DMomentMorphFunction.cxx:220
 Roo2DMomentMorphFunction.cxx:221
 Roo2DMomentMorphFunction.cxx:222
 Roo2DMomentMorphFunction.cxx:223
 Roo2DMomentMorphFunction.cxx:224
 Roo2DMomentMorphFunction.cxx:225
 Roo2DMomentMorphFunction.cxx:226
 Roo2DMomentMorphFunction.cxx:227
 Roo2DMomentMorphFunction.cxx:228
 Roo2DMomentMorphFunction.cxx:229
 Roo2DMomentMorphFunction.cxx:230
 Roo2DMomentMorphFunction.cxx:231
 Roo2DMomentMorphFunction.cxx:232
 Roo2DMomentMorphFunction.cxx:233
 Roo2DMomentMorphFunction.cxx:234
 Roo2DMomentMorphFunction.cxx:235
 Roo2DMomentMorphFunction.cxx:236
 Roo2DMomentMorphFunction.cxx:237
 Roo2DMomentMorphFunction.cxx:238
 Roo2DMomentMorphFunction.cxx:239
 Roo2DMomentMorphFunction.cxx:240
 Roo2DMomentMorphFunction.cxx:241
 Roo2DMomentMorphFunction.cxx:242
 Roo2DMomentMorphFunction.cxx:243
 Roo2DMomentMorphFunction.cxx:244
 Roo2DMomentMorphFunction.cxx:245
 Roo2DMomentMorphFunction.cxx:246
 Roo2DMomentMorphFunction.cxx:247
 Roo2DMomentMorphFunction.cxx:248
 Roo2DMomentMorphFunction.cxx:249
 Roo2DMomentMorphFunction.cxx:250
 Roo2DMomentMorphFunction.cxx:251
 Roo2DMomentMorphFunction.cxx:252
 Roo2DMomentMorphFunction.cxx:253
 Roo2DMomentMorphFunction.cxx:254
 Roo2DMomentMorphFunction.cxx:255
 Roo2DMomentMorphFunction.cxx:256
 Roo2DMomentMorphFunction.cxx:257
 Roo2DMomentMorphFunction.cxx:258
 Roo2DMomentMorphFunction.cxx:259
 Roo2DMomentMorphFunction.cxx:260
 Roo2DMomentMorphFunction.cxx:261
 Roo2DMomentMorphFunction.cxx:262
 Roo2DMomentMorphFunction.cxx:263
 Roo2DMomentMorphFunction.cxx:264
 Roo2DMomentMorphFunction.cxx:265
 Roo2DMomentMorphFunction.cxx:266
 Roo2DMomentMorphFunction.cxx:267
 Roo2DMomentMorphFunction.cxx:268
 Roo2DMomentMorphFunction.cxx:269
 Roo2DMomentMorphFunction.cxx:270
 Roo2DMomentMorphFunction.cxx:271
 Roo2DMomentMorphFunction.cxx:272
 Roo2DMomentMorphFunction.cxx:273
 Roo2DMomentMorphFunction.cxx:274
 Roo2DMomentMorphFunction.cxx:275
 Roo2DMomentMorphFunction.cxx:276
 Roo2DMomentMorphFunction.cxx:277
 Roo2DMomentMorphFunction.cxx:278
 Roo2DMomentMorphFunction.cxx:279
 Roo2DMomentMorphFunction.cxx:280
 Roo2DMomentMorphFunction.cxx:281
 Roo2DMomentMorphFunction.cxx:282
 Roo2DMomentMorphFunction.cxx:283
 Roo2DMomentMorphFunction.cxx:284
 Roo2DMomentMorphFunction.cxx:285
 Roo2DMomentMorphFunction.cxx:286
 Roo2DMomentMorphFunction.cxx:287
 Roo2DMomentMorphFunction.cxx:288
 Roo2DMomentMorphFunction.cxx:289
 Roo2DMomentMorphFunction.cxx:290
 Roo2DMomentMorphFunction.cxx:291
 Roo2DMomentMorphFunction.cxx:292
 Roo2DMomentMorphFunction.cxx:293
 Roo2DMomentMorphFunction.cxx:294
 Roo2DMomentMorphFunction.cxx:295
 Roo2DMomentMorphFunction.cxx:296
 Roo2DMomentMorphFunction.cxx:297
 Roo2DMomentMorphFunction.cxx:298
 Roo2DMomentMorphFunction.cxx:299
 Roo2DMomentMorphFunction.cxx:300
 Roo2DMomentMorphFunction.cxx:301
 Roo2DMomentMorphFunction.cxx:302
 Roo2DMomentMorphFunction.cxx:303
 Roo2DMomentMorphFunction.cxx:304
 Roo2DMomentMorphFunction.cxx:305
 Roo2DMomentMorphFunction.cxx:306
 Roo2DMomentMorphFunction.cxx:307
 Roo2DMomentMorphFunction.cxx:308
 Roo2DMomentMorphFunction.cxx:309
 Roo2DMomentMorphFunction.cxx:310
 Roo2DMomentMorphFunction.cxx:311
 Roo2DMomentMorphFunction.cxx:312
 Roo2DMomentMorphFunction.cxx:313
 Roo2DMomentMorphFunction.cxx:314
 Roo2DMomentMorphFunction.cxx:315
 Roo2DMomentMorphFunction.cxx:316
 Roo2DMomentMorphFunction.cxx:317
 Roo2DMomentMorphFunction.cxx:318
 Roo2DMomentMorphFunction.cxx:319
 Roo2DMomentMorphFunction.cxx:320
 Roo2DMomentMorphFunction.cxx:321
 Roo2DMomentMorphFunction.cxx:322
 Roo2DMomentMorphFunction.cxx:323
 Roo2DMomentMorphFunction.cxx:324
 Roo2DMomentMorphFunction.cxx:325
 Roo2DMomentMorphFunction.cxx:326
 Roo2DMomentMorphFunction.cxx:327
 Roo2DMomentMorphFunction.cxx:328
 Roo2DMomentMorphFunction.cxx:329
 Roo2DMomentMorphFunction.cxx:330
 Roo2DMomentMorphFunction.cxx:331
 Roo2DMomentMorphFunction.cxx:332
 Roo2DMomentMorphFunction.cxx:333
 Roo2DMomentMorphFunction.cxx:334
 Roo2DMomentMorphFunction.cxx:335
 Roo2DMomentMorphFunction.cxx:336
 Roo2DMomentMorphFunction.cxx:337
 Roo2DMomentMorphFunction.cxx:338
 Roo2DMomentMorphFunction.cxx:339
 Roo2DMomentMorphFunction.cxx:340
 Roo2DMomentMorphFunction.cxx:341
 Roo2DMomentMorphFunction.cxx:342
 Roo2DMomentMorphFunction.cxx:343
 Roo2DMomentMorphFunction.cxx:344
 Roo2DMomentMorphFunction.cxx:345
 Roo2DMomentMorphFunction.cxx:346
 Roo2DMomentMorphFunction.cxx:347
 Roo2DMomentMorphFunction.cxx:348
 Roo2DMomentMorphFunction.cxx:349
 Roo2DMomentMorphFunction.cxx:350
 Roo2DMomentMorphFunction.cxx:351
 Roo2DMomentMorphFunction.cxx:352
 Roo2DMomentMorphFunction.cxx:353
 Roo2DMomentMorphFunction.cxx:354
 Roo2DMomentMorphFunction.cxx:355
 Roo2DMomentMorphFunction.cxx:356
 Roo2DMomentMorphFunction.cxx:357
 Roo2DMomentMorphFunction.cxx:358
 Roo2DMomentMorphFunction.cxx:359
 Roo2DMomentMorphFunction.cxx:360
 Roo2DMomentMorphFunction.cxx:361
 Roo2DMomentMorphFunction.cxx:362
 Roo2DMomentMorphFunction.cxx:363
 Roo2DMomentMorphFunction.cxx:364
 Roo2DMomentMorphFunction.cxx:365
 Roo2DMomentMorphFunction.cxx:366
 Roo2DMomentMorphFunction.cxx:367
 Roo2DMomentMorphFunction.cxx:368
 Roo2DMomentMorphFunction.cxx:369
 Roo2DMomentMorphFunction.cxx:370
 Roo2DMomentMorphFunction.cxx:371
 Roo2DMomentMorphFunction.cxx:372
 Roo2DMomentMorphFunction.cxx:373
 Roo2DMomentMorphFunction.cxx:374
 Roo2DMomentMorphFunction.cxx:375
 Roo2DMomentMorphFunction.cxx:376
 Roo2DMomentMorphFunction.cxx:377
 Roo2DMomentMorphFunction.cxx:378
 Roo2DMomentMorphFunction.cxx:379
 Roo2DMomentMorphFunction.cxx:380
 Roo2DMomentMorphFunction.cxx:381
 Roo2DMomentMorphFunction.cxx:382
 Roo2DMomentMorphFunction.cxx:383
 Roo2DMomentMorphFunction.cxx:384
 Roo2DMomentMorphFunction.cxx:385
 Roo2DMomentMorphFunction.cxx:386
 Roo2DMomentMorphFunction.cxx:387
 Roo2DMomentMorphFunction.cxx:388
 Roo2DMomentMorphFunction.cxx:389
 Roo2DMomentMorphFunction.cxx:390
 Roo2DMomentMorphFunction.cxx:391
 Roo2DMomentMorphFunction.cxx:392