ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooAbsArg.h,v 1.93 2007/07/16 21:04:28 wouter Exp $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/
#ifndef ROO_ABS_ARG
#define ROO_ABS_ARG

#include <assert.h>
#include "TNamed.h"
#include "THashList.h"
#include "TRefArray.h"
#include "RooPrintable.h"
#include "RooRefCountList.h"
#include "RooAbsCache.h"
#include "RooLinkedListIter.h"
#include "RooNameReg.h"
#include <map>
#include <set>
#include <deque>
#include <stack>

#include <iostream>

#include "TClass.h"

class TTree ;
class RooArgSet ;
class RooAbsCollection ;
class RooTreeData ;
class RooTreeDataStore ;
class RooVectorDataStore ;
class RooAbsData ;
class RooAbsDataStore ;
class RooAbsProxy ;
class RooArgProxy ;
class RooSetProxy ;
class RooListProxy ;
class RooExpensiveObjectCache ;
class RooWorkspace ;
class RooRealProxy ;
/* class TGraphStruct ; */

class RooRefArray : public TObjArray {
 public:
  RooRefArray() : TObjArray() {
  } ;
  RooRefArray(const RooRefArray& other) : TObjArray(other) {
  }     
  virtual ~RooRefArray() {} ;
 protected:
  ClassDef(RooRefArray,1) // Helper class for proxy lists
} ;


class RooAbsArg : public TNamed, public RooPrintable {
public:

  // Constructors, cloning and assignment
  RooAbsArg() ;
  virtual ~RooAbsArg();
  RooAbsArg(const char *name, const char *title);
  RooAbsArg(const RooAbsArg& other, const char* name=0) ;
  virtual TObject* clone(const char* newname=0) const = 0 ;
  virtual TObject* Clone(const char* newname=0) const { 
    return clone(newname) ; 
  }
  virtual RooAbsArg* cloneTree(const char* newname=0) const ;

  // Accessors to client-server relation information 
  virtual Bool_t isDerived() const { 
    // Does value or shape of this arg depend on any other arg?
    return kTRUE ;
    //std::cout << IsA()->GetName() << "::isDerived(" << GetName() << ") = " << (_serverList.GetSize()>0 || _proxyList.GetSize()>0) << std::endl ;
    //return (_serverList.GetSize()>0 || _proxyList.GetSize()>0)?kTRUE:kFALSE; 
  }
  Bool_t isCloneOf(const RooAbsArg& other) const ; 
  Bool_t dependsOnValue(const RooAbsCollection& serverList, const RooAbsArg* ignoreArg=0) const { 
    // Does this arg depend on the value of any of of the values in serverList?
    return dependsOn(serverList,ignoreArg,kTRUE) ; 
  }
  Bool_t dependsOnValue(const RooAbsArg& server, const RooAbsArg* ignoreArg=0) const { 
    // Does this arg depend on the value of server?
    return dependsOn(server,ignoreArg,kTRUE) ; 
  }
  Bool_t dependsOn(const RooAbsCollection& serverList, const RooAbsArg* ignoreArg=0, Bool_t valueOnly=kFALSE) const ;
  Bool_t dependsOn(const RooAbsArg& server, const RooAbsArg* ignoreArg=0, Bool_t valueOnly=kFALSE) const ;
  Bool_t overlaps(const RooAbsArg& testArg, Bool_t valueOnly=kFALSE) const ;
  Bool_t hasClients() const { return _clientList.GetSize()>0 ? kTRUE : kFALSE ; }
  inline TIterator* clientIterator() const { 
    // Return iterator over all client RooAbsArgs
    return _clientList.MakeIterator() ; 
  }
  inline TIterator* valueClientIterator() const { 
    // Return iterator over all value client RooAbsArgs
    return _clientListValue.MakeIterator() ; 
  }
  inline TIterator* shapeClientIterator() const { 
    // Return iterator over all shape client RooAbsArgs
    return _clientListShape.MakeIterator() ; 
  }
  inline TIterator* serverIterator() const { 
    // Return iterator over all server RooAbsArgs
    return _serverList.MakeIterator() ; 
  }

  inline RooFIter valueClientMIterator() const { return _clientListValue.fwdIterator() ; }
  inline RooFIter shapeClientMIterator() const { return _clientListShape.fwdIterator() ; }
  inline RooFIter serverMIterator() const { return _serverList.fwdIterator() ; }


  inline RooAbsArg* findServer(const char *name) const { 
    // Return server of this arg with given name. Returns null if not found
    return (RooAbsArg*)_serverList.FindObject(name); 
  }
  inline RooAbsArg* findServer(const RooAbsArg& arg) const { 
    // Return server of this arg with name of given input arg. Returns null if not found
    return (RooAbsArg*)_serverList.findArg(&arg); 
  }
  inline RooAbsArg* findServer(Int_t index) const { 
    // Return i-th server from server list
    return (RooAbsArg*)_serverList.At(index); 
  }
  inline Bool_t isValueServer(const RooAbsArg& arg) const { 
    // If true, arg is a value server of self
    return _clientListValue.findArg(&arg)?kTRUE:kFALSE ; 
  }
  inline Bool_t isValueServer(const char* name) const { 
    // If true, we have a server with given name
    return _clientListValue.FindObject(name)?kTRUE:kFALSE ; 
  }
  inline Bool_t isShapeServer(const RooAbsArg& arg) const { 
    // If true arg is a shape server of self
    return _clientListShape.findArg(&arg)?kTRUE:kFALSE ; 
  }
  inline Bool_t isShapeServer(const char* name) const { 
    // If true, we have a shape server with given name
    return _clientListShape.FindObject(name)?kTRUE:kFALSE ; 
  }
  void leafNodeServerList(RooAbsCollection* list, const RooAbsArg* arg=0, Bool_t recurseNonDerived=kFALSE) const ;
  void branchNodeServerList(RooAbsCollection* list, const RooAbsArg* arg=0, Bool_t recurseNonDerived=kFALSE) const ;
  void treeNodeServerList(RooAbsCollection* list, const RooAbsArg* arg=0, 
			  Bool_t doBranch=kTRUE, Bool_t doLeaf=kTRUE, 
			  Bool_t valueOnly=kFALSE, Bool_t recurseNonDerived=kFALSE) const ;
  

