/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofit:$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)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
//
// BEGIN_HTML
// RooHistFunc implements a real-valued function sampled from a 
// multidimensional histogram. The histogram can have an arbitrary number of real or 
// discrete dimensions and may have negative values
// END_HTML
//

#include "RooFit.h"
#include "Riostream.h"

#include "RooHistFunc.h"
#include "RooDataHist.h"
#include "RooMsgService.h"
#include "RooRealVar.h"
#include "RooCategory.h"
#include "RooWorkspace.h"

#include "TError.h"

using namespace std;

ClassImp(RooHistFunc)
;



//_____________________________________________________________________________
RooHistFunc::RooHistFunc() :
  _dataHist(0),
  _intOrder(0),
  _cdfBoundaries(kFALSE),
  _totVolume(0),
  _unitNorm(kFALSE)
{
  // Default constructor
  TRACE_CREATE 

  _histObsIter = _histObsList.createIterator() ;
  _pdfObsIter = _depList.createIterator() ;
}


//_____________________________________________________________________________
RooHistFunc::RooHistFunc(const char *name, const char *title, const RooArgSet& vars, 
		       const RooDataHist& dhist, Int_t intOrder) :
  RooAbsReal(name,title), 
  _depList("depList","List of dependents",this),
  _dataHist((RooDataHist*)&dhist), 
  _codeReg(10),
  _intOrder(intOrder),
  _cdfBoundaries(kFALSE),
  _totVolume(0),
  _unitNorm(kFALSE)
{
  // Constructor from a RooDataHist. The variable listed in 'vars' control the dimensionality of the
  // function. Any additional dimensions present in 'dhist' will be projected out. RooDataHist dimensions
  // can be either real or discrete. See RooDataHist::RooDataHist for details on the binning.
  // RooHistFunc neither owns or clone 'dhist' and the user must ensure the input histogram exists
  // for the entire life span of this function.

  _histObsList.addClone(vars) ;
  _depList.add(vars) ;

  _histObsIter = _histObsList.createIterator() ;
  _pdfObsIter = _depList.createIterator() ;

  // Verify that vars and dhist.get() have identical contents
  const RooArgSet* dvars = dhist.get() ;
  if (vars.getSize()!=dvars->getSize()) {
    coutE(InputArguments) << "RooHistFunc::ctor(" << GetName() 
			  << ") ERROR variable list and RooDataHist must contain the same variables." << endl ;
    assert(0) ;
  }
  TIterator* iter = vars.createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    if (!dvars->find(arg->GetName())) {
      coutE(InputArguments) << "RooHistFunc::ctor(" << GetName() 
			    << ") ERROR variable list and RooDataHist must contain the same variables." << endl ;
      assert(0) ;
    }
  }
  delete iter ;
  TRACE_CREATE 
}



//_____________________________________________________________________________
RooHistFunc::RooHistFunc(const char *name, const char *title, const RooArgList& funcObs, const RooArgList& histObs, 
  		       const RooDataHist& dhist, Int_t intOrder) :
  RooAbsReal(name,title), 
  _depList("depList","List of dependents",this),
  _dataHist((RooDataHist*)&dhist), 
  _codeReg(10),
  _intOrder(intOrder),
  _cdfBoundaries(kFALSE),
  _totVolume(0),
  _unitNorm(kFALSE)
{
  // Constructor from a RooDataHist. The variable listed in 'vars' control the dimensionality of the
  // function. Any additional dimensions present in 'dhist' will be projected out. RooDataHist dimensions
  // can be either real or discrete. See RooDataHist::RooDataHist for details on the binning.
  // RooHistFunc neither owns or clone 'dhist' and the user must ensure the input histogram exists
  // for the entire life span of this function.

  _histObsList.addClone(histObs) ;
  _depList.add(funcObs) ;

  _histObsIter = _histObsList.createIterator() ;
  _pdfObsIter = _depList.createIterator() ;

  // Verify that vars and dhist.get() have identical contents
  const RooArgSet* dvars = dhist.get() ;
  if (histObs.getSize()!=dvars->getSize()) {
    coutE(InputArguments) << "RooHistFunc::ctor(" << GetName() 
			  << ") ERROR variable list and RooDataHist must contain the same variables." << endl ;
    assert(0) ;
  }
  TIterator* iter = histObs.createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    if (!dvars->find(arg->GetName())) {
      coutE(InputArguments) << "RooHistFunc::ctor(" << GetName() 
			    << ") ERROR variable list and RooDataHist must contain the same variables." << endl ;
      assert(0) ;
    }
  }
  delete iter ;
  TRACE_CREATE 
}



