/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, NIKHEF, verkerke@nikhef.nl                         *
 *                                                                           *
 * Copyright (c) 2000-2011, 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
// RooUnit test is an abstract base class for unit regression tests for
// RooFit and RooStats tests performed in stressRooFit and stressRooStats
//
// Implementations of this class must implement abstract method testCode()
// which defines the regression test to be performed. Inside testCode()
// the regression test can define objects on which the regression is performed.
// These are
//    RooPlot      - regPlot() ;
//    RooFitResult - regFitResult() ;
//    Double_t     - regValue() ;
//    RooTable     - regTable() ;
//    TH1/2/3      - regTH 
//
//    RooWorkspace - regWS() ;
// 
//
// END_HTML
//
//

#include "RooFit.h"
#include "RooUnitTest.h"
#include "TROOT.h"
#include "TClass.h"
#include "TSystem.h"
#include "RooHist.h"
#include "RooMsgService.h"
#include "RooDouble.h"
#include "RooTrace.h"
#include "RooRandom.h"
#include <math.h>

ClassImp(RooUnitTest)
;

using namespace std; 

TDirectory* RooUnitTest::gMemDir = 0 ;


//_____________________________________________________________________________
RooUnitTest::RooUnitTest(const char* name, TFile* refFile, Bool_t writeRef, Int_t verbose) : TNamed(name,name), 
  			                         _refFile(refFile), _debug(kFALSE), _write(writeRef), _verb(verbose)
{
}



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


//_____________________________________________________________________________
void RooUnitTest::regPlot(RooPlot* frame, const char* refName) 
{
  if (_refFile) {
    string refNameStr(refName) ;
    frame->SetName(refName) ;
    _regPlots.push_back(make_pair(frame,refNameStr)) ;
  } else {
    delete frame ;
  }
}


//_____________________________________________________________________________
void RooUnitTest::regResult(RooFitResult* r, const char* refName) 
{
  if (_refFile) {
    string refNameStr(refName) ;
    _regResults.push_back(make_pair(r,refNameStr)) ;
  } else {
    delete r ;
  }
}


//_____________________________________________________________________________
void RooUnitTest::regValue(Double_t d, const char* refName) 
{
  if (_refFile) {
    string refNameStr(refName) ;
    _regValues.push_back(make_pair(d,refNameStr)) ;
  }
}


//_____________________________________________________________________________
void RooUnitTest::regTable(RooTable* t, const char* refName) 
{
  if (_refFile) {
    string refNameStr(refName) ;
    _regTables.push_back(make_pair(t,refNameStr)) ;
  } else {
    delete t ;
  }
}


//_____________________________________________________________________________
void RooUnitTest::regWS(RooWorkspace* ws, const char* refName) 
{
  if (_refFile) {
    string refNameStr(refName) ;
    _regWS.push_back(make_pair(ws,refNameStr)) ;
  } else {
    delete ws ;
  }
}


//_____________________________________________________________________________
void RooUnitTest::regTH(TH1* th, const char* refName) 
{
  if (_refFile) {
    string refNameStr(refName) ;
    _regTH.push_back(make_pair(th,refNameStr)) ;
  } else {
    delete th ;
  }
}


//_____________________________________________________________________________
RooWorkspace* RooUnitTest::getWS(const char* refName) 
{
  RooWorkspace* ws = dynamic_cast<RooWorkspace*>(_refFile->Get(refName)) ;
  if (!ws) {
    cout << "RooUnitTest ERROR: cannot retrieve RooWorkspace " << refName 
	 << " from reference file, skipping " << endl ;
    return 0 ;
  }
  
  return ws ;
}


//_____________________________________________________________________________
Bool_t RooUnitTest::areTHidentical(TH1* htest, TH1* href) 
{
  if (htest->GetDimension() != href->GetDimension()) {
    return kFALSE ;
  }

  // Use Kolmogorov distance as metric rather than probability
  // because we expect histograms to be identical rather
  // than drawn from the same parent distribution
  Double_t kmax = htest->KolmogorovTest(href,"M") ;

  if (kmax>htol()) {

    cout << "KS distances = " << kmax << endl ;

    Int_t ntest = htest->GetNbinsX() +2 ;
    Int_t nref  = href->GetNbinsX() +2 ;
    if (htest->GetDimension()>1) {
      ntest *= htest->GetNbinsY() + 2 ;
      nref *= href->GetNbinsY() + 2 ;
    }
    if (htest->GetDimension()>2) {
      ntest *= htest->GetNbinsZ() + 2 ;
      nref *= href->GetNbinsZ() + 2 ;
    }
    
    if (ntest != nref) {
      return kFALSE ;
    }
    
    for (Int_t i=0 ; i<ntest ; i++) {
      if (fabs(htest->GetBinContent(i)-href->GetBinContent(i))>htol()) {
	cout << "htest[" << i << "] = " << htest->GetBinContent(i) << " href[" << i << "] = " << href->GetBinContent(i) << endl; 
      }
    }

    return kFALSE ;
  }

  return kTRUE ;
}



