// RooExpensiveObjectCache is a singleton class that serves as repository
// for objects that are expensive to calculate. Owners of such objects
// can registers these here with associated parameter values for which
// the object is valid, so that other instances can, at a later moment
// retrieve these precalculated objects
// END_HTML
#include "TClass.h"
#include "RooFit.h"
#include "RooSentinel.h"
#include "RooAbsReal.h"
#include "RooAbsCategory.h"
#include "RooArgSet.h"
#include "RooMsgService.h"
#include <iostream>
#include <math.h>
using namespace std ;
#include "RooExpensiveObjectCache.h"
ClassImp(RooExpensiveObjectCache)
ClassImp(RooExpensiveObjectCache::ExpensiveObject)
;
RooExpensiveObjectCache* RooExpensiveObjectCache::_instance = 0 ;
RooExpensiveObjectCache::RooExpensiveObjectCache()
{
}
RooExpensiveObjectCache::RooExpensiveObjectCache(const RooExpensiveObjectCache& other) :
TObject(other)
{
}
RooExpensiveObjectCache::~RooExpensiveObjectCache()
{
for (std::map<TString,ExpensiveObject*>::iterator iter = _map.begin() ; iter!=_map.end() ; ++iter) {
delete iter->second ;
}
if (_instance == this) {
_instance = 0 ;
}
}
RooExpensiveObjectCache& RooExpensiveObjectCache::instance()
{
if (!_instance) {
_instance = new RooExpensiveObjectCache() ;
RooSentinel::activate() ;
}
return *_instance ;
}
void RooExpensiveObjectCache::cleanup()
{
delete _instance ;
}
Bool_t RooExpensiveObjectCache::registerObject(const char* ownerName, const char* objectName, TObject& cacheObject, const RooArgSet& params)
{
TIterator* parIter = params.createIterator() ;
Bool_t ret = registerObject(ownerName,objectName,cacheObject,parIter) ;
delete parIter ;
return ret ;
}
Bool_t RooExpensiveObjectCache::registerObject(const char* ownerName, const char* objectName, TObject& cacheObject, TIterator* parIter)
{
ExpensiveObject* eo = _map[objectName] ;
if (eo) {
delete eo ;
}
_map[objectName] = new ExpensiveObject(ownerName,cacheObject,parIter) ;
return kFALSE ;
}
const TObject* RooExpensiveObjectCache::retrieveObject(const char* name, TClass* tc, const RooArgSet& params)
{
ExpensiveObject* eo = _map[name] ;
if (!eo) {
return 0 ;
}
if (eo->matches(tc,params)) {
return eo->payload() ;
}
return 0 ;
}
RooExpensiveObjectCache::ExpensiveObject::ExpensiveObject(const char* inOwnerName, TObject& inPayload, TIterator* parIter)
{
_ownerName = inOwnerName;
_payload = &inPayload ;
RooAbsArg* arg ;
parIter->Reset() ;
while((arg=(RooAbsArg*)parIter->Next() )) {
RooAbsReal* real = dynamic_cast<RooAbsReal*>(arg) ;
if (real) {
_realRefParams[real->GetName()] = real->getVal() ;
} else {
RooAbsCategory* cat = dynamic_cast<RooAbsCategory*>(arg) ;
if (cat) {
_catRefParams[cat->GetName()] = cat->getIndex() ;
} else {
oocoutW(&inPayload,Caching) << "RooExpensiveObject::registerObject() WARNING: ignoring non-RooAbsReal/non-RooAbsCategory reference parameter " << arg->GetName() << endl ;
}
}
}
}
RooExpensiveObjectCache::ExpensiveObject::ExpensiveObject(const ExpensiveObject& other) :
_realRefParams(other._realRefParams),
_catRefParams(other._catRefParams),
_ownerName(other._ownerName)
{
_payload = other._payload->Clone() ;
}
RooExpensiveObjectCache::ExpensiveObject::~ExpensiveObject()
{
delete _payload ;
}
Bool_t RooExpensiveObjectCache::ExpensiveObject::matches(TClass* tc, const RooArgSet& params)
{
if (_payload->IsA() != tc) {
return kFALSE;
}
TIterator* iter = params.createIterator() ;
RooAbsArg* arg ;
while((arg=(RooAbsArg*)iter->Next() )) {
RooAbsReal* real = dynamic_cast<RooAbsReal*>(arg) ;
if (real) {
if (fabs(real->getVal()-_realRefParams[real->GetName()])>1e-12) {
delete iter ;
return kFALSE ;
}
} else {
RooAbsCategory* cat = dynamic_cast<RooAbsCategory*>(arg) ;
if (cat) {
if (cat->getIndex() != _catRefParams[cat->GetName()]) {
delete iter ;
return kFALSE ;
}
}
}
}
delete iter ;
return kTRUE ;
}
void RooExpensiveObjectCache::print() const
{
map<TString,ExpensiveObject*>::const_iterator iter = _map.begin() ;
while(iter!=_map.end()) {
cout << "key=" << iter->first << " value=" ;
iter->second->print() ;
++iter ;
}
}
void RooExpensiveObjectCache::ExpensiveObject::print()
{
cout << _payload->IsA()->GetName() << "::" << _payload->GetName() << " parameters=( " ;
map<TString,Double_t>::iterator iter = _realRefParams.begin() ;
while(iter!=_realRefParams.end()) {
cout << iter->first << "=" << iter->second << " " ;
++iter ;
}
map<TString,Int_t>::iterator iter2 = _catRefParams.begin() ;
while(iter2!=_catRefParams.end()) {
cout << iter2->first << "=" << iter2->second << " " ;
++iter2 ;
}
cout << ")" << endl ;
}
void RooExpensiveObjectCache::importCacheObjects(RooExpensiveObjectCache& other, const char* ownerName, Bool_t verbose)
{
map<TString,ExpensiveObject*>::const_iterator iter = other._map.begin() ;
while(iter!=other._map.end()) {
if (string(ownerName)==iter->second->ownerName()) {
_map[iter->first.Data()] = new ExpensiveObject(*iter->second) ;
if (verbose) {
oocoutI(iter->second->payload(),Caching) << "RooExpensiveObjectCache::importCache() importing cache object "
<< iter->first << " associated with object " << iter->second->ownerName() << endl ;
}
}
++iter ;
}
}
Last change: Thu Nov 13 09:42:39 2008
Last generated: 2008-11-13 09:42
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.