00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_ABS_ARG
00017 #define ROO_ABS_ARG
00018
00019 #include <assert.h>
00020 #include "TNamed.h"
00021 #include "THashList.h"
00022 #include "RooPrintable.h"
00023 #include "RooRefCountList.h"
00024 #include "RooAbsCache.h"
00025 #include <map>
00026 #include <set>
00027 #include <deque>
00028
00029 class TTree ;
00030 class RooArgSet ;
00031 class RooAbsCollection ;
00032 class RooTreeData ;
00033 class RooTreeDataStore ;
00034 class RooAbsData ;
00035 class RooAbsDataStore ;
00036 class RooAbsProxy ;
00037 class RooArgProxy ;
00038 class RooSetProxy ;
00039 class RooListProxy ;
00040 class RooExpensiveObjectCache ;
00041 class RooWorkspace ;
00042
00043
00044 class RooAbsArg : public TNamed, public RooPrintable {
00045 public:
00046
00047
00048 RooAbsArg() ;
00049 virtual ~RooAbsArg();
00050 RooAbsArg(const char *name, const char *title);
00051 RooAbsArg(const RooAbsArg& other, const char* name=0) ;
00052 virtual TObject* clone(const char* newname) const = 0 ;
00053 virtual TObject* Clone(const char* newname=0) const {
00054 return clone(newname?newname:GetName()) ;
00055 }
00056 virtual RooAbsArg* cloneTree(const char* newname=0) const ;
00057
00058
00059 virtual Bool_t isDerived() const {
00060
00061 return (_serverList.GetSize()>0 || _proxyList.GetSize()>0)?kTRUE:kFALSE;
00062 }
00063 Bool_t isCloneOf(const RooAbsArg& other) const ;
00064 Bool_t dependsOnValue(const RooAbsCollection& serverList, const RooAbsArg* ignoreArg=0) const {
00065
00066 return dependsOn(serverList,ignoreArg,kTRUE) ;
00067 }
00068 Bool_t dependsOnValue(const RooAbsArg& server, const RooAbsArg* ignoreArg=0) const {
00069
00070 return dependsOn(server,ignoreArg,kTRUE) ;
00071 }
00072 Bool_t dependsOn(const RooAbsCollection& serverList, const RooAbsArg* ignoreArg=0, Bool_t valueOnly=kFALSE) const ;
00073 Bool_t dependsOn(const RooAbsArg& server, const RooAbsArg* ignoreArg=0, Bool_t valueOnly=kFALSE) const ;
00074 Bool_t overlaps(const RooAbsArg& testArg, Bool_t valueOnly=kFALSE) const ;
00075 Bool_t hasClients() const { return _clientList.GetSize()>0 ? kTRUE : kFALSE ; }
00076 inline TIterator* clientIterator() const {
00077
00078 return _clientList.MakeIterator() ;
00079 }
00080 inline TIterator* valueClientIterator() const {
00081
00082 return _clientListValue.MakeIterator() ;
00083 }
00084 inline TIterator* shapeClientIterator() const {
00085
00086 return _clientListShape.MakeIterator() ;
00087 }
00088 inline TIterator* serverIterator() const {
00089
00090 return _serverList.MakeIterator() ;
00091 }
00092
00093 inline RooAbsArg* findServer(const char *name) const {
00094
00095 return (RooAbsArg*)_serverList.FindObject(name);
00096 }
00097 inline RooAbsArg* findServer(const RooAbsArg& arg) const {
00098
00099 return (RooAbsArg*)_serverList.FindObject(&arg);
00100 }
00101 inline RooAbsArg* findServer(Int_t index) const {
00102
00103 return (RooAbsArg*)_serverList.At(index);
00104 }
00105 inline Bool_t isValueServer(const RooAbsArg& arg) const {
00106
00107 return _clientListValue.FindObject(&arg)?kTRUE:kFALSE ;
00108 }
00109 inline Bool_t isValueServer(const char* name) const {
00110
00111 return _clientListValue.FindObject(name)?kTRUE:kFALSE ;
00112 }
00113 inline Bool_t isShapeServer(const RooAbsArg& arg) const {
00114
00115 return _clientListShape.FindObject(&arg)?kTRUE:kFALSE ;
00116 }
00117 inline Bool_t isShapeServer(const char* name) const {
00118
00119 return _clientListShape.FindObject(name)?kTRUE:kFALSE ;
00120 }
00121 void leafNodeServerList(RooAbsCollection* list, const RooAbsArg* arg=0, Bool_t recurseNonDerived=kFALSE) const ;
00122 void branchNodeServerList(RooAbsCollection* list, const RooAbsArg* arg=0, Bool_t recurseNonDerived=kFALSE) const ;
00123 void treeNodeServerList(RooAbsCollection* list, const RooAbsArg* arg=0,
00124 Bool_t doBranch=kTRUE, Bool_t doLeaf=kTRUE,
00125 Bool_t valueOnly=kFALSE, Bool_t recurseNonDerived=kFALSE) const ;
00126
00127
00128 inline virtual Bool_t isFundamental() const {
00129
00130
00131
00132
00133 return kFALSE;
00134 }
00135
00136
00137
00138
00139 virtual RooAbsArg *createFundamental(const char* newname=0) const = 0;
00140
00141 inline virtual Bool_t isLValue() const {
00142
00143
00144
00145 return kFALSE;
00146 }
00147
00148 void addParameters(RooArgSet& params, const RooArgSet* nset=0, Bool_t stripDisconnected=kTRUE) const ;
00149
00150
00151 friend class RooProdPdf ;
00152 friend class RooAddPdf ;
00153 friend class RooAddPdfOrig ;
00154 RooArgSet* getVariables(Bool_t stripDisconnected=kTRUE) const ;
00155 RooArgSet* getParameters(const RooAbsData* data, Bool_t stripDisconnected=kTRUE) const ;
00156 RooArgSet* getParameters(const RooAbsData& data, Bool_t stripDisconnected=kTRUE) const {
00157
00158 return getParameters(&data,stripDisconnected) ;
00159 }
00160 RooArgSet* getParameters(const RooArgSet& set, Bool_t stripDisconnected=kTRUE) const {
00161
00162 return getParameters(&set,stripDisconnected) ;
00163 }
00164 virtual RooArgSet* getParameters(const RooArgSet* depList, Bool_t stripDisconnected=kTRUE) const ;
00165 RooArgSet* getObservables(const RooArgSet& set, Bool_t valueOnly=kTRUE) const {
00166
00167 return getObservables(&set,valueOnly) ;
00168 }
00169 RooArgSet* getObservables(const RooAbsData* data) const ;
00170 RooArgSet* getObservables(const RooAbsData& data) const {
00171
00172 return getObservables(&data) ;
00173 }
00174 virtual RooArgSet* getObservables(const RooArgSet* depList, Bool_t valueOnly=kTRUE) const ;
00175 Bool_t observableOverlaps(const RooAbsData* dset, const RooAbsArg& testArg) const ;
00176 Bool_t observableOverlaps(const RooArgSet* depList, const RooAbsArg& testArg) const ;
00177 virtual Bool_t checkObservables(const RooArgSet* nset) const ;
00178 Bool_t recursiveCheckObservables(const RooArgSet* nset) const ;
00179 RooArgSet* getComponents() const ;
00180
00181
00182 inline RooArgSet* getDependents(const RooArgSet& set) const { return getObservables(set) ; }
00183 inline RooArgSet* getDependents(const RooAbsData* set) const { return getObservables(set) ; }
00184 inline RooArgSet* getDependents(const RooArgSet* depList) const { return getObservables(depList) ; }
00185 inline Bool_t dependentOverlaps(const RooAbsData* dset, const RooAbsArg& testArg) const { return observableOverlaps(dset,testArg) ; }
00186 inline Bool_t dependentOverlaps(const RooArgSet* depList, const RooAbsArg& testArg) const { return observableOverlaps(depList, testArg) ; }
00187 inline Bool_t checkDependents(const RooArgSet* nset) const { return checkObservables(nset) ; }
00188 inline Bool_t recursiveCheckDependents(const RooArgSet* nset) const { return recursiveCheckObservables(nset) ; }
00189
00190
00191 void attachDataSet(const RooAbsData &set);
00192 void attachDataStore(const RooAbsDataStore &set);
00193
00194
00195 virtual Bool_t readFromStream(istream& is, Bool_t compact, Bool_t verbose=kFALSE) = 0 ;
00196 virtual void writeToStream(ostream& os, Bool_t compact) const = 0 ;
00197
00198 inline virtual void Print(Option_t *options= 0) const {
00199
00200 printStream(defaultPrintStream(),defaultPrintContents(options),defaultPrintStyle(options));
00201 }
00202
00203 virtual void printName(ostream& os) const ;
00204 virtual void printTitle(ostream& os) const ;
00205 virtual void printClassName(ostream& os) const ;
00206 virtual void printAddress(ostream& os) const ;
00207 virtual void printArgs(ostream& os) const ;
00208 virtual void printMetaArgs(ostream& ) const {} ;
00209 virtual void printMultiline(ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const;
00210 virtual void printTree(ostream& os, TString indent="") const ;
00211
00212 virtual Int_t defaultPrintContents(Option_t* opt) const ;
00213
00214
00215 void setAttribute(const Text_t* name, Bool_t value=kTRUE) ;
00216 Bool_t getAttribute(const Text_t* name) const ;
00217 inline const std::set<std::string>& attributes() const {
00218
00219 return _boolAttrib ;
00220 }
00221
00222 void setStringAttribute(const Text_t* key, const Text_t* value) ;
00223 const Text_t* getStringAttribute(const Text_t* key) const ;
00224 inline const std::map<std::string,std::string>& stringAttributes() const {
00225
00226 return _stringAttrib ;
00227 }
00228
00229
00230 void setTransientAttribute(const Text_t* name, Bool_t value=kTRUE) ;
00231 Bool_t getTransientAttribute(const Text_t* name) const ;
00232 inline const std::set<std::string>& transientAttributes() const {
00233
00234 return _boolAttribTransient ;
00235 }
00236
00237 inline Bool_t isConstant() const {
00238
00239 return getAttribute("Constant") ;
00240 }
00241 RooLinkedList getCloningAncestors() const ;
00242
00243
00244 Int_t Compare(const TObject* other) const ;
00245 virtual Bool_t IsSortable() const {
00246
00247 return kTRUE ;
00248 }
00249
00250
00251 static void verboseDirty(Bool_t flag) ;
00252 static void copyList(TList& dest, const TList& source) ;
00253 void printDirty(Bool_t depth=kTRUE) const ;
00254
00255 static void setDirtyInhibit(Bool_t flag) ;
00256 static void setACleanADirty(Bool_t flag) ;
00257
00258 virtual Bool_t operator==(const RooAbsArg& other) = 0 ;
00259
00260
00261 virtual Bool_t inRange(const char*) const {
00262
00263 return kTRUE ;
00264 }
00265 virtual Bool_t hasRange(const char*) const {
00266
00267 return kFALSE ;
00268 }
00269
00270
00271 enum ConstOpCode { Activate=0, DeActivate=1, ConfigChange=2, ValueChange=3 } ;
00272
00273
00274 friend class RooMinuit ;
00275
00276
00277 virtual void optimizeCacheMode(const RooArgSet& observables) ;
00278 virtual void optimizeCacheMode(const RooArgSet& observables, RooArgSet& optNodes, RooLinkedList& processedNodes) ;
00279
00280
00281
00282 Bool_t findConstantNodes(const RooArgSet& observables, RooArgSet& cacheList) ;
00283 Bool_t findConstantNodes(const RooArgSet& observables, RooArgSet& cacheList, RooLinkedList& processedNodes) ;
00284
00285
00286
00287 virtual void constOptimizeTestStatistic(ConstOpCode opcode) ;
00288
00289 void graphVizTree(const char* fileName, const char* delimiter="\n", bool useTitle=false, bool useLatex=false) ;
00290 void graphVizTree(ostream& os, const char* delimiter="\n", bool useTitle=false, bool useLatex=false) ;
00291
00292
00293
00294 void printComponentTree(const char* indent="",const char* namePat=0, Int_t nLevel=999) ;
00295 void printCompactTree(const char* indent="",const char* fileName=0, const char* namePat=0, RooAbsArg* client=0) ;
00296 void printCompactTree(ostream& os, const char* indent="", const char* namePat=0, RooAbsArg* client=0) ;
00297 virtual void printCompactTreeHook(ostream& os, const char *ind="") ;
00298
00299
00300 inline Bool_t isShapeDirty() const {
00301
00302 return isDerived()?_shapeDirty:kFALSE ;
00303 }
00304 inline Bool_t isValueDirty() const {
00305
00306 if (inhibitDirty()) return kTRUE ;
00307 switch(_operMode) {
00308 case AClean: return flipAClean() ;
00309 case ADirty: return kTRUE ;
00310 case Auto: return (isDerived()?_valueDirty:kFALSE) ;
00311 }
00312 return kTRUE ;
00313 }
00314
00315
00316 void registerCache(RooAbsCache& cache) ;
00317 void unRegisterCache(RooAbsCache& cache) ;
00318 Int_t numCaches() const ;
00319 RooAbsCache* getCache(Int_t index) const ;
00320
00321 enum OperMode { Auto=0, AClean=1, ADirty=2 } ;
00322 inline OperMode operMode() const { return _operMode==AClean ? (flipAClean() ? ADirty : AClean ) : _operMode ; }
00323 void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE) ;
00324
00325 static UInt_t crc32(const char* data) ;
00326
00327 Bool_t addOwnedComponents(const RooArgSet& comps) ;
00328 const RooArgSet* ownedComponents() const { return _ownedComponents ; }
00329
00330 void setProhibitServerRedirect(Bool_t flag) { _prohibitServerRedirect = flag ; }
00331
00332 protected:
00333
00334 void graphVizAddConnections(std::set<std::pair<RooAbsArg*,RooAbsArg*> >&) ;
00335
00336 friend class RooExtendPdf ;
00337 friend class RooRealIntegral ;
00338 friend class RooAbsReal ;
00339 friend class RooProjectedPdf ;
00340
00341
00342 virtual void operModeHook() {} ;
00343
00344 virtual void optimizeDirtyHook(const RooArgSet* ) {} ;
00345
00346 virtual Bool_t isValid() const ;
00347
00348 virtual void getParametersHook(const RooArgSet* , RooArgSet* , Bool_t ) const {} ;
00349 virtual void getObservablesHook(const RooArgSet* , RooArgSet* ) const {} ;
00350
00351
00352 public:
00353 inline void setValueDirty() const { setValueDirty(0) ; }
00354 inline void setShapeDirty() const { setShapeDirty(0) ; }
00355 inline void clearValueDirty() const {
00356 _valueDirty=kFALSE ;
00357 }
00358 inline void clearShapeDirty() const {
00359 _shapeDirty=kFALSE ;
00360 }
00361
00362 const char* aggregateCacheUniqueSuffix() const ;
00363 virtual const char* cacheUniqueSuffix() const { return 0 ; }
00364
00365 protected:
00366
00367
00368 friend class RooArgSet ;
00369 friend class RooAbsCollection ;
00370 friend class RooCustomizer ;
00371 friend class RooWorkspace ;
00372 RooRefCountList _serverList ;
00373 RooRefCountList _clientList ;
00374 RooRefCountList _clientListShape ;
00375 RooRefCountList _clientListValue ;
00376 TList _proxyList ;
00377 std::deque<RooAbsCache*> _cacheList ;
00378 TIterator* _clientShapeIter ;
00379 TIterator* _clientValueIter ;
00380
00381
00382 public:
00383 Bool_t redirectServers(const RooAbsCollection& newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t isRecursionStep=kFALSE) ;
00384 Bool_t recursiveRedirectServers(const RooAbsCollection& newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t recurseInNewSet=kTRUE) ;
00385 virtual Bool_t redirectServersHook(const RooAbsCollection& , Bool_t , Bool_t , Bool_t ) { return kFALSE ; } ;
00386 virtual void serverNameChangeHook(const RooAbsArg* , const RooAbsArg* ) { } ;
00387
00388 void addServer(RooAbsArg& server, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE) ;
00389 void addServerList(RooAbsCollection& serverList, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE) ;
00390 void replaceServer(RooAbsArg& oldServer, RooAbsArg& newServer, Bool_t valueProp, Bool_t shapeProp) ;
00391 void changeServer(RooAbsArg& server, Bool_t valueProp, Bool_t shapeProp) ;
00392 void removeServer(RooAbsArg& server, Bool_t force=kFALSE) ;
00393 RooAbsArg *findNewServer(const RooAbsCollection &newSet, Bool_t nameChange) const;
00394
00395 RooExpensiveObjectCache& expensiveObjectCache() const ;
00396 void setExpensiveObjectCache(RooExpensiveObjectCache& cache) { _eocache = &cache ; }
00397
00398 virtual Bool_t importWorkspaceHook(RooWorkspace&) { return kFALSE ; } ;
00399
00400 protected:
00401
00402
00403 friend class RooAddModel ;
00404 friend class RooArgProxy ;
00405 friend class RooSetProxy ;
00406 friend class RooListProxy ;
00407 friend class RooObjectFactory ;
00408 void registerProxy(RooArgProxy& proxy) ;
00409 void registerProxy(RooSetProxy& proxy) ;
00410 void registerProxy(RooListProxy& proxy) ;
00411 void unRegisterProxy(RooArgProxy& proxy) ;
00412 void unRegisterProxy(RooSetProxy& proxy) ;
00413 void unRegisterProxy(RooListProxy& proxy) ;
00414 RooAbsProxy* getProxy(Int_t index) const ;
00415 void setProxyNormSet(const RooArgSet* nset) ;
00416 Int_t numProxies() const ;
00417
00418
00419 std::set<std::string> _boolAttrib ;
00420 std::map<std::string,std::string> _stringAttrib ;
00421 std::set<std::string> _boolAttribTransient ;
00422
00423 void printAttribList(ostream& os) const;
00424
00425
00426 friend class RooCompositeDataStore ;
00427 friend class RooTreeDataStore ;
00428 friend class RooTreeData ;
00429 friend class RooDataSet ;
00430 friend class RooRealMPFE ;
00431 friend class RooHistPdf ;
00432 virtual void syncCache(const RooArgSet* nset=0) = 0 ;
00433 virtual void copyCache(const RooAbsArg* source, Bool_t valueOnly=kFALSE) = 0 ;
00434 virtual void attachToTree(TTree& t, Int_t bufSize=32000) = 0 ;
00435 virtual void setTreeBranchStatus(TTree& t, Bool_t active) = 0 ;
00436 virtual void fillTreeBranch(TTree& t) = 0 ;
00437 TString cleanBranchName() const ;
00438
00439
00440 friend ostream& operator<<(ostream& os, const RooAbsArg &arg);
00441 friend istream& operator>>(istream& is, RooAbsArg &arg) ;
00442
00443
00444 static Bool_t _verboseDirty ;
00445 static Bool_t _inhibitDirty ;
00446 static Bool_t _flipAClean ;
00447 Bool_t _deleteWatch ;
00448 static Bool_t flipAClean() ;
00449
00450 static Bool_t inhibitDirty() ;
00451
00452
00453 void setValueDirty(const RooAbsArg* source) const ;
00454 void setShapeDirty(const RooAbsArg* source) const ;
00455 mutable Bool_t _valueDirty ;
00456 mutable Bool_t _shapeDirty ;
00457
00458 mutable OperMode _operMode ;
00459
00460
00461 RooArgSet* _ownedComponents ;
00462
00463 mutable Bool_t _prohibitServerRedirect ;
00464
00465 mutable RooExpensiveObjectCache* _eocache ;
00466
00467 ClassDef(RooAbsArg,4)
00468 };
00469
00470 ostream& operator<<(ostream& os, const RooAbsArg &arg);
00471 istream& operator>>(istream& is, RooAbsArg &arg) ;
00472
00473 #endif