37 ClassImp(RooEffGenContext);
42 RooEffGenContext::RooEffGenContext(
const RooAbsPdf &model,
43 const RooAbsPdf& pdf,
const RooAbsReal& eff,
44 const RooArgSet &vars,
45 const RooDataSet *prototype,
const RooArgSet* auxProto,
46 Bool_t verbose,
const RooArgSet* ) :
47 RooAbsGenContext(model, vars, prototype, auxProto, verbose), _maxEff(0.)
49 RooArgSet x(eff,eff.GetName());
50 _cloneSet =
static_cast<RooArgSet*
>(x.snapshot(kTRUE));
51 _eff =
dynamic_cast<RooAbsReal*
>(_cloneSet->find(eff.GetName()));
52 _generator = pdf.genContext(vars, prototype, auxProto, verbose);
53 _vars =
static_cast<RooArgSet*
>(vars.snapshot(kTRUE));
59 RooEffGenContext::~RooEffGenContext()
69 void RooEffGenContext::initGenerator(
const RooArgSet &theEvent)
71 _eff->recursiveRedirectServers(theEvent);
72 _generator->initGenerator(theEvent);
75 Int_t code = _eff->getMaxVal(*_vars);
79 _maxEff = _eff->maxVal(code);
88 void RooEffGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
91 _generator->generateEvent(theEvent, remaining);
92 double val = _eff->getVal();
93 if (val > _maxEff && !_eff->getMaxVal(*_vars)) {
94 coutE(Generation) << ClassName() <<
"::" << GetName()
95 <<
":generateEvent: value of efficiency is larger than assumed maximum of 1." << std::endl;
98 if (val > RooRandom::uniform() * _maxEff) {