42 ClassImp(RooBinnedGenContext);
49 RooBinnedGenContext::RooBinnedGenContext(
const RooAbsPdf &model,
const RooArgSet &vars,
50 const RooDataSet *prototype,
const RooArgSet* auxProto,
52 RooAbsGenContext(model,vars,prototype,auxProto,verbose)
54 cxcoutI(Generation) <<
"RooBinnedGenContext::ctor() setting up event special generator context for sum 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->getSize()>0) ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
58 ccxcoutI(Generation) << endl ;
61 _pdfSet = (RooArgSet*) RooArgSet(model).snapshot(kTRUE) ;
62 _pdf = (RooAbsPdf*) _pdfSet->find(model.GetName()) ;
63 _pdf->setOperMode(RooAbsArg::ADirty,kTRUE) ;
68 RooArgSet coefNSet(vars) ;
69 coefNSet.add(*prototype->get()) ;
70 _pdf->fixAddCoefNormalization(coefNSet) ;
73 _pdf->recursiveRedirectServers(*_theEvent) ;
74 _vars = _pdf->getObservables(vars) ;
77 RooFIter viter = _vars->fwdIterator() ;
79 while((var=viter.next())) {
80 RooRealVar* rvar =
dynamic_cast<RooRealVar*
>(var) ;
82 list<Double_t>* binb = model.binBoundaries(*rvar,rvar->getMin(),rvar->getMax()) ;
89 _hist =
new RooDataHist(
"genData",
"genData",*_vars) ;
91 _expectedData = kFALSE ;
98 RooBinnedGenContext::~RooBinnedGenContext()
110 void RooBinnedGenContext::attach(
const RooArgSet& args)
112 _pdf->recursiveRedirectServers(args) ;
122 void RooBinnedGenContext::initGenerator(
const RooArgSet &theEvent)
124 _pdf->recursiveRedirectServers(theEvent) ;
131 void RooBinnedGenContext::setExpectedData(Bool_t flag)
133 _expectedData = flag ;
139 RooDataSet *RooBinnedGenContext::generate(Double_t nEvt, Bool_t , Bool_t extended)
144 Double_t nEvents = nEvt ;
147 if (!_pdf->canBeExtended()) {
148 coutE(InputArguments) <<
"RooAbsPdf::generateBinned(" << GetName()
149 <<
") ERROR: No event count provided and p.d.f does not provide expected number of events" << endl ;
153 if (_expectedData || extended) {
154 nEvents = _pdf->expectedEvents(_vars) ;
156 nEvents = Int_t(_pdf->expectedEvents(_vars)+0.5) ;
162 _pdf->fillDataHist(_hist,_vars,1,kTRUE) ;
165 RooRealVar weight(
"weight",
"weight",0,1e9) ;
166 RooArgSet tmp(*_vars) ;
168 RooDataSet* wudata =
new RooDataSet(
"wu",
"wu",tmp,RooFit::WeightVar(
"weight")) ;
170 vector<int> histOut(_hist->numEntries()) ;
171 Double_t histMax(-1) ;
172 Int_t histOutSum(0) ;
173 for (
int i=0 ; i<_hist->numEntries() ; i++) {
178 Double_t w=_hist->weight()*nEvents ;
179 wudata->add(*_hist->get(),w) ;
181 }
else if (extended) {
184 Double_t w = RooRandom::randomGenerator()->Poisson(_hist->weight()*nEvents) ;
185 wudata->add(*_hist->get(),w) ;
191 if (_hist->weight()>histMax) {
192 histMax = _hist->weight() ;
194 histOut[i] = RooRandom::randomGenerator()->Poisson(_hist->weight()*nEvents) ;
195 histOutSum += histOut[i] ;
200 if (!_expectedData && !extended) {
205 Int_t nEvtExtra = abs(Int_t(nEvents)-histOutSum) ;
206 Int_t wgt = (histOutSum>nEvents) ? -1 : 1 ;
211 Int_t ibinRand = RooRandom::randomGenerator()->Integer(_hist->numEntries()) ;
212 _hist->get(ibinRand) ;
213 Double_t ranY = RooRandom::randomGenerator()->Uniform(histMax) ;
215 if (ranY<_hist->weight()) {
217 histOut[ibinRand]++ ;
220 if (histOut[ibinRand]>0) {
221 histOut[ibinRand]-- ;
231 for (
int i=0 ; i<_hist->numEntries() ; i++) {
233 wudata->add(*_hist->get(),histOut[i]) ;
247 void RooBinnedGenContext::generateEvent(RooArgSet&, Int_t)
257 void RooBinnedGenContext::printMultiline(ostream &os, Int_t content, Bool_t verbose, TString indent)
const
259 RooAbsGenContext::printMultiline(os,content,verbose,indent) ;
260 os << indent <<
"--- RooBinnedGenContext ---" << endl ;
261 os << indent <<
"Using PDF ";
262 _pdf->printStream(os,kName|kArgs|kClassName,kSingleLine,indent);