41 ClassImp(RooExpensiveObjectCache);
42 ClassImp(RooExpensiveObjectCache::ExpensiveObject);
48 RooExpensiveObjectCache::RooExpensiveObjectCache() : _nextUID(0)
57 RooExpensiveObjectCache::RooExpensiveObjectCache(
const RooExpensiveObjectCache& other) :
58 TObject(other), _nextUID(0)
67 RooExpensiveObjectCache::~RooExpensiveObjectCache()
69 for (std::map<TString,ExpensiveObject*>::iterator iter = _map.begin() ; iter!=_map.end() ; ++iter) {
80 RooExpensiveObjectCache& RooExpensiveObjectCache::instance()
82 static RooExpensiveObjectCache instance;
93 Bool_t RooExpensiveObjectCache::registerObject(
const char* ownerName,
const char* objectName, TObject& cacheObject,
const RooArgSet& params)
95 TIterator* parIter = params.createIterator() ;
96 Bool_t ret = registerObject(ownerName,objectName,cacheObject,parIter) ;
110 Bool_t RooExpensiveObjectCache::registerObject(
const char* ownerName,
const char* objectName, TObject& cacheObject, TIterator* parIter)
113 ExpensiveObject* eo = _map[objectName] ;
120 _map[objectName] =
new ExpensiveObject(olduid!=-1?olduid:_nextUID++, ownerName,cacheObject,parIter) ;
132 const TObject* RooExpensiveObjectCache::retrieveObject(
const char* name, TClass* tc,
const RooArgSet& params)
134 ExpensiveObject* eo = _map[name] ;
142 if (eo->matches(tc,params)) {
143 return eo->payload() ;
154 const TObject* RooExpensiveObjectCache::getObj(Int_t uid)
156 for (std::map<TString,ExpensiveObject*>::iterator iter = _map.begin() ; iter !=_map.end() ; ++iter) {
157 if (iter->second->uid() == uid) {
158 return iter->second->payload() ;
170 Bool_t RooExpensiveObjectCache::clearObj(Int_t uid)
172 for (std::map<TString,ExpensiveObject*>::iterator iter = _map.begin() ; iter !=_map.end() ; ++iter) {
173 if (iter->second->uid() == uid) {
174 _map.erase(iter->first) ;
187 Bool_t RooExpensiveObjectCache::setObj(Int_t uid, TObject* obj)
189 for (std::map<TString,ExpensiveObject*>::iterator iter = _map.begin() ; iter !=_map.end() ; ++iter) {
190 if (iter->second->uid() == uid) {
191 iter->second->setPayload(obj) ;
203 void RooExpensiveObjectCache::clearAll()
217 RooExpensiveObjectCache::ExpensiveObject::ExpensiveObject(Int_t uidIn,
const char* inOwnerName, TObject& inPayload, TIterator* parIter)
220 _ownerName = inOwnerName;
222 _payload = &inPayload ;
226 while((arg=(RooAbsArg*)parIter->Next() )) {
227 RooAbsReal* real =
dynamic_cast<RooAbsReal*
>(arg) ;
229 _realRefParams[real->GetName()] = real->getVal() ;
231 RooAbsCategory* cat =
dynamic_cast<RooAbsCategory*
>(arg) ;
233 _catRefParams[cat->GetName()] = cat->getIndex() ;
235 oocoutW(&inPayload,Caching) <<
"RooExpensiveObject::registerObject() WARNING: ignoring non-RooAbsReal/non-RooAbsCategory reference parameter " << arg->GetName() << endl ;
246 RooExpensiveObjectCache::ExpensiveObject::ExpensiveObject(Int_t uidIn,
const ExpensiveObject& other) :
248 _realRefParams(other._realRefParams),
249 _catRefParams(other._catRefParams),
250 _ownerName(other._ownerName)
252 _payload = other._payload->Clone() ;
259 RooExpensiveObjectCache::ExpensiveObject::~ExpensiveObject()
271 Bool_t RooExpensiveObjectCache::ExpensiveObject::matches(TClass* tc,
const RooArgSet& params)
273 if (_payload->IsA() != tc) {
278 TIterator* iter = params.createIterator() ;
280 while((arg=(RooAbsArg*)iter->Next() )) {
281 RooAbsReal* real =
dynamic_cast<RooAbsReal*
>(arg) ;
283 if (fabs(real->getVal()-_realRefParams[real->GetName()])>1e-12) {
288 RooAbsCategory* cat =
dynamic_cast<RooAbsCategory*
>(arg) ;
290 if (cat->getIndex() != _catRefParams[cat->GetName()]) {
307 void RooExpensiveObjectCache::print()
const
309 map<TString,ExpensiveObject*>::const_iterator iter = _map.begin() ;
311 while(iter!=_map.end()) {
312 cout <<
"uid = " << iter->second->uid() <<
" key=" << iter->first <<
" value=" ;
313 iter->second->print() ;
322 void RooExpensiveObjectCache::ExpensiveObject::print()
const
324 cout << _payload->IsA()->GetName() <<
"::" << _payload->GetName() ;
325 if (_realRefParams.size()>0 || _catRefParams.size()>0) {
326 cout <<
" parameters=( " ;
327 auto iter = _realRefParams.begin() ;
328 while(iter!=_realRefParams.end()) {
329 cout << iter->first <<
"=" << iter->second <<
" " ;
332 auto iter2 = _catRefParams.begin() ;
333 while(iter2!=_catRefParams.end()) {
334 cout << iter2->first <<
"=" << iter2->second <<
" " ;
347 void RooExpensiveObjectCache::importCacheObjects(RooExpensiveObjectCache& other,
const char* ownerName, Bool_t verbose)
349 map<TString,ExpensiveObject*>::const_iterator iter = other._map.begin() ;
350 while(iter!=other._map.end()) {
351 if (
string(ownerName)==iter->second->ownerName()) {
352 _map[iter->first.Data()] =
new ExpensiveObject(_nextUID++, *iter->second) ;
354 oocoutI(iter->second->payload(),Caching) <<
"RooExpensiveObjectCache::importCache() importing cache object "
355 << iter->first <<
" associated with object " << iter->second->ownerName() << endl ;