#include "RooFit.h"
#include "RooDataProjBinding.h"
#include "RooDataProjBinding.h"
#include "RooAbsReal.h"
#include "RooAbsData.h"
#include "Roo1DTable.h"
#include "RooSuperCategory.h"
#include "RooCategory.h"
#include "RooAbsPdf.h"
#include <assert.h>
ClassImp(RooDataProjBinding)
;
RooDataProjBinding::RooDataProjBinding(const RooAbsReal &real, const RooAbsData& data, 
				       const RooArgSet &vars, const RooArgSet* nset) :
  RooRealBinding(real,vars,0), _first(kTRUE), _real(&real), _data(&data), _nset(nset), 
  _superCat(0), _catTable(0)
{  
  
  
  TIterator* iter = data.get()->createIterator() ;
  Bool_t allCat(kTRUE) ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    if (!dynamic_cast<RooCategory*>(arg)) allCat = kFALSE ;
  }
  delete iter ;
  
  
  if (allCat) {
     _superCat = new RooSuperCategory("superCat","superCat",*data.get()) ;
     _catTable = data.table(*_superCat) ;
  }
}
RooDataProjBinding::~RooDataProjBinding() 
{
  
  if (_superCat) delete _superCat ;
  if (_catTable) delete _catTable ;
}
Double_t RooDataProjBinding::operator()(const Double_t xvector[]) const 
{
  
  assert(isValid());
  loadValues(xvector);    
  
  Double_t result(0) ;
  Double_t wgtSum(0) ;  
  if (_catTable) {
    
    TIterator* iter = _superCat->typeIterator() ;
    RooCatType* type ;
    while((type=(RooCatType*)iter->Next())) {
      
      _superCat->setIndex(type->getVal()) ;
      
      Double_t wgt = _catTable->get(type->GetName()) ;
      if (wgt) {
	result += wgt * _real->getVal(_nset) ;
	wgtSum += wgt ;
      }
    }
    delete iter ;
    
  } else {
    
    Int_t i ;
    Int_t nEvt = _data->numEntries() ;
    
    if (_first) {
      cout << "RooDataProjBinding::operator() projecting over " << nEvt << " events" << endl ;
      _first = kFALSE ;
    } else {
      cout << "." ; cout.flush() ;
    }
    for (i=0 ; i<nEvt ; i++) {
      _data->get(i) ;
      Double_t wgt = _data->weight() ;
      if (wgt) {
	result += wgt * _real->getVal(_nset) ;
	wgtSum += wgt ;
      }      
    }
  }
  
  if (wgtSum==0) return 0 ;
  return result / wgtSum ;
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.