ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * 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 RooXYChi2Var implements a simple chi^2 calculation from a unbinned
// dataset with values x,y with errors on y (and optionally on x) and a function.
// The function can be either a RooAbsReal, or an extended RooAbsPdf where
// the function value is calculated as the probability density times the
// expected number of events
// The chi^2 is calculated as 
//
//              / (Data[y]-) - func \+2
//  Sum[point] |  ------------------ |
//              \     Data[ErrY]    /
//
//

#include "RooFit.h"

#include "RooXYChi2Var.h"
#include "RooDataSet.h"
#include "RooAbsReal.h"

#include "Riostream.h"

#include "RooRealVar.h"

#include "RooGaussKronrodIntegrator1D.h"
#include "RooAbsDataStore.h"
#include "RooRealBinding.h"
#include "RooNumIntFactory.h"

using namespace std;

ClassImp(RooXYChi2Var)
;


//_____________________________________________________________________________
RooXYChi2Var::RooXYChi2Var() 
{
  // coverity[UNINIT_CTOR]
  _funcInt = 0 ;
  _rrvIter = _rrvArgs.createIterator() ;
}


//_____________________________________________________________________________
RooXYChi2Var::RooXYChi2Var(const char *name, const char* title, RooAbsReal& func, RooDataSet& xydata, Bool_t integrate) :
  RooAbsOptTestStatistic(name,title,func,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0), 
  _extended(kFALSE),
  _integrate(integrate),
  _intConfig(*defaultIntegratorConfig()),
  _funcInt(0)
{
  //
  //  RooXYChi2Var constructor with function and X-Y values dataset
  //
  // An X-Y dataset is a weighted dataset with one or more observables X where the weight is interpreted
  // as the Y value and the weight error is interpreted as the Y value error. The weight must have an
  // non-zero error defined at each point for the chi^2 calculation to be meaningful.
  //
  // To store errors associated with the x and y values in a RooDataSet, call RooRealVar::setAttribute("StoreError")
  // on each X-type observable for which the error should be stored and add datapoints to the dataset as follows
  //
  // RooDataSet::add(xset,yval,yerr) where xset is the RooArgSet of x observables (with or without errors) and yval and yerr
  //                                 are the Double_t values that correspond to the Y and its error
  //
  _extended = kFALSE ;
  _yvar = 0 ;

  initialize() ;
}


//_____________________________________________________________________________
RooXYChi2Var::RooXYChi2Var(const char *name, const char* title, RooAbsReal& func, RooDataSet& xydata, RooRealVar& yvar, Bool_t integrate) :
  RooAbsOptTestStatistic(name,title,func,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0), 
  _extended(kFALSE),
  _integrate(integrate),
  _intConfig(*defaultIntegratorConfig()),
  _funcInt(0)  
{
  //
  //  RooXYChi2Var constructor with function and X-Y values dataset
  //
  // An X-Y dataset is a weighted dataset with one or more observables X where given yvar is interpreted
  // as the Y value. The Y variable must have a non-zero error defined at each point for the chi^2 calculation to be meaningful.
  //
  // To store errors associated with the x and y values in a RooDataSet, call RooRealVar::setAttribute("StoreError")
  // on each X-type observable for which the error should be stored and add datapoints to the dataset as follows
  //
  // RooDataSet::add(xset,yval,yerr) where xset is the RooArgSet of x observables (with or without errors) and yval and yerr
  //                                 are the Double_t values that correspond to the Y and its error
  //
  _extended = kFALSE ;
  _yvar = (RooRealVar*) _dataClone->get()->find(yvar.GetName()) ;

  initialize() ;
}


//_____________________________________________________________________________
RooXYChi2Var::RooXYChi2Var(const char *name, const char* title, RooAbsPdf& extPdf, RooDataSet& xydata, Bool_t integrate) :
  RooAbsOptTestStatistic(name,title,extPdf,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0), 
  _extended(kTRUE),
  _integrate(integrate),
  _intConfig(*defaultIntegratorConfig()),
  _funcInt(0)
{
  //
  // RooXYChi2Var constructor with an extended p.d.f. and X-Y values dataset
  // The value of the function that defines the chi^2 in this form is takes as
  // the p.d.f. times the expected number of events
  //
  // An X-Y dataset is a weighted dataset with one or more observables X where the weight is interpreted
  // as the Y value and the weight error is interpreted as the Y value error. The weight must have an
  // non-zero error defined at each point for the chi^2 calculation to be meaningful.
  //
  // To store errors associated with the x and y values in a RooDataSet, call RooRealVar::setAttribute("StoreError")
  // on each X-type observable for which the error should be stored and add datapoints to the dataset as follows
  //
  // RooDataSet::add(xset,yval,yerr) where xset is the RooArgSet of x observables (with or without errors) and yval and yerr
  //                                 are the Double_t values that correspond to the Y and its error
  //
  if (!extPdf.canBeExtended()) {
    throw(string(Form("RooXYChi2Var::ctor(%s) ERROR: Input p.d.f. must be an extendible",GetName()))) ;
  }
  _yvar = 0 ;
  initialize() ;
}




