ROOT  6.06/08
Reference Guide
RooSetProxy.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 //
19 // BEGIN_HTML
20 // RooSetProxy is the concrete proxy for RooArgSet objects.
21 // A RooSetProxy is the general mechanism to store a RooArgSet
22 // with RooAbsArgs in a RooAbsArg.
23 //
24 // Creating a RooSetProxy adds all members of the proxied RooArgSet to the proxy owners
25 // server list (thus receiving value/shape dirty flags from it) and
26 // registers itself with the owning class. The latter allows the
27 // owning class to update the pointers of RooArgSet contents to reflect
28 // the serverRedirect changes.
29 // END_HTML
30 //
31 
32 
33 #include "RooFit.h"
34 
35 #include "Riostream.h"
36 #include "RooSetProxy.h"
37 #include "RooSetProxy.h"
38 #include "RooArgSet.h"
39 #include "RooAbsArg.h"
40 
41 using namespace std;
42 
44 ;
45 
46 
47 #ifdef USEMEMPOOL
48 
49 ////////////////////////////////////////////////////////////////////////////////
50 /// Overload new operator must be implemented because it is overloaded
51 /// in the RooArgSet base class. Perform standard memory allocation
52 /// here instead of memory pool management performed in RooArgSet
53 
54 void* RooSetProxy::operator new (size_t bytes)
55 {
56  return malloc(bytes) ;
57 }
58 
59 
60 ////////////////////////////////////////////////////////////////////////////////
61 
62 void RooSetProxy::operator delete (void* ptr)
63 {
64  free(ptr) ;
65 }
66 
67 #endif
68 
69 
70 ////////////////////////////////////////////////////////////////////////////////
71 /// Construct proxy with given name and description, with given owner
72 /// The default value and shape dirty propagation of the set contents
73 /// to the set owner is controlled by flags defValueServer and defShapeServer
74 
75 RooSetProxy::RooSetProxy(const char* inName, const char* /*desc*/, RooAbsArg* owner,
76  Bool_t defValueServer, Bool_t defShapeServer) :
77  RooArgSet(inName), _owner(owner),
78  _defValueServer(defValueServer),
79  _defShapeServer(defShapeServer)
80 {
81  //SetTitle(desc) ;
82  _owner->registerProxy(*this) ;
83  _iter = createIterator() ;
84 }
85 
86 
87 
88 ////////////////////////////////////////////////////////////////////////////////
89 /// Copy constructor
90 
91 RooSetProxy::RooSetProxy(const char* inName, RooAbsArg* owner, const RooSetProxy& other) :
92  RooArgSet(other,inName), _owner(owner),
95 {
96  _owner->registerProxy(*this) ;
97  _iter = createIterator() ;
98 }
99 
100 
101 
102 ////////////////////////////////////////////////////////////////////////////////
103 /// Destructor
104 
106 {
107  if (_owner) _owner->unRegisterProxy(*this) ;
108  delete _iter ;
109 }
110 
111 
112 
113 ////////////////////////////////////////////////////////////////////////////////
114 /// Overloaded RooArgSet::add() method insert object into set
115 /// and registers object as server to owner with given value
116 /// and shape dirty flag propagation requests
117 
118 Bool_t RooSetProxy::add(const RooAbsArg& var, Bool_t valueServer, Bool_t shapeServer, Bool_t silent)
119 {
120  Bool_t ret=RooArgSet::add(var,silent) ;
121  if (ret) {
122  _owner->addServer((RooAbsArg&)var,valueServer,shapeServer) ;
123  }
124  return ret ;
125 }
126 
127 
128 
129 ////////////////////////////////////////////////////////////////////////////////
130 /// Overloaded RooArgSet::addOwned() method insert object into owning set
131 /// and registers object as server to owner with default value
132 /// and shape dirty flag propagation
133 
135 {
136  Bool_t ret=RooArgSet::addOwned(var,silent) ;
137  if (ret) {
139  }
140  return ret ;
141 }
142 
143 
144 
145 ////////////////////////////////////////////////////////////////////////////////
146 /// Overloaded RooArgSet::addClone() method insert clone of object into owning set
147 /// and registers cloned object as server to owner with default value
148 /// and shape dirty flag propagation
149 
151 {
152  RooAbsArg* ret=RooArgSet::addClone(var,silent) ;
153  if (ret) {
155  }
156  return ret ;
157 }
158 
159 
160 
161 ////////////////////////////////////////////////////////////////////////////////
162 /// Overloaded RooArgSet::add() method inserts 'var' into set
163 /// and registers 'var' as server to owner with default value
164 /// and shape dirty flag propagation
165 
167 {
168  return add(var,_defValueServer,_defShapeServer,silent) ;
169 }
170 
171 
172 
173 ////////////////////////////////////////////////////////////////////////////////
174 /// Replace object 'var1' in set with 'var2'. Deregister var1 as
175 /// server from owner and register var2 as server to owner with
176 /// default value and shape dirty propagation flags
177 
178 Bool_t RooSetProxy::replace(const RooAbsArg& var1, const RooAbsArg& var2)
179 {
180  Bool_t ret=RooArgSet::replace(var1,var2) ;
181  if (ret) {
182  if (!isOwning()) _owner->removeServer((RooAbsArg&)var1) ;
184  _owner->isShapeServer(var2)) ;
185  }
186  return ret ;
187 }
188 
189 
190 
191 ////////////////////////////////////////////////////////////////////////////////
192 /// Remove object 'var' from set and deregister 'var' as server to owner.
193 
194 Bool_t RooSetProxy::remove(const RooAbsArg& var, Bool_t silent, Bool_t matchByNameOnly)
195 {
196  Bool_t ret=RooArgSet::remove(var,silent,matchByNameOnly) ;
197  if (ret && !isOwning()) {
198  _owner->removeServer((RooAbsArg&)var) ;
199  }
200  return ret ;
201 }
202 
203 
204 
205 ////////////////////////////////////////////////////////////////////////////////
206 /// Remove each argument in the input list from our list using remove(const RooAbsArg&).
207 /// and remove each argument as server to owner
208 
209 Bool_t RooSetProxy::remove(const RooAbsCollection& list, Bool_t silent, Bool_t matchByNameOnly)
210 {
211  Bool_t result(false) ;
212 
213  TIterator* iter = list.createIterator() ;
214  RooAbsArg* arg ;
215  while((arg=(RooAbsArg*)iter->Next())) {
216  result |= remove(*arg,silent,matchByNameOnly) ;
217  }
218  delete iter ;
219 
220  return result;
221 }
222 
223 
224 
225 
226 ////////////////////////////////////////////////////////////////////////////////
227 /// Remove all argument inset using remove(const RooAbsArg&).
228 /// and remove each argument as server to owner
229 
231 {
232  if (!isOwning()) {
233  TIterator* iter = createIterator() ;
234  RooAbsArg* arg ;
235  while ((arg=(RooAbsArg*)iter->Next())) {
236  if (!isOwning()) {
237  _owner->removeServer(*arg) ;
238  }
239  }
240  delete iter ;
241  }
242 
244 }
245 
246 
247 
248 
249 ////////////////////////////////////////////////////////////////////////////////
250 /// Assign values of arguments on other set to arguments in this set
251 
253 {
254  RooArgSet::operator=(other) ;
255  return *this ;
256 }
257 
258 
259 
260 
261 ////////////////////////////////////////////////////////////////////////////////
262 /// Process server change operation on owner. Replace elements in set with equally
263 /// named objects in 'newServerList'
264 
265 Bool_t RooSetProxy::changePointer(const RooAbsCollection& newServerList, Bool_t nameChange, Bool_t factoryInitMode)
266 {
267  if (getSize()==0) {
268  if (factoryInitMode) {
269  TIterator* iter = newServerList.createIterator() ;
270  RooAbsArg* arg ;
271  while((arg=(RooAbsArg*)iter->Next())) {
272  if (arg!=_owner) {
273  add(*arg,kTRUE) ;
274  }
275  }
276  delete iter ;
277  } else {
278  return kTRUE ;
279  }
280  }
281 
282  _iter->Reset() ;
283  RooAbsArg* arg ;
284  Bool_t error(kFALSE) ;
285  while ((arg=(RooAbsArg*)_iter->Next())) {
286 
287  RooAbsArg* newArg= arg->findNewServer(newServerList, nameChange);
288  if (newArg && newArg!=_owner) error |= !RooArgSet::replace(*arg,*newArg) ;
289  }
290  return !error ;
291 }
292 
293 
294 
295 ////////////////////////////////////////////////////////////////////////////////
296 /// Printing name of proxy on ostream. If addContents is true
297 /// also print names of objects in set
298 
299 void RooSetProxy::print(ostream& os, Bool_t addContents) const
300 {
301  if (!addContents) {
302  os << name() << "=" ; printStream(os,kValue,kInline) ;
303  } else {
304  os << name() << "=(" ;
305  TIterator* iter = createIterator() ;
306  RooAbsArg* arg ;
307  Bool_t first2(kTRUE) ;
308  while ((arg=(RooAbsArg*)iter->Next())) {
309  if (first2) {
310  first2 = kFALSE ;
311  } else {
312  os << "," ;
313  }
314  arg->printStream(os,kValue|kName,kInline) ;
315  }
316  os << ")" ;
317  delete iter ;
318  }
319 }
RooArgSet & operator=(const RooArgSet &other)
Definition: RooArgSet.h:84
TIterator * createIterator(Bool_t dir=kIterForward) const
virtual void printStream(std::ostream &os, Int_t contents, StyleOption style, TString indent="") const
Print description of object on ostream, printing contents set by contents integer, which is interpreted as an OR of &#39;enum ContentsOptions&#39; values and in the style given by &#39;enum StyleOption&#39;.
void unRegisterProxy(RooArgProxy &proxy)
Remove proxy from proxy list.
Definition: RooAbsArg.cxx:1172
Bool_t _defValueServer
Definition: RooSetProxy.h:65
virtual void Reset()=0
virtual Bool_t changePointer(const RooAbsCollection &newServerSet, Bool_t nameChange=kFALSE, Bool_t factoryInitMode=kFALSE)
do not persist
Bool_t isOwning() const
virtual Bool_t replace(const RooAbsArg &var1, const RooAbsArg &var2)
Replace var1 with var2 and return kTRUE for success.
virtual void removeAll()
Remove all argument inset using remove(const RooAbsArg&).
void registerProxy(RooArgProxy &proxy)
Register an RooArgProxy in the proxy list.
Definition: RooAbsArg.cxx:1144
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
STL namespace.
Iterator abstract base class.
Definition: TIterator.h:32
RooAbsArg * findNewServer(const RooAbsCollection &newSet, Bool_t nameChange) const
Find the new server in the specified set that matches the old server.
Definition: RooAbsArg.cxx:1050
Vc_ALWAYS_INLINE void free(T *p)
Frees memory that was allocated with Vc::malloc.
Definition: memory.h:94
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add element to an owning set.
Definition: RooArgSet.cxx:461
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove object &#39;var&#39; from set and deregister &#39;var&#39; as server to owner.
virtual Bool_t replace(const RooAbsArg &var1, const RooAbsArg &var2)
Replace object &#39;var1&#39; in set with &#39;var2&#39;.
virtual const char * name() const
Definition: RooSetProxy.h:43
Int_t getSize() const
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Overloaded RooArgSet::addOwned() method insert object into owning set and registers object as server ...
RooAbsArg * _owner
Definition: RooSetProxy.h:64
RooSetProxy & operator=(const RooArgSet &other)
Assign values of arguments on other set to arguments in this set.
#define ClassImp(name)
Definition: Rtypes.h:279
TIterator * _iter
Definition: RooSetProxy.h:67
Bool_t _defShapeServer
Definition: RooSetProxy.h:66
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove the specified argument from our list.
Bool_t isShapeServer(const RooAbsArg &arg) const
Definition: RooAbsArg.h:142
virtual ~RooSetProxy()
Destructor.
Bool_t isValueServer(const RooAbsArg &arg) const
Definition: RooAbsArg.h:134
virtual TObject * Next()=0
virtual RooAbsArg * addClone(const RooAbsArg &var, Bool_t silent=kFALSE)
Add clone of specified element to an owning set.
Definition: RooArgSet.cxx:475
double result[121]
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
Definition: RooAbsArg.h:66
virtual RooAbsArg * addClone(const RooAbsArg &var, Bool_t silent=kFALSE)
Overloaded RooArgSet::addClone() method insert clone of object into owning set and registers cloned o...
void addServer(RooAbsArg &server, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE)
Register another RooAbsArg as a server to us, ie, declare that we depend on it.
Definition: RooAbsArg.cxx:361
const Bool_t kTRUE
Definition: Rtypes.h:91
Vc_ALWAYS_INLINE_L T *Vc_ALWAYS_INLINE_R malloc(size_t n)
Allocates memory on the Heap with alignment and padding suitable for vectorized access.
Definition: memory.h:67
void removeServer(RooAbsArg &server, Bool_t force=kFALSE)
Unregister another RooAbsArg as a server to us, ie, declare that we no longer depend on its value and...
Definition: RooAbsArg.cxx:412
virtual void print(std::ostream &os, Bool_t addContents=kFALSE) const
Printing name of proxy on ostream.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add element to non-owning set.
Definition: RooArgSet.cxx:448
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Overloaded RooArgSet::add() method inserts &#39;var&#39; into set and registers &#39;var&#39; as server to owner with...