#include "RooFit.h"
#include "RooProdGenContext.h"
#include "RooProdGenContext.h"
#include "RooProdPdf.h"
#include "RooDataSet.h"
#include "RooRealVar.h"
#include "RooGlobalFunc.h"
ClassImp(RooProdGenContext)
;
RooProdGenContext::RooProdGenContext(const RooProdPdf &model, const RooArgSet &vars,
const RooDataSet *prototype, const RooArgSet* auxProto, Bool_t verbose) :
RooAbsGenContext(model,vars,prototype,auxProto,verbose), _pdf(&model)
{
RooArgSet deps(vars) ;
if (prototype) {
RooArgSet* protoDeps = model.getObservables(*prototype->get()) ;
deps.remove(*protoDeps,kTRUE,kTRUE) ;
delete protoDeps ;
}
RooLinkedList termList,depsList,impDepList,crossDepList,intList ;
model.factorizeProduct(deps,RooArgSet(),termList,depsList,impDepList,crossDepList,intList) ;
TIterator* termIter = termList.MakeIterator() ;
TIterator* normIter = depsList.MakeIterator() ;
TIterator* impIter = impDepList.MakeIterator() ;
RooArgSet genDeps ;
Bool_t working = kTRUE ;
Int_t nSkip=0 ;
while(working) {
working = kFALSE ;
RooAbsPdf* pdf ;
RooArgSet* term ;
RooArgSet* impDeps ;
RooArgSet* termDeps ;
termIter->Reset() ;
impIter->Reset() ;
normIter->Reset() ;
while((term=(RooArgSet*)termIter->Next())) {
impDeps = (RooArgSet*)impIter->Next() ;
termDeps = (RooArgSet*)normIter->Next() ;
RooArgSet neededDeps(*impDeps) ;
neededDeps.remove(genDeps,kTRUE,kTRUE) ;
if (neededDeps.getSize()>0) {
if (++nSkip<100) {
working = kTRUE ;
} else {
cout << "RooProdGenContext ERROR: Generations is requested of observables that are conditional observables of the entire product expression: " ; neededDeps.Print("1") ;
_isValid = kFALSE ;
return ;
}
continue ;
}
if (termDeps->getSize()==0) {
termList.Remove(term) ;
depsList.Remove(termDeps) ;
impDepList.Remove(impDeps) ;
delete term ;
delete termDeps ;
delete impDeps ;
continue ;
}
working = kTRUE ;
TIterator* pdfIter = term->createIterator() ;
if (term->getSize()==1) {
pdf = (RooAbsPdf*) pdfIter->Next() ;
RooArgSet* pdfDep = pdf->getObservables(termDeps) ;
if (pdfDep->getSize()>0) {
RooArgSet* auxProto = impDeps ? pdf->getObservables(impDeps) : 0 ;
RooAbsGenContext* cx = pdf->genContext(*pdfDep,prototype,auxProto,verbose) ;
_gcList.Add(cx) ;
}
genDeps.add(*pdfDep) ;
delete pdfDep ;
} else {
if (termDeps->getSize()>0) {
const char* name = model.makeRGPPName("PRODGEN_",*term,RooArgSet(),RooArgSet(),0) ;
RooLinkedList cmdList ;
RooLinkedList pdfSetList ;
pdfIter->Reset() ;
RooArgSet fullPdfSet ;
while((pdf=(RooAbsPdf*)pdfIter->Next())) {
RooArgSet* pdfnset = model.findPdfNSet(*pdf) ;
RooArgSet* pdfSet = new RooArgSet(*pdf) ;
pdfSetList.Add(pdfSet) ;
if (pdfnset && pdfnset->getSize()>0) {
cmdList.Add(RooFit::Conditional(*pdfSet,*pdfnset).Clone()) ;
} else {
fullPdfSet.add(*pdfSet) ;
}
}
RooProdPdf* multiPdf = new RooProdPdf(name,name,fullPdfSet,cmdList) ;
cmdList.Delete() ;
pdfSetList.Delete() ;
multiPdf->useDefaultGen(kTRUE) ;
_ownedMultiProds.addOwned(*multiPdf) ;
RooAbsGenContext* cx = multiPdf->genContext(*termDeps,prototype,auxProto,verbose) ;
_gcList.Add(cx) ;
genDeps.add(*termDeps) ;
}
}
delete pdfIter ;
termList.Remove(term) ;
depsList.Remove(termDeps) ;
impDepList.Remove(impDeps) ;
delete term ;
delete termDeps ;
delete impDeps ;
}
}
if (termList.GetSize()>0) {
RooAbsPdf* pdf ;
RooArgSet* term ;
termIter->Reset() ;
normIter->Reset() ;
RooArgSet trailerTerm ;
RooArgSet trailerTermDeps ;
while((term=(RooArgSet*)termIter->Next())) {
RooArgSet* termDeps = (RooArgSet*)normIter->Next() ;
trailerTerm.add(*term) ;
trailerTermDeps.add(*termDeps) ;
}
const char* name = model.makeRGPPName("PRODGEN_",trailerTerm,RooArgSet(),RooArgSet(),0) ;
RooLinkedList cmdList ;
RooLinkedList pdfSetList ;
RooArgSet fullPdfSet ;
TIterator* pdfIter = trailerTerm.createIterator() ;
while((pdf=(RooAbsPdf*)pdfIter->Next())) {
RooArgSet* pdfnset = model.findPdfNSet(*pdf) ;
RooArgSet* pdfSet = new RooArgSet(*pdf) ;
pdfSetList.Add(pdfSet) ;
if (pdfnset && pdfnset->getSize()>0) {
cmdList.Add(RooFit::Conditional(*pdfSet,*pdfnset).Clone()) ;
} else {
fullPdfSet.add(*pdfSet) ;
}
}
RooProdPdf* multiPdf = new RooProdPdf(name,name,fullPdfSet,cmdList) ;
cmdList.Delete() ;
pdfSetList.Delete() ;
multiPdf->useDefaultGen(kTRUE) ;
_ownedMultiProds.addOwned(*multiPdf) ;
RooAbsGenContext* cx = multiPdf->genContext(trailerTermDeps,prototype,auxProto,verbose) ;
_gcList.Add(cx) ;
}
delete termIter ;
delete impIter ;
delete normIter ;
_gcIter = _gcList.MakeIterator() ;
termList.Delete() ;
depsList.Delete() ;
impDepList.Delete() ;
crossDepList.Delete() ;
intList.Delete() ;
}
RooProdGenContext::~RooProdGenContext()
{
delete _gcIter ;
_gcList.Delete() ;
}
void RooProdGenContext::initGenerator(const RooArgSet &theEvent)
{
RooAbsGenContext* gc ;
_gcIter->Reset() ;
while((gc=(RooAbsGenContext*)_gcIter->Next())){
gc->initGenerator(theEvent) ;
}
}
void RooProdGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
{
TList compData ;
RooAbsGenContext* gc ;
_gcIter->Reset() ;
while((gc=(RooAbsGenContext*)_gcIter->Next())) {
gc->generateEvent(theEvent,remaining) ;
}
}
void RooProdGenContext::setProtoDataOrder(Int_t* lut)
{
RooAbsGenContext::setProtoDataOrder(lut) ;
_gcIter->Reset() ;
RooAbsGenContext* gc ;
while((gc=(RooAbsGenContext*)_gcIter->Next())) {
gc->setProtoDataOrder(lut) ;
}
}
void RooProdGenContext::printToStream(ostream &os, PrintOption opt, TString indent) const
{
RooAbsGenContext::printToStream(os,opt,indent) ;
TString indent2(indent) ;
indent2.Append(" ") ;
RooAbsGenContext* gc ;
_gcIter->Reset() ;
while((gc=(RooAbsGenContext*)_gcIter->Next())) {
gc->printToStream(os,opt,indent2) ;
}
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.