Logo ROOT   6.18/05
Reference Guide
RooCacheManager.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * File: $Id$
5 * Authors: *
6 * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7 * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8 * *
9 * Copyright (c) 2000-2005, Regents of the University of California *
10 * and Stanford University. All rights reserved. *
11 * *
12 * Redistribution and use in source and binary forms, *
13 * with or without modification, are permitted according to the terms *
14 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15 *****************************************************************************/
16#ifndef ROO_CACHE_MANAGER
17#define ROO_CACHE_MANAGER
18
19#include "Rtypes.h"
20
21#include "RooMsgService.h"
22#include "RooNormSetCache.h"
23#include "RooAbsReal.h"
24#include "RooArgSet.h"
25#include "RooArgList.h"
26#include "RooAbsCache.h"
27#include "RooAbsCacheElement.h"
28#include "RooNameReg.h"
29#include <vector>
30
31class RooNameSet ;
32
33
34template<class T>
36
37public:
38
40 RooCacheManager(RooAbsArg* owner, Int_t maxSize=2) ;
41 RooCacheManager(const RooCacheManager& other, RooAbsArg* owner=0) ;
42 virtual ~RooCacheManager() ;
43
44 T* getObj(const RooArgSet* nset, Int_t* sterileIndex=0, const TNamed* isetRangeName=0) {
45 // Getter function without integration set
46 return getObj(nset,0,sterileIndex,isetRangeName) ;
47 }
48
49 Int_t setObj(const RooArgSet* nset, T* obj, const TNamed* isetRangeName=0) {
50 // Setter function without integration set
51 return setObj(nset,0,obj,isetRangeName) ;
52 }
53
54 inline T* getObj(const RooArgSet* nset, const RooArgSet* iset, Int_t* sterileIdx, const char* isetRangeName) {
55 if (_wired) return _object[0] ;
56 return getObj(nset,iset,sterileIdx,RooNameReg::ptr(isetRangeName)) ;
57 }
58
59 T* getObj(const RooArgSet* nset, const RooArgSet* iset, Int_t* sterileIndex=0, const TNamed* isetRangeName=0) ;
60 Int_t setObj(const RooArgSet* nset, const RooArgSet* iset, T* obj, const TNamed* isetRangeName=0) ;
61
62 void reset() ;
63 virtual void sterilize() ;
64
65 Int_t lastIndex() const {
66 // Return index of slot used in last get or set operation
67 return _lastIndex ;
68 }
69 Int_t cacheSize() const {
70 // Return size of cache
71 return _size ;
72 }
73
74 virtual Bool_t redirectServersHook(const RooAbsCollection& /*newServerList*/, Bool_t /*mustReplaceAll*/,
75 Bool_t /*nameChange*/, Bool_t /*isRecursive*/) {
76 // Interface function to intercept server redirects
77 return kFALSE ;
78 }
79 virtual void operModeHook() {
80 // Interface function to intercept cache operation mode changes
81 }
82 virtual void printCompactTreeHook(std::ostream&, const char *) {
83 // Interface function to cache add contents to output in tree printing mode
84 }
85
86 T* getObjByIndex(Int_t index) const ;
87 const RooNameSet* nameSet1ByIndex(Int_t index) const ;
88 const RooNameSet* nameSet2ByIndex(Int_t index) const ;
89
90 virtual void insertObjectHook(T&) {
91 // Interface function to perform post-insert operations on cached object
92 }
93
94 void wireCache() {
95 if (_size==0) {
96 oocoutI(_owner,Optimization) << "RooCacheManager::wireCache(" << _owner->GetName() << ") no cached elements!" << std::endl ;
97 } else if (_size==1) {
98 oocoutI(_owner,Optimization) << "RooCacheManager::wireCache(" << _owner->GetName() << ") now wiring cache" << std::endl ;
100 } else if (_size>1) {
101 oocoutI(_owner,Optimization) << "RooCacheManager::wireCache(" << _owner->GetName() << ") cache cannot be wired because it contains more than one element" << std::endl ;
102 }
103 }
104
105protected:
106
107 Int_t _maxSize ; //! Maximum size
108 Int_t _size ; //! Actual use
109 Int_t _lastIndex ; //! Last slot accessed
110
111 std::vector<RooNormSetCache> _nsetCache ; //! Normalization/Integration set manager
112 std::vector<T*> _object ; //! Payload
113 Bool_t _wired ; //! In wired mode, there is a single payload which is returned always
114
115 ClassDef(RooCacheManager,2) // Cache Manager class generic objects
116} ;
117
118
119template<class T>
121{
122 // Constructor for simple caches without RooAbsArg payload. A cache
123 // made with this constructor is not registered with its owner
124 // and will not receive information on server redirects and
125 // cache operation mode changes
126
127 _maxSize = maxSize ;
128 _nsetCache.resize(_maxSize) ; // = new RooNormSetCache[maxSize] ;
129 _object.resize(_maxSize,0) ; // = new T*[maxSize] ;
130 _wired = kFALSE ;
131}
132
133template<class T>
135{
136 // Constructor for simple caches with RooAbsArg derived payload. A cache
137 // made with this constructor is registered with its owner
138 // and will receive information on server redirects and
139 // cache operation mode changes
140
141 _maxSize = maxSize ;
142 _size = 0 ;
143
144 _nsetCache.resize(_maxSize) ; // = new RooNormSetCache[maxSize] ;
145 _object.resize(_maxSize,0) ; // = new T*[maxSize] ;
146 _wired = kFALSE ;
147 _lastIndex = -1 ;
148
149 Int_t i ;
150 for (i=0 ; i<_maxSize ; i++) {
151 _object[i]=0 ;
152 }
153
154}
155
156
157template<class T>
159{
160 // Copy constructor
161
162 _maxSize = other._maxSize ;
163 _size = other._size ;
164
165 _nsetCache.resize(_maxSize) ; // = new RooNormSetCache[_maxSize] ;
166 _object.resize(_maxSize,0) ; // = new T*[_maxSize] ;
167 _wired = kFALSE ;
168 _lastIndex = -1 ;
169
170 //std::cout << "RooCacheManager:cctor(" << this << ") other = " << &other << " _size=" << _size << " _maxSize = " << _maxSize << std::endl ;
171
172 Int_t i ;
173 for (i=0 ; i<other._size ; i++) {
174 _nsetCache[i].initialize(other._nsetCache[i]) ;
175 _object[i] = 0 ;
176 }
177
178 for (i=other._size ; i<_maxSize ; i++) {
179 _object[i] = 0 ;
180 }
181}
182
183
184template<class T>
186{
187 // Destructor
188
189 //delete[] _nsetCache ;
190 Int_t i ;
191 for (i=0 ; i<_size ; i++) {
192 delete _object[i] ;
193 }
194 //delete[] _object ;
195}
196
197
198template<class T>
200{
201 // Clear the cache
202
203 Int_t i ;
204 for (i=0 ; i<_maxSize ; i++) {
205 delete _object[i] ;
206 _object[i]=0 ;
207 _nsetCache[i].clear() ;
208 }
209 _lastIndex = -1 ;
210 _size = 0 ;
211}
212
213
214
215template<class T>
217{
218 // Clear the cache payload but retain slot mapping w.r.t to
219 // normalization and integration sets.
220
221 Int_t i ;
222 for (i=0 ; i<_maxSize ; i++) {
223 delete _object[i] ;
224 _object[i]=0 ;
225 }
226}
227
228
229
230template<class T>
231Int_t RooCacheManager<T>::setObj(const RooArgSet* nset, const RooArgSet* iset, T* obj, const TNamed* isetRangeName)
232{
233 // Insert payload object 'obj' in cache indexed on nset,iset and isetRangeName
234
235 // Check if object is already registered
236 Int_t sterileIdx(-1) ;
237 if (getObj(nset,iset,&sterileIdx,isetRangeName)) {
238 return lastIndex() ;
239 }
240
241
242 if (sterileIdx>=0) {
243 // Found sterile slot that can should be recycled [ sterileIndex only set if isetRangeName matches ]
244
245 if (sterileIdx>=_maxSize) {
246 //cout << "RooCacheManager<T>::setObj()/SI increasing object cache size from " << _maxSize << " to " << sterileIdx+4 << endl ;
247 _maxSize = sterileIdx+4;
248 _object.resize(_maxSize,0) ;
249 _nsetCache.resize(_maxSize) ;
250 }
251
252
253 _object[sterileIdx] = obj ;
254
255 // Allow optional post-processing of object inserted in cache
256 insertObjectHook(*obj) ;
257
258 return lastIndex() ;
259 }
260
261 if (_size>=_maxSize-1) {
262 //cout << "RooCacheManager<T>::setObj() increasing object cache size from " << _maxSize << " to " << _maxSize*2 << endl ;
263 _maxSize *=2 ;
264 _object.resize(_maxSize,0) ;
265 _nsetCache.resize(_maxSize) ;
266 }
267
268 //cout << "RooCacheManager::setObj<T>(" << this << ") _size = " << _size << " _maxSize = " << _maxSize << endl ;
269 _nsetCache[_size].autoCache(_owner,nset,iset,isetRangeName,kTRUE) ;
270 if (_object[_size]) {
271 delete _object[_size] ;
272 }
273
274 _object[_size] = obj ;
275 _size++ ;
276
277 // Allow optional post-processing of object inserted in cache
278 insertObjectHook(*obj) ;
279
280 // Unwire cache in case it was wired
281 _wired = kFALSE ;
282
283 return _size-1 ;
284}
285
286
287
288template<class T>
289T* RooCacheManager<T>::getObj(const RooArgSet* nset, const RooArgSet* iset, Int_t* sterileIdx, const TNamed* isetRangeName)
290{
291 // Retrieve payload object indexed on nset,uset amd isetRangeName
292 // If sterileIdx is not null, it is set to the index of the sterile
293 // slot in cacse such a slot is recycled
294
295 // Fast-track for wired mode
296 if (_wired) {
297 if(_object[0]==0 && sterileIdx) *sterileIdx=0 ;
298 return _object[0] ;
299 }
300
301 Int_t i ;
302 for (i=0 ; i<_size ; i++) {
303 if (_nsetCache[i].contains(nset,iset,isetRangeName)==kTRUE) {
304 _lastIndex = i ;
305 if(_object[i]==0 && sterileIdx) *sterileIdx=i ;
306 return _object[i] ;
307 }
308 }
309
310 for (i=0 ; i<_size ; i++) {
311 if (_nsetCache[i].autoCache(_owner,nset,iset,isetRangeName,kFALSE)==kFALSE) {
312 _lastIndex = i ;
313 if(_object[i]==0 && sterileIdx) *sterileIdx=i ;
314 return _object[i] ;
315 }
316 }
317
318 return 0 ;
319}
320
321
322
323template<class T>
325{
326 // Retrieve payload object by slot index
327
328 if (index<0||index>=_size) {
329 oocoutE(_owner,ObjectHandling) << "RooCacheManager::getNormListByIndex: ERROR index ("
330 << index << ") out of range [0," << _size-1 << "]" << std::endl ;
331 return 0 ;
332 }
333 return _object[index] ;
334}
335
336template<class T>
338{
339 // Retrieve RooNameSet associated with slot at given index
340
341 if (index<0||index>=_size) {
342 oocoutE(_owner,ObjectHandling) << "RooCacheManager::getNormListByIndex: ERROR index ("
343 << index << ") out of range [0," << _size-1 << "]" << std::endl ;
344 return 0 ;
345 }
346 return &_nsetCache[index].nameSet1() ;
347}
348
349template<class T>
351{
352 // Retrieve RooNameSet associated with slot at given index
353
354 if (index<0||index>=_size) {
355 oocoutE(_owner,ObjectHandling) << "RooCacheManager::getNormListByIndex: ERROR index ("
356 << index << ") out of range [0," << _size-1 << "]" << std::endl ;
357 return 0 ;
358 }
359 return &_nsetCache[index].nameSet2() ;
360}
361
362
363#endif
#define oocoutE(o, a)
Definition: RooMsgService.h:47
#define oocoutI(o, a)
Definition: RooMsgService.h:44
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: RtypesCore.h:88
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassDef(name, id)
Definition: Rtypes.h:326
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
Definition: RooAbsArg.h:70
RooAbsCache is the abstract base class for data members of RooAbsArgs that cache other (composite) Ro...
Definition: RooAbsCache.h:27
RooAbsArg * _owner
Definition: RooAbsCache.h:44
RooAbsCollection is an abstract container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition: RooArgSet.h:28
Template class RooCacheManager manages the storage of any type of data indexed on the choice of norma...
Int_t setObj(const RooArgSet *nset, const RooArgSet *iset, T *obj, const TNamed *isetRangeName=0)
RooCacheManager(Int_t maxSize=2)
Int_t cacheSize() const
virtual void insertObjectHook(T &)
virtual void sterilize()
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=0, const TNamed *isetRangeName=0)
std::vector< T * > _object
Normalization/Integration set manager.
std::vector< RooNormSetCache > _nsetCache
Last slot accessed.
RooCacheManager(const RooCacheManager &other, RooAbsArg *owner=0)
const RooNameSet * nameSet2ByIndex(Int_t index) const
T * getObjByIndex(Int_t index) const
Int_t lastIndex() const
virtual void printCompactTreeHook(std::ostream &, const char *)
Interface for printing of cache guts in tree mode printing.
virtual Bool_t redirectServersHook(const RooAbsCollection &, Bool_t, Bool_t, Bool_t)
Interface for server redirect calls.
const RooNameSet * nameSet1ByIndex(Int_t index) const
T * getObj(const RooArgSet *nset, const RooArgSet *iset, Int_t *sterileIndex=0, const TNamed *isetRangeName=0)
Bool_t _wired
Payload.
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=0)
T * getObj(const RooArgSet *nset, const RooArgSet *iset, Int_t *sterileIdx, const char *isetRangeName)
virtual ~RooCacheManager()
RooCacheManager(RooAbsArg *owner, Int_t maxSize=2)
Int_t _lastIndex
Actual use.
virtual void operModeHook()
Interface for operation mode changes.
Int_t _size
Maximum size.
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
Definition: RooNameReg.cxx:104
RooNameSet is a utility class that stores the names the objects in a RooArget.
Definition: RooNameSet.h:24
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
double T(double x)
Definition: ChebyshevPol.h:34
@ Optimization
Definition: RooGlobalFunc.h:58
@ ObjectHandling
Definition: RooGlobalFunc.h:58