//_____________________________________________________________________________
Bool_t RooUnitTest::runCompTests() 
{
  Bool_t ret = kTRUE ;

  list<pair<RooPlot*, string> >::iterator iter = _regPlots.begin() ;
  while (iter!=_regPlots.end()) {

    if (!_write) {

      // Comparison mode
      
      // Retrieve benchmark
      RooPlot* bmark = dynamic_cast<RooPlot*>(_refFile->Get(iter->second.c_str())) ;
      if (!bmark) {
	cout << "RooUnitTest ERROR: cannot retrieve RooPlot " << iter->second << " from reference file, skipping " << endl ;
	ret = kFALSE ;
	++iter ;
	continue ;
      }
      
      if (_verb) {
	cout << "comparing RooPlot " << iter->first << " to benchmark " << iter->second << " = " << bmark << endl ;      
	cout << "reference: " ; iter->first->Print() ;
	cout << "benchmark: " ; bmark->Print() ;
      }

      RooPlot* compPlot = _debug ? iter->first->emptyClone(Form("%s_comparison",iter->first->GetName())) : 0 ;
      Bool_t anyFail=kFALSE ;
      
      Stat_t nItems = iter->first->numItems() ;
      for (Stat_t i=0 ; i<nItems ; i++) {
	// coverity[NULL_RETURNS]
	TObject* obj = iter->first->getObject((Int_t)i) ;
	
	// Retrieve corresponding object from reference frame
	TObject* objRef = bmark->findObject(obj->GetName()) ;
	
	if (!objRef) {
	  cout << "RooUnitTest ERROR: cannot retrieve object " << obj->GetName() << " from reference  RooPlot " << iter->second << ", skipping" << endl ;
	  ret = kFALSE ;
	  break ;
	}
	
	// Histogram comparisons
	if (obj->IsA()==RooHist::Class()) {
	  RooHist* testHist = static_cast<RooHist*>(obj) ;
	  RooHist* refHist = static_cast<RooHist*>(objRef) ;
	  if (!testHist->isIdentical(*refHist,htol())) {
	    cout << "RooUnitTest ERROR: comparison of object " << obj->IsA()->GetName() << "::" << obj->GetName() 
		 <<   " fails comparison with counterpart in reference RooPlot " << bmark->GetName() << endl ;
	    
	    if (compPlot) {
	      compPlot->addPlotable((RooHist*)testHist->Clone(),"P") ;	    
	      compPlot->getAttLine()->SetLineColor(kRed) ;
	      compPlot->getAttMarker()->SetMarkerColor(kRed) ;
	      compPlot->getAttLine()->SetLineWidth(1) ;
	      
	      compPlot->addPlotable((RooHist*)refHist->Clone(),"P") ;
	      compPlot->getAttLine()->SetLineColor(kBlue) ;
	      compPlot->getAttMarker()->SetMarkerColor(kBlue) ;
	      compPlot->getAttLine()->SetLineWidth(1) ;
	    }

	    anyFail=kTRUE ;
	    ret = kFALSE ;
	  }
	} else if (obj->IsA()==RooCurve::Class()) {
	  RooCurve* testCurve = static_cast<RooCurve*>(obj) ;
	  RooCurve* refCurve = static_cast<RooCurve*>(objRef) ;
	  if (!testCurve->isIdentical(*refCurve,ctol())) {
	    cout << "RooUnitTest ERROR: comparison of object " << obj->IsA()->GetName() << "::" << obj->GetName() 
		 <<   " fails comparison with counterpart in reference RooPlot " << bmark->GetName() << endl ;

	    if (compPlot) {
	      compPlot->addPlotable((RooCurve*)testCurve->Clone()) ;
	      compPlot->getAttLine()->SetLineColor(kRed) ;
	      compPlot->getAttLine()->SetLineWidth(1) ;
	      compPlot->getAttLine()->SetLineStyle(kSolid) ;
	      
	      compPlot->addPlotable((RooCurve*)refCurve->Clone()) ;
	      compPlot->getAttLine()->SetLineColor(kBlue) ;
	      compPlot->getAttLine()->SetLineWidth(1) ;
	      compPlot->getAttLine()->SetLineStyle(kDashed) ;
	    }

	    anyFail=kTRUE ;
	    ret = kFALSE ;
	  }
	  
	}	
	
      }

      if (anyFail && compPlot) {
	cout << "RooUnitTest INFO: writing comparison plot " << compPlot->GetName() << " of failed test to RooUnitTest_DEBUG.root" << endl ;
	TFile fdbg("RooUnitTest_DEBUG.root","UPDATE") ;
	compPlot->Write() ;
	fdbg.Close() ;
      } else {
	delete compPlot ;
      }

      // Delete RooPlot when comparison is finished to avoid noise in leak checking
      delete iter->first ;

    } else {

      // Writing mode

      cout <<"RooUnitTest: Writing reference RooPlot " << iter->first << " as benchmark " << iter->second << endl ;
      _refFile->cd() ;
      iter->first->Write(iter->second.c_str()) ;
      gMemDir->cd() ;
    }
      
    ++iter ;
  }


  list<pair<RooFitResult*, string> >::iterator iter2 = _regResults.begin() ;
  while (iter2!=_regResults.end()) {

    if (!_write) {

      // Comparison mode
 
     // Retrieve benchmark
      RooFitResult* bmark = dynamic_cast<RooFitResult*>(_refFile->Get(iter2->second.c_str())) ;
      if (!bmark) {
	cout << "RooUnitTest ERROR: cannot retrieve RooFitResult " << iter2->second << " from reference file, skipping " << endl ;
	++iter2 ;
	ret = kFALSE ;
	continue ;
      }

      if (_verb) {
	cout << "comparing RooFitResult " << iter2->first << " to benchmark " << iter2->second << " = " << bmark << endl ;      
      }

      if (!iter2->first->isIdentical(*bmark,fptol(),fctol())) {
	cout << "RooUnitTest ERROR: comparison of object " << iter2->first->IsA()->GetName() << "::" << iter2->first->GetName() 
	     <<   " fails comparison with counterpart in reference RooFitResult " << bmark->GetName() << endl ;
	ret = kFALSE ;
      }

      // Delete RooFitResult when comparison is finished to avoid noise in leak checking
      delete iter2->first ;
      
        
    } else {

      // Writing mode
      
      cout <<"RooUnitTest: Writing reference RooFitResult " << iter2->first << " as benchmark " << iter2->second << endl ;
      _refFile->cd() ;
      iter2->first->Write(iter2->second.c_str()) ;
      gMemDir->cd() ;
    }
      
    ++iter2 ;
  }

  list<pair<Double_t, string> >::iterator iter3 = _regValues.begin() ;
  while (iter3!=_regValues.end()) {

    if (!_write) {

      // Comparison mode
 
     // Retrieve benchmark
      RooDouble* ref = dynamic_cast<RooDouble*>(_refFile->Get(iter3->second.c_str())) ;
      if (!ref) {
	cout << "RooUnitTest ERROR: cannot retrieve RooDouble " << iter3->second << " from reference file, skipping " << endl ;
	++iter3 ;
	ret = kFALSE ;
	continue ;
      }
      
      if (_verb) {
	cout << "comparing value " << iter3->first << " to benchmark " << iter3->second << " = " << (Double_t)(*ref) << endl ;      
      }

      if (fabs(iter3->first - (Double_t)(*ref))>vtol() ) {
	cout << "RooUnitTest ERROR: comparison of value " << iter3->first <<   " fails comparison with reference " << ref->GetName() << endl ;
	ret = kFALSE ;
      }
     
        
    } else {

      // Writing mode
      
      cout <<"RooUnitTest: Writing reference Double_t " << iter3->first << " as benchmark " << iter3->second << endl ;
      _refFile->cd() ;
      RooDouble* rd = new RooDouble(iter3->first) ;
      rd->Write(iter3->second.c_str()) ;
      gMemDir->cd() ;
    }
      
    ++iter3 ;
  }


  list<pair<RooTable*, string> >::iterator iter4 = _regTables.begin() ;
  while (iter4!=_regTables.end()) {

    if (!_write) {

      // Comparison mode
 
     // Retrieve benchmark
      RooTable* bmark = dynamic_cast<RooTable*>(_refFile->Get(iter4->second.c_str())) ;
      if (!bmark) {
	cout << "RooUnitTest ERROR: cannot retrieve RooTable " << iter4->second << " from reference file, skipping " << endl ;
	++iter4 ;
	ret = kFALSE ;
	continue ;
      }

      if (_verb) {
	cout << "comparing RooTable " << iter4->first << " to benchmark " << iter4->second << " = " << bmark << endl ;      
      }

      if (!iter4->first->isIdentical(*bmark)) {
	cout << "RooUnitTest ERROR: comparison of object " << iter4->first->IsA()->GetName() << "::" << iter4->first->GetName() 
	     <<   " fails comparison with counterpart in reference RooTable " << bmark->GetName() << endl ;
	ret = kFALSE ;
      }

      // Delete RooTable when comparison is finished to avoid noise in leak checking
      delete iter4->first ;
      
        
    } else {

      // Writing mode
      
      cout <<"RooUnitTest: Writing reference RooTable " << iter4->first << " as benchmark " << iter4->second << endl ;
      _refFile->cd() ;
      iter4->first->Write(iter4->second.c_str()) ;
      gMemDir->cd() ;
    }
      
    ++iter4 ;
  }


  list<pair<RooWorkspace*, string> >::iterator iter5 = _regWS.begin() ;
  while (iter5!=_regWS.end()) {

    if (_write) {

      // Writing mode
      
      cout <<"RooUnitTest: Writing reference RooWorkspace " << iter5->first << " as benchmark " << iter5->second << endl ;
      _refFile->cd() ;
      iter5->first->Write(iter5->second.c_str()) ;
      gMemDir->cd() ;
    }
      
    ++iter5 ;
  }

  /////////////////
  list<pair<TH1*, string> >::iterator iter6 = _regTH.begin() ;
  while (iter6!=_regTH.end()) {

    if (!_write) {

      // Comparison mode
 
     // Retrieve benchmark
      TH1* bmark = dynamic_cast<TH1*>(_refFile->Get(iter6->second.c_str())) ;
      if (!bmark) {
	cout << "RooUnitTest ERROR: cannot retrieve TH1 " << iter6->second << " from reference file, skipping " << endl ;
	++iter6 ;
	ret = kFALSE ;
	continue ;
      }

      if (_verb) {
	cout << "comparing TH1 " << iter6->first << " to benchmark " << iter6->second << " = " << bmark << endl ;      
      }

      if (!areTHidentical(iter6->first,bmark)) {
	// coverity[NULL_RETURNS]
	cout << "RooUnitTest ERROR: comparison of object " << iter6->first->IsA()->GetName() << "::" << iter6->first->GetName() 
	     <<   " fails comparison with counterpart in reference TH1 " << bmark->GetName() << endl ;


      if (_debug) {
	cout << "RooUnitTest INFO: writing THx " << iter6->first->GetName() << " and " << bmark->GetName()  
	     << " of failed test to RooUnitTest_DEBUG.root" << endl ;
	TFile fdbg("RooUnitTest_DEBUG.root","UPDATE") ;
	iter6->first->SetName(Form("%s_test",iter6->first->GetName())) ;
	iter6->first->Write() ;
	bmark->SetName(Form("%s_ref",bmark->GetName())) ;
	bmark->Write() ;
	fdbg.Close() ;
      }

	ret = kFALSE ;
      }

      // Delete TH1 when comparison is finished to avoid noise in leak checking
      delete iter6->first ;
      
        
    } else {

      // Writing mode
      
      cout <<"RooUnitTest: Writing reference TH1 " << iter6->first << " as benchmark " << iter6->second << endl ;
      _refFile->cd() ;
      iter6->first->Write(iter6->second.c_str()) ;
      gMemDir->cd() ;
    }
      
    ++iter6 ;
  }


  /////////////////

  return ret ;
}