//_____________________________________________________________________________
RooHistFunc::RooHistFunc(const RooHistFunc& other, const char* name) :
  RooAbsReal(other,name), 
  _depList("depList",this,other._depList),
  _dataHist(other._dataHist),
  _codeReg(other._codeReg),
  _intOrder(other._intOrder),
  _cdfBoundaries(other._cdfBoundaries),
  _totVolume(other._totVolume),
  _unitNorm(other._unitNorm)
{
  // Copy constructor
  TRACE_CREATE 

  _histObsList.addClone(other._histObsList) ;

  _histObsIter = _histObsList.createIterator() ;
  _pdfObsIter = _depList.createIterator() ;
}



//_____________________________________________________________________________
RooHistFunc::~RooHistFunc() 
{ 
  TRACE_DESTROY 

  delete _histObsIter ;
  delete _pdfObsIter ;
}




//_____________________________________________________________________________
Double_t RooHistFunc::evaluate() const
{
  // Return the current value: The value of the bin enclosing the current coordinates
  // of the dependents, normalized by the histograms contents. Interpolation
  // is applied if the RooHistFunc is configured to do that

  // Transfer values from   
  if (_depList.getSize()>0) {
    _histObsIter->Reset() ;
    _pdfObsIter->Reset() ;
    RooAbsArg* harg, *parg ;
    while((harg=(RooAbsArg*)_histObsIter->Next())) {
      parg = (RooAbsArg*)_pdfObsIter->Next() ;
      if (harg != parg) {
	parg->syncCache() ;
	harg->copyCache(parg,kTRUE) ;
	if (!harg->inRange(0)) {
	  return 0 ;
	}
      }
    }
  }

  Double_t ret =  _dataHist->weight(_histObsList,_intOrder,kFALSE,_cdfBoundaries) ;  
  return ret ;
}

//_____________________________________________________________________________
Int_t RooHistFunc::getMaxVal(const RooArgSet& vars) const 
{
  // Only handle case of maximum in all variables
  RooAbsCollection* common = _depList.selectCommon(vars) ;
  if (common->getSize()==_depList.getSize()) {
    delete common ;
    return 1;
  }
  delete common ;
  return 0 ;
}

//_____________________________________________________________________________
Double_t RooHistFunc::maxVal(Int_t code) const 
{
  R__ASSERT(code==1) ;

  Double_t max(-1) ;
  for (Int_t i=0 ; i<_dataHist->numEntries() ; i++) {
    _dataHist->get(i) ;
    Double_t wgt = _dataHist->weight() ;
    if (wgt>max) max=wgt ;
  }

  return max*1.05 ;
}

//_____________________________________________________________________________
Double_t RooHistFunc::totVolume() const
{
  // Return the total volume spanned by the observables of the RooDataHist

  // Return previously calculated value, if any
  if (_totVolume>0) {
    return _totVolume ;
  }
  _totVolume = 1. ;
  TIterator* iter = _depList.createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    RooRealVar* real = dynamic_cast<RooRealVar*>(arg) ;
    if (real) {
      _totVolume *= (real->getMax()-real->getMin()) ;
    } else {
      RooCategory* cat = dynamic_cast<RooCategory*>(arg) ;
      if (cat) {
	_totVolume *= cat->numTypes() ;
      }
    }
  }
  delete iter ;
  return _totVolume ;
}



