44 ClassImp(RooAbsCachedReal);
51 RooAbsCachedReal::RooAbsCachedReal(
const char *name,
const char *title, Int_t ipOrder) :
52 RooAbsReal(name,title),
64 RooAbsCachedReal::RooAbsCachedReal(
const RooAbsCachedReal& other,
const char* name) :
65 RooAbsReal(other,name),
66 _cacheMgr(other._cacheMgr,this),
67 _ipOrder(other._ipOrder),
68 _disableCache(other._disableCache)
77 RooAbsCachedReal::~RooAbsCachedReal()
89 Double_t RooAbsCachedReal::getValV(
const RooArgSet* nset)
const
92 return RooAbsReal::getValV(nset) ;
100 FuncCacheElem* cache = getCache(nset) ;
102 _value = cache->func()->getVal() ;
112 void RooAbsCachedReal::clearCacheObject(FuncCacheElem& cache)
const
114 cache.hist()->setAllWeights(-1) ;
126 RooAbsCachedReal::FuncCacheElem* RooAbsCachedReal::createCache(
const RooArgSet* nset)
const
128 return new FuncCacheElem(const_cast<RooAbsCachedReal&>(*
this),nset) ;
136 RooAbsCachedReal::FuncCacheElem* RooAbsCachedReal::getCache(
const RooArgSet* nset)
const
139 Int_t sterileIdx(-1) ;
140 FuncCacheElem* cache = (FuncCacheElem*) _cacheMgr.getObj(nset,0,&sterileIdx) ;
142 if (cache->paramTracker()->hasChanged(kTRUE)) {
143 ccoutD(Eval) <<
"RooAbsCachedReal::getCache(" << GetName() <<
") cached function "
144 << cache->func()->GetName() <<
" requires recalculation as parameters changed" << endl ;
145 fillCacheObject(*cache) ;
146 cache->func()->setValueDirty() ;
151 cache = createCache(nset) ;
154 RooFIter iarg( cache->hist()->get()->fwdIterator() );
156 while ( (arg=iarg.next()) ) {
157 arg->setOperMode(ADirty);
161 RooDataHist* htmp = (RooDataHist*) expensiveObjectCache().retrieveObject(cache->hist()->GetName(),RooDataHist::Class(),cache->paramTracker()->parameters()) ;
165 cache->hist()->reset() ;
166 cache->hist()->add(*htmp) ;
170 fillCacheObject(*cache) ;
172 RooDataHist* eoclone =
new RooDataHist(*cache->hist()) ;
173 eoclone->removeSelfFromDir() ;
174 expensiveObjectCache().registerObject(GetName(),cache->hist()->GetName(),*eoclone,cache->paramTracker()->parameters()) ;
178 Int_t code = _cacheMgr.setObj(nset,0,((RooAbsCacheElement*)cache),0) ;
179 ccoutD(Caching) <<
"RooAbsCachedReal("<<
this<<
")::getCache(" << GetName() <<
") creating new cache " << cache->func()->GetName() <<
" for nset " << (nset?*nset:RooArgSet()) <<
" with code " << code << endl ;
194 RooAbsCachedReal::FuncCacheElem::FuncCacheElem(
const RooAbsCachedReal&
self,
const RooArgSet* nset)
197 _cacheSource = kFALSE ;
200 RooArgSet* nset2 =
self.actualObservables(nset?*nset:RooArgSet()) ;
202 RooArgSet orderedObs ;
203 self.preferredObservableScanOrder(*nset2,orderedObs) ;
206 TString hname =
self.inputBaseName() ;
207 hname.Append(
"_CACHEHIST") ;
208 hname.Append(
self.cacheNameSuffix(*nset2)) ;
210 _hist =
new RooDataHist(hname,hname,*nset2,
self.binningName()) ;
211 _hist->removeSelfFromDir() ;
213 RooArgSet* observables=
self.actualObservables(*nset2) ;
216 TString funcname =
self.inputBaseName() ;
217 funcname.Append(
"_CACHE") ;
218 funcname.Append(
self.cacheNameSuffix(*nset2)) ;
219 _func =
new RooHistFunc(funcname,funcname,*observables,*_hist,
self.getInterpolationOrder()) ;
220 if (
self.operMode()==ADirty) _func->setOperMode(ADirty) ;
223 _func->setValueDirty() ;
226 RooArgSet* params =
self.actualParameters(orderedObs) ;
227 string name= Form(
"%s_CACHEPARAMS",_func->GetName()) ;
228 _paramTracker =
new RooChangeTracker(name.c_str(),name.c_str(),*params,kTRUE) ;
229 _paramTracker->hasChanged(kTRUE) ;
233 _func->addServerList(*params) ;
245 RooAbsCachedReal::FuncCacheElem::~FuncCacheElem()
247 if (_sourceClone) {
delete _sourceClone ; }
248 delete _paramTracker ;
259 TString RooAbsCachedReal::cacheNameSuffix(
const RooArgSet& nset)
const
262 name.Append(
"_Obs[") ;
263 if (nset.getSize()>0) {
264 TIterator* iter = nset.createIterator() ;
266 Bool_t first(kTRUE) ;
267 while((arg=(RooAbsArg*)iter->Next())) {
273 name.Append(arg->GetName()) ;
279 const char* payloadUS = payloadUniqueSuffix() ;
281 name.Append(payloadUS) ;
291 void RooAbsCachedReal::setInterpolationOrder(Int_t order)
295 for (Int_t i=0 ; i<_cacheMgr.cacheSize() ; i++) {
296 FuncCacheElem* cache = (FuncCacheElem*) _cacheMgr.getObjByIndex(i) ;
298 cache->func()->setInterpolationOrder(order) ;
308 RooArgList RooAbsCachedReal::FuncCacheElem::containedArgs(Action)
310 RooArgList ret(*func()) ;
312 ret.add(*_paramTracker) ;
314 ret.add(*_sourceClone) ;
323 void RooAbsCachedReal::FuncCacheElem::printCompactTreeHook(ostream& os,
const char* indent, Int_t curElem, Int_t maxElem)
326 os << indent <<
"--- RooAbsCachedReal begin cache ---" << endl ;
329 TString indent2(indent) ;
330 indent2 += Form(
"[%d] ",curElem) ;
331 func()->printCompactTree(os,indent2) ;
333 if (curElem==maxElem) {
334 os << indent <<
"--- RooAbsCachedReal end cache --- " << endl ;
343 Int_t RooAbsCachedReal::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars,
const RooArgSet* normSet,
const char* rangeName)
const
345 FuncCacheElem* cache = getCache(normSet?normSet:&allVars) ;
346 Int_t code = cache->func()->getAnalyticalIntegralWN(allVars,analVars,normSet,rangeName) ;
347 _anaIntMap[code].first = &allVars ;
348 _anaIntMap[code].second = normSet ;
357 Double_t RooAbsCachedReal::analyticalIntegralWN(Int_t code,
const RooArgSet* normSet,
const char* rangeName)
const
360 return getVal(normSet) ;
363 const RooArgSet* anaVars = _anaIntMap[code].first ;
364 const RooArgSet* normSet2 = _anaIntMap[code].second ;
366 FuncCacheElem* cache = getCache(normSet2?normSet2:anaVars) ;
367 return cache->func()->analyticalIntegralWN(code,normSet,rangeName) ;