  inline virtual Bool_t isFundamental() const { 
    // Is this object a fundamental type that can be added to a dataset?
    // Fundamental-type subclasses override this method to return kTRUE.
    // Note that this test is subtlely different from the dynamic isDerived()
    // test, e.g. a constant is not derived but is also not fundamental.
    return kFALSE; 
  }

  // Create a fundamental-type object that stores our type of value. The
  // created object will have a valid value, but not necessarily the same
  // as our value. The caller is responsible for deleting the returned object.
  virtual RooAbsArg *createFundamental(const char* newname=0) const = 0;

  inline virtual Bool_t isLValue() const { 
    // Is this argument an l-value, ie, can it appear on the left-hand side
    // of an assignment expression? LValues are also special since they can
    // potentially be analytically integrated and generated.
    return kFALSE; 
  }

  void addParameters(RooArgSet& params, const RooArgSet* nset=0, Bool_t stripDisconnected=kTRUE)  const ; 

  // Parameter & observable interpretation of servers
  friend class RooProdPdf ;
  friend class RooAddPdf ;
  friend class RooAddPdfOrig ;
  RooArgSet* getVariables(Bool_t stripDisconnected=kTRUE) const ;
  RooArgSet* getParameters(const RooAbsData* data, Bool_t stripDisconnected=kTRUE) const ;
  RooArgSet* getParameters(const RooAbsData& data, Bool_t stripDisconnected=kTRUE) const { 
    // Return the parameters of this p.d.f when used in conjuction with dataset 'data'
    return getParameters(&data,stripDisconnected) ; 
  }
  RooArgSet* getParameters(const RooArgSet& set, Bool_t stripDisconnected=kTRUE) const { 
    // Return the parameters of the p.d.f given the provided set of observables
    return getParameters(&set,stripDisconnected) ; 
  }
  virtual RooArgSet* getParameters(const RooArgSet* depList, Bool_t stripDisconnected=kTRUE) const ;
  RooArgSet* getObservables(const RooArgSet& set, Bool_t valueOnly=kTRUE) const { 
    // Return the observables of _this_ pdf given a set of observables
    return getObservables(&set,valueOnly) ; 
  }
  RooArgSet* getObservables(const RooAbsData* data) const ;
  RooArgSet* getObservables(const RooAbsData& data) const { 
    // Return the observables of _this_ pdf given the observables defined by 'data'
    return getObservables(&data) ; 
  }
  RooArgSet* getObservables(const RooArgSet* depList, Bool_t valueOnly=kTRUE) const ;
  Bool_t observableOverlaps(const RooAbsData* dset, const RooAbsArg& testArg) const ;
  Bool_t observableOverlaps(const RooArgSet* depList, const RooAbsArg& testArg) const ;
  virtual Bool_t checkObservables(const RooArgSet* nset) const ;
  Bool_t recursiveCheckObservables(const RooArgSet* nset) const ;
  RooArgSet* getComponents() const ;	

  // --- Obsolete functions for backward compatibility
  inline RooArgSet* getDependents(const RooArgSet& set) const { return getObservables(set) ; }
  inline RooArgSet* getDependents(const RooAbsData* set) const { return getObservables(set) ; }
  inline RooArgSet* getDependents(const RooArgSet* depList) const { return getObservables(depList) ; }
  inline Bool_t dependentOverlaps(const RooAbsData* dset, const RooAbsArg& testArg) const { return observableOverlaps(dset,testArg) ; }
  inline Bool_t dependentOverlaps(const RooArgSet* depList, const RooAbsArg& testArg) const { return observableOverlaps(depList, testArg) ; }
  inline Bool_t checkDependents(const RooArgSet* nset) const { return checkObservables(nset) ; }
  inline Bool_t recursiveCheckDependents(const RooArgSet* nset) const { return recursiveCheckObservables(nset) ; }
  // --- End obsolete functions for backward compatibility

  void attachDataSet(const RooAbsData &set);
  void attachDataStore(const RooAbsDataStore &set);

  // I/O streaming interface (machine readable)
  virtual Bool_t readFromStream(std::istream& is, Bool_t compact, Bool_t verbose=kFALSE) = 0 ;
  virtual void writeToStream(std::ostream& os, Bool_t compact) const = 0 ;

  inline virtual void Print(Option_t *options= 0) const {
    // Printing interface (human readable)
    printStream(defaultPrintStream(),defaultPrintContents(options),defaultPrintStyle(options));
  }

