51 cxcoutI(Generation) <<
"RooAddGenContext::ctor() setting up event special generator context for sum p.d.f. " << model.GetName()
52 <<
" for generation of observable(s) " << vars ;
53 if (prototype)
ccxcoutI(Generation) <<
" with prototype data for " << *prototype->
get() ;
54 if (auxProto && !auxProto->
empty())
ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
58 _pdfSet = std::make_unique<RooArgSet>();
66 coefNSet.
add(*prototype->
get()) ;
67 _pdf->fixAddCoefNormalization(coefNSet,
false) ;
70 _nComp = model._pdfList.size() ;
72 _vars = std::make_unique<RooArgSet>();
75 for (
const auto arg : model._pdfList) {
76 auto pdf =
dynamic_cast<const RooAbsPdf *
>(arg);
78 coutF(Generation) <<
"Cannot generate events from an object that is not a PDF.\n\t"
79 <<
"The offending object is a " << arg->ClassName() <<
" named '" << arg->GetName() <<
"'." << std::endl;
80 throw std::invalid_argument(
"Trying to generate events from on object that is not a PDF.");
83 _gcList.emplace_back(pdf->genContext(vars,prototype,auxProto,verbose));
100 cxcoutI(Generation) <<
"RooAddGenContext::ctor() setting up event special generator context for sum resolution model " << model.GetName()
101 <<
" for generation of observable(s) " << vars ;
102 if (prototype)
ccxcoutI(Generation) <<
" with prototype data for " << *prototype->
get() ;
103 if (auxProto && !auxProto->
empty())
ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
107 _pdfSet = std::make_unique<RooArgSet>();
111 _nComp = model._pdfList.size() ;
113 _vars = std::make_unique<RooArgSet>();
116 for (
const auto obj : model._pdfList) {
118 _gcList.emplace_back(pdf->genContext(vars,prototype,auxProto,verbose));
131 _pdf->recursiveRedirectServers(args) ;
148 _pdf->recursiveRedirectServers(theEvent) ;
160 gc->initGenerator(theEvent) ;
176 _gcList[i]->generateEvent(theEvent,remaining) ;
190 auto updateThresholdsImpl = [&](
auto* pdf,
auto * cache) {
191 pdf->updateCoefficients(*cache,
_vars.get()) ;
195 double coef = pdf->_coefCache[i];
197 std::stringstream errMsgStream;
198 errMsgStream <<
"RooAddGenContext::updateThresholds(): coefficient number " << i <<
" of the "
199 << pdf->ClassName() <<
" \"" << pdf->GetName() <<
"\"" <<
" is negative!"
200 <<
" The current RooAddGenContext doesn't support negative coefficients."
201 <<
" Please recreate a new generator context with " << pdf->ClassName() <<
"::genContext()";
202 auto const errMsg = errMsgStream.str();
203 cxcoutE(Generation) << errMsg << std::endl;
204 throw std::runtime_error(errMsg);
222 gc->setProtoDataOrder(lut) ;
234 os <<
indent <<
"--- RooAddGenContext ---" << std::endl;
235 os <<
indent <<
"Using PDF ";
238 os <<
indent <<
"List of component generators" << std::endl;
242 gc->printMultiline(os,content,verbose,indent2) ;
int Int_t
Signed integer 4 bytes (int).
static void indent(ostringstream &buf, int indent_level)
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
RooArgSet _theEvent
Pointer to observable event being generated.
RooAbsGenContext(const RooAbsPdf &model, const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool _verbose=false)
Constructor.
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.
Abstract interface for all probability density functions.
void setProtoDataOrder(Int_t *lut) override
Forward the setProtoDataOrder call to the component generator contexts.
std::vector< double > _coefThresh
[_nComp] Array of coefficient thresholds
std::unique_ptr< RooArgSet > _pdfSet
Set owned all nodes of internal clone of p.d.f.
std::unique_ptr< RooArgSet > _vars
bool _isModel
Are we generating from a RooAddPdf or a RooAddModel.
void initGenerator(const RooArgSet &theEvent) override
One-time initialization of generator context.
std::vector< std::unique_ptr< RooAbsGenContext > > _gcList
List of component generator contexts.
void updateThresholds()
Update the cumulative threshold table from the current coefficient values.
void printMultiline(std::ostream &os, Int_t content, bool verbose=false, TString indent="") const override
Print the details of the context.
AddCacheElem * _pcache
! RooAddPdf cache element
void attach(const RooArgSet ¶ms) override
Attach given set of variables to internal p.d.f. clone.
Int_t _nComp
Number of PDF components.
RooAddGenContext(const RooAddPdf &model, const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool _verbose=false)
Constructor.
RooAbsPdf * _pdf
Pointer to cloned p.d.f.
void generateEvent(RooArgSet &theEvent, Int_t remaining) override
Randomly choose one of the component contexts to generate this event, with a probability proportional...
RooAddModel is an efficient implementation of a sum of PDFs of the form.
AddCacheElem * getProjCache(const RooArgSet *nset, const RooArgSet *iset=nullptr) const
Retrieve cache element with for calculation of p.d.f value with normalization set nset and integrated...
Efficient implementation of a sum of PDFs of the form.
AddCacheElem * getProjCache(const RooArgSet *nset, const RooArgSet *iset=nullptr) const
Retrieve cache element for the computation of the PDF normalisation.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Container class to hold unbinned data.
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
static double uniform(TRandom *generator=randomGenerator())
Return a number uniformly distributed from (0,1).
TString & Append(const char *cs)