RooAddGenContext.cxx

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  * @(#)root/roofitcore:$Id: RooAddGenContext.cxx 34064 2010-06-22 15:05:19Z wouter $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
00015  *****************************************************************************/
00016 
00017 //////////////////////////////////////////////////////////////////////////////
00018 // 
00019 // BEGIN_HTML 
00020 // RooAddGenContext is an efficient implementation of the
00021 // generator context specific for RooAddPdf PDFs. The strategy
00022 // of RooAddGenContext is to defer generation of each component
00023 // to a dedicated generator context for that component and to
00024 // randomly choose one of those context to generate an event,
00025 // with a probability proportional to its associated coefficient
00026 // END_HTML
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   // Constructor
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   // Constructor. Build an array of generator contexts for each product component PDF
00062   _pdfSet = (RooArgSet*) RooArgSet(model).snapshot(kTRUE) ;
00063   _pdf = (RooAddPdf*) _pdfSet->find(model.GetName()) ;
00064 
00065   // Fix normalization set of this RooAddPdf
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   // Constructor
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   // Constructor. Build an array of generator contexts for each product component PDF
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   // Destructor. Delete all owned subgenerator contexts
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   // Attach given set of variables to internal p.d.f. clone
00143 
00144   _pdf->recursiveRedirectServers(args) ;
00145 
00146   // Forward initGenerator call to all components
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   // One-time initialization of generator contex. Attach theEvent
00161   // to internal p.d.f clone and forward initialization call to 
00162   // the component generators
00163 
00164   _pdf->recursiveRedirectServers(theEvent) ;
00165 
00166   // Forward initGenerator call to all components
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   // Randomly choose one of the component contexts to generate this event,
00180   // with a probability proportional to its coefficient
00181 
00182   // Throw a random number to determin which component to generate
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   // Update the cumulative threshold table from the current coefficient
00199   // values
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     //cout << "Now calling getProjCache()" << endl ;
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 //       cout << "RooAddGenContext::updateThresholds(" << GetName() << ") _coefThresh[" << i+1 << "] = " << _coefThresh[i+1] << endl ;
00228     }
00229     
00230   }
00231 
00232 }
00233 
00234 
00235 //_____________________________________________________________________________
00236 void RooAddGenContext::setProtoDataOrder(Int_t* lut)
00237 {
00238   // Forward the setProtoDataOrder call to the component generator contexts
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   // Print the details of the context
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 }

Generated on Tue Jul 5 15:05:56 2011 for ROOT_528-00b_version by  doxygen 1.5.1