  virtual void printName(std::ostream& os) const ;
  virtual void printTitle(std::ostream& os) const ;
  virtual void printClassName(std::ostream& os) const ;
  virtual void printAddress(std::ostream& os) const ;
  virtual void printArgs(std::ostream& os) const ;
  virtual void printMetaArgs(std::ostream& /*os*/) const {} ;
  virtual void printMultiline(std::ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const;
  virtual void printTree(std::ostream& os, TString indent="") const ;

  virtual Int_t defaultPrintContents(Option_t* opt) const ;

  // Accessors to attributes
  void setAttribute(const Text_t* name, Bool_t value=kTRUE) ;
  Bool_t getAttribute(const Text_t* name) const ;
  inline const std::set<std::string>& attributes() const { 
    // Returns set of names of boolean attributes defined
    return _boolAttrib ; 
  }

  void setStringAttribute(const Text_t* key, const Text_t* value) ;
  const Text_t* getStringAttribute(const Text_t* key) const ;
  inline const std::map<std::string,std::string>& stringAttributes() const { 
    // Returns std::map<string,string> with all string attributes defined
    return _stringAttrib ; 
  }

  // Accessors to transient attributes
  void setTransientAttribute(const Text_t* name, Bool_t value=kTRUE) ;
  Bool_t getTransientAttribute(const Text_t* name) const ;
  inline const std::set<std::string>& transientAttributes() const { 
    // Return set of transient boolean attributes 
    return _boolAttribTransient ; 
  }

  inline Bool_t isConstant() const { 
    // Returns true if 'Constant' attribute is set
    return _isConstant ; //getAttribute("Constant") ; 
  }
  RooLinkedList getCloningAncestors() const ;

  // Sorting
  Int_t Compare(const TObject* other) const ;
  virtual Bool_t IsSortable() const { 
    // Object is sortable in ROOT container class
    return kTRUE ; 
  }

  //Debug hooks
  static void verboseDirty(Bool_t flag) ;
  void printDirty(Bool_t depth=kTRUE) const ;

  static void setDirtyInhibit(Bool_t flag) ;

  virtual Bool_t operator==(const RooAbsArg& other) = 0 ;
  virtual Bool_t isIdentical(const RooAbsArg& other, Bool_t assumeSameType=kFALSE) = 0 ;

  // Range management
  virtual Bool_t inRange(const char*) const { 
    // Is value in range (dummy interface always returns true)
    return kTRUE ; 
  }
  virtual Bool_t hasRange(const char*) const { 
    // Has this argument a defined range (dummy interface always returns flase)
    return kFALSE ; 
  }


  enum ConstOpCode { Activate=0, DeActivate=1, ConfigChange=2, ValueChange=3 } ;
  

  friend class RooMinuit ;

  // Cache mode optimization (tracks changes & do lazy evaluation vs evaluate always)
  virtual void optimizeCacheMode(const RooArgSet& observables) ;
  virtual void optimizeCacheMode(const RooArgSet& observables, RooArgSet& optNodes, RooLinkedList& processedNodes) ;
  

  // Find constant terms in expression 
  Bool_t findConstantNodes(const RooArgSet& observables, RooArgSet& cacheList) ;
  Bool_t findConstantNodes(const RooArgSet& observables, RooArgSet& cacheList, RooLinkedList& processedNodes) ;


  // constant term optimization
  virtual void constOptimizeTestStatistic(ConstOpCode opcode, Bool_t doAlsoTrackingOpt=kTRUE) ;
  enum CacheMode { Always=0, NotAdvised=1, Never=2 } ;
  virtual CacheMode canNodeBeCached() const { return Always ; }
  virtual void setCacheAndTrackHints(RooArgSet& /*trackNodes*/ ) {} ;
  
  void graphVizTree(const char* fileName, const char* delimiter="\n", bool useTitle=false, bool useLatex=false) ;
  void graphVizTree(std::ostream& os, const char* delimiter="\n", bool useTitle=false, bool useLatex=false) ;

/*   TGraphStruct* graph(Bool_t useFactoryTag=kFALSE, Double_t textSize=0.03) ; */

  void printComponentTree(const char* indent="",const char* namePat=0, Int_t nLevel=999) ;
  void printCompactTree(const char* indent="",const char* fileName=0, const char* namePat=0, RooAbsArg* client=0) ;
  void printCompactTree(std::ostream& os, const char* indent="", const char* namePat=0, RooAbsArg* client=0) ;
  virtual void printCompactTreeHook(std::ostream& os, const char *ind="") ;

  // Dirty state accessor
  inline Bool_t isShapeDirty() const { 
    // Return true is shape has been invalidated by server value change
    return isDerived()?_shapeDirty:kFALSE ; 
  } 

  inline Bool_t isValueDirty() const { 
    // Returns true of value has been invalidated by server value change
    if (inhibitDirty()) return kTRUE ;
    switch(_operMode) {
    case AClean: 
      return kFALSE ;
    case ADirty: 
      return kTRUE ;
    case Auto: 
      if (_valueDirty) return isDerived() ;
      return kFALSE ;
    }
    return kTRUE ; // we should never get here
  }

  inline Bool_t isValueDirtyAndClear() const { 
    // Returns true of value has been invalidated by server value change
    if (inhibitDirty()) return kTRUE ;
    switch(_operMode) {
    case AClean: 
      return kFALSE ;
    case ADirty: 
      return kTRUE ;
    case Auto: 
      if (_valueDirty) {
	_valueDirty = kFALSE ;
	return isDerived();
      }
      return kFALSE ;
    }
    return kTRUE ; // But we should never get here
  }


  inline Bool_t isValueOrShapeDirtyAndClear() const { 
    // Returns true of value has been invalidated by server value change

    if (inhibitDirty()) return kTRUE ;
    switch(_operMode) {
    case AClean: 
      return kFALSE ;
    case ADirty: 
      return kTRUE ;
    case Auto: 
      if (_valueDirty || _shapeDirty) {
	_shapeDirty = kFALSE ;
	_valueDirty = kFALSE ;
	return isDerived();
      }
      _shapeDirty = kFALSE ;
      _valueDirty = kFALSE ;
      return kFALSE ;
    }
    return kTRUE ; // But we should never get here
  }

  // Cache management
  void registerCache(RooAbsCache& cache) ;
  void unRegisterCache(RooAbsCache& cache) ;
  Int_t numCaches() const ;
  RooAbsCache* getCache(Int_t index) const ;

  enum OperMode { Auto=0, AClean=1, ADirty=2 } ;
  inline OperMode operMode() const { return _operMode  ; }
  void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE) ; 

  static UInt_t crc32(const char* data);
  static UInt_t crc32(const char* data, ULong_t sz, UInt_t crc = 0);

