46 ClassImp(RooAddGenContext);
53 RooAddGenContext::RooAddGenContext(
const RooAddPdf &model,
const RooArgSet &vars,
54 const RooDataSet *prototype,
const RooArgSet* auxProto,
56 RooAbsGenContext(model,vars,prototype,auxProto,verbose), _isModel(kFALSE)
58 cxcoutI(Generation) <<
"RooAddGenContext::ctor() setting up event special generator context for sum p.d.f. " << model.GetName()
59 <<
" for generation of observable(s) " << vars ;
60 if (prototype) ccxcoutI(Generation) <<
" with prototype data for " << *prototype->get() ;
61 if (auxProto && auxProto->getSize()>0) ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
62 ccxcoutI(Generation) << endl ;
65 _pdfSet = (RooArgSet*) RooArgSet(model).snapshot(kTRUE) ;
66 _pdf = (RooAddPdf*) _pdfSet->find(model.GetName()) ;
67 _pdf->setOperMode(RooAbsArg::ADirty,kTRUE) ;
72 RooArgSet coefNSet(vars) ;
73 coefNSet.add(*prototype->get()) ;
74 _pdf->fixAddCoefNormalization(coefNSet,kFALSE) ;
77 _nComp = model._pdfList.getSize() ;
78 _coefThresh =
new Double_t[_nComp+1] ;
79 _vars = (RooArgSet*) vars.snapshot(kFALSE) ;
81 for (
const auto arg : model._pdfList) {
82 auto pdf =
dynamic_cast<const RooAbsPdf *
>(arg);
84 coutF(Generation) <<
"Cannot generate events from an object that is not a PDF.\n\t"
85 <<
"The offending object is a " << arg->IsA()->GetName() <<
" named '" << arg->GetName() <<
"'." << std::endl;
86 throw std::invalid_argument(
"Trying to generate events from on object that is not a PDF.");
89 RooAbsGenContext* cx = pdf->genContext(vars,prototype,auxProto,verbose) ;
90 _gcList.push_back(cx) ;
93 ((RooAddPdf*)_pdf)->getProjCache(_vars) ;
94 _pdf->recursiveRedirectServers(*_theEvent) ;
105 RooAddGenContext::RooAddGenContext(
const RooAddModel &model,
const RooArgSet &vars,
106 const RooDataSet *prototype,
const RooArgSet* auxProto,
108 RooAbsGenContext(model,vars,prototype,auxProto,verbose), _isModel(kTRUE)
110 cxcoutI(Generation) <<
"RooAddGenContext::ctor() setting up event special generator context for sum resolution model " << model.GetName()
111 <<
" for generation of observable(s) " << vars ;
112 if (prototype) ccxcoutI(Generation) <<
" with prototype data for " << *prototype->get() ;
113 if (auxProto && auxProto->getSize()>0) ccxcoutI(Generation) <<
" with auxiliary prototypes " << *auxProto ;
114 ccxcoutI(Generation) << endl ;
117 _pdfSet = (RooArgSet*) RooArgSet(model).snapshot(kTRUE) ;
118 _pdf = (RooAbsPdf*) _pdfSet->find(model.GetName()) ;
121 model._pdfIter->Reset() ;
123 _nComp = model._pdfList.getSize() ;
124 _coefThresh =
new Double_t[_nComp+1] ;
125 _vars = (RooArgSet*) vars.snapshot(kFALSE) ;
127 while((pdf=(RooAbsPdf*)model._pdfIter->Next())) {
128 RooAbsGenContext* cx = pdf->genContext(vars,prototype,auxProto,verbose) ;
129 _gcList.push_back(cx) ;
132 ((RooAddModel*)_pdf)->getProjCache(_vars) ;
133 _pdf->recursiveRedirectServers(*_theEvent) ;
144 RooAddGenContext::~RooAddGenContext()
146 delete[] _coefThresh ;
147 for (vector<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
159 void RooAddGenContext::attach(
const RooArgSet& args)
161 _pdf->recursiveRedirectServers(args) ;
164 for (vector<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
165 (*iter)->attach(args) ;
176 void RooAddGenContext::initGenerator(
const RooArgSet &theEvent)
178 _pdf->recursiveRedirectServers(theEvent) ;
181 RooAddModel* amod = (RooAddModel*) _pdf ;
182 _mcache = amod->getProjCache(_vars) ;
184 RooAddPdf* apdf = (RooAddPdf*) _pdf ;
185 _pcache = apdf->getProjCache(_vars,0,
"FULL_RANGE_ADDGENCONTEXT") ;
189 for (vector<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
190 (*iter)->initGenerator(theEvent) ;
199 void RooAddGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
203 Double_t rand = RooRandom::uniform() ;
205 for (i=0 ; i<_nComp ; i++) {
206 if (rand>_coefThresh[i] && rand<_coefThresh[i+1]) {
207 _gcList[i]->generateEvent(theEvent,remaining) ;
218 void RooAddGenContext::updateThresholds()
222 RooAddModel* amod = (RooAddModel*) _pdf ;
223 amod->updateCoefficients(*_mcache,_vars) ;
225 _coefThresh[0] = 0. ;
227 for (i=0 ; i<_nComp ; i++) {
228 _coefThresh[i+1] = amod->_coefCache[i] ;
229 _coefThresh[i+1] += _coefThresh[i] ;
234 RooAddPdf* apdf = (RooAddPdf*) _pdf ;
236 apdf->updateCoefficients(*_pcache,_vars) ;
238 _coefThresh[0] = 0. ;
240 for (i=0 ; i<_nComp ; i++) {
241 _coefThresh[i+1] = apdf->_coefCache[i] ;
242 _coefThresh[i+1] += _coefThresh[i] ;
254 void RooAddGenContext::setProtoDataOrder(Int_t* lut)
256 RooAbsGenContext::setProtoDataOrder(lut) ;
257 for (vector<RooAbsGenContext*>::iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
258 (*iter)->setProtoDataOrder(lut) ;
267 void RooAddGenContext::printMultiline(ostream &os, Int_t content, Bool_t verbose, TString indent)
const
269 RooAbsGenContext::printMultiline(os,content,verbose,indent) ;
270 os << indent <<
"--- RooAddGenContext ---" << endl ;
271 os << indent <<
"Using PDF ";
272 _pdf->printStream(os,kName|kArgs|kClassName,kSingleLine,indent);
274 os << indent <<
"List of component generators" << endl ;
275 TString indent2(indent) ;
276 indent2.Append(
" ") ;
277 for (vector<RooAbsGenContext*>::const_iterator iter=_gcList.begin() ; iter!=_gcList.end() ; ++iter) {
278 (*iter)->printMultiline(os,content,verbose,indent2) ;