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)