//_____________________________________________________________________________
Int_t RooHistFunc::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName) const 
{
  // Determine integration scenario. If no interpolation is used,
  // RooHistFunc can perform all integrals over its dependents
  // analytically via partial or complete summation of the input
  // histogram. If interpolation is used, only the integral
  // over all RooHistPdf observables is implemented.


  // Only analytical integrals over the full range are defined
  if (rangeName!=0) {
    return 0 ;
  }

  // Simplest scenario, integrate over all dependents
  RooAbsCollection *allVarsCommon = allVars.selectCommon(_depList) ;  
  Bool_t intAllObs = (allVarsCommon->getSize()==_depList.getSize()) ;  
  delete allVarsCommon ;
  if (intAllObs && matchArgs(allVars,analVars,_depList)) {
    return 1000 ;
  }

  // Disable partial analytical integrals if interpolation is used
  if (_intOrder>0) {
    return 0 ;
  }

  // Find subset of _depList that integration is requested over
  RooArgSet* allVarsSel = (RooArgSet*) allVars.selectCommon(_depList) ;
  if (allVarsSel->getSize()==0) {
    delete allVarsSel ;
    return 0 ;
  }

  // Partial integration scenarios.
  // Build unique code from bit mask of integrated variables in depList
  Int_t code(0),n(0) ;
  TIterator* iter = _depList.createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    if (allVars.find(arg->GetName())) code |= (1<<n) ;
    n++ ;
  }
  delete iter ;
  analVars.add(*allVarsSel) ;

  return code ;

}



//_____________________________________________________________________________
Double_t RooHistFunc::analyticalIntegral(Int_t code, const char* /*rangeName*/) const 
{
  // Return integral identified by 'code'. The actual integration
  // is deferred to RooDataHist::sum() which implements partial
  // or complete summation over the histograms contents

  // WVE needs adaptation for rangeName feature

  // Simplest scenario, integration over all dependents
  if (code==1000) {
    return _dataHist->sum(kTRUE) ;
  }

  // Partial integration scenario, retrieve set of variables, calculate partial sum
  RooArgSet intSet ;
  TIterator* iter = _depList.createIterator() ;
  RooAbsArg* arg ;
  Int_t n(0) ;
  while((arg=(RooAbsArg*)iter->Next())) {
    if (code & (1<<n)) {
      intSet.add(*arg) ;
    }
    n++ ;
  }
  delete iter ;

  if (_depList.getSize()>0) {
    _histObsIter->Reset() ;
    _pdfObsIter->Reset() ;
    RooAbsArg* harg, *parg ;
    while((harg=(RooAbsArg*)_histObsIter->Next())) {
      parg = (RooAbsArg*)_pdfObsIter->Next() ;
      if (harg != parg) {
	parg->syncCache() ;
	harg->copyCache(parg,kTRUE) ;
	if (!harg->inRange(0)) {
	  return 0 ;
	}
      }
    }
  }

  Double_t ret =  _dataHist->sum(intSet,_histObsList,kTRUE) ;
  return ret ;
}



//_____________________________________________________________________________
list<Double_t>* RooHistFunc::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const
{
  // Return sampling hint for making curves of (projections) of this function
  // as the recursive division strategy of RooCurve cannot deal efficiently
  // with the vertical lines that occur in a non-interpolated histogram

  // No hints are required when interpolation is used
  if (_intOrder>1) {
    return 0 ;
  }


  // Find histogram observable corresponding to pdf observable
  RooAbsArg* hobs(0) ;
  _histObsIter->Reset() ;
  _pdfObsIter->Reset() ;
  RooAbsArg* harg, *parg ;
  while((harg=(RooAbsArg*)_histObsIter->Next())) {
    parg = (RooAbsArg*)_pdfObsIter->Next() ;
    if (string(parg->GetName())==obs.GetName()) {
      hobs=harg ; 
    }
  }
  if (!hobs) {
    return 0 ;
  }

  // Check that observable is in dataset, if not no hint is generated
  RooAbsLValue* lvarg = dynamic_cast<RooAbsLValue*>(_dataHist->get()->find(hobs->GetName())) ;
  if (!lvarg) {
    return 0 ;
  }

  // Retrieve position of all bin boundaries
  const RooAbsBinning* binning = lvarg->getBinningPtr(0) ;
  Double_t* boundaries = binning->array() ;

  list<Double_t>* hint = new list<Double_t> ;

  // Widen range slighty
  xlo = xlo - 0.01*(xhi-xlo) ;
  xhi = xhi + 0.01*(xhi-xlo) ;

  Double_t delta = (xhi-xlo)*1e-8 ;
 
  // Construct array with pairs of points positioned epsilon to the left and
  // right of the bin boundaries
  for (Int_t i=0 ; i<binning->numBoundaries() ; i++) {
    if (boundaries[i]>=xlo && boundaries[i]<=xhi) {
      hint->push_back(boundaries[i]-delta) ;
      hint->push_back(boundaries[i]+delta) ;
    }
  }

  return hint ;
}


