40 class RooAbsCollection ;
42 class RooTreeDataStore ;
43 class RooVectorDataStore ;
45 class RooAbsDataStore ;
50 class RooExpensiveObjectCache ;
53 class RooRefArray :
public TObjArray {
55 RooRefArray() : TObjArray() {
57 RooRefArray(
const RooRefArray& other) : TObjArray(other) {
59 RooRefArray& operator=(
const RooRefArray& other) =
default;
60 virtual ~RooRefArray() {} ;
62 ClassDef(RooRefArray,1)
68 std::string printValue(RooAbsArg*);
71 class RooAbsArg :
public TNamed,
public RooPrintable {
73 using RefCountList_t = RooSTLRefCountList<RooAbsArg>;
74 using RefCountListLegacyIterator_t = TIteratorToSTLInterface<RefCountList_t::Container_t>;
79 RooAbsArg(
const char *name,
const char *title);
80 RooAbsArg(
const RooAbsArg& other,
const char* name=0) ;
81 RooAbsArg& operator=(
const RooAbsArg& other);
82 virtual TObject* clone(
const char* newname=0)
const = 0 ;
83 virtual TObject* Clone(
const char* newname = 0)
const {
84 return clone(newname && newname[0] !=
'\0' ? newname :
nullptr);
86 virtual RooAbsArg* cloneTree(
const char* newname=0)
const ;
91 virtual Bool_t isDerived()
const {
96 Bool_t isCloneOf(
const RooAbsArg& other)
const ;
97 Bool_t dependsOnValue(
const RooAbsCollection& serverList,
const RooAbsArg* ignoreArg=0)
const {
99 return dependsOn(serverList,ignoreArg,kTRUE) ;
101 Bool_t dependsOnValue(
const RooAbsArg& server,
const RooAbsArg* ignoreArg=0)
const {
103 return dependsOn(server,ignoreArg,kTRUE) ;
105 Bool_t dependsOn(
const RooAbsCollection& serverList,
const RooAbsArg* ignoreArg=0, Bool_t valueOnly=kFALSE)
const ;
106 Bool_t dependsOn(
const RooAbsArg& server,
const RooAbsArg* ignoreArg=0, Bool_t valueOnly=kFALSE)
const ;
107 Bool_t overlaps(
const RooAbsArg& testArg, Bool_t valueOnly=kFALSE)
const ;
108 Bool_t hasClients()
const {
return !_clientList.empty(); }
112 inline TIterator* clientIterator() const
113 R__SUGGEST_ALTERNATIVE("Use clients() and begin(), end() or range-based loops.") {
115 return makeLegacyIterator(_clientList);
117 inline TIterator* valueClientIterator() const
118 R__SUGGEST_ALTERNATIVE("Use valueClients() and begin(), end() or range-based loops.") {
120 return makeLegacyIterator(_clientListValue);
122 inline TIterator* shapeClientIterator() const
123 R__SUGGEST_ALTERNATIVE("Use shapeClients() and begin(), end() or range-based loops.") {
125 return makeLegacyIterator(_clientListShape);
127 inline TIterator* serverIterator() const
128 R__SUGGEST_ALTERNATIVE("Use servers() and begin(), end() or range-based loops.") {
130 return makeLegacyIterator(_serverList);
133 inline RooFIter valueClientMIterator() const
134 R__SUGGEST_ALTERNATIVE("Use valueClients() and begin(), end() or range-based loops.") {
135 return RooFIter(std::unique_ptr<RefCountListLegacyIterator_t>(makeLegacyIterator(_clientListValue)));
137 inline RooFIter shapeClientMIterator() const
138 R__SUGGEST_ALTERNATIVE("Use shapeClients() and begin(), end() or range-based loops.") {
139 return RooFIter(std::unique_ptr<RefCountListLegacyIterator_t>(makeLegacyIterator(_clientListShape)));
141 inline RooFIter serverMIterator() const
142 R__SUGGEST_ALTERNATIVE("Use shapeClients() and begin(), end() or range-based loops.") {
143 return RooFIter(std::unique_ptr<RefCountListLegacyIterator_t>(makeLegacyIterator(_serverList)));
149 const RefCountList_t& clients()
const {
153 const RefCountList_t& valueClients()
const {
154 return _clientListValue;
158 const RefCountList_t& shapeClients()
const {
159 return _clientListShape;
163 const RefCountList_t& servers()
const {
167 inline RooAbsArg* findServer(
const char *name)
const {
168 const auto serverIt = _serverList.findByName(name);
169 return serverIt != _serverList.end() ? *serverIt :
nullptr;
172 inline RooAbsArg* findServer(
const RooAbsArg& arg)
const {
173 const auto serverIt = _serverList.findByNamePointer(&arg);
174 return serverIt != _serverList.end() ? *serverIt :
nullptr;
177 inline RooAbsArg* findServer(Int_t index)
const {
178 return _serverList.containedObjects()[index];
181 inline Bool_t isValueServer(
const RooAbsArg& arg)
const {
182 return _clientListValue.containsByNamePtr(&arg);
185 inline Bool_t isValueServer(
const char* name)
const {
186 return _clientListValue.containsSameName(name);
189 inline Bool_t isShapeServer(
const RooAbsArg& arg)
const {
190 return _clientListShape.containsByNamePtr(&arg);
193 inline Bool_t isShapeServer(
const char* name)
const {
194 return _clientListShape.containsSameName(name);
196 void leafNodeServerList(RooAbsCollection* list,
const RooAbsArg* arg=0, Bool_t recurseNonDerived=kFALSE)
const ;
197 void branchNodeServerList(RooAbsCollection* list,
const RooAbsArg* arg=0, Bool_t recurseNonDerived=kFALSE)
const ;
198 void treeNodeServerList(RooAbsCollection* list,
const RooAbsArg* arg=0,
199 Bool_t doBranch=kTRUE, Bool_t doLeaf=kTRUE,
200 Bool_t valueOnly=kFALSE, Bool_t recurseNonDerived=kFALSE)
const ;
207 inline virtual Bool_t isFundamental()
const {
214 virtual RooAbsArg *createFundamental(
const char* newname=0)
const = 0;
219 inline virtual Bool_t isLValue()
const {
225 friend class RooProdPdf ;
226 friend class RooAddPdf ;
227 friend class RooAddPdfOrig ;
228 RooArgSet* getVariables(Bool_t stripDisconnected=kTRUE)
const ;
229 RooArgSet* getParameters(
const RooAbsData* data, Bool_t stripDisconnected=kTRUE)
const ;
231 RooArgSet* getParameters(
const RooAbsData& data, Bool_t stripDisconnected=kTRUE)
const {
232 return getParameters(&data,stripDisconnected) ;
235 RooArgSet* getParameters(
const RooArgSet& observables, Bool_t stripDisconnected=kTRUE)
const {
236 return getParameters(&observables,stripDisconnected);
238 virtual RooArgSet* getParameters(
const RooArgSet* depList, Bool_t stripDisconnected=kTRUE)
const ;
240 RooArgSet* getObservables(
const RooArgSet& set, Bool_t valueOnly=kTRUE)
const {
241 return getObservables(&set,valueOnly) ;
243 RooArgSet* getObservables(
const RooAbsData* data)
const ;
245 RooArgSet* getObservables(
const RooAbsData& data)
const {
246 return getObservables(&data) ;
248 RooArgSet* getObservables(
const RooArgSet* depList, Bool_t valueOnly=kTRUE)
const ;
249 Bool_t observableOverlaps(
const RooAbsData* dset,
const RooAbsArg& testArg)
const ;
250 Bool_t observableOverlaps(
const RooArgSet* depList,
const RooAbsArg& testArg)
const ;
251 virtual Bool_t checkObservables(
const RooArgSet* nset)
const ;
252 Bool_t recursiveCheckObservables(
const RooArgSet* nset)
const ;
253 RooArgSet* getComponents()
const ;
257 inline RooArgSet* getDependents(
const RooArgSet& set)
const {
return getObservables(set) ; }
259 inline RooArgSet* getDependents(
const RooAbsData* set)
const {
return getObservables(set) ; }
261 inline RooArgSet* getDependents(
const RooArgSet* depList)
const {
return getObservables(depList) ; }
263 inline Bool_t dependentOverlaps(
const RooAbsData* dset,
const RooAbsArg& testArg)
const {
return observableOverlaps(dset,testArg) ; }
265 inline Bool_t dependentOverlaps(
const RooArgSet* depList,
const RooAbsArg& testArg)
const {
return observableOverlaps(depList, testArg) ; }
267 inline Bool_t checkDependents(
const RooArgSet* nset)
const {
return checkObservables(nset) ; }
269 inline Bool_t recursiveCheckDependents(
const RooArgSet* nset)
const {
return recursiveCheckObservables(nset) ; }
272 void attachDataSet(
const RooAbsData &set);
273 void attachDataStore(
const RooAbsDataStore &set);
276 virtual Bool_t readFromStream(std::istream& is, Bool_t compact, Bool_t verbose=kFALSE) = 0 ;
277 virtual void writeToStream(std::ostream& os, Bool_t compact)
const = 0 ;
281 virtual void Print(Option_t *options= 0)
const {
283 printStream(defaultPrintStream(),defaultPrintContents(options),defaultPrintStyle(options));
286 virtual void printName(std::ostream& os)
const ;
287 virtual void printTitle(std::ostream& os)
const ;
288 virtual void printClassName(std::ostream& os)
const ;
289 virtual void printAddress(std::ostream& os)
const ;
290 virtual void printArgs(std::ostream& os)
const ;
291 virtual void printMetaArgs(std::ostream& )
const {} ;
292 virtual void printMultiline(std::ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent=
"")
const;
293 virtual void printTree(std::ostream& os, TString indent=
"")
const ;
295 virtual Int_t defaultPrintContents(Option_t* opt)
const ;
298 void setAttribute(
const Text_t* name, Bool_t value=kTRUE) ;
299 Bool_t getAttribute(
const Text_t* name)
const ;
300 inline const std::set<std::string>& attributes()
const {
305 void setStringAttribute(
const Text_t* key,
const Text_t* value) ;
306 const Text_t* getStringAttribute(
const Text_t* key)
const ;
307 inline const std::map<std::string,std::string>& stringAttributes()
const {
309 return _stringAttrib ;
313 void setTransientAttribute(
const Text_t* name, Bool_t value=kTRUE) ;
314 Bool_t getTransientAttribute(
const Text_t* name)
const ;
315 inline const std::set<std::string>& transientAttributes()
const {
317 return _boolAttribTransient ;
320 inline Bool_t isConstant()
const {
324 RooLinkedList getCloningAncestors()
const ;
327 Int_t Compare(
const TObject* other)
const ;
328 virtual Bool_t IsSortable()
const {
334 static void verboseDirty(Bool_t flag) ;
335 void printDirty(Bool_t depth=kTRUE)
const ;
337 static void setDirtyInhibit(Bool_t flag) ;
339 virtual Bool_t operator==(
const RooAbsArg& other) = 0 ;
340 virtual Bool_t isIdentical(
const RooAbsArg& other, Bool_t assumeSameType=kFALSE) = 0 ;
343 virtual Bool_t inRange(
const char*)
const {
347 virtual Bool_t hasRange(
const char*)
const {
353 enum ConstOpCode { Activate=0, DeActivate=1, ConfigChange=2, ValueChange=3 } ;
356 friend class RooMinuit ;
359 virtual void optimizeCacheMode(
const RooArgSet& observables) ;
360 virtual void optimizeCacheMode(
const RooArgSet& observables, RooArgSet& optNodes, RooLinkedList& processedNodes) ;
364 Bool_t findConstantNodes(
const RooArgSet& observables, RooArgSet& cacheList) ;
365 Bool_t findConstantNodes(
const RooArgSet& observables, RooArgSet& cacheList, RooLinkedList& processedNodes) ;
369 virtual void constOptimizeTestStatistic(ConstOpCode opcode, Bool_t doAlsoTrackingOpt=kTRUE) ;
370 enum CacheMode { Always=0, NotAdvised=1, Never=2 } ;
371 virtual CacheMode canNodeBeCached()
const {
return Always ; }
372 virtual void setCacheAndTrackHints(RooArgSet& ) {} ;
374 void graphVizTree(
const char* fileName,
const char* delimiter=
"\n",
bool useTitle=
false,
bool useLatex=
false) ;
375 void graphVizTree(std::ostream& os,
const char* delimiter=
"\n",
bool useTitle=
false,
bool useLatex=
false) ;
379 void printComponentTree(
const char* indent=
"",
const char* namePat=0, Int_t nLevel=999) ;
380 void printCompactTree(
const char* indent=
"",
const char* fileName=0,
const char* namePat=0, RooAbsArg* client=0) ;
381 void printCompactTree(std::ostream& os,
const char* indent=
"",
const char* namePat=0, RooAbsArg* client=0) ;
382 virtual void printCompactTreeHook(std::ostream& os,
const char *ind=
"") ;
385 inline Bool_t isShapeDirty()
const {
387 return isDerived()?_shapeDirty:kFALSE ;
390 inline Bool_t isValueDirty()
const {
392 if (inhibitDirty())
return kTRUE ;
399 if (_valueDirty)
return isDerived() ;
405 inline Bool_t isValueDirtyAndClear()
const {
407 if (inhibitDirty())
return kTRUE ;
415 _valueDirty = kFALSE ;
424 inline Bool_t isValueOrShapeDirtyAndClear()
const {
427 if (inhibitDirty())
return kTRUE ;
434 if (_valueDirty || _shapeDirty) {
435 _shapeDirty = kFALSE ;
436 _valueDirty = kFALSE ;
439 _shapeDirty = kFALSE ;
440 _valueDirty = kFALSE ;
447 void registerCache(RooAbsCache& cache) ;
448 void unRegisterCache(RooAbsCache& cache) ;
449 Int_t numCaches()
const ;
450 RooAbsCache* getCache(Int_t index)
const ;
452 enum OperMode { Auto=0, AClean=1, ADirty=2 } ;
453 inline OperMode operMode()
const {
return _operMode ; }
454 void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE) ;
456 Bool_t addOwnedComponents(
const RooArgSet& comps) ;
457 const RooArgSet* ownedComponents()
const {
return _ownedComponents ; }
459 void setProhibitServerRedirect(Bool_t flag) { _prohibitServerRedirect = flag ; }
461 void setWorkspace(RooWorkspace &ws) { _myws = &ws; }
466 void setValueDirty() {
467 if (_operMode == Auto && !inhibitDirty())
468 setValueDirty(
nullptr);
471 void setShapeDirty() { setShapeDirty(
nullptr); }
473 const char* aggregateCacheUniqueSuffix()
const ;
474 virtual const char* cacheUniqueSuffix()
const {
return 0 ; }
476 void wireAllCaches() ;
478 inline const TNamed* namePtr()
const {
482 void SetName(
const char* name) ;
483 void SetNameTitle(
const char *name,
const char *title) ;
487 Bool_t redirectServers(
const RooAbsCollection& newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t isRecursionStep=kFALSE) ;
488 Bool_t recursiveRedirectServers(
const RooAbsCollection& newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t recurseInNewSet=kTRUE) ;
489 virtual Bool_t redirectServersHook(
const RooAbsCollection& , Bool_t , Bool_t , Bool_t ) {
return kFALSE ; } ;
490 virtual void serverNameChangeHook(
const RooAbsArg* ,
const RooAbsArg* ) { } ;
492 void addServer(RooAbsArg& server, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE, std::size_t refCount = 1);
493 void addServerList(RooAbsCollection& serverList, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE) ;
494 void replaceServer(RooAbsArg& oldServer, RooAbsArg& newServer, Bool_t valueProp, Bool_t shapeProp) ;
495 void changeServer(RooAbsArg& server, Bool_t valueProp, Bool_t shapeProp) ;
496 void removeServer(RooAbsArg& server, Bool_t force=kFALSE) ;
497 RooAbsArg *findNewServer(
const RooAbsCollection &newSet, Bool_t nameChange)
const;
499 RooExpensiveObjectCache& expensiveObjectCache()
const ;
500 virtual void setExpensiveObjectCache(RooExpensiveObjectCache &cache) { _eocache = &cache; }
502 virtual Bool_t importWorkspaceHook(RooWorkspace &ws)
510 void graphVizAddConnections(std::set<std::pair<RooAbsArg*,RooAbsArg*> >&) ;
512 virtual void operModeHook() {} ;
514 virtual void optimizeDirtyHook(
const RooArgSet* ) {} ;
516 virtual Bool_t isValid()
const ;
518 virtual void getParametersHook(
const RooArgSet* , RooArgSet* , Bool_t )
const {} ;
519 virtual void getObservablesHook(
const RooArgSet* , RooArgSet* )
const {} ;
521 void clearValueAndShapeDirty()
const {
526 void clearValueDirty()
const {
529 void clearShapeDirty()
const {
534 void setValueDirty(
const RooAbsArg* source);
536 void setShapeDirty(
const RooAbsArg* source);
538 virtual void ioStreamerPass2() ;
539 static void ioStreamerPass2Finalize() ;
543 void addParameters(RooArgSet& params,
const RooArgSet* nset=0, Bool_t stripDisconnected=kTRUE)
const;
545 RefCountListLegacyIterator_t * makeLegacyIterator(
const RefCountList_t& list)
const;
551 friend class RooArgSet ;
552 friend class RooAbsCollection ;
553 friend class RooCustomizer ;
554 friend class RooWorkspace ;
555 friend class RooExtendPdf ;
556 friend class RooRealIntegral ;
557 friend class RooAbsReal ;
558 friend class RooProjectedPdf ;
559 RefCountList_t _serverList ;
560 RefCountList_t _clientList;
561 RefCountList_t _clientListShape;
562 RefCountList_t _clientListValue;
564 RooRefArray _proxyList ;
565 std::deque<RooAbsCache*> _cacheList ;
569 friend class RooAddModel ;
570 friend class RooArgProxy ;
571 friend class RooSetProxy ;
572 friend class RooListProxy ;
573 friend class RooObjectFactory ;
574 friend class RooHistPdf ;
575 friend class RooHistFunc ;
576 friend class RooHistFunc2 ;
577 void registerProxy(RooArgProxy& proxy) ;
578 void registerProxy(RooSetProxy& proxy) ;
579 void registerProxy(RooListProxy& proxy) ;
580 void unRegisterProxy(RooArgProxy& proxy) ;
581 void unRegisterProxy(RooSetProxy& proxy) ;
582 void unRegisterProxy(RooListProxy& proxy) ;
583 RooAbsProxy* getProxy(Int_t index)
const ;
584 void setProxyNormSet(
const RooArgSet* nset) ;
585 Int_t numProxies()
const ;
588 std::set<std::string> _boolAttrib ;
589 std::map<std::string,std::string> _stringAttrib ;
590 std::set<std::string> _boolAttribTransient ;
592 void printAttribList(std::ostream& os)
const;
595 friend class RooCompositeDataStore ;
596 friend class RooTreeDataStore ;
597 friend class RooVectorDataStore ;
598 friend class RooTreeData ;
599 friend class RooDataSet ;
600 friend class RooRealMPFE ;
601 virtual void syncCache(
const RooArgSet* nset=0) = 0 ;
602 virtual void copyCache(
const RooAbsArg* source, Bool_t valueOnly=kFALSE, Bool_t setValDirty=kTRUE) = 0 ;
604 virtual void attachToTree(TTree& t, Int_t bufSize=32000) = 0 ;
605 virtual void attachToVStore(RooVectorDataStore& vstore) = 0 ;
607 void attachToStore(RooAbsDataStore& store) ;
609 virtual void setTreeBranchStatus(TTree& t, Bool_t active) = 0 ;
610 virtual void fillTreeBranch(TTree& t) = 0 ;
611 TString cleanBranchName()
const ;
614 friend std::ostream& operator<<(std::ostream& os,
const RooAbsArg &arg);
615 friend std::istream& operator>>(std::istream& is, RooAbsArg &arg) ;
616 friend void RooRefArray::Streamer(TBuffer&);
619 static Bool_t _verboseDirty ;
620 static Bool_t _inhibitDirty ;
621 Bool_t _deleteWatch ;
623 Bool_t inhibitDirty()
const ;
626 void setLocalNoDirtyInhibit(Bool_t flag)
const { _localNoInhibitDirty = flag ; }
627 Bool_t localNoDirtyInhibit()
const {
return _localNoInhibitDirty ; }
631 mutable Bool_t _valueDirty ;
632 mutable Bool_t _shapeDirty ;
633 mutable bool _allBatchesDirty{
true};
635 mutable OperMode _operMode ;
636 mutable Bool_t _fast ;
639 RooArgSet* _ownedComponents ;
641 mutable Bool_t _prohibitServerRedirect ;
643 mutable RooExpensiveObjectCache* _eocache ;
645 mutable TNamed* _namePtr ;
648 mutable Bool_t _localNoInhibitDirty ;
653 mutable RooWorkspace *_myws;
656 friend class RooFitResult;
658 static std::map<RooAbsArg*,TRefArray*> _ioEvoList ;
660 static std::stack<RooAbsArg*> _ioReadStack ;
662 ClassDef(RooAbsArg,7)
665 std::ostream& operator<<(std::ostream& os,
const RooAbsArg &arg);
666 std::istream& operator>>(std::istream& is, RooAbsArg &arg);