47using std::endl, std::string, std::ostream;
64 bool verbose,
const RooArgSet* forceDirect) :
68 cxcoutI(Generation) <<
"RooGenContext::ctor() setting up event generator context for p.d.f. " << model.
GetName()
69 <<
" for generation of observable(s) " << vars ;
70 if (prototype)
ccxcoutI(Generation) <<
" with prototype data for " << *prototype->
get() ;
71 if (auxProto && !auxProto->
empty())
ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
72 if (forceDirect && !forceDirect->
empty())
ccxcoutI(Generation) <<
" with internal generation forced for observables " << *forceDirect ;
80 coutE(Generation) <<
"RooGenContext::RooGenContext(" <<
GetName() <<
") Couldn't deep-clone PDF, abort," << endl ;
89 if (prototype&&
_pdfClone->dependsOn(*prototype->
get())) {
91 fullNormSet.
add(*prototype->
get()) ;
92 _pdfClone->fixAddCoefNormalization(fullNormSet) ;
102 if(!tmp->isFundamental()) {
103 coutE(Generation) <<
"RooGenContext::ctor(): cannot generate values for derived \"" << tmp->GetName() <<
"\"" << endl;
110 coutI(Generation) <<
"RooGenContext::ctor() WARNING model does not depend on \"" << tmp->GetName()
111 <<
"\" which will have uniform distribution" << endl;
119 if (forceDirect==
nullptr || !forceDirect->
find(direct->
GetName())) {
121 cxcoutD(Generation) <<
"RooGenContext::ctor() observable " << arg->
GetName() <<
" has been determined to be unsafe for internal generation" << endl;
137 coutE(Generation) <<
"RooGenContext::ctor() constructor failed with errors" << endl;
144 cxcoutD(Generation) <<
"RooGenContext::ctor() observables " <<
_directVars <<
" are safe for internal generator (if supported by p.d.f)" << endl ;
147 cxcoutD(Generation) <<
"RooGenContext::ctor() observables " <<
_otherVars <<
" are NOT safe for internal generator (if supported by p.d.f)" << endl ;
154 cxcoutD(Generation) <<
"RooGenContext::ctor() Model depends on supplied protodata observables, static initialization of internal generator will not be allowed" << endl ;
162 cxcoutD(Generation) <<
"RooGenContext::ctor() Model indicates that it can internally generate observables "
163 << generatedVars <<
" with configuration identifier " <<
_code << endl ;
176 cxcoutI(Generation) <<
"RooGenContext::ctor() Context will" ;
191 ntitle.
Append(
" (Accept/Reject)") ;
202 if(depList.
empty()) {
207 if (maxFindCode != 0) {
208 coutI(Generation) <<
"RooGenContext::ctor() no prototype data provided, all observables are generated with numerically and "
209 <<
"model supports analytical maximum findin:, can provide analytical pdf maximum to numeric generator" << endl ;
211 _maxVar = std::make_unique<RooRealVar>(
"funcMax",
"function maximum",maxVal) ;
212 cxcoutD(Generation) <<
"RooGenContext::ctor() maximum value returned by RooAbsPdf::maxVal() is " << maxVal << endl ;
219 cxcoutI(Generation) <<
"RooGenContext::ctor() accept/reject sampling function is " <<
_acceptRejectFunc->GetName() << endl ;
229 cxcoutI(Generation) <<
"RooGenContext::ctor() accept/reject sampling function is " <<
_acceptRejectFunc->GetName() << endl ;
235 if (maxFindCode != 0) {
237 coutI(Generation) <<
"RooGenContext::ctor() prototype data provided, and "
238 <<
"model supports analytical maximum finding in the full phase space: "
239 <<
"can provide analytical pdf maximum to numeric generator" << endl ;
241 _maxVar = std::make_unique<RooRealVar>(
"funcMax",
"function maximum", maxVal);
244 if (maxFindCode != 0) {
246 coutI(Generation) <<
"RooGenContext::ctor() prototype data provided, and "
247 <<
"model supports analytical maximum finding in the variables which are not"
248 <<
" internally generated. Can provide analytical pdf maximum to numeric "
249 <<
"generator" << endl;
250 cxcoutD(Generation) <<
"RooGenContext::ctor() maximum value must be reevaluated for each "
251 <<
"event with configuration code " << maxFindCode << endl ;
252 _maxVar = std::make_unique<RooRealVar>(
"funcMax",
"function maximum",1) ;
261 otherAndProto.
add(protoDeps) ;
265 cxcoutD(Generation) <<
"RooGenContext::ctor() prototype data provided, observables are generated numerically no "
266 <<
"analytical estimate of maximum function value provided by model, must determine maximum value through initial sampling space "
267 <<
"of accept/reject observables plus prototype observables: " << otherAndProto << endl ;
273 double max = maxFinder->getFuncMax() ;
274 _maxVar = std::make_unique<RooRealVar>(
"funcMax",
"function maximum",max) ;
277 oocoutE(
nullptr, Generation) <<
"RooGenContext::ctor(" << model.
GetName()
278 <<
") ERROR: generating conditional p.d.f. which requires prior knowledge of function maximum, "
279 <<
"but chosen numeric generator (" << maxFinder->generatorName() <<
") does not support maximum finding" << endl ;
280 throw string(
"RooGenContext::ctor()") ;
283 cxcoutD(Generation) <<
"RooGenContext::ctor() maximum function value found through initial sampling is " << max << endl ;
291 cxcoutD(Generation) <<
"RooGenContext::ctor() creating MC sampling generator " <<
_generator->generatorName() <<
" from function for observables " <<
_otherVars << endl ;
307 _pdfClone->recursiveRedirectServers(args,
false);
326 for (
auto* arg : theEvent) {
337 cxcoutD(Generation) <<
"RooGenContext::initGenerator() initializing internal generator of model with code " <<
_code << endl ;
354 cxcoutD(Generation) <<
"RooGenContext::initGenerator() reevaluation of maximum function value is required for each event, new value is " << max << endl ;
359 double resampleRatio(1) ;
361 if (resampleRatio<1) {
362 coutI(Generation) <<
"RooGenContext::generateEvent INFO: accept/reject generator requests resampling of previously produced events by factor "
363 << resampleRatio <<
" due to increased maximum weight" << endl ;
366 if(
nullptr == subEvent) {
367 coutE(Generation) <<
"RooGenContext::generateEvent ERROR accept/reject generator failed" << endl ;
386 coutE(Generation) <<
"RooGenContext::generateEvent(" <<
GetName() <<
") ERROR: uniform variable " << uniVar->GetName() <<
" is not an lvalue" << endl ;
402 os <<
indent <<
" --- RooGenContext --- " << endl ;
403 os <<
indent <<
"Using PDF ";
static void indent(ostringstream &buf, int indent_level)
Common abstract base class for objects that represent a value and a "shape" in RooFit.
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.
RooAbsCollection & assignValueOnly(const RooAbsCollection &other, bool forceIfSizeOne=false)
Sets the value of any argument in our set that also appears in the other set.
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...
RooAbsArg * find(const char *name) const
Find object with given name in 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.
RooArgSet _protoVars
Prototype observables.
bool _verbose
Verbose messaging?
bool _isValid
Is context in valid state?
void resampleData(double &ratio)
Rescale existing output buffer with given ratio.
Abstract base class for objects that are lvalues, i.e.
virtual void randomize(const char *rangeName=nullptr)=0
Abstract interface for all probability density functions.
const RooNumGenConfig * getGeneratorConfig() const
Return the numeric MC generator configuration used for this object.
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 void softAbort()
Soft abort function that interrupts macro execution but doesn't kill ROOT.
Implements a universal generator context for all RooAbsPdf classes that do not have or need a special...
void printMultiline(std::ostream &os, Int_t content, bool verbose=false, TString indent="") const override
Printing interface.
void generateEvent(RooArgSet &theEvent, Int_t remaining) override
Generate one event.
RooArgSet _otherVars
List of observables generated internally, randomly, and by accept/reject sampling.
Int_t _code
Internal generation code.
void initGenerator(const RooArgSet &theEvent) override
Perform one-time initialization of the generator context.
~RooGenContext() override
std::unique_ptr< RooAbsNumGenerator > _generator
MC sampling generation engine.
RooAbsPdf * _pdfClone
Clone of input p.d.f.
RooArgSet _cloneSet
Clone of all nodes of input p.d.f.
Int_t _updateFMaxPerEvent
If true, maximum p.d.f value needs to be recalculated for each event.
std::unique_ptr< RooRealVar > _maxVar
Variable holding maximum value of p.d.f.
std::unique_ptr< RooAbsReal > _acceptRejectFunc
Projection function to be passed to accept/reject sampler.
void attach(const RooArgSet ¶ms) override
Attach the cloned model to the event buffer we will be filling.
RooGenContext(const RooAbsPdf &model, const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false, const RooArgSet *forceDirect=nullptr)
Initialize a new context for generating events with the specified variables, using the specified PDF ...
RooAbsNumGenerator * createSampler(RooAbsReal &func, const RooArgSet &genVars, const RooArgSet &condVars, const RooNumGenConfig &config, bool verbose=false, RooAbsReal *maxFuncVal=nullptr)
Construct a numeric integrator instance that operates on function 'func' and is configured with 'conf...
static RooNumGenFactory & instance()
Static method returning reference to singleton instance of factory.
const char * GetName() const override
Returns name of object.
TString & Append(const char *cs)