48 ClassImp(RooAbsNumGenerator);
58 RooAbsNumGenerator::RooAbsNumGenerator(
const RooAbsReal &func,
const RooArgSet &genVars, Bool_t verbose,
const RooAbsReal* maxFuncVal) :
59 TNamed(func), _cloneSet(0), _funcClone(0), _funcMaxVal(maxFuncVal), _verbose(verbose), _funcValStore(0), _funcValPtr(0), _cache(0)
63 RooArgSet nodes(func,func.GetName());
64 _cloneSet= (RooArgSet*) nodes.snapshot(kTRUE);
66 coutE(Generation) <<
"RooAbsNumGenerator::RooAbsNumGenerator(" << GetName() <<
") Couldn't deep-clone function, abort," << endl ;
67 RooErrorHandler::softAbort() ;
71 _funcClone = (RooAbsReal*)_cloneSet->find(func.GetName());
78 TIterator *iterator= genVars.createIterator();
79 const RooAbsArg *found = 0;
80 const RooAbsArg *arg = 0;
81 while((arg= (
const RooAbsArg*)iterator->Next())) {
82 if(!arg->isFundamental()) {
83 coutE(Generation) << fName <<
"::" << ClassName() <<
": cannot generate values for derived \""
84 << arg->GetName() <<
"\"" << endl;
89 found= (
const RooAbsArg*)_cloneSet->find(arg->GetName());
94 arg= _cloneSet->addClone(*arg);
98 const RooCategory *catVar=
dynamic_cast<const RooCategory*
>(arg);
99 const RooRealVar *realVar=
dynamic_cast<const RooRealVar*
>(arg);
101 _catVars.add(*catVar);
103 else if(0 != realVar) {
104 if(realVar->hasMin() && realVar->hasMax()) {
105 _realVars.add(*realVar);
108 coutE(Generation) << fName <<
"::" << ClassName() <<
": cannot generate values for \""
109 << realVar->GetName() <<
"\" with unbound range" << endl;
114 coutE(Generation) << fName <<
"::" << ClassName() <<
": cannot generate values for \""
115 << arg->GetName() <<
"\" with unexpected type" << endl;
121 coutE(Generation) << fName <<
"::" << ClassName() <<
": constructor failed with errors" << endl;
126 _funcValStore=
dynamic_cast<RooRealVar*
>(_funcClone->createFundamental());
127 assert(0 != _funcValStore);
130 RooArgSet cacheArgs(_catVars);
131 cacheArgs.add(_realVars);
132 cacheArgs.add(*_funcValStore);
133 _cache=
new RooDataSet(
"cache",
"Accept-Reject Event Cache",cacheArgs);
137 const RooArgSet *cacheVars= _cache->get();
138 assert(0 != cacheVars);
139 _funcClone->recursiveRedirectServers(*cacheVars,kFALSE);
142 const RooArgSet *dataVars= _cache->get();
143 _catVars.replace(*dataVars);
144 _realVars.replace(*dataVars);
147 _funcValPtr= (RooRealVar*)dataVars->find(_funcValStore->GetName());
156 RooAbsNumGenerator::~RooAbsNumGenerator()
160 delete _funcValStore ;
168 void RooAbsNumGenerator::attachParameters(
const RooArgSet& vars)
170 RooArgSet newParams(vars) ;
171 newParams.remove(*_cache->get(),kTRUE,kTRUE) ;
172 _funcClone->recursiveRedirectServers(newParams) ;
182 void RooAbsNumGenerator::printName(ostream& os)
const
192 void RooAbsNumGenerator::printTitle(ostream& os)
const
202 void RooAbsNumGenerator::printClassName(ostream& os)
const
204 os << IsA()->GetName() ;
212 void RooAbsNumGenerator::printArgs(ostream& os)
const
214 os <<
"[ function=" << _funcClone->GetName() <<
" catobs=" << _catVars <<
" realobs=" << _realVars <<
" ]" ;