54 ClassImp(RooFoamGenerator);
61 void RooFoamGenerator::registerSampler(RooNumGenFactory& fact)
64 RooRealVar nSample(
"nSample",
"Number of samples per cell",200,0,1e6) ;
65 RooRealVar nCell1D(
"nCell1D",
"Number of cells for 1-dim generation",30,0,1e6) ;
66 RooRealVar nCell2D(
"nCell2D",
"Number of cells for 2-dim generation",500,0,1e6) ;
67 RooRealVar nCell3D(
"nCell3D",
"Number of cells for 3-dim generation",5000,0,1e6) ;
68 RooRealVar nCellND(
"nCellND",
"Number of cells for N-dim generation",10000,0,1e6) ;
69 RooRealVar chatLevel(
"chatLevel",
"TFOAM 'chat level' (verbosity)",0,0,2) ;
71 RooFoamGenerator* proto =
new RooFoamGenerator ;
72 fact.storeProtoSampler(proto,RooArgSet(nSample,nCell1D,nCell2D,nCell3D,nCellND,chatLevel)) ;
80 RooFoamGenerator::RooFoamGenerator(
const RooAbsReal &func,
const RooArgSet &genVars,
const RooNumGenConfig& config, Bool_t verbose,
const RooAbsReal* maxFuncVal) :
81 RooAbsNumGenerator(func,genVars,verbose,maxFuncVal)
83 _rvIter = _realVars.createIterator() ;
84 _binding =
new RooTFoamBinding(*_funcClone,_realVars) ;
86 _tfoam =
new TFoam(
"TFOAM") ;
87 _tfoam->SetkDim(_realVars.getSize()) ;
88 _tfoam->SetRho(_binding) ;
89 _tfoam->SetPseRan(RooRandom::randomGenerator()) ;
90 switch(_realVars.getSize()) {
91 case 1:_tfoam->SetnCells((Int_t)config.getConfigSection(
"RooFoamGenerator").getRealValue(
"nCell1D")) ; break ;
92 case 2:_tfoam->SetnCells((Int_t)config.getConfigSection(
"RooFoamGenerator").getRealValue(
"nCell2D")) ; break ;
93 case 3:_tfoam->SetnCells((Int_t)config.getConfigSection(
"RooFoamGenerator").getRealValue(
"nCell3D")) ; break ;
94 default:_tfoam->SetnCells((Int_t)config.getConfigSection(
"RooFoamGenerator").getRealValue(
"nCellND")) ; break ;
96 _tfoam->SetnSampl((Int_t)config.getConfigSection(
"RooFoamGenerator").getRealValue(
"nSample")) ;
97 _tfoam->SetPseRan(RooRandom::randomGenerator()) ;
98 _tfoam->SetChat((Int_t)config.getConfigSection(
"RooFoamGenerator").getRealValue(
"chatLevel")) ;
99 _tfoam->Initialize() ;
101 _vec =
new Double_t[_realVars.getSize()] ;
102 _xmin =
new Double_t[_realVars.getSize()] ;
103 _range =
new Double_t[_realVars.getSize()] ;
105 TIterator* iter = _realVars.createIterator() ;
108 while((var=(RooRealVar*)iter->Next())) {
109 _xmin[i] = var->getMin() ;
110 _range[i] = var->getMax() - var->getMin() ;
121 RooFoamGenerator::~RooFoamGenerator()
136 const RooArgSet *RooFoamGenerator::generateEvent(UInt_t , Double_t& )
138 const RooArgSet *
event= _cache->get();
139 if(event->getSize() == 1)
return event;
141 _tfoam->MakeEvent() ;
142 _tfoam->GetMCvect(_vec) ;
148 while((var=(RooRealVar*)_rvIter->Next())) {
149 var->setVal(_xmin[i] + _range[i]*_vec[i]) ;