43 ClassImp(RooProdGenContext);
49 RooProdGenContext::RooProdGenContext(
const RooProdPdf &model,
const RooArgSet &vars,
50 const RooDataSet *prototype,
const RooArgSet* auxProto, Bool_t verbose) :
51 RooAbsGenContext(model,vars,prototype,auxProto,verbose), _uniIter(0), _pdf(&model)
56 cxcoutI(Generation) <<
"RooProdGenContext::ctor() setting up event special generator context for product p.d.f. " << model.GetName()
57 <<
" for generation of observable(s) " << vars ;
58 if (prototype) ccxcoutI(Generation) <<
" with prototype data for " << *prototype->get() ;
59 if (auxProto && auxProto->getSize()>0) ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
60 ccxcoutI(Generation) << endl ;
63 RooArgSet deps(vars) ;
65 RooArgSet* protoDeps = model.getObservables(*prototype->get()) ;
66 deps.remove(*protoDeps,kTRUE,kTRUE) ;
71 RooLinkedList termList,depsList,impDepList,crossDepList,intList ;
72 model.factorizeProduct(deps,RooArgSet(),termList,depsList,impDepList,crossDepList,intList) ;
73 TIterator* termIter = termList.MakeIterator() ;
74 TIterator* normIter = depsList.MakeIterator() ;
75 TIterator* impIter = impDepList.MakeIterator() ;
77 if (dologD(Generation)) {
78 cxcoutD(Generation) <<
"RooProdGenContext::ctor() factorizing product expression in irriducible terms " ;
79 while(RooArgSet* t=(RooArgSet*)termIter->Next()) {
80 ccxcoutD(Generation) << *t ;
82 ccxcoutD(Generation) << endl ;
88 Bool_t anyAction = kTRUE ;
101 Bool_t anyPrevAction=anyAction ;
104 if (termList.GetSize()==0) {
108 while((term=(RooArgSet*)termIter->Next())) {
110 impDeps = (RooArgSet*)impIter->Next() ;
111 termDeps = (RooArgSet*)normIter->Next() ;
112 if (impDeps==0 || termDeps==0) {
116 cxcoutD(Generation) <<
"RooProdGenContext::ctor() analyzing product term " << *term <<
" with observable(s) " << *termDeps ;
117 if (impDeps->getSize()>0) {
118 ccxcoutD(Generation) <<
" which has dependence of external observable(s) " << *impDeps <<
" that to be generated first by other terms" ;
120 ccxcoutD(Generation) << endl ;
123 RooArgSet neededDeps(*impDeps) ;
124 neededDeps.remove(genDeps,kTRUE,kTRUE) ;
126 if (neededDeps.getSize()>0) {
127 if (!anyPrevAction) {
128 cxcoutD(Generation) <<
"RooProdGenContext::ctor() no convergence in single term analysis loop, terminating loop and process remainder of terms as single unit " << endl ;
132 cxcoutD(Generation) <<
"RooProdGenContext::ctor() skipping this term for now because it needs imported dependents that are not generated yet" << endl ;
138 if (termDeps->getSize()==0) {
139 cxcoutD(Generation) <<
"RooProdGenContext::ctor() term has no observables requested to be generated, removing it" << endl ;
140 termList.Remove(term) ;
141 depsList.Remove(termDeps) ;
142 impDepList.Remove(impDeps) ;
150 TIterator* pdfIter = term->createIterator() ;
151 if (term->getSize()==1) {
154 pdf = (RooAbsPdf*) pdfIter->Next() ;
155 RooArgSet* pdfDep = pdf->getObservables(termDeps) ;
156 if (pdfDep->getSize()>0) {
157 coutI(Generation) <<
"RooProdGenContext::ctor() creating subcontext for generation of observables " << *pdfDep <<
" from model " << pdf->GetName() << endl ;
158 RooArgSet* auxProto2 = pdf->getObservables(impDeps) ;
159 RooAbsGenContext* cx = pdf->genContext(*pdfDep,prototype,auxProto2,verbose) ;
161 _gcList.push_back(cx) ;
165 genDeps.add(*pdfDep) ;
172 if (termDeps->getSize()>0) {
173 const std::string name = model.makeRGPPName(
"PRODGEN_",*term,RooArgSet(),RooArgSet(),0) ;
177 RooLinkedList cmdList ;
178 RooLinkedList pdfSetList ;
180 RooArgSet fullPdfSet ;
181 while((pdf=(RooAbsPdf*)pdfIter->Next())) {
183 RooArgSet* pdfnset = model.findPdfNSet(*pdf) ;
184 RooArgSet* pdfSet =
new RooArgSet(*pdf) ;
185 pdfSetList.Add(pdfSet) ;
187 if (pdfnset && pdfnset->getSize()>0) {
189 cmdList.Add(RooFit::Conditional(*pdfSet,*pdfnset).Clone()) ;
192 fullPdfSet.add(*pdfSet) ;
196 RooProdPdf* multiPdf =
new RooProdPdf(name.c_str(),name.c_str(),fullPdfSet,cmdList) ;
198 pdfSetList.Delete() ;
200 multiPdf->setOperMode(RooAbsArg::ADirty,kTRUE) ;
201 multiPdf->useDefaultGen(kTRUE) ;
202 _ownedMultiProds.addOwned(*multiPdf) ;
204 coutI(Generation) <<
"RooProdGenContext()::ctor creating subcontext for generation of observables " << *termDeps
205 <<
"for irriducuble composite term using sub-product object " << multiPdf->GetName() ;
206 RooAbsGenContext* cx = multiPdf->genContext(*termDeps,prototype,auxProto,verbose) ;
207 _gcList.push_back(cx) ;
209 genDeps.add(*termDeps) ;
218 termList.Remove(term) ;
219 depsList.Remove(termDeps) ;
220 impDepList.Remove(impDeps) ;
230 if (termList.GetSize()>0) {
232 cxcoutD(Generation) <<
"RooProdGenContext::ctor() there are left-over terms that need to be generated separately" << endl ;
240 RooArgSet trailerTerm ;
241 RooArgSet trailerTermDeps ;
242 while((term=(RooArgSet*)termIter->Next())) {
243 RooArgSet* termDeps = (RooArgSet*)normIter->Next() ;
244 trailerTerm.add(*term) ;
245 trailerTermDeps.add(*termDeps) ;
248 const std::string name = model.makeRGPPName(
"PRODGEN_",trailerTerm,RooArgSet(),RooArgSet(),0) ;
252 RooLinkedList cmdList ;
253 RooLinkedList pdfSetList ;
254 RooArgSet fullPdfSet ;
256 TIterator* pdfIter = trailerTerm.createIterator() ;
257 while((pdf=(RooAbsPdf*)pdfIter->Next())) {
259 RooArgSet* pdfnset = model.findPdfNSet(*pdf) ;
260 RooArgSet* pdfSet =
new RooArgSet(*pdf) ;
261 pdfSetList.Add(pdfSet) ;
263 if (pdfnset && pdfnset->getSize()>0) {
265 cmdList.Add(RooFit::Conditional(*pdfSet,*pdfnset).Clone()) ;
267 fullPdfSet.add(*pdfSet) ;
272 RooProdPdf* multiPdf =
new RooProdPdf(name.c_str(),name.c_str(),fullPdfSet,cmdList) ;
274 pdfSetList.Delete() ;
276 multiPdf->setOperMode(RooAbsArg::ADirty,kTRUE) ;
277 multiPdf->useDefaultGen(kTRUE) ;
278 _ownedMultiProds.addOwned(*multiPdf) ;
280 cxcoutD(Generation) <<
"RooProdGenContext(" << model.GetName() <<
"): creating context for irreducible composite trailer term "
281 << multiPdf->GetName() <<
" that generates observables " << trailerTermDeps << endl ;
282 RooAbsGenContext* cx = multiPdf->genContext(trailerTermDeps,prototype,auxProto,verbose) ;
283 _gcList.push_back(cx) ;
289 _uniObs.remove(genDeps,kTRUE,kTRUE) ;
290 if (_uniObs.getSize()>0) {
291 _uniIter = _uniObs.createIterator() ;
292 coutI(Generation) <<
"RooProdGenContext(" << model.GetName() <<
"): generating uniform distribution for non-dependent observable(s) " << _uniObs << endl ;
304 impDepList.Delete() ;
305 crossDepList.Delete() ;
315 RooProdGenContext::~RooProdGenContext()
318 for (list<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
327 void RooProdGenContext::attach(
const RooArgSet& args)
330 for (list<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
331 (*iter)->attach(args) ;
339 void RooProdGenContext::initGenerator(
const RooArgSet &theEvent)
342 for (list<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
343 (*iter)->initGenerator(theEvent) ;
355 void RooProdGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
359 for (list<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
360 (*iter)->generateEvent(theEvent,remaining) ;
367 while((uniVar=(RooAbsArg*)_uniIter->Next())) {
368 RooAbsLValue* arglv =
dynamic_cast<RooAbsLValue*
>(uniVar) ;
384 void RooProdGenContext::setProtoDataOrder(Int_t* lut)
387 RooAbsGenContext::setProtoDataOrder(lut) ;
389 for (list<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
390 (*iter)->setProtoDataOrder(lut) ;
400 void RooProdGenContext::printMultiline(ostream &os, Int_t content, Bool_t verbose, TString indent)
const
402 RooAbsGenContext::printMultiline(os,content,verbose,indent) ;
403 os << indent <<
"--- RooProdGenContext ---" << endl ;
404 os << indent <<
"Using PDF ";
405 _pdf->printStream(os,kName|kArgs|kClassName,kSingleLine,indent);
406 os << indent <<
"List of component generators" << endl ;
408 TString indent2(indent) ;
409 indent2.Append(
" ") ;
411 for (list<RooAbsGenContext*>::const_iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
412 (*iter)->printMultiline(os,content,verbose,indent2) ;