46 ClassImp(RooAbsCachedPdf);
53 RooAbsCachedPdf::RooAbsCachedPdf(
const char *name,
const char *title, Int_t ipOrder) :
54 RooAbsPdf(name,title),
66 RooAbsCachedPdf::RooAbsCachedPdf(
const RooAbsCachedPdf& other,
const char* name) :
67 RooAbsPdf(other,name),
68 _cacheMgr(other._cacheMgr,this),
69 _ipOrder(other._ipOrder),
70 _disableCache(other._disableCache)
79 RooAbsCachedPdf::~RooAbsCachedPdf()
91 Double_t RooAbsCachedPdf::getValV(
const RooArgSet* nset)
const
94 return RooAbsPdf::getValV(nset) ;
98 PdfCacheElem* cache = getCache(nset) ;
100 Double_t value = cache->pdf()->getVal(nset) ;
111 RooAbsPdf* RooAbsCachedPdf::getCachePdf(
const RooArgSet* nset)
const
113 PdfCacheElem* cache = getCache(nset) ;
116 return cache->pdf() ;
126 RooDataHist* RooAbsCachedPdf::getCacheHist(
const RooArgSet* nset)
const
128 PdfCacheElem* cache = getCache(nset) ;
131 return cache->hist() ;
141 void RooAbsCachedPdf::clearCacheObject(PdfCacheElem& cache)
const
143 cache.hist()->setAllWeights(-1) ;
154 RooAbsCachedPdf::PdfCacheElem* RooAbsCachedPdf::getCache(
const RooArgSet* nset, Bool_t recalculate)
const
157 Int_t sterileIdx(-1) ;
158 PdfCacheElem* cache = (PdfCacheElem*) _cacheMgr.getObj(nset,0,&sterileIdx) ;
162 if (cache->paramTracker()->hasChanged(kTRUE) && (recalculate || !cache->pdf()->haveUnitNorm()) ) {
163 cxcoutD(Eval) <<
"RooAbsCachedPdf::getCache(" << GetName() <<
") cache " << cache <<
" pdf "
164 << cache->pdf()->GetName() <<
" requires recalculation as parameters changed" << endl ;
165 fillCacheObject(*cache) ;
166 cache->pdf()->setValueDirty() ;
172 cache = createCache(nset) ;
175 RooDataHist* htmp = (RooDataHist*) expensiveObjectCache().retrieveObject(cache->hist()->GetName(),RooDataHist::Class(),cache->paramTracker()->parameters()) ;
179 cache->hist()->reset() ;
180 cache->hist()->add(*htmp) ;
184 fillCacheObject(*cache) ;
186 RooDataHist* eoclone =
new RooDataHist(*cache->hist()) ;
187 eoclone->removeSelfFromDir() ;
188 expensiveObjectCache().registerObject(GetName(),cache->hist()->GetName(),*eoclone,cache->paramTracker()->parameters()) ;
194 Int_t code = _cacheMgr.setObj(nset,0,((RooAbsCacheElement*)cache),0) ;
196 coutI(Caching) <<
"RooAbsCachedPdf::getCache(" << GetName() <<
") creating new cache " << cache <<
" with pdf "
197 << cache->pdf()->GetName() <<
" for nset " << (nset?*nset:RooArgSet()) <<
" with code " << code ;
199 ccoutI(Caching) <<
" from preexisting content." ;
201 ccoutI(Caching) << endl ;
214 RooAbsCachedPdf::PdfCacheElem::PdfCacheElem(
const RooAbsCachedPdf&
self,
const RooArgSet* nsetIn) :
215 _pdf(0), _paramTracker(0), _hist(0), _norm(0)
218 RooArgSet* nset2 =
self.actualObservables(nsetIn?*nsetIn:RooArgSet()) ;
220 RooArgSet orderedObs ;
222 self.preferredObservableScanOrder(*nset2,orderedObs) ;
226 TString hname =
self.GetName() ;
228 hname.Append(
self.inputBaseName()) ;
229 hname.Append(
"_CACHEHIST") ;
230 hname.Append(
self.cacheNameSuffix(orderedObs)) ;
231 hname.Append(
self.histNameSuffix()) ;
232 _hist =
new RooDataHist(hname,hname,orderedObs,
self.binningName()) ;
233 _hist->removeSelfFromDir() ;
240 RooArgSet pdfFinalObs ;
241 TIterator* iter = orderedObs.createIterator() ;
243 while((harg=(RooAbsArg*)iter->Next())) {
244 RooAbsArg& po =
self.pdfObservable(*harg) ;
246 if (po.isFundamental()) {
247 pdfFinalObs.add(po) ;
249 RooArgSet* tmp = po.getVariables() ;
250 pdfFinalObs.add(*tmp) ;
257 TString pdfname =
self.inputBaseName() ;
258 pdfname.Append(
"_CACHE") ;
259 pdfname.Append(
self.cacheNameSuffix(pdfFinalObs)) ;
260 _pdf =
new RooHistPdf(pdfname,pdfname,pdfObs,orderedObs,*_hist,
self.getInterpolationOrder()) ;
262 _nset.addClone(*nsetIn) ;
267 RooArgSet* params =
self.actualParameters(pdfFinalObs) ;
268 params->remove(pdfFinalObs,kTRUE,kTRUE) ;
270 string name= Form(
"%s_CACHEPARAMS",_pdf->GetName()) ;
271 _paramTracker =
new RooChangeTracker(name.c_str(),name.c_str(),*params,kTRUE) ;
272 _paramTracker->hasChanged(kTRUE) ;
276 _pdf->addServerList(*params) ;
279 _pdf->setValueDirty() ;
293 TString RooAbsCachedPdf::cacheNameSuffix(
const RooArgSet& nset)
const
296 name.Append(
"_Obs[") ;
297 if (nset.getSize()>0) {
298 TIterator* iter = nset.createIterator() ;
300 Bool_t first(kTRUE) ;
301 while((arg=(RooAbsArg*)iter->Next())) {
307 name.Append(arg->GetName()) ;
313 const char* payloadUS = payloadUniqueSuffix() ;
315 name.Append(payloadUS) ;
326 void RooAbsCachedPdf::setInterpolationOrder(Int_t order)
331 for (i=0 ; i<_cacheMgr.cacheSize() ; i++) {
332 PdfCacheElem* cache = (PdfCacheElem*) _cacheMgr.getObjByIndex(i) ;
334 cache->pdf()->setInterpolationOrder(order) ;
344 RooArgList RooAbsCachedPdf::PdfCacheElem::containedArgs(Action)
346 RooArgList ret(*_pdf) ;
347 ret.add(*_paramTracker) ;
348 if (_norm) ret.add(*_norm) ;
357 RooAbsCachedPdf::PdfCacheElem::~PdfCacheElem()
366 delete _paramTracker ;
378 void RooAbsCachedPdf::PdfCacheElem::printCompactTreeHook(ostream& os,
const char* indent, Int_t curElem, Int_t maxElem)
381 os << indent <<
"--- RooAbsCachedPdf begin cache ---" << endl ;
384 TString indent2(indent) ;
385 os << Form(
"[%d] Configuration for observables ",curElem) << _nset << endl ;
386 indent2 += Form(
"[%d] ",curElem) ;
387 _pdf->printCompactTree(os,indent2) ;
389 os << Form(
"[%d] Norm ",curElem) ;
390 _norm->printStream(os,kName|kArgs,kSingleLine) ;
393 if (curElem==maxElem) {
394 os << indent <<
"--- RooAbsCachedPdf end cache --- " << endl ;
404 Bool_t RooAbsCachedPdf::forceAnalyticalInt(
const RooAbsArg& dep)
const
406 RooArgSet* actObs = actualObservables(dep) ;
407 Bool_t ret = (actObs->getSize()>0) ;
419 Int_t RooAbsCachedPdf::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars,
const RooArgSet* normSet,
const char* rangeName)
const
421 if (allVars.getSize()==0) {
425 PdfCacheElem* cache = getCache(normSet?normSet:&allVars) ;
426 Int_t code = cache->pdf()->getAnalyticalIntegralWN(allVars,analVars,normSet,rangeName) ;
432 RooArgSet* all =
new RooArgSet ;
433 RooArgSet* ana =
new RooArgSet ;
434 RooArgSet* nrm =
new RooArgSet ;
435 all->addClone(allVars) ;
436 ana->addClone(analVars) ;
438 nrm->addClone(*normSet) ;
440 std::vector<Int_t> codeList(2);
442 codeList[1] = cache->pdf()->haveUnitNorm() ? 1 : 0 ;
443 Int_t masterCode = _anaReg.store(codeList,all,ana,nrm)+1 ;
447 if (cache->pdf()->haveUnitNorm()) {
448 analVars.add(allVars,kTRUE) ;
461 Double_t RooAbsCachedPdf::analyticalIntegralWN(Int_t code,
const RooArgSet* normSet,
const char* rangeName)
const
464 return getVal(normSet) ;
467 RooArgSet *allVars(0),*anaVars(0),*normSet2(0),*dummy(0) ;
468 const std::vector<Int_t> codeList = _anaReg.retrieve(code-1,allVars,anaVars,normSet2,dummy) ;
470 PdfCacheElem* cache = getCache(normSet2?normSet2:anaVars,kFALSE) ;
471 Double_t ret = cache->pdf()->analyticalIntegralWN(codeList[0],normSet,rangeName) ;
474 RooArgSet factObs(*allVars) ;
475 factObs.remove(*anaVars,kTRUE,kTRUE) ;
476 TIterator* iter = factObs.createIterator() ;
478 while((arg=dynamic_cast<RooAbsLValue*>(iter->Next()))) {
479 ret *= arg->volume(rangeName) ;