//_____________________________________________________________________________
void RooUnitTest::setSilentMode() 
{
  RooMsgService::instance().setSilentMode(kTRUE) ;
  for (Int_t i=0 ; i<RooMsgService::instance().numStreams() ; i++) {
    if (RooMsgService::instance().getStream(i).minLevel<RooFit::ERROR) {
      RooMsgService::instance().setStreamStatus(i,kFALSE) ;
    }
  }
}


//_____________________________________________________________________________
void RooUnitTest::clearSilentMode() 
{
  RooMsgService::instance().setSilentMode(kFALSE) ;
  for (Int_t i=0 ; i<RooMsgService::instance().numStreams() ; i++) {
    RooMsgService::instance().setStreamStatus(i,kTRUE) ;
  }  
}



//_____________________________________________________________________________
Bool_t RooUnitTest::runTest()
{
  gMemDir->cd() ;

  if (_verb<2) { 
    setSilentMode() ;
  } else {
    cout << "*** Begin of output of Unit Test at normal verbosity *************" << endl ;
  }  

  RooMsgService::instance().clearErrorCount() ;

  // Reset random generator seed to make results independent of test ordering
  gRandom->SetSeed(12345) ;
  RooRandom::randomGenerator()->SetSeed(12345) ;

  RooTrace::callgrind_zero() ;
  if (!testCode()) return kFALSE ;
  RooTrace::callgrind_dump() ;

  if (_verb<2) { 
    clearSilentMode() ;
  } else {
    cout << "*** End of output of Unit Test at normal verbosity ***************" << endl ;
  }

  if (RooMsgService::instance().errorCount()>0) {
    cout << "RooUnitTest: ERROR messages were logged, failing test" << endl ;
    return kFALSE ;
  }

  return runCompTests() ;
}


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