54 cxcoutI(Generation) <<
"RooProdGenContext::ctor() setting up event special generator context for product p.d.f. " << model.
GetName()
55 <<
" for generation of observable(s) " << vars ;
56 if (prototype)
ccxcoutI(Generation) <<
" with prototype data for " << *prototype->
get() ;
57 if (auxProto && !auxProto->
empty())
ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
65 deps.
remove(protoDeps,
true,
true) ;
69 RooLinkedList termList,depsList,impDepList,crossDepList,intList ;
73 cxcoutD(Generation) <<
"RooProdGenContext::ctor() factorizing product expression in irriducible terms " ;
74 for(
auto * t : static_range_cast<RooArgSet*>(termList)) {
83 bool anyAction = true ;
87 auto termIter = termList.
begin();
88 auto impIter = impDepList.
begin();
89 auto normIter = depsList.
begin();
91 bool anyPrevAction=anyAction ;
94 if (termList.
empty()) {
98 while(termIter != termList.
end()) {
100 auto * term =
static_cast<RooArgSet*
>(*termIter);
101 auto * impDeps =
static_cast<RooArgSet*
>(*impIter);
102 auto * termDeps =
static_cast<RooArgSet*
>(*normIter);
103 if (impDeps==
nullptr || termDeps==
nullptr) {
107 cxcoutD(Generation) <<
"RooProdGenContext::ctor() analyzing product term " << *term <<
" with observable(s) " << *termDeps ;
108 if (!impDeps->empty()) {
109 ccxcoutD(Generation) <<
" which has dependence of external observable(s) " << *impDeps <<
" that to be generated first by other terms" ;
115 neededDeps.
remove(genDeps,
true,
true) ;
117 if (!neededDeps.
empty()) {
118 if (!anyPrevAction) {
119 cxcoutD(Generation) <<
"RooProdGenContext::ctor() no convergence in single term analysis loop, terminating loop and process remainder of terms as single unit " << endl ;
123 cxcoutD(Generation) <<
"RooProdGenContext::ctor() skipping this term for now because it needs imported dependents that are not generated yet" << endl ;
132 if (termDeps->empty()) {
133 cxcoutD(Generation) <<
"RooProdGenContext::ctor() term has no observables requested to be generated, removing it" << endl ;
141 depsList.
Remove(termDeps);
142 impDepList.
Remove(impDeps);
151 if (term->size()==1) {
154 auto pdf =
static_cast<RooAbsPdf*
>((*term)[0]);
156 if (!pdfDep->empty()) {
157 coutI(Generation) <<
"RooProdGenContext::ctor() creating subcontext for generation of observables " << *pdfDep <<
" from model " << pdf->GetName() << endl ;
158 std::unique_ptr<RooArgSet> auxProto2{pdf->getObservables(impDeps)};
159 _gcList.push_back(pdf->genContext(*pdfDep,prototype,auxProto2.
get(),verbose)) ;
163 genDeps.
add(*pdfDep) ;
168 if (!termDeps->empty()) {
176 for(
auto * pdf : static_range_cast<RooAbsPdf*>(*term)) {
180 pdfSetList.
Add(pdfSet) ;
182 if (pdfnset && !pdfnset->
empty()) {
187 fullPdfSet.
add(*pdfSet) ;
199 coutI(Generation) <<
"RooProdGenContext()::ctor creating subcontext for generation of observables " << *termDeps
200 <<
"for irriducuble composite term using sub-product object " << multiPdf->
GetName() ;
204 genDeps.
add(*termDeps) ;
215 depsList.
Remove(termDeps);
216 impDepList.
Remove(impDeps);
226 if (!termList.
empty()) {
228 cxcoutD(Generation) <<
"RooProdGenContext::ctor() there are left-over terms that need to be generated separately" << endl ;
231 auto normIter = depsList.
begin();
234 for(
auto * term : static_range_cast<RooArgSet*>(termList)) {
235 auto* termDeps =
static_cast<RooArgSet*
>(*normIter);
236 trailerTerm.
add(*term) ;
237 trailerTermDeps.
add(*termDeps) ;
249 for(
auto * pdf : static_range_cast<RooAbsPdf*>(trailerTerm)) {
253 pdfSetList.
Add(pdfSet) ;
255 if (pdfnset && !pdfnset->
empty()) {
259 fullPdfSet.
add(*pdfSet) ;
272 cxcoutD(Generation) <<
"RooProdGenContext(" << model.
GetName() <<
"): creating context for irreducible composite trailer term "
273 << multiPdf->
GetName() <<
" that generates observables " << trailerTermDeps << endl ;
283 coutI(Generation) <<
"RooProdGenContext(" << model.
GetName() <<
"): generating uniform distribution for non-dependent observable(s) " <<
_uniObs << std::endl;
303 for (list<RooAbsGenContext*>::iterator iter=
_gcList.begin() ; iter!=
_gcList.end() ; ++iter) {
315 for (list<RooAbsGenContext*>::iterator iter=
_gcList.begin() ; iter!=
_gcList.end() ; ++iter) {
316 (*iter)->attach(args) ;
327 for (list<RooAbsGenContext*>::iterator iter=
_gcList.begin() ; iter!=
_gcList.end() ; ++iter) {
328 (*iter)->initGenerator(theEvent) ;
344 for (list<RooAbsGenContext*>::iterator iter=
_gcList.begin() ; iter!=
_gcList.end() ; ++iter) {
345 (*iter)->generateEvent(theEvent,remaining) ;
350 for(
auto * arglv : dynamic_range_cast<RooAbsLValue*>(
_uniObs)) {
371 for (list<RooAbsGenContext*>::iterator iter=
_gcList.begin() ; iter!=
_gcList.end() ; ++iter) {
372 (*iter)->setProtoDataOrder(lut) ;
385 os <<
indent <<
"--- RooProdGenContext ---" << endl ;
386 os <<
indent <<
"Using PDF ";
388 os <<
indent <<
"List of component generators" << endl ;
393 for (list<RooAbsGenContext*>::const_iterator iter=
_gcList.begin() ; iter!=
_gcList.end() ; ++iter) {
394 (*iter)->printMultiline(os,content,verbose,indent2) ;
static void indent(ostringstream &buf, int indent_level)
void setOperMode(OperMode mode, bool recurseADirty=true)
Set the operation mode of this node.
RooFit::OwningPtr< RooArgSet > getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
RooAbsGenContext is the abstract base class for generator contexts of RooAbsPdf objects.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Interface for multi-line printing.
virtual void setProtoDataOrder(Int_t *lut)
Set the traversal order of prototype data to that in the lookup tables passed as argument.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooDataSet is a container class to hold unbinned data.
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
RooLinkedList is an collection class for internal use, storing a collection of RooAbsArg pointers in ...
RooLinkedListIterImpl end() const
void Delete(Option_t *o=nullptr) override
Remove all elements in collection and delete all elements NB: Collection does not own elements,...
virtual void Add(TObject *arg)
RooLinkedListIterImpl begin() const
virtual bool Remove(TObject *arg)
Remove object from collection.
virtual void printStream(std::ostream &os, Int_t contents, StyleOption style, TString indent="") const
Print description of object on ostream, printing contents set by contents integer,...
RooProdGenContext is an efficient implementation of the generator context specific for RooProdPdf PDF...
void setProtoDataOrder(Int_t *lut) override
Set the traversal order of the prototype dataset by the given lookup table.
void attach(const RooArgSet ¶ms) override
Attach generator to given event buffer.
RooArgSet _ownedMultiProds
Owned auxiliary multi-term product PDFs.
std::list< RooAbsGenContext * > _gcList
List of component generator contexts.
const RooProdPdf * _pdf
Original PDF.
void initGenerator(const RooArgSet &theEvent) override
One-time initialization of generator context, forward to component generators.
RooArgSet _uniObs
Observable to be generated with flat distribution.
~RooProdGenContext() override
Destructor. Delete all owned subgenerator contexts.
void generateEvent(RooArgSet &theEvent, Int_t remaining) override
Generate a single event of the product by generating the components of the products sequentially.
RooProdGenContext(const RooProdPdf &model, const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool _verbose=false)
void printMultiline(std::ostream &os, Int_t content, bool verbose=false, TString indent="") const override
Detailed printing interface.
RooProdPdf is an efficient implementation of a product of PDFs of the form.
void factorizeProduct(const RooArgSet &normSet, const RooArgSet &intSet, RooLinkedList &termList, RooLinkedList &normList, RooLinkedList &impDepList, RooLinkedList &crossDepList, RooLinkedList &intList) const
Factorize product in irreducible terms for given choice of integration/normalization.
void useDefaultGen(bool flag=true)
RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const override
Return generator context optimized for generating events from product p.d.f.s.
std::string makeRGPPName(const char *pfx, const RooArgSet &term, const RooArgSet &iset, const RooArgSet &nset, const char *isetRangeName) const
Make an appropriate automatic name for a RooGenProdProj object in getPartIntList()
RooArgSet * findPdfNSet(RooAbsPdf const &pdf) const
Look up user specified normalization set for given input PDF component.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
const char * GetName() const override
Returns name of object.
TString & Append(const char *cs)
RooCmdArg Conditional(const RooArgSet &pdfSet, const RooArgSet &depSet, bool depsAreCond=false)