  static const UInt_t fnv1a32start = 2166136261u;
  static UInt_t fnv1a32(const char* data);
  static UInt_t fnv1a32(const char* data, ULong_t sz, UInt_t hash = fnv1a32start);

  static const ULong64_t fnv1a64start = (ULong64_t(3421674724u) << 32) | ULong64_t(2216829733u);
  static ULong64_t fnv1a64(const char* data);
  static ULong64_t fnv1a64(const char* data, ULong_t sz, ULong64_t hash = fnv1a64start);
  
  Bool_t addOwnedComponents(const RooArgSet& comps) ;
  const RooArgSet* ownedComponents() const { return _ownedComponents ; }
  
  void setProhibitServerRedirect(Bool_t flag) { _prohibitServerRedirect = flag ; }

  protected:

  void graphVizAddConnections(std::set<std::pair<RooAbsArg*,RooAbsArg*> >&) ;

  friend class RooExtendPdf ;
  friend class RooRealIntegral ;
  friend class RooAbsReal ;
  friend class RooProjectedPdf ;
  //friend class RooSimCloneTool ;

  virtual void operModeHook() {} ;

  virtual void optimizeDirtyHook(const RooArgSet* /*obs*/) {} ;

  virtual Bool_t isValid() const ;

  virtual void getParametersHook(const RooArgSet* /*nset*/, RooArgSet* /*list*/, Bool_t /*stripDisconnected*/) const {} ;
  virtual void getObservablesHook(const RooArgSet* /*nset*/, RooArgSet* /*list*/) const {} ;

  // Dirty state modifiers
 public:
  inline void setValueDirty() const {   if (_operMode==Auto && !inhibitDirty()) setValueDirty(0) ; }
  inline void setShapeDirty() const { setShapeDirty(0) ; } 

  inline void clearValueAndShapeDirty() const {
    _valueDirty=kFALSE ;  
    _shapeDirty=kFALSE ; 
  }

  inline void clearValueDirty() const { 
    _valueDirty=kFALSE ; 
  }
  inline void clearShapeDirty() const { 
    _shapeDirty=kFALSE ; 
  }
  
  const char* aggregateCacheUniqueSuffix() const ;
  virtual const char* cacheUniqueSuffix() const { return 0 ; }

  void wireAllCaches() ;
  
  inline const TNamed* namePtr() const {
    return _namePtr ;
  }

  void SetName(const char* name) ;
  void SetNameTitle(const char *name, const char *title) ;

 protected:

  // Client-Server relatation and Proxy management 
  friend class RooArgSet ;
  friend class RooAbsCollection ;
  friend class RooCustomizer ;
  friend class RooWorkspace ;
  RooRefCountList _serverList       ; // list of server objects
  RooRefCountList _clientList       ; // list of client objects
  RooRefCountList _clientListShape  ; // subset of clients that requested shape dirty flag propagation
  RooRefCountList _clientListValue  ; // subset of clients that requested value dirty flag propagation
  RooRefArray _proxyList        ; // list of proxies
  std::deque<RooAbsCache*> _cacheList ; // list of caches
  TIterator* _clientShapeIter ; //! Iterator over _clientListShape 
  TIterator* _clientValueIter ; //! Iterator over _clientListValue 

  // Server redirection interface
 public:
  Bool_t redirectServers(const RooAbsCollection& newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t isRecursionStep=kFALSE) ;
  Bool_t recursiveRedirectServers(const RooAbsCollection& newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t recurseInNewSet=kTRUE) ;
  virtual Bool_t redirectServersHook(const RooAbsCollection& /*newServerList*/, Bool_t /*mustReplaceAll*/, Bool_t /*nameChange*/, Bool_t /*isRecursive*/) { return kFALSE ; } ;
  virtual void serverNameChangeHook(const RooAbsArg* /*oldServer*/, const RooAbsArg* /*newServer*/) { } ;

  void addServer(RooAbsArg& server, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE) ;
  void addServerList(RooAbsCollection& serverList, Bool_t valueProp=kTRUE, Bool_t shapeProp=kFALSE) ;
  void replaceServer(RooAbsArg& oldServer, RooAbsArg& newServer, Bool_t valueProp, Bool_t shapeProp) ;
  void changeServer(RooAbsArg& server, Bool_t valueProp, Bool_t shapeProp) ;
  void removeServer(RooAbsArg& server, Bool_t force=kFALSE) ;
  RooAbsArg *findNewServer(const RooAbsCollection &newSet, Bool_t nameChange) const;

  RooExpensiveObjectCache& expensiveObjectCache() const ;
  virtual void setExpensiveObjectCache(RooExpensiveObjectCache& cache) { _eocache = &cache ; }  

  virtual Bool_t importWorkspaceHook(RooWorkspace&) { return kFALSE ; } ;

 protected:

  // Proxy management
  friend class RooAddModel ;
  friend class RooArgProxy ;
  friend class RooSetProxy ;
  friend class RooListProxy ;
  friend class RooObjectFactory ;
  friend class RooHistPdf ;
  friend class RooHistFunc ;
  friend class RooHistFunc2 ;
  void registerProxy(RooArgProxy& proxy) ;
  void registerProxy(RooSetProxy& proxy) ;
  void registerProxy(RooListProxy& proxy) ;
  void unRegisterProxy(RooArgProxy& proxy) ;
  void unRegisterProxy(RooSetProxy& proxy) ;
  void unRegisterProxy(RooListProxy& proxy) ;
  RooAbsProxy* getProxy(Int_t index) const ;
  void setProxyNormSet(const RooArgSet* nset) ;
  Int_t numProxies() const ;

