46 using namespace RooFit ;
52 ClassImp(RooSimGenContext);
61 RooSimGenContext::RooSimGenContext(
const RooSimultaneous &model,
const RooArgSet &vars,
62 const RooDataSet *prototype,
const RooArgSet* auxProto, Bool_t verbose) :
63 RooAbsGenContext(model,vars,prototype,auxProto,verbose), _pdf(&model), _protoData(0)
66 RooAbsCategory *idxCat = (RooAbsCategory*) model._indexCat.absArg() ;
67 RooArgSet pdfVars(vars) ;
69 RooArgSet allPdfVars(pdfVars) ;
70 if (prototype) allPdfVars.add(*prototype->get(),kTRUE) ;
72 if (!idxCat->isDerived()) {
73 pdfVars.remove(*idxCat,kTRUE,kTRUE) ;
74 Bool_t doGenIdx = allPdfVars.find(idxCat->GetName())?kTRUE:kFALSE ;
77 oocoutE(_pdf,Generation) <<
"RooSimGenContext::ctor(" << GetName() <<
") ERROR: This context must"
78 <<
" generate the index category" << endl ;
81 _haveIdxProto = kFALSE ;
85 TIterator* sIter = idxCat->serverIterator() ;
87 Bool_t anyServer(kFALSE), allServers(kTRUE) ;
88 while((server=(RooAbsArg*)sIter->Next())) {
89 if (vars.find(server->GetName())) {
91 pdfVars.remove(*server,kTRUE,kTRUE) ;
98 if (anyServer && !allServers) {
99 oocoutE(_pdf,Generation) <<
"RooSimGenContext::ctor(" << GetName() <<
") ERROR: This context must"
100 <<
" generate all components of a derived index category" << endl ;
103 _haveIdxProto = kFALSE ;
110 _haveIdxProto = prototype ? kTRUE : kFALSE ;
111 _idxCatName = idxCat->GetName() ;
112 if (!_haveIdxProto && !model.canBeExtended()) {
113 oocoutE(_pdf,Generation) <<
"RooSimGenContext::ctor(" << GetName() <<
") ERROR: Need either extended mode"
114 <<
" or prototype data to calculate number of events per category" << endl ;
121 _numPdf = model._pdfProxyList.GetSize() ;
122 _fracThresh =
new Double_t[_numPdf+1] ;
126 _proxyIter = model._pdfProxyList.MakeIterator() ;
127 _allVarsPdf.add(allPdfVars) ;
128 RooRealProxy* proxy ;
131 while((proxy=(RooRealProxy*)_proxyIter->Next())) {
132 pdf=(RooAbsPdf*)proxy->absArg() ;
135 RooAbsGenContext* cx = pdf->genContext(pdfVars,prototype,auxProto,verbose) ;
138 cx->SetName(proxy->name()) ;
139 _gcList.push_back(cx) ;
140 _gcIndex.push_back(idxCat->lookupType(proxy->name())->getVal()) ;
143 _fracThresh[i] = _fracThresh[i-1] + (_haveIdxProto?0:pdf->expectedEvents(&allPdfVars)) ;
148 if (!_haveIdxProto) {
149 for(i=0 ; i<_numPdf ; i++)
150 _fracThresh[i] /= _fracThresh[_numPdf] ;
155 _idxCatSet = (RooArgSet*) RooArgSet(model._indexCat.arg()).snapshot(kTRUE) ;
157 oocoutE(_pdf,Generation) <<
"RooSimGenContext::RooSimGenContext(" << GetName() <<
") Couldn't deep-clone index category, abort," << endl ;
158 throw std::string(
"RooSimGenContext::RooSimGenContext() Couldn't deep-clone index category, abort") ;
161 _idxCat = (RooAbsCategoryLValue*) _idxCatSet->find(model._indexCat.arg().GetName()) ;
169 RooSimGenContext::~RooSimGenContext()
171 delete[] _fracThresh ;
173 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
177 if (_protoData)
delete _protoData ;
185 void RooSimGenContext::attach(
const RooArgSet& args)
187 if (_idxCat->isDerived()) {
188 _idxCat->recursiveRedirectServers(args,kTRUE) ;
192 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
193 (*iter)->attach(args) ;
202 void RooSimGenContext::initGenerator(
const RooArgSet &theEvent)
205 if (_idxCat->isDerived()) {
206 _idxCat->recursiveRedirectServers(theEvent,kTRUE) ;
208 _idxCat = (RooAbsCategoryLValue*) theEvent.find(_idxCat->GetName()) ;
215 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
216 (*iter)->initGenerator(theEvent) ;
225 RooDataSet* RooSimGenContext::createDataSet(
const char* name,
const char* title,
const RooArgSet& obs)
229 if (!obs.contains(*_idxCat)) {
230 return new RooDataSet(name,title,obs) ;
234 map<string,RooAbsData*> dmap ;
236 TIterator* iter = _idxCat->typeIterator() ;
237 while((state=(RooCatType*)iter->Next())) {
238 RooAbsPdf* slicePdf = _pdf->getPdf(state->GetName()) ;
239 RooArgSet* sliceObs = slicePdf->getObservables(obs) ;
240 std::string sliceName = Form(
"%s_slice_%s",name,state->GetName()) ;
241 std::string sliceTitle = Form(
"%s (index slice %s)",title,state->GetName()) ;
242 RooDataSet* dset =
new RooDataSet(sliceName.c_str(),sliceTitle.c_str(),*sliceObs) ;
243 dmap[state->GetName()] = dset ;
247 _protoData =
new RooDataSet(name, title, obs, Index((RooCategory&)*_idxCat), Link(dmap), OwnLinked()) ;
254 RooDataSet* emptyClone =
new RooDataSet(*_protoData,name) ;
268 void RooSimGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
273 Int_t gidx(0), cidx =_idxCat->getIndex() ;
274 for (Int_t i=0 ; i<(Int_t)_gcIndex.size() ; i++) {
275 if (_gcIndex[i]==cidx) { gidx = i ; break ; }
277 RooAbsGenContext* cx = _gcList[gidx] ;
279 cx->generateEvent(theEvent,remaining) ;
281 oocoutW(_pdf,Generation) <<
"RooSimGenContext::generateEvent: WARNING, no PDF to generate event of type " << cidx << endl ;
288 Double_t rand = RooRandom::uniform() ;
290 for (i=0 ; i<_numPdf ; i++) {
291 if (rand>_fracThresh[i] && rand<_fracThresh[i+1]) {
292 RooAbsGenContext* gen=_gcList[i] ;
293 gen->generateEvent(theEvent,remaining) ;
295 _idxCat->setIndex(_gcIndex[i]);
308 void RooSimGenContext::updateFractions()
310 if (_haveIdxProto) return ;
313 RooRealProxy* proxy ;
316 _proxyIter->Reset() ;
317 while((proxy=(RooRealProxy*)_proxyIter->Next())) {
318 pdf=(RooAbsPdf*)proxy->absArg() ;
321 _fracThresh[i] = _fracThresh[i-1] + (_haveIdxProto?0:pdf->expectedEvents(&_allVarsPdf)) ;
326 if (!_haveIdxProto) {
327 for(i=0 ; i<_numPdf ; i++)
328 _fracThresh[i] /= _fracThresh[_numPdf] ;
340 void RooSimGenContext::setProtoDataOrder(Int_t* lut)
342 RooAbsGenContext::setProtoDataOrder(lut) ;
344 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
345 (*iter)->setProtoDataOrder(lut) ;
353 void RooSimGenContext::printMultiline(ostream &os, Int_t content, Bool_t verbose, TString indent)
const
355 RooAbsGenContext::printMultiline(os,content,verbose,indent) ;
356 os << indent <<
"--- RooSimGenContext ---" << endl ;
357 os << indent <<
"Using PDF ";
358 _pdf->printStream(os,kName|kArgs|kClassName,kSingleLine,indent);
359 os << indent <<
"List of component generators" << endl ;
361 TString indent2(indent) ;
362 indent2.Append(
" ") ;
364 for (vector<RooAbsGenContext*>::const_iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
365 (*iter)->printMultiline(os,content,verbose,indent2);