RooSetProxy.cxx

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  * @(#)root/roofitcore:$Id: RooSetProxy.cxx 28259 2009-04-16 16:21:16Z wouter $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
00015  *****************************************************************************/
00016 
00017 //////////////////////////////////////////////////////////////////////////////
00018 //
00019 // BEGIN_HTML
00020 // RooSetProxy is the concrete proxy for RooArgSet objects.
00021 // A RooSetProxy is the general mechanism to store a RooArgSet
00022 // with RooAbsArgs in a RooAbsArg.
00023 //
00024 // Creating a RooSetProxy adds all members of the proxied RooArgSet to the proxy owners
00025 // server list (thus receiving value/shape dirty flags from it) and
00026 // registers itself with the owning class. The latter allows the
00027 // owning class to update the pointers of RooArgSet contents to reflect
00028 // the serverRedirect changes.
00029 // END_HTML
00030 //
00031 
00032 
00033 #include "RooFit.h"
00034 
00035 #include "Riostream.h"
00036 #include "RooSetProxy.h"
00037 #include "RooSetProxy.h"
00038 #include "RooArgSet.h"
00039 #include "RooAbsArg.h"
00040 
00041 ClassImp(RooSetProxy)
00042 ;
00043 
00044 
00045 #ifdef USEMEMPOOL
00046 
00047 //_____________________________________________________________________________
00048 void* RooSetProxy::operator new (size_t bytes)
00049 {
00050   // Overload new operator must be implemented because it is overloaded
00051   // in the RooArgSet base class. Perform standard memory allocation
00052   // here instead of memory pool management performed in RooArgSet
00053 
00054   return malloc(bytes) ;
00055 }
00056 
00057 
00058 //_____________________________________________________________________________
00059 void RooSetProxy::operator delete (void* ptr)
00060 {
00061   free(ptr) ;
00062 }
00063 
00064 #endif
00065 
00066 
00067 //_____________________________________________________________________________
00068 RooSetProxy::RooSetProxy(const char* inName, const char* /*desc*/, RooAbsArg* owner, 
00069                          Bool_t defValueServer, Bool_t defShapeServer) :
00070   RooArgSet(inName), _owner(owner), 
00071   _defValueServer(defValueServer), 
00072   _defShapeServer(defShapeServer)
00073 {
00074   // Construct proxy with given name and description, with given owner
00075   // The default value and shape dirty propagation of the set contents
00076   // to the set owner is controlled by flags defValueServer and defShapeServer
00077 
00078   //SetTitle(desc) ;
00079   _owner->registerProxy(*this) ;
00080   _iter = createIterator() ;
00081 }
00082 
00083 
00084 
00085 //_____________________________________________________________________________
00086 RooSetProxy::RooSetProxy(const char* inName, RooAbsArg* owner, const RooSetProxy& other) : 
00087   RooArgSet(other,inName), _owner(owner),  
00088   _defValueServer(other._defValueServer), 
00089   _defShapeServer(other._defShapeServer)
00090 {
00091   // Copy constructor
00092 
00093   _owner->registerProxy(*this) ;
00094   _iter = createIterator() ;
00095 }
00096 
00097 
00098 
00099 //_____________________________________________________________________________
00100 RooSetProxy::~RooSetProxy()
00101 {
00102   // Destructor
00103   if (_owner) _owner->unRegisterProxy(*this) ;
00104   delete _iter ;
00105 }
00106 
00107 
00108 
00109 //_____________________________________________________________________________
00110 Bool_t RooSetProxy::add(const RooAbsArg& var, Bool_t valueServer, Bool_t shapeServer, Bool_t silent)
00111 {
00112   // Overloaded RooArgSet::add() method insert object into set 
00113   // and registers object as server to owner with given value
00114   // and shape dirty flag propagation requests
00115 
00116   Bool_t ret=RooArgSet::add(var,silent) ;
00117   if (ret) {
00118     _owner->addServer((RooAbsArg&)var,valueServer,shapeServer) ;
00119   }
00120   return ret ;  
00121 }
00122 
00123 
00124 
00125 //_____________________________________________________________________________
00126 Bool_t RooSetProxy::addOwned(RooAbsArg& var, Bool_t silent)
00127 {
00128   // Overloaded RooArgSet::addOwned() method insert object into owning set 
00129   // and registers object as server to owner with default value
00130   // and shape dirty flag propagation
00131 
00132   Bool_t ret=RooArgSet::addOwned(var,silent) ;
00133   if (ret) {
00134     _owner->addServer((RooAbsArg&)var,_defValueServer,_defShapeServer) ;
00135   }
00136   return ret ;  
00137 }
00138                                  
00139 
00140 
00141 //_____________________________________________________________________________
00142 RooAbsArg* RooSetProxy::addClone(const RooAbsArg& var, Bool_t silent) 
00143 {
00144   // Overloaded RooArgSet::addClone() method insert clone of object into owning set 
00145   // and registers cloned object as server to owner with default value
00146   // and shape dirty flag propagation
00147 
00148   RooAbsArg* ret=RooArgSet::addClone(var,silent) ;
00149   if (ret) {
00150     _owner->addServer((RooAbsArg&)var,_defValueServer,_defShapeServer) ;
00151   }
00152   return ret ;
00153 }
00154 
00155 
00156 
00157 //_____________________________________________________________________________
00158 Bool_t RooSetProxy::add(const RooAbsArg& var, Bool_t silent) 
00159 {
00160   // Overloaded RooArgSet::add() method inserts 'var' into set
00161   // and registers 'var' as server to owner with default value
00162   // and shape dirty flag propagation
00163 
00164   return add(var,_defValueServer,_defShapeServer,silent) ;
00165 }
00166 
00167 
00168 
00169 //_____________________________________________________________________________
00170 Bool_t RooSetProxy::replace(const RooAbsArg& var1, const RooAbsArg& var2) 
00171 {
00172   // Replace object 'var1' in set with 'var2'. Deregister var1 as
00173   // server from owner and register var2 as server to owner with
00174   // default value and shape dirty propagation flags
00175 
00176   Bool_t ret=RooArgSet::replace(var1,var2) ;
00177   if (ret) {
00178     if (!isOwning()) _owner->removeServer((RooAbsArg&)var1) ;
00179     _owner->addServer((RooAbsArg&)var2,_owner->isValueServer(var1),
00180                                        _owner->isShapeServer(var2)) ;
00181   }
00182   return ret ;
00183 }
00184 
00185 
00186 
00187 //_____________________________________________________________________________
00188 Bool_t RooSetProxy::remove(const RooAbsArg& var, Bool_t silent, Bool_t matchByNameOnly) 
00189 {
00190   // Remove object 'var' from set and deregister 'var' as server to owner.
00191 
00192   Bool_t ret=RooArgSet::remove(var,silent,matchByNameOnly) ;
00193   if (ret && !isOwning()) {
00194     _owner->removeServer((RooAbsArg&)var) ;
00195   }
00196   return ret ;
00197 }
00198 
00199 
00200 
00201 //_____________________________________________________________________________
00202 Bool_t RooSetProxy::remove(const RooAbsCollection& list, Bool_t silent, Bool_t matchByNameOnly) 
00203 {
00204   // Remove each argument in the input list from our list using remove(const RooAbsArg&).
00205   // and remove each argument as server to owner
00206 
00207   Bool_t result(false) ;
00208 
00209   TIterator* iter = list.createIterator() ;
00210   RooAbsArg* arg ;
00211   while((arg=(RooAbsArg*)iter->Next())) {
00212     result |= remove(*arg,silent,matchByNameOnly) ;
00213   }
00214   delete iter ;
00215 
00216   return result;  
00217 }
00218 
00219 
00220 
00221 
00222 //_____________________________________________________________________________
00223 void RooSetProxy::removeAll() 
00224 {
00225   // Remove all argument inset using remove(const RooAbsArg&).
00226   // and remove each argument as server to owner
00227 
00228   if (!isOwning()) {
00229     TIterator* iter = createIterator() ;
00230     RooAbsArg* arg ;
00231     while ((arg=(RooAbsArg*)iter->Next())) {
00232       if (!isOwning()) {
00233         _owner->removeServer(*arg) ;
00234       }
00235     }
00236     delete iter ;
00237   }
00238 
00239   RooArgSet::removeAll() ;
00240 }
00241 
00242 
00243 
00244 
00245 //_____________________________________________________________________________
00246 RooSetProxy& RooSetProxy::operator=(const RooArgSet& other) 
00247 {
00248   // Assign values of arguments on other set to arguments in this set
00249   RooArgSet::operator=(other) ;
00250   return *this ;
00251 }
00252 
00253 
00254 
00255 
00256 //_____________________________________________________________________________
00257 Bool_t RooSetProxy::changePointer(const RooAbsCollection& newServerList, Bool_t nameChange, Bool_t factoryInitMode) 
00258 {
00259   // Process server change operation on owner. Replace elements in set with equally
00260   // named objects in 'newServerList'
00261 
00262   if (getSize()==0) {
00263     if (factoryInitMode) {
00264       TIterator* iter = newServerList.createIterator() ;
00265       RooAbsArg* arg ;
00266       while((arg=(RooAbsArg*)iter->Next())) {
00267         add(*arg,kTRUE) ;
00268       }
00269       delete iter ;
00270     } else {
00271       return kTRUE ;    
00272     }
00273   }
00274 
00275   _iter->Reset() ;
00276   RooAbsArg* arg ;
00277   Bool_t error(kFALSE) ;
00278   while ((arg=(RooAbsArg*)_iter->Next())) {
00279     
00280     RooAbsArg* newArg= arg->findNewServer(newServerList, nameChange);
00281     if (newArg) error |= !RooArgSet::replace(*arg,*newArg) ;
00282   }
00283   return !error ;
00284 }
00285 
00286 
00287 
00288 //_____________________________________________________________________________
00289 void RooSetProxy::print(ostream& os, Bool_t addContents) const 
00290 { 
00291   // Printing name of proxy on ostream. If addContents is true
00292   // also print names of objects in set
00293 
00294   if (!addContents) {
00295     os << name() << "=" ; printStream(os,kValue,kInline) ; 
00296   } else {
00297     os << name() << "=(" ;
00298     TIterator* iter = createIterator() ;
00299     RooAbsArg* arg ;
00300     Bool_t first2(kTRUE) ;
00301     while ((arg=(RooAbsArg*)iter->Next())) {
00302       if (first2) {
00303         first2 = kFALSE ;
00304       } else {
00305         os << "," ;
00306       }
00307       arg->printStream(os,kValue|kName,kInline) ;
00308     }
00309     os << ")" ;
00310     delete iter ;
00311   }
00312 }

Generated on Tue Jul 5 15:07:30 2011 for ROOT_528-00b_version by  doxygen 1.5.1