  // Attribute list
  std::set<std::string> _boolAttrib ; // Boolean attributes
  std::map<std::string,std::string> _stringAttrib ; // String attributes
  std::set<std::string> _boolAttribTransient ; //! Transient boolean attributes (not copied in ctor)

  void printAttribList(std::ostream& os) const;

  // Hooks for RooTreeData interface
  friend class RooCompositeDataStore ;
  friend class RooTreeDataStore ;
  friend class RooVectorDataStore ;
  friend class RooTreeData ;
  friend class RooDataSet ;
  friend class RooRealMPFE ;
  virtual void syncCache(const RooArgSet* nset=0) = 0 ;
  virtual void copyCache(const RooAbsArg* source, Bool_t valueOnly=kFALSE, Bool_t setValDirty=kTRUE) = 0 ;

  virtual void attachToTree(TTree& t, Int_t bufSize=32000) = 0 ;
  virtual void attachToVStore(RooVectorDataStore& vstore) = 0 ;
  void attachToStore(RooAbsDataStore& store) ;

  virtual void setTreeBranchStatus(TTree& t, Bool_t active) = 0 ;
  virtual void fillTreeBranch(TTree& t) = 0 ;
  TString cleanBranchName() const ;

  // Global   
  friend std::ostream& operator<<(std::ostream& os, const RooAbsArg &arg);  
  friend std::istream& operator>>(std::istream& is, RooAbsArg &arg) ;

  // Debug stuff
  static Bool_t _verboseDirty ; // Static flag controlling verbose messaging for dirty state changes
  static Bool_t _inhibitDirty ; // Static flag controlling global inhibit of dirty state propagation
  Bool_t _deleteWatch ; //! Delete watch flag 

  Bool_t inhibitDirty() const ;
 
 public:
  void setLocalNoDirtyInhibit(Bool_t flag) const { _localNoInhibitDirty = flag ; }
  Bool_t localNoDirtyInhibit() const { return _localNoInhibitDirty ; }
 protected:

  // Value and Shape dirty state bits
  void setValueDirty(const RooAbsArg* source) const ; 
  void setShapeDirty(const RooAbsArg* source) const ; 
  mutable Bool_t _valueDirty ;  // Flag set if value needs recalculating because input values modified
  mutable Bool_t _shapeDirty ;  // Flag set if value needs recalculating because input shapes modified

  friend class RooRealProxy ;
  mutable OperMode _operMode ; // Dirty state propagation mode
  mutable Bool_t _fast ; // Allow fast access mode in getVal() and proxies

  // Owned components
  RooArgSet* _ownedComponents ; //! Set of owned component

  mutable Bool_t _prohibitServerRedirect ; //! Prohibit server redirects -- Debugging tool

  mutable RooExpensiveObjectCache* _eocache ; // Pointer to global cache manager for any expensive components created by this object

  mutable TNamed* _namePtr ; //! Do not persist. Pointer to global instance of string that matches object named
  Bool_t _isConstant ; //! Cached isConstant status 

  mutable Bool_t _localNoInhibitDirty ; //! Prevent 'AlwaysDirty' mode for this node

/*   RooArgSet _leafNodeCache ; //! Cached leaf nodes */
/*   RooArgSet _branchNodeCache //! Cached branch nodes     */

 public:  
  virtual void ioStreamerPass2() ;
  static void ioStreamerPass2Finalize() ;
  static std::map<RooAbsArg*,TRefArray*> _ioEvoList ; // temporary holding list for proxies needed in schema evolution  
  static std::stack<RooAbsArg*> _ioReadStack ; // reading stack 
  
  ClassDef(RooAbsArg,6) // Abstract variable
};

std::ostream& operator<<(std::ostream& os, const RooAbsArg &arg);  
std::istream& operator>>(std::istream& is, RooAbsArg &arg) ;

