00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "RooFit.h"
00031
00032 #include "Riostream.h"
00033
00034
00035 #include "RooMsgService.h"
00036 #include "RooAddGenContext.h"
00037 #include "RooAddGenContext.h"
00038 #include "RooAddPdf.h"
00039 #include "RooDataSet.h"
00040 #include "RooRandom.h"
00041 #include "RooAddModel.h"
00042
00043 ClassImp(RooAddGenContext)
00044 ;
00045
00046
00047
00048 RooAddGenContext::RooAddGenContext(const RooAddPdf &model, const RooArgSet &vars,
00049 const RooDataSet *prototype, const RooArgSet* auxProto,
00050 Bool_t verbose) :
00051 RooAbsGenContext(model,vars,prototype,auxProto,verbose), _isModel(kFALSE)
00052 {
00053
00054
00055 cxcoutI(Generation) << "RooAddGenContext::ctor() setting up event special generator context for sum p.d.f. " << model.GetName()
00056 << " for generation of observable(s) " << vars ;
00057 if (prototype) ccxcoutI(Generation) << " with prototype data for " << *prototype->get() ;
00058 if (auxProto && auxProto->getSize()>0) ccxcoutI(Generation) << " with auxiliary prototypes " << *auxProto ;
00059 ccxcoutI(Generation) << endl ;
00060
00061
00062 _pdfSet = (RooArgSet*) RooArgSet(model).snapshot(kTRUE) ;
00063 _pdf = (RooAddPdf*) _pdfSet->find(model.GetName()) ;
00064
00065
00066 if (prototype)
00067 {
00068 RooArgSet coefNSet(vars) ;
00069 coefNSet.add(*prototype->get()) ;
00070 _pdf->fixAddCoefNormalization(coefNSet) ;
00071 }
00072
00073 model._pdfIter->Reset() ;
00074 RooAbsPdf* pdf ;
00075 _nComp = model._pdfList.getSize() ;
00076 _coefThresh = new Double_t[_nComp+1] ;
00077 _vars = (RooArgSet*) vars.snapshot(kFALSE) ;
00078
00079 while((pdf=(RooAbsPdf*)model._pdfIter->Next())) {
00080 RooAbsGenContext* cx = pdf->genContext(vars,prototype,auxProto,verbose) ;
00081 _gcList.Add(cx) ;
00082 }
00083
00084 ((RooAddPdf*)_pdf)->getProjCache(_vars) ;
00085 _pdf->recursiveRedirectServers(*_theEvent) ;
00086 }
00087
00088
00089
00090
00091 RooAddGenContext::RooAddGenContext(const RooAddModel &model, const RooArgSet &vars,
00092 const RooDataSet *prototype, const RooArgSet* auxProto,
00093 Bool_t verbose) :
00094 RooAbsGenContext(model,vars,prototype,auxProto,verbose), _isModel(kTRUE)
00095 {
00096
00097
00098 cxcoutI(Generation) << "RooAddGenContext::ctor() setting up event special generator context for sum resolution model " << model.GetName()
00099 << " for generation of observable(s) " << vars ;
00100 if (prototype) ccxcoutI(Generation) << " with prototype data for " << *prototype->get() ;
00101 if (auxProto && auxProto->getSize()>0) ccxcoutI(Generation) << " with auxiliary prototypes " << *auxProto ;
00102 ccxcoutI(Generation) << endl ;
00103
00104
00105 _pdfSet = (RooArgSet*) RooArgSet(model).snapshot(kTRUE) ;
00106 _pdf = (RooAbsPdf*) _pdfSet->find(model.GetName()) ;
00107
00108
00109 model._pdfIter->Reset() ;
00110 RooAbsPdf* pdf ;
00111 _nComp = model._pdfList.getSize() ;
00112 _coefThresh = new Double_t[_nComp+1] ;
00113 _vars = (RooArgSet*) vars.snapshot(kFALSE) ;
00114
00115 while((pdf=(RooAbsPdf*)model._pdfIter->Next())) {
00116 RooAbsGenContext* cx = pdf->genContext(vars,prototype,auxProto,verbose) ;
00117 _gcList.Add(cx) ;
00118 }
00119
00120 ((RooAddModel*)_pdf)->getProjCache(_vars) ;
00121 _pdf->recursiveRedirectServers(*_theEvent) ;
00122 }
00123
00124
00125
00126
00127 RooAddGenContext::~RooAddGenContext()
00128 {
00129
00130
00131 delete[] _coefThresh ;
00132 _gcList.Delete() ;
00133 delete _vars ;
00134 delete _pdfSet ;
00135 }
00136
00137
00138
00139
00140 void RooAddGenContext::attach(const RooArgSet& args)
00141 {
00142
00143
00144 _pdf->recursiveRedirectServers(args) ;
00145
00146
00147 TIterator* iter = _gcList.MakeIterator() ;
00148 RooAbsGenContext* gc ;
00149 while((gc=(RooAbsGenContext*)iter->Next())){
00150 gc->attach(args) ;
00151 }
00152 delete iter ;
00153 }
00154
00155
00156
00157
00158 void RooAddGenContext::initGenerator(const RooArgSet &theEvent)
00159 {
00160
00161
00162
00163
00164 _pdf->recursiveRedirectServers(theEvent) ;
00165
00166
00167 TIterator* iter = _gcList.MakeIterator() ;
00168 RooAbsGenContext* gc ;
00169 while((gc=(RooAbsGenContext*)iter->Next())){
00170 gc->initGenerator(theEvent) ;
00171 }
00172 delete iter ;
00173 }
00174
00175
00176
00177 void RooAddGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
00178 {
00179
00180
00181
00182
00183 updateThresholds() ;
00184 Double_t rand = RooRandom::uniform() ;
00185 Int_t i=0 ;
00186 for (i=0 ; i<_nComp ; i++) {
00187 if (rand>_coefThresh[i] && rand<_coefThresh[i+1]) {
00188 ((RooAbsGenContext*)_gcList.At(i))->generateEvent(theEvent,remaining) ;
00189 return ;
00190 }
00191 }
00192 }
00193
00194
00195
00196 void RooAddGenContext::updateThresholds()
00197 {
00198
00199
00200
00201 if (_isModel) {
00202
00203 RooAddModel* amod = (RooAddModel*) _pdf ;
00204
00205 RooAddModel::CacheElem* cache = amod->getProjCache(_vars) ;
00206 amod->updateCoefficients(*cache,_vars) ;
00207
00208 _coefThresh[0] = 0. ;
00209 Int_t i ;
00210 for (i=0 ; i<_nComp ; i++) {
00211 _coefThresh[i+1] = amod->_coefCache[i] ;
00212 _coefThresh[i+1] += _coefThresh[i] ;
00213 }
00214
00215 } else {
00216 RooAddPdf* apdf = (RooAddPdf*) _pdf ;
00217
00218
00219 RooAddPdf::CacheElem* cache = apdf->getProjCache(_vars,0,"FULL_RANGE_ADDGENCONTEXT") ;
00220 apdf->updateCoefficients(*cache,_vars) ;
00221
00222 _coefThresh[0] = 0. ;
00223 Int_t i ;
00224 for (i=0 ; i<_nComp ; i++) {
00225 _coefThresh[i+1] = apdf->_coefCache[i] ;
00226 _coefThresh[i+1] += _coefThresh[i] ;
00227
00228 }
00229
00230 }
00231
00232 }
00233
00234
00235
00236 void RooAddGenContext::setProtoDataOrder(Int_t* lut)
00237 {
00238
00239
00240 RooAbsGenContext::setProtoDataOrder(lut) ;
00241 Int_t i ;
00242 for (i=0 ; i<_nComp ; i++) {
00243 ((RooAbsGenContext*)_gcList.At(i))->setProtoDataOrder(lut) ;
00244 }
00245 }
00246
00247
00248
00249
00250 void RooAddGenContext::printMultiline(ostream &os, Int_t content, Bool_t verbose, TString indent) const
00251 {
00252
00253
00254 RooAbsGenContext::printMultiline(os,content,verbose,indent) ;
00255 os << indent << "--- RooAddGenContext ---" << endl ;
00256 os << indent << "Using PDF ";
00257 _pdf->printStream(os,kName|kArgs|kClassName,kSingleLine,indent);
00258
00259 os << indent << "List of component generators" << endl ;
00260 TString indent2(indent) ;
00261 indent2.Append(" ") ;
00262 for (Int_t i=0 ; i<_nComp ; i++) {
00263 ((RooAbsGenContext*)_gcList.At(i))->printMultiline(os,content,verbose,indent2) ;
00264 }
00265 }