Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
RooObjCacheManager.cxx
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * @(#)root/roofitcore:$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
17/**
18\file RooObjCacheManager.cxx
19\class RooObjCacheManager
20\ingroup Roofitcore
21
22Implementation of a RooCacheManager<RooAbsCacheElement>
23that specializes in the storage of cache elements that contain RooAbsArg objects.
24Caches with RooAbsArg derived payload require special care as server redirects
25cache operation mode changes and constant term optimization calls may need to be
26forwarded to such cache payload. This cache manager takes care of all these operations
27by forwarding these calls to the RooAbsCacheElement interface functions, which
28have a sensible default implementation.
29**/
30
31#include "Riostream.h"
32#include <vector>
33#include "RooObjCacheManager.h"
34#include "RooMsgService.h"
35
36
38
39////////////////////////////////////////////////////////////////////////////////
40/// Constructor of object cache manager for given owner. If clearCacheOnServerRedirect is true
41/// all cache elements will be cleared when a server redirect is intercepted by the cache manager.
42/// This is the default strategy and should only be overridden when you really understand
43/// what you're doing as properly implementing server redirect in cache elements can get very
44/// complicated, especially if there are (cyclical) reference back to the owning object
45
46RooObjCacheManager::RooObjCacheManager(RooAbsArg* owner, Int_t maxSize, bool clearCacheOnServerRedirect, bool allowOptimize) :
47 RooCacheManager<RooAbsCacheElement>(owner,maxSize),
48 _clearOnRedirect(clearCacheOnServerRedirect),
49 _allowOptimize(allowOptimize),
51{
52}
53
54
55////////////////////////////////////////////////////////////////////////////////
56/// Copy constructor
57
62 _optCacheModeSeen(false) // cache mode properties are not transferred in copy constructor
63{
64}
65
66
67////////////////////////////////////////////////////////////////////////////////
68/// Destructor
69
76
77
78////////////////////////////////////////////////////////////////////////////////
79/// Intercept server redirect calls. If clearOnRedirect was set, sterilize
80/// the cache (i.e. keep the structure but delete all contents). If not
81/// forward serverRedirect to cache elements
82
83bool RooObjCacheManager::redirectServersHook(const RooAbsCollection& newServerList, bool mustReplaceAll, bool nameChange, bool isRecursive)
84{
85 if (_clearOnRedirect) {
86
87 sterilize() ;
88
89 } else {
90
91 for (Int_t i=0 ; i<cacheSize() ; i++) {
92 if (_object[i]) {
93 _object[i]->redirectServersHook(newServerList,mustReplaceAll,nameChange,isRecursive) ;
94 }
95 }
96
97 }
98
99 return false ;
100}
101
102
103
104////////////////////////////////////////////////////////////////////////////////
105/// Intercept changes to cache operation mode and forward to cache elements
106
108{
109 if (!_owner) {
110 return ;
111 }
112
113 for (Int_t i=0 ; i<cacheSize() ; i++) {
114 if (_object[i]) {
115 _object[i]->operModeHook(_owner->operMode()) ;
116 }
117 }
118}
119
120
121
122////////////////////////////////////////////////////////////////////////////////
123/// Intercept calls to perform automatic optimization of cache mode operation.
124/// Forward calls to existing cache elements and save configuration of
125/// cache mode optimization so that it can be applied on new cache elements
126/// upon insertion
127
128void RooObjCacheManager::optimizeCacheMode(const RooArgSet& obs, RooArgSet& optNodes, RooLinkedList& processedNodes)
129{
130 oocxcoutD(_owner,Caching) << "RooObjCacheManager::optimizeCacheMode(owner=" << _owner->GetName() << ") obs = " << obs << std::endl;
131
132 _optCacheModeSeen = true ;
133
135 _optCacheObservables->removeAll() ;
136 _optCacheObservables->add(obs) ;
137 } else {
139 }
140
141 for (Int_t i=0 ; i<cacheSize() ; i++) {
142 if (_object[i]) {
143 _object[i]->optimizeCacheMode(obs,optNodes,processedNodes) ;
144 }
145 }
146}
147
148
149////////////////////////////////////////////////////////////////////////////////
150
152{
154
155 // WVE - adding this causes trouble with IntegralMorpht????
156 // Perhaps this should not be done in sterilize, but be a separate operation
157 // called specially from RooAbsObsTestStatistic::setData()
158
160 delete _optCacheObservables ;
161 _optCacheObservables = nullptr ;
162 _optCacheModeSeen = false ;
163 }
164
165}
166
167
168
169////////////////////////////////////////////////////////////////////////////////
170/// Set owner link on all object inserted into cache.
171/// Also if cache mode optimization was requested, apply
172/// it now to cache element being inserted
173
175{
176 obj.setOwner(_owner) ;
177
178 // If value caching mode optimization has happened, process it now on object being inserted
179 if (_optCacheModeSeen) {
181 RooArgSet s ;
183 }
184
185}
186
187
188
189
190////////////////////////////////////////////////////////////////////////////////
191/// Add details on cache contents when printing in tree mode
192
193void RooObjCacheManager::printCompactTreeHook(std::ostream& os, const char *indent)
194{
195 for (Int_t i=0 ; i<cacheSize() ; i++) {
196 if (_object[i]) {
197 _object[i]->printCompactTreeHook(os,indent,i,cacheSize()-1) ;
198 }
199 }
200}
201
202
203
204////////////////////////////////////////////////////////////////////////////////
205/// If clearOnRedirect is false, forward constant term optimization calls to
206/// cache elements
207
208void RooObjCacheManager::findConstantNodes(const RooArgSet& obs, RooArgSet& cacheList, RooLinkedList& processedNodes)
209{
210 if (!_allowOptimize) {
211 return ;
212 }
213
214 for (Int_t i=0 ; i<cacheSize() ; i++) {
215 if (_object[i]) {
216 _object[i]->findConstantNodes(obs,cacheList, processedNodes) ;
217 }
218 }
219}
220
221
#define oocxcoutD(o, a)
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
static void indent(ostringstream &buf, int indent_level)
return
Common abstract base class for objects that represent a value and a "shape" in RooFit.
Definition RooAbsArg.h:76
Abstract base class for objects to be stored in RooAbsCache cache manager objects.
virtual void optimizeCacheMode(const RooArgSet &obs, RooArgSet &optNodes, RooLinkedList &processedNodes)
Interface for cache optimization calls.
void setOwner(RooAbsArg *owner)
Abstract container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:24
virtual void sterilize()
Clear the cache payload but retain slot mapping w.r.t to normalization and integration sets.
std::vector< RooAbsCacheElement * > _object
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
void operModeHook() override
Intercept changes to cache operation mode and forward to cache elements.
RooObjCacheManager(RooAbsArg *owner=nullptr, Int_t maxSize=2, bool clearCacheOnServerRedirect=true, bool allowOptimize=false)
Constructor of object cache manager for given owner.
~RooObjCacheManager() override
Destructor.
void insertObjectHook(RooAbsCacheElement &) override
Set owner link on all object inserted into cache.
void printCompactTreeHook(std::ostream &, const char *) override
Add details on cache contents when printing in tree mode.
bool redirectServersHook(const RooAbsCollection &, bool, bool, bool) override
Intercept server redirect calls.
static bool _clearObsList
Clear obslist on sterilize?
void findConstantNodes(const RooArgSet &, RooArgSet &, RooLinkedList &) override
If clearOnRedirect is false, forward constant term optimization calls to cache elements.
RooArgSet * _optCacheObservables
! current optCacheObservables
void sterilize() override
Clear the cache payload but retain slot mapping w.r.t to normalization and integration sets.
void optimizeCacheMode(const RooArgSet &, RooArgSet &, RooLinkedList &) override
Intercept calls to perform automatic optimization of cache mode operation.
TLine l
Definition textangle.C:4