40 using namespace RooFit ;
46 ClassImp(RooSimSplitGenContext);
55 RooSimSplitGenContext::RooSimSplitGenContext(
const RooSimultaneous &model,
const RooArgSet &vars, Bool_t verbose, Bool_t autoBinned,
const char* binnedTag) :
56 RooAbsGenContext(model,vars,0,0,verbose), _pdf(&model)
59 RooAbsCategory *idxCat = (RooAbsCategory*) model._indexCat.absArg() ;
60 RooArgSet pdfVars(vars) ;
62 RooArgSet allPdfVars(pdfVars) ;
64 if (!idxCat->isDerived()) {
65 pdfVars.remove(*idxCat,kTRUE,kTRUE) ;
66 Bool_t doGenIdx = allPdfVars.find(idxCat->GetName())?kTRUE:kFALSE ;
69 oocoutE(_pdf,Generation) <<
"RooSimSplitGenContext::ctor(" << GetName() <<
") ERROR: This context must"
70 <<
" generate the index category" << endl ;
77 TIterator* sIter = idxCat->serverIterator() ;
79 Bool_t anyServer(kFALSE), allServers(kTRUE) ;
80 while((server=(RooAbsArg*)sIter->Next())) {
81 if (vars.find(server->GetName())) {
83 pdfVars.remove(*server,kTRUE,kTRUE) ;
90 if (anyServer && !allServers) {
91 oocoutE(_pdf,Generation) <<
"RooSimSplitGenContext::ctor(" << GetName() <<
") ERROR: This context must"
92 <<
" generate all components of a derived index category" << endl ;
101 _idxCatName = idxCat->GetName() ;
102 if (!model.canBeExtended()) {
103 oocoutE(_pdf,Generation) <<
"RooSimSplitGenContext::RooSimSplitGenContext(" << GetName() <<
"): All components of the simultaneous PDF "
104 <<
"must be extended PDFs. Otherwise, it is impossible to calculate the number of events to be generated per component." << endl ;
112 _numPdf = model._pdfProxyList.GetSize() ;
113 _fracThresh =
new Double_t[_numPdf+1] ;
117 _proxyIter = model._pdfProxyList.MakeIterator() ;
118 _allVarsPdf.add(allPdfVars) ;
119 RooRealProxy* proxy ;
122 while((proxy=(RooRealProxy*)_proxyIter->Next())) {
123 pdf=(RooAbsPdf*)proxy->absArg() ;
126 RooArgSet* compVars = pdf->getObservables(pdfVars) ;
127 RooAbsGenContext* cx = pdf->autoGenContext(*compVars,0,0,verbose,autoBinned,binnedTag) ;
130 const RooCatType* state = idxCat->lookupType(proxy->name()) ;
132 cx->SetName(proxy->name()) ;
133 _gcList.push_back(cx) ;
134 _gcIndex.push_back(state->getVal()) ;
137 _fracThresh[i] = _fracThresh[i-1] + pdf->expectedEvents(&allPdfVars) ;
141 for(i=0 ; i<_numPdf ; i++) {
142 _fracThresh[i] /= _fracThresh[_numPdf] ;
146 _idxCatSet = (RooArgSet*) RooArgSet(model._indexCat.arg()).snapshot(kTRUE) ;
148 oocoutE(_pdf,Generation) <<
"RooSimSplitGenContext::RooSimSplitGenContext(" << GetName() <<
") Couldn't deep-clone index category, abort," << endl ;
149 throw std::string(
"RooSimSplitGenContext::RooSimSplitGenContext() Couldn't deep-clone index category, abort") ;
152 _idxCat = (RooAbsCategoryLValue*) _idxCatSet->find(model._indexCat.arg().GetName()) ;
160 RooSimSplitGenContext::~RooSimSplitGenContext()
162 delete[] _fracThresh ;
164 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
175 void RooSimSplitGenContext::attach(
const RooArgSet& args)
177 if (_idxCat->isDerived()) {
178 _idxCat->recursiveRedirectServers(args,kTRUE) ;
182 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
183 (*iter)->attach(args) ;
192 void RooSimSplitGenContext::initGenerator(
const RooArgSet &theEvent)
195 if (_idxCat->isDerived()) {
196 _idxCat->recursiveRedirectServers(theEvent,kTRUE) ;
198 _idxCat = (RooAbsCategoryLValue*) theEvent.find(_idxCat->GetName()) ;
202 for (vector<RooAbsGenContext*>::iterator iter = _gcList.begin() ; iter!=_gcList.end() ; ++iter) {
203 (*iter)->initGenerator(theEvent) ;
212 RooDataSet* RooSimSplitGenContext::generate(Double_t nEvents, Bool_t skipInit, Bool_t extendedMode)
215 coutE(Generation) << ClassName() <<
"::" << GetName() <<
": context is not valid" << endl;
222 nEvents= _expectedEvents;
224 coutI(Generation) << ClassName() <<
"::" << GetName() <<
":generate: will generate "
225 << nEvents <<
" events" << endl;
227 if (_verbose) Print(
"v") ;
232 initGenerator(*_theEvent);
236 vector<Double_t> nGen(_numPdf) ;
238 _proxyIter->Reset() ;
239 RooRealProxy* proxy ;
241 while((proxy=(RooRealProxy*)_proxyIter->Next())) {
242 RooAbsPdf* pdf=(RooAbsPdf*)proxy->absArg() ;
244 nGen[i] = pdf->expectedEvents(&_allVarsPdf) ;
249 _proxyIter->Reset() ;
250 RooRealProxy* proxy ;
253 while((proxy=(RooRealProxy*)_proxyIter->Next())) {
254 RooAbsPdf* pdf=(RooAbsPdf*)proxy->absArg() ;
255 _fracThresh[i] = _fracThresh[i-1] + pdf->expectedEvents(&_allVarsPdf) ;
258 for(i=0 ; i<_numPdf ; i++) {
259 _fracThresh[i] /= _fracThresh[_numPdf] ;
263 Double_t nGenSoFar(0) ;
264 while (nGenSoFar<nEvents) {
265 Double_t rand = RooRandom::uniform() ;
267 for (i=0 ; i<_numPdf ; i++) {
268 if (rand>_fracThresh[i] && rand<_fracThresh[i+1]) {
280 _proxyIter->Reset() ;
281 map<string,RooAbsData*> dataMap ;
283 RooRealProxy* proxy ;
284 while((proxy=(RooRealProxy*)_proxyIter->Next())) {
287 if (_gcList[icomp]) {
288 dataMap[proxy->GetName()] = _gcList[icomp]->generate(nGen[icomp],skipInit,extendedMode) ;
295 RooDataSet* hmaster =
new RooDataSet(
"hmaster",
"hmaster",_allVarsPdf,RooFit::Index((RooCategory&)*_idxCat),RooFit::Link(dataMap),RooFit::OwnLinked()) ;
304 void RooSimSplitGenContext::setExpectedData(Bool_t flag)
306 for (vector<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
307 (*iter)->setExpectedData(flag) ;
316 RooDataSet* RooSimSplitGenContext::createDataSet(
const char* ,
const char* ,
const RooArgSet& )
326 void RooSimSplitGenContext::generateEvent(RooArgSet &, Int_t )
337 void RooSimSplitGenContext::setProtoDataOrder(Int_t* )
346 void RooSimSplitGenContext::printMultiline(ostream &os, Int_t content, Bool_t verbose, TString indent)
const
348 RooAbsGenContext::printMultiline(os,content,verbose,indent) ;
349 os << indent <<
"--- RooSimSplitGenContext ---" << endl ;
350 os << indent <<
"Using PDF ";
351 _pdf->printStream(os,kName|kArgs|kClassName,kSingleLine,indent);