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);