//______________________________________________________________________________
std::list<Double_t>* RooHistFunc::binBoundaries(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const 
{
  // Return sampling hint for making curves of (projections) of this function
  // as the recursive division strategy of RooCurve cannot deal efficiently
  // with the vertical lines that occur in a non-interpolated histogram

  // No hints are required when interpolation is used
  if (_intOrder>1) {
    return 0 ;
  }

  // Find histogram observable corresponding to pdf observable
  RooAbsArg* hobs(0) ;
  _histObsIter->Reset() ;
  _pdfObsIter->Reset() ;
  RooAbsArg* harg, *parg ;
  while((harg=(RooAbsArg*)_histObsIter->Next())) {
    parg = (RooAbsArg*)_pdfObsIter->Next() ;
    if (string(parg->GetName())==obs.GetName()) {
      hobs=harg ; 
    }
  }

  // cout << "RooHistFunc::bb(" << GetName() << ") histObs = " << _histObsList << endl ;
  // cout << "RooHistFunc::bb(" << GetName() << ") pdfObs = " << _depList << endl ;

  RooAbsRealLValue* transform(0) ;
  if (!hobs) {

    // Considering alternate: input observable is histogram observable and pdf observable is transformation in terms of it
    RooAbsArg* pobs(0) ;
    _histObsIter->Reset() ;
    _pdfObsIter->Reset() ;
    while((harg=(RooAbsArg*)_histObsIter->Next())) {
      parg = (RooAbsArg*)_pdfObsIter->Next() ;
      if (string(harg->GetName())==obs.GetName()) {
	pobs=parg ; 
	hobs=harg ;
      }
    }

    // Not found, or check that matching pdf observable is an l-value dependent on histogram observable fails
    if (!hobs || !(pobs->dependsOn(obs) && dynamic_cast<RooAbsRealLValue*>(pobs))) {
      cout << "RooHistFunc::binBoundaries(" << GetName() << ") obs = " << obs.GetName() << " hobs is not found, returning null" << endl ;
      return 0 ;
    }

    // Now we are in business - we are in a situation where the pdf observable LV(x), mapping to a histogram observable x
    // We can return bin boundaries by mapping the histogram boundaties through the inverse of the LV(x) transformation
    transform = dynamic_cast<RooAbsRealLValue*>(pobs) ;
  }


  // cout << "hobs = " << hobs->GetName() << endl ;
  // cout << "transform = " << (transform?transform->GetName():"<none>") << endl ;

  // Check that observable is in dataset, if not no hint is generated
  RooAbsArg* xtmp = _dataHist->get()->find(hobs->GetName()) ;
  if (!xtmp) {
    cout << "RooHistFunc::binBoundaries(" << GetName() << ") hobs = " << hobs->GetName() << " is not found in dataset?" << endl ;
    _dataHist->get()->Print("v") ;
    return 0 ;
  }
  RooAbsLValue* lvarg = dynamic_cast<RooAbsLValue*>(_dataHist->get()->find(hobs->GetName())) ;
  if (!lvarg) {
    cout << "RooHistFunc::binBoundaries(" << GetName() << ") hobs = " << hobs->GetName() << " but is not an LV, returning null" << endl ;
    return 0 ;
  }

  // Retrieve position of all bin boundaries
  const RooAbsBinning* binning = lvarg->getBinningPtr(0) ;
  Double_t* boundaries = binning->array() ;

  list<Double_t>* hint = new list<Double_t> ;

  // Construct array with pairs of points positioned epsilon to the left and
  // right of the bin boundaries
  for (Int_t i=0 ; i<binning->numBoundaries() ; i++) {
    if (boundaries[i]>=xlo && boundaries[i]<=xhi) {
      
      Double_t boundary = boundaries[i] ;
      if (transform) {
	transform->setVal(boundary) ;
	//cout << "transform bound " << boundary << " using " << transform->GetName() << " result " << obs.getVal() << endl ;
	hint->push_back(obs.getVal()) ;
      } else {	
	hint->push_back(boundary) ;
      }
    }
  }

  return hint ;
}



//_____________________________________________________________________________
Bool_t RooHistFunc::importWorkspaceHook(RooWorkspace& ws) 
{  
  // Check if our datahist is already in the workspace
  std::list<RooAbsData*> allData = ws.allEmbeddedData() ;
  std::list<RooAbsData*>::const_iterator iter ;
  for (iter = allData.begin() ; iter != allData.end() ; ++iter) {
    // If your dataset is already in this workspace nothing needs to be done
    if (*iter == _dataHist) {
      return kFALSE ;
    }
  }

  // Check if dataset with given name already exists
  RooAbsData* wsdata = ws.embeddedData(_dataHist->GetName()) ;

  if (wsdata) {

    // Yes it exists - now check if it is identical to our internal histogram 
    if (wsdata->InheritsFrom(RooDataHist::Class())) {

      // Check if histograms are identical
      if (areIdentical((RooDataHist&)*wsdata,*_dataHist)) {

	// Exists and is of correct type, and identical -- adjust internal pointer to WS copy
	_dataHist = (RooDataHist*) wsdata ;
      } else {

	// not identical, clone rename and import
	TString uniqueName = Form("%s_%s",_dataHist->GetName(),GetName()) ;
	Bool_t flag = ws.import(*_dataHist,RooFit::Rename(uniqueName.Data()),RooFit::Embedded()) ;
	if (flag) {
	  coutE(ObjectHandling) << " RooHistPdf::importWorkspaceHook(" << GetName() << ") unable to import clone of underlying RooDataHist with unique name " << uniqueName << ", abort" << endl ;
	  return kTRUE ;
	}
	_dataHist = (RooDataHist*) ws.embeddedData(uniqueName.Data()) ;
      }

    } else {

      // Exists and is NOT of correct type: clone rename and import
      TString uniqueName = Form("%s_%s",_dataHist->GetName(),GetName()) ;
      Bool_t flag = ws.import(*_dataHist,RooFit::Rename(uniqueName.Data()),RooFit::Embedded()) ;
      if (flag) {
	coutE(ObjectHandling) << " RooHistPdf::importWorkspaceHook(" << GetName() << ") unable to import clone of underlying RooDataHist with unique name " << uniqueName << ", abort" << endl ;
	return kTRUE ;
      }
      _dataHist = (RooDataHist*) ws.embeddedData(uniqueName.Data()) ;
      
    }
    return kFALSE ;
  }
  
  // We need to import our datahist into the workspace
  ws.import(*_dataHist,RooFit::Embedded()) ;
  
  // Redirect our internal pointer to the copy in the workspace
  _dataHist = (RooDataHist*) ws.embeddedData(_dataHist->GetName()) ;
  return kFALSE ;
}


//_____________________________________________________________________________
Bool_t RooHistFunc::areIdentical(const RooDataHist& dh1, const RooDataHist& dh2) 
{
  if (fabs(dh1.sumEntries()-dh2.sumEntries())>1e-8) return kFALSE ;
  if (dh1.numEntries() != dh2.numEntries()) return kFALSE ;
  for (int i=0 ; i < dh1.numEntries() ; i++) {
    dh1.get(i) ;
    dh2.get(i) ;
    if (fabs(dh1.weight()-dh2.weight())>1e-8) return kFALSE ;
  }
  if (!(RooNameSet(*dh1.get())==RooNameSet(*dh2.get()))) return kFALSE ;
  return kTRUE ;
}



//______________________________________________________________________________
void RooHistFunc::Streamer(TBuffer &R__b)
{
   // Stream an object of class RooHistFunc.

   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(RooHistFunc::Class(),this);
      // WVE - interim solution - fix proxies here
      _proxyList.Clear() ;
      registerProxy(_depList) ;
   } else {
      R__b.WriteClassBuffer(RooHistFunc::Class(),this);
   }
}


//______________________________________________________________________________
void RooHistFunc::ioStreamerPass2() 
{
  // Schema evolution: if histObsList wasn't filled from persistence (v1)
  // then fill it here. Can't be done in regular schema evolution in LinkDef
  // as _depList content is not guaranteed to be initialized there

  if (_histObsList.getSize()==0) {
    _histObsList.addClone(_depList) ;
  }
}

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