#endif
 RooAbsArg.h:1
 RooAbsArg.h:2
 RooAbsArg.h:3
 RooAbsArg.h:4
 RooAbsArg.h:5
 RooAbsArg.h:6
 RooAbsArg.h:7
 RooAbsArg.h:8
 RooAbsArg.h:9
 RooAbsArg.h:10
 RooAbsArg.h:11
 RooAbsArg.h:12
 RooAbsArg.h:13
 RooAbsArg.h:14
 RooAbsArg.h:15
 RooAbsArg.h:16
 RooAbsArg.h:17
 RooAbsArg.h:18
 RooAbsArg.h:19
 RooAbsArg.h:20
 RooAbsArg.h:21
 RooAbsArg.h:22
 RooAbsArg.h:23
 RooAbsArg.h:24
 RooAbsArg.h:25
 RooAbsArg.h:26
 RooAbsArg.h:27
 RooAbsArg.h:28
 RooAbsArg.h:29
 RooAbsArg.h:30
 RooAbsArg.h:31
 RooAbsArg.h:32
 RooAbsArg.h:33
 RooAbsArg.h:34
 RooAbsArg.h:35
 RooAbsArg.h:36
 RooAbsArg.h:37
 RooAbsArg.h:38
 RooAbsArg.h:39
 RooAbsArg.h:40
 RooAbsArg.h:41
 RooAbsArg.h:42
 RooAbsArg.h:43
 RooAbsArg.h:44
 RooAbsArg.h:45
 RooAbsArg.h:46
 RooAbsArg.h:47
 RooAbsArg.h:48
 RooAbsArg.h:49
 RooAbsArg.h:50
 RooAbsArg.h:51
 RooAbsArg.h:52
 RooAbsArg.h:53
 RooAbsArg.h:54
 RooAbsArg.h:55
 RooAbsArg.h:56
 RooAbsArg.h:57
 RooAbsArg.h:58
 RooAbsArg.h:59
 RooAbsArg.h:60
 RooAbsArg.h:61
 RooAbsArg.h:62
 RooAbsArg.h:63
 RooAbsArg.h:64
 RooAbsArg.h:65
 RooAbsArg.h:66
 RooAbsArg.h:67
 RooAbsArg.h:68
 RooAbsArg.h:69
 RooAbsArg.h:70
 RooAbsArg.h:71
 RooAbsArg.h:72
 RooAbsArg.h:73
 RooAbsArg.h:74
 RooAbsArg.h:75
 RooAbsArg.h:76
 RooAbsArg.h:77
 RooAbsArg.h:78
 RooAbsArg.h:79
 RooAbsArg.h:80
 RooAbsArg.h:81
 RooAbsArg.h:82
 RooAbsArg.h:83
 RooAbsArg.h:84
 RooAbsArg.h:85
 RooAbsArg.h:86
 RooAbsArg.h:87
 RooAbsArg.h:88
 RooAbsArg.h:89
 RooAbsArg.h:90
 RooAbsArg.h:91
 RooAbsArg.h:92
 RooAbsArg.h:93
 RooAbsArg.h:94
 RooAbsArg.h:95
 RooAbsArg.h:96
 RooAbsArg.h:97
 RooAbsArg.h:98
 RooAbsArg.h:99
 RooAbsArg.h:100
 RooAbsArg.h:101
 RooAbsArg.h:102
 RooAbsArg.h:103
 RooAbsArg.h:104
 RooAbsArg.h:105
 RooAbsArg.h:106
 RooAbsArg.h:107
 RooAbsArg.h:108
 RooAbsArg.h:109
 RooAbsArg.h:110
 RooAbsArg.h:111
 RooAbsArg.h:112
 RooAbsArg.h:113
 RooAbsArg.h:114
 RooAbsArg.h:115
 RooAbsArg.h:116
 RooAbsArg.h:117
 RooAbsArg.h:118
 RooAbsArg.h:119
 RooAbsArg.h:120
 RooAbsArg.h:121
 RooAbsArg.h:122
 RooAbsArg.h:123
 RooAbsArg.h:124
 RooAbsArg.h:125
 RooAbsArg.h:126
 RooAbsArg.h:127
 RooAbsArg.h:128
 RooAbsArg.h:129
 RooAbsArg.h:130
 RooAbsArg.h:131
 RooAbsArg.h:132
 RooAbsArg.h:133
 RooAbsArg.h:134
 RooAbsArg.h:135
 RooAbsArg.h:136
 RooAbsArg.h:137
 RooAbsArg.h:138
 RooAbsArg.h:139
 RooAbsArg.h:140
 RooAbsArg.h:141
 RooAbsArg.h:142
 RooAbsArg.h:143
 RooAbsArg.h:144
 RooAbsArg.h:145
 RooAbsArg.h:146
 RooAbsArg.h:147
 RooAbsArg.h:148
 RooAbsArg.h:149
 RooAbsArg.h:150
 RooAbsArg.h:151
 RooAbsArg.h:152
 RooAbsArg.h:153
 RooAbsArg.h:154
 RooAbsArg.h:155
 RooAbsArg.h:156
 RooAbsArg.h:157
 RooAbsArg.h:158
 RooAbsArg.h:159
 RooAbsArg.h:160
 RooAbsArg.h:161
 RooAbsArg.h:162
 RooAbsArg.h:163
 RooAbsArg.h:164
 RooAbsArg.h:165
 RooAbsArg.h:166
 RooAbsArg.h:167
 RooAbsArg.h:168
 RooAbsArg.h:169
 RooAbsArg.h:170
 RooAbsArg.h:171
 RooAbsArg.h:172
 RooAbsArg.h:173
 RooAbsArg.h:174
 RooAbsArg.h:175
 RooAbsArg.h:176
 RooAbsArg.h:177
 RooAbsArg.h:178
 RooAbsArg.h:179
 RooAbsArg.h:180
 RooAbsArg.h:181
 RooAbsArg.h:182
 RooAbsArg.h:183
 RooAbsArg.h:184
 RooAbsArg.h:185
 RooAbsArg.h:186
 RooAbsArg.h:187
 RooAbsArg.h:188
 RooAbsArg.h:189
 RooAbsArg.h:190
 RooAbsArg.h:191
 RooAbsArg.h:192
 RooAbsArg.h:193
 RooAbsArg.h:194
 RooAbsArg.h:195
 RooAbsArg.h:196
 RooAbsArg.h:197
 RooAbsArg.h:198
 RooAbsArg.h:199
 RooAbsArg.h:200
 RooAbsArg.h:201
 RooAbsArg.h:202
 RooAbsArg.h:203
 RooAbsArg.h:204
 RooAbsArg.h:205
 RooAbsArg.h:206
 RooAbsArg.h:207
 RooAbsArg.h:208
 RooAbsArg.h:209
 RooAbsArg.h:210
 RooAbsArg.h:211
 RooAbsArg.h:212
 RooAbsArg.h:213
 RooAbsArg.h:214
 RooAbsArg.h:215
 RooAbsArg.h:216
 RooAbsArg.h:217
 RooAbsArg.h:218
 RooAbsArg.h:219
 RooAbsArg.h:220
 RooAbsArg.h:221
 RooAbsArg.h:222
 RooAbsArg.h:223
 RooAbsArg.h:224
 RooAbsArg.h:225
 RooAbsArg.h:226
 RooAbsArg.h:227
 RooAbsArg.h:228
 RooAbsArg.h:229
 RooAbsArg.h:230
 RooAbsArg.h:231
 RooAbsArg.h:232
 RooAbsArg.h:233
 RooAbsArg.h:234
 RooAbsArg.h:235
 RooAbsArg.h:236
 RooAbsArg.h:237
 RooAbsArg.h:238
 RooAbsArg.h:239
 RooAbsArg.h:240
 RooAbsArg.h:241
 RooAbsArg.h:242
 RooAbsArg.h:243
 RooAbsArg.h:244
 RooAbsArg.h:245
 RooAbsArg.h:246
 RooAbsArg.h:247
 RooAbsArg.h:248
 RooAbsArg.h:249
 RooAbsArg.h:250
 RooAbsArg.h:251
 RooAbsArg.h:252
 RooAbsArg.h:253
 RooAbsArg.h:254
 RooAbsArg.h:255
 RooAbsArg.h:256
 RooAbsArg.h:257
 RooAbsArg.h:258
 RooAbsArg.h:259
 RooAbsArg.h:260
 RooAbsArg.h:261
 RooAbsArg.h:262
 RooAbsArg.h:263
 RooAbsArg.h:264
 RooAbsArg.h:265
 RooAbsArg.h:266
 RooAbsArg.h:267
 RooAbsArg.h:268
 RooAbsArg.h:269
 RooAbsArg.h:270
 RooAbsArg.h:271
 RooAbsArg.h:272
 RooAbsArg.h:273
 RooAbsArg.h:274
 RooAbsArg.h:275
 RooAbsArg.h:276
 RooAbsArg.h:277
 RooAbsArg.h:278
 RooAbsArg.h:279
 RooAbsArg.h:280
 RooAbsArg.h:281
 RooAbsArg.h:282
 RooAbsArg.h:283
 RooAbsArg.h:284
 RooAbsArg.h:285
 RooAbsArg.h:286
 RooAbsArg.h:287
 RooAbsArg.h:288
 RooAbsArg.h:289
 RooAbsArg.h:290
 RooAbsArg.h:291
 RooAbsArg.h:292
 RooAbsArg.h:293
 RooAbsArg.h:294
 RooAbsArg.h:295
 RooAbsArg.h:296
 RooAbsArg.h:297
 RooAbsArg.h:298
 RooAbsArg.h:299
 RooAbsArg.h:300
 RooAbsArg.h:301
 RooAbsArg.h:302
 RooAbsArg.h:303
 RooAbsArg.h:304
 RooAbsArg.h:305
 RooAbsArg.h:306
 RooAbsArg.h:307
 RooAbsArg.h:308
 RooAbsArg.h:309
 RooAbsArg.h:310
 RooAbsArg.h:311
 RooAbsArg.h:312
 RooAbsArg.h:313
 RooAbsArg.h:314
 RooAbsArg.h:315
 RooAbsArg.h:316
 RooAbsArg.h:317
 RooAbsArg.h:318
 RooAbsArg.h:319
 RooAbsArg.h:320
 RooAbsArg.h:321
 RooAbsArg.h:322
 RooAbsArg.h:323
 RooAbsArg.h:324
 RooAbsArg.h:325
 RooAbsArg.h:326
 RooAbsArg.h:327
 RooAbsArg.h:328
 RooAbsArg.h:329
 RooAbsArg.h:330
 RooAbsArg.h:331
 RooAbsArg.h:332
 RooAbsArg.h:333
 RooAbsArg.h:334
 RooAbsArg.h:335
 RooAbsArg.h:336
 RooAbsArg.h:337
 RooAbsArg.h:338
 RooAbsArg.h:339
 RooAbsArg.h:340
 RooAbsArg.h:341
 RooAbsArg.h:342
 RooAbsArg.h:343
 RooAbsArg.h:344
 RooAbsArg.h:345
 RooAbsArg.h:346
 RooAbsArg.h:347
 RooAbsArg.h:348
 RooAbsArg.h:349
 RooAbsArg.h:350
 RooAbsArg.h:351
 RooAbsArg.h:352
 RooAbsArg.h:353
 RooAbsArg.h:354
 RooAbsArg.h:355
 RooAbsArg.h:356
 RooAbsArg.h:357
 RooAbsArg.h:358
 RooAbsArg.h:359
 RooAbsArg.h:360
 RooAbsArg.h:361
 RooAbsArg.h:362
 RooAbsArg.h:363
 RooAbsArg.h:364
 RooAbsArg.h:365
 RooAbsArg.h:366
 RooAbsArg.h:367
 RooAbsArg.h:368
 RooAbsArg.h:369
 RooAbsArg.h:370
 RooAbsArg.h:371
 RooAbsArg.h:372
 RooAbsArg.h:373
 RooAbsArg.h:374
 RooAbsArg.h:375
 RooAbsArg.h:376
 RooAbsArg.h:377
 RooAbsArg.h:378
 RooAbsArg.h:379
 RooAbsArg.h:380
 RooAbsArg.h:381
 RooAbsArg.h:382
 RooAbsArg.h:383
 RooAbsArg.h:384
 RooAbsArg.h:385
 RooAbsArg.h:386
 RooAbsArg.h:387
 RooAbsArg.h:388
 RooAbsArg.h:389
 RooAbsArg.h:390
 RooAbsArg.h:391
 RooAbsArg.h:392
 RooAbsArg.h:393
 RooAbsArg.h:394
 RooAbsArg.h:395
 RooAbsArg.h:396
 RooAbsArg.h:397
 RooAbsArg.h:398
 RooAbsArg.h:399
 RooAbsArg.h:400
 RooAbsArg.h:401
 RooAbsArg.h:402
 RooAbsArg.h:403
 RooAbsArg.h:404
 RooAbsArg.h:405
 RooAbsArg.h:406
 RooAbsArg.h:407
 RooAbsArg.h:408
 RooAbsArg.h:409
 RooAbsArg.h:410
 RooAbsArg.h:411
 RooAbsArg.h:412
 RooAbsArg.h:413
 RooAbsArg.h:414
 RooAbsArg.h:415
 RooAbsArg.h:416
 RooAbsArg.h:417
 RooAbsArg.h:418
 RooAbsArg.h:419
 RooAbsArg.h:420
 RooAbsArg.h:421
 RooAbsArg.h:422
 RooAbsArg.h:423
 RooAbsArg.h:424
 RooAbsArg.h:425
 RooAbsArg.h:426
 RooAbsArg.h:427
 RooAbsArg.h:428
 RooAbsArg.h:429
 RooAbsArg.h:430
 RooAbsArg.h:431
 RooAbsArg.h:432
 RooAbsArg.h:433
 RooAbsArg.h:434
 RooAbsArg.h:435
 RooAbsArg.h:436
 RooAbsArg.h:437
 RooAbsArg.h:438
 RooAbsArg.h:439
 RooAbsArg.h:440
 RooAbsArg.h:441
 RooAbsArg.h:442
 RooAbsArg.h:443
 RooAbsArg.h:444
 RooAbsArg.h:445
 RooAbsArg.h:446
 RooAbsArg.h:447
 RooAbsArg.h:448
 RooAbsArg.h:449
 RooAbsArg.h:450
 RooAbsArg.h:451
 RooAbsArg.h:452
 RooAbsArg.h:453
 RooAbsArg.h:454
 RooAbsArg.h:455
 RooAbsArg.h:456
 RooAbsArg.h:457
 RooAbsArg.h:458
 RooAbsArg.h:459
 RooAbsArg.h:460
 RooAbsArg.h:461
 RooAbsArg.h:462
 RooAbsArg.h:463
 RooAbsArg.h:464
 RooAbsArg.h:465
 RooAbsArg.h:466
 RooAbsArg.h:467
 RooAbsArg.h:468
 RooAbsArg.h:469
 RooAbsArg.h:470
 RooAbsArg.h:471
 RooAbsArg.h:472
 RooAbsArg.h:473
 RooAbsArg.h:474
 RooAbsArg.h:475
 RooAbsArg.h:476
 RooAbsArg.h:477
 RooAbsArg.h:478
 RooAbsArg.h:479
 RooAbsArg.h:480
 RooAbsArg.h:481
 RooAbsArg.h:482
 RooAbsArg.h:483
 RooAbsArg.h:484
 RooAbsArg.h:485
 RooAbsArg.h:486
 RooAbsArg.h:487
 RooAbsArg.h:488
 RooAbsArg.h:489
 RooAbsArg.h:490
 RooAbsArg.h:491
 RooAbsArg.h:492
 RooAbsArg.h:493
 RooAbsArg.h:494
 RooAbsArg.h:495
 RooAbsArg.h:496
 RooAbsArg.h:497
 RooAbsArg.h:498
 RooAbsArg.h:499
 RooAbsArg.h:500
 RooAbsArg.h:501
 RooAbsArg.h:502
 RooAbsArg.h:503
 RooAbsArg.h:504
 RooAbsArg.h:505
 RooAbsArg.h:506
 RooAbsArg.h:507
 RooAbsArg.h:508
 RooAbsArg.h:509
 RooAbsArg.h:510
 RooAbsArg.h:511
 RooAbsArg.h:512
 RooAbsArg.h:513
 RooAbsArg.h:514
 RooAbsArg.h:515
 RooAbsArg.h:516
 RooAbsArg.h:517
 RooAbsArg.h:518
 RooAbsArg.h:519
 RooAbsArg.h:520
 RooAbsArg.h:521
 RooAbsArg.h:522
 RooAbsArg.h:523
 RooAbsArg.h:524
 RooAbsArg.h:525
 RooAbsArg.h:526
 RooAbsArg.h:527
 RooAbsArg.h:528
 RooAbsArg.h:529
 RooAbsArg.h:530
 RooAbsArg.h:531
 RooAbsArg.h:532
 RooAbsArg.h:533
 RooAbsArg.h:534
 RooAbsArg.h:535
 RooAbsArg.h:536
 RooAbsArg.h:537
 RooAbsArg.h:538
 RooAbsArg.h:539
 RooAbsArg.h:540
 RooAbsArg.h:541
 RooAbsArg.h:542
 RooAbsArg.h:543
 RooAbsArg.h:544
 RooAbsArg.h:545
 RooAbsArg.h:546
 RooAbsArg.h:547
 RooAbsArg.h:548
 RooAbsArg.h:549
 RooAbsArg.h:550
 RooAbsArg.h:551
 RooAbsArg.h:552
 RooAbsArg.h:553
 RooAbsArg.h:554
 RooAbsArg.h:555
 RooAbsArg.h:556
 RooAbsArg.h:557
 RooAbsArg.h:558
 RooAbsArg.h:559
 RooAbsArg.h:560
 RooAbsArg.h:561
 RooAbsArg.h:562
 RooAbsArg.h:563
 RooAbsArg.h:564
 RooAbsArg.h:565
 RooAbsArg.h:566
 RooAbsArg.h:567
 RooAbsArg.h:568
 RooAbsArg.h:569
 RooAbsArg.h:570
 RooAbsArg.h:571
 RooAbsArg.h:572
 RooAbsArg.h:573
 RooAbsArg.h:574
 RooAbsArg.h:575
 RooAbsArg.h:576
 RooAbsArg.h:577
 RooAbsArg.h:578
 RooAbsArg.h:579
 RooAbsArg.h:580
 RooAbsArg.h:581
 RooAbsArg.h:582
 RooAbsArg.h:583
 RooAbsArg.h:584
 RooAbsArg.h:585
 RooAbsArg.h:586
 RooAbsArg.h:587
 RooAbsArg.h:588
 RooAbsArg.h:589
 RooAbsArg.h:590
 RooAbsArg.h:591
 RooAbsArg.h:592
 RooAbsArg.h:593
 RooAbsArg.h:594
 RooAbsArg.h:595
 RooAbsArg.h:596
 RooAbsArg.h:597
 RooAbsArg.h:598
 RooAbsArg.h:599
 RooAbsArg.h:600