//_____________________________________________________________________________
RooXYChi2Var::RooXYChi2Var(const char *name, const char* title, RooAbsPdf& extPdf, RooDataSet& xydata, RooRealVar& yvar, Bool_t integrate) :
  RooAbsOptTestStatistic(name,title,extPdf,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0), 
  _extended(kTRUE),
  _integrate(integrate),
  _intConfig(*defaultIntegratorConfig()),
  _funcInt(0)
{
  //
  // RooXYChi2Var constructor with an extended p.d.f. and X-Y values dataset
  // The value of the function that defines the chi^2 in this form is takes as
  // the p.d.f. times the expected number of events
  //
  // An X-Y dataset is a weighted dataset with one or more observables X where the weight is interpreted
  // as the Y value and the weight error is interpreted as the Y value error. The weight must have an
  // non-zero error defined at each point for the chi^2 calculation to be meaningful.
  //
  // To store errors associated with the x and y values in a RooDataSet, call RooRealVar::setAttribute("StoreError")
  // on each X-type observable for which the error should be stored and add datapoints to the dataset as follows
  //
  // RooDataSet::add(xset,yval,yerr) where xset is the RooArgSet of x observables (with or without errors) and yval and yerr
  //                                 are the Double_t values that correspond to the Y and its error
  //
  if (!extPdf.canBeExtended()) {
    throw(string(Form("RooXYChi2Var::ctor(%s) ERROR: Input p.d.f. must be an extendible",GetName()))) ;
  }
  _yvar = (RooRealVar*) _dataClone->get()->find(yvar.GetName()) ;
  initialize() ;
}




//_____________________________________________________________________________
RooXYChi2Var::RooXYChi2Var(const RooXYChi2Var& other, const char* name) : 
  RooAbsOptTestStatistic(other,name),
  _extended(other._extended),
  _integrate(other._integrate),
  _intConfig(other._intConfig),
  _funcInt(0)
{
  // Copy constructor

  _yvar = other._yvar ? (RooRealVar*) _dataClone->get()->find(other._yvar->GetName()) : 0 ;
  initialize() ;
  
}




//_____________________________________________________________________________
void RooXYChi2Var::initialize()
{
  // Common constructor initialization

  TIterator* iter = _funcObsSet->createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    RooRealVar* var = dynamic_cast<RooRealVar*>(arg) ;
    if (var) {
      _rrvArgs.add(*var) ;
    }
  }
  if (_yvar) {
    _rrvArgs.add(*_yvar) ;
  }
  delete iter ;
  _rrvIter = _rrvArgs.createIterator() ;

  // Define alternate numeric integrator configuration for bin integration
  // We expect bin contents to very only very slowly so a non-adaptive
  // Gauss-Kronrod integrator is expected to perform well.
  _intConfig.setEpsRel(1e-7) ;
  _intConfig.setEpsAbs(1e-7) ;
  _intConfig.method1D().setLabel("RooGaussKronrodIntegrator1D") ;
  _intConfig.methodND().setLabel("RooAdaptiveIntegratorND") ;

  initIntegrator() ;
  
}



//_____________________________________________________________________________
void RooXYChi2Var::initIntegrator()
{
  // Initialize bin content integrator

  if (!_funcInt) {
    _funcInt = _funcClone->createIntegral(_rrvArgs,_rrvArgs,_intConfig,"bin") ;
    _rrvIter->Reset() ;
    RooRealVar* x ;
    while((x=(RooRealVar*)_rrvIter->Next())) {
      _binList.push_back(&x->getBinning("bin",kFALSE,kTRUE)) ;
    }
  }
  
}



//_____________________________________________________________________________
RooXYChi2Var::~RooXYChi2Var()
{
  // Destructor

  delete _rrvIter ;
  if (_funcInt) delete _funcInt ;
}




//_____________________________________________________________________________
Double_t RooXYChi2Var::xErrorContribution(Double_t ydata) const
{
  // Calculate contribution to internal error due to error on 'x' coordinates
  // at point i

  RooRealVar* var ;
  Double_t ret(0) ;

  _rrvIter->Reset() ;
  while((var=(RooRealVar*)_rrvIter->Next())) {

    if (var->hasAsymError()) {
      
      // Get value at central X
      Double_t cxval = var->getVal() ;
      Double_t xerrLo = -var->getAsymErrorLo() ;
      Double_t xerrHi = var->getAsymErrorHi() ;
      Double_t xerr = (xerrLo+xerrHi)/2 ;
      
      // Get value at X-eps
      var->setVal(cxval - xerr/100) ;
      Double_t fxmin = fy() ;

      // Get value at X+eps
      var->setVal(cxval + xerr/100) ;
      Double_t fxmax = fy() ;
      
      // Calculate slope
      Double_t slope = (fxmax-fxmin)/(2*xerr/100.) ;
      
//       cout << "xerrHi = " << xerrHi << " xerrLo = " << xerrLo << " slope = " << slope << endl ;
      
      // Asymmetric X error, decide which one to use
      if ((ydata>cxval && fxmax>fxmin) || (ydata<=cxval && fxmax<=fxmin)) {
	// Use right X error
	ret += pow(xerrHi*slope,2) ;
      } else {
	// Use left X error
	ret += pow(xerrLo*slope,2) ;
      }
      
    } else if (var->hasError()) {

      // Get value at central X
      Double_t cxval = var->getVal() ;
      Double_t xerr = var->getError() ;

      // Get value at X-eps
      var->setVal(cxval - xerr/100) ;
      Double_t fxmin = fy() ;

      // Get value at X+eps
      var->setVal(cxval + xerr/100) ;
      Double_t fxmax = fy() ;
      
      // Calculate slope
      Double_t slope = (fxmax-fxmin)/(2*xerr/100.) ;

//       cout << var << " " ;
//       var->Print() ;

//       cout << var->GetName() << " xerr = " << xerr << " slope = " << slope << endl ;
            
      // Symmetric X error
      ret += pow(xerr*slope,2) ;
    }    
  }
  return ret ;
}




//_____________________________________________________________________________
Double_t RooXYChi2Var::fy() const
{
  // Return function value requested bu present configuration
  //
  // If integration is required, the function value integrated
  // over the bin volume divided by the bin volume is returned,
  // otherwise the value at the bin center is returned. 
  // The bin volume is defined by the error on the 'X' coordinates
  //
  // If an extended p.d.f. is used as function, its value is
  // also multiplied by the expected number of events here

  // Get function value
  Double_t yfunc ;
  if (!_integrate) {
    yfunc = _funcClone->getVal(_dataClone->get()) ;
  } else {
    Double_t volume(1) ;
    _rrvIter->Reset() ;
    for (list<RooAbsBinning*>::const_iterator iter = _binList.begin() ; iter != _binList.end() ; iter++) {
      RooRealVar* x = (RooRealVar*) _rrvIter->Next() ;
      Double_t xmin = x->getVal() + x->getErrorLo() ;
      Double_t xmax = x->getVal() + x->getErrorHi() ;
      (*iter)->setRange(xmin,xmax) ;
      x->setShapeDirty() ;
      volume *= (xmax - xmin) ;
    }
    Double_t ret = _funcInt->getVal() ;
    return ret / volume ;
  }
  if (_extended) {      
    RooAbsPdf* pdf = (RooAbsPdf*) _funcClone ;
    // Multiply with expected number of events
    yfunc *= pdf->expectedEvents(_dataClone->get()) ;
  }      
  return yfunc ;
}



//_____________________________________________________________________________
Double_t RooXYChi2Var::evaluatePartition(Int_t firstEvent, Int_t lastEvent, Int_t stepSize) const 
{
  // Calculate chi^2 in partition from firstEvent to lastEvent using given stepSize

  Double_t result(0), carry(0);

  // Loop over bins of dataset
  RooDataSet* xydata = (RooDataSet*) _dataClone ;

  _dataClone->store()->recalculateCache( _projDeps, firstEvent, lastEvent, stepSize,kFALSE ) ;

  for (Int_t i=firstEvent ; i<lastEvent ; i+=stepSize) {
    
    // get the data values for this event
    xydata->get(i);
    
    if (!xydata->valid()) {
      continue ;
    }

//     cout << "xydata = " << endl ;
//     xydata->get()->Print("v") ;
    //xydata->store()->dump() ;

    // Get function value
    Double_t yfunc = fy() ;

    // Get data value and error
    Double_t ydata ;
    Double_t eylo,eyhi ;
    if (_yvar) {
      ydata = _yvar->getVal() ;
      eylo = -1*_yvar->getErrorLo() ;
      eyhi = _yvar->getErrorHi() ;
    } else {
      ydata = xydata->weight() ;
      xydata->weightError(eylo,eyhi) ;
    }

    // Calculate external error
    Double_t eExt = yfunc-ydata ;

    // Pick upper or lower error bar depending on sign of external error
    Double_t eInt = (eExt>0) ? eyhi : eylo ;

    // Add contributions due to error in x coordinates    
    Double_t eIntX2 = _integrate ? 0 : xErrorContribution(ydata) ;

//     cout << "fy = " << yfunc << " eExt = " << eExt << " eInt = " << eInt << " eIntX2 = " << eIntX2 << endl ;

    // Return 0 if eInt=0, special handling in MINUIT will follow
    if (eInt==0.) {
      coutE(Eval) << "RooXYChi2Var::RooXYChi2Var(" << GetName() << ") INFINITY ERROR: data point " << i 
		  << " has zero error, but function is not zero (f=" << yfunc << ")" << endl ;
      return 0 ;
    }

    // Add chi2 term
    Double_t term = eExt*eExt/(eInt*eInt+ eIntX2);
    Double_t y = term - carry;
    Double_t t = result + y;
    carry = (t - result) - y;
    result = t;
  }

  _evalCarry = carry;
  return result ;
}



RooArgSet RooXYChi2Var::requiredExtraObservables() const 
{
  // Inform base class that observable yvar cannot be optimized away from the dataset
  if (_yvar) return RooArgSet(*_yvar) ;
  return RooArgSet() ;
}



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