75 #if (__GNUC__==3&&__GNUC_MINOR__==2&&__GNUC_PATCHLEVEL__==3)
76 char* operator+( streampos&,
char* );
82 Bool_t RooAbsArg::_verboseDirty(kFALSE) ;
83 Bool_t RooAbsArg::_inhibitDirty(kFALSE) ;
84 Bool_t RooAbsArg::inhibitDirty()
const {
return _inhibitDirty && !_localNoInhibitDirty; }
86 std::map<RooAbsArg*,TRefArray*> RooAbsArg::_ioEvoList ;
87 std::stack<RooAbsArg*> RooAbsArg::_ioReadStack ;
93 RooAbsArg::RooAbsArg()
94 : TNamed(), _deleteWatch(kFALSE), _valueDirty(kTRUE), _shapeDirty(kTRUE), _operMode(Auto), _fast(kFALSE), _ownedComponents(nullptr),
95 _prohibitServerRedirect(kFALSE), _eocache(0), _namePtr(0), _isConstant(kFALSE), _localNoInhibitDirty(kFALSE),
98 _namePtr = (TNamed*) RooNameReg::instance().constPtr(GetName()) ;
107 RooAbsArg::RooAbsArg(
const char *name,
const char *title)
108 : TNamed(name, title), _deleteWatch(kFALSE), _valueDirty(kTRUE), _shapeDirty(kTRUE), _operMode(Auto), _fast(kFALSE),
109 _ownedComponents(0), _prohibitServerRedirect(kFALSE), _eocache(0), _namePtr(0), _isConstant(kFALSE),
110 _localNoInhibitDirty(kFALSE), _myws(0)
112 if (name ==
nullptr || strlen(name) == 0) {
113 throw std::logic_error(
"Each RooFit object needs a name. "
114 "Objects representing the same entity (e.g. an observable 'x') are identified using their name.");
116 _namePtr = (TNamed*) RooNameReg::instance().constPtr(GetName()) ;
123 RooAbsArg::RooAbsArg(
const RooAbsArg &other,
const char *name)
124 : TNamed(other.GetName(), other.GetTitle()), RooPrintable(other), _boolAttrib(other._boolAttrib),
125 _stringAttrib(other._stringAttrib), _deleteWatch(other._deleteWatch), _operMode(Auto), _fast(kFALSE),
126 _ownedComponents(0), _prohibitServerRedirect(kFALSE), _eocache(other._eocache), _namePtr(other._namePtr),
127 _isConstant(other._isConstant), _localNoInhibitDirty(other._localNoInhibitDirty), _myws(0)
131 TNamed::SetName(name) ;
132 _namePtr = (TNamed*) RooNameReg::instance().constPtr(name) ;
135 TNamed::SetName(other.GetName()) ;
136 _namePtr = other._namePtr ;
140 Bool_t valueProp, shapeProp ;
141 for (
const auto server : other._serverList) {
142 valueProp = server->_clientListValue.containsByNamePtr(&other);
143 shapeProp = server->_clientListShape.containsByNamePtr(&other);
144 addServer(*server,valueProp,shapeProp) ;
158 RooAbsArg& RooAbsArg::operator=(
const RooAbsArg& other) {
159 TNamed::operator=(other);
160 RooPrintable::operator=(other);
161 _boolAttrib = other._boolAttrib;
162 _stringAttrib = other._stringAttrib;
163 _deleteWatch = other._deleteWatch;
164 _operMode = other._operMode;
166 _ownedComponents =
nullptr;
167 _prohibitServerRedirect = other._prohibitServerRedirect;
168 _eocache = other._eocache;
169 _namePtr = other._namePtr;
170 _isConstant = other._isConstant;
171 _localNoInhibitDirty = other._localNoInhibitDirty;
174 bool valueProp, shapeProp;
175 for (
const auto server : other._serverList) {
176 valueProp = server->_clientListValue.containsByNamePtr(&other);
177 shapeProp = server->_clientListShape.containsByNamePtr(&other);
178 addServer(*server,valueProp,shapeProp) ;
191 RooAbsArg::~RooAbsArg()
194 while (!_serverList.empty()) {
195 removeServer(*_serverList.containedObjects().back(), kTRUE);
199 std::vector<RooAbsArg*> clientListTmp(_clientList.begin(), _clientList.end());
200 Bool_t first(kTRUE) ;
201 for (
auto client : clientListTmp) {
202 client->setAttribute(
"ServerDied") ;
203 TString attr(
"ServerDied:");
204 attr.Append(GetName());
205 attr.Append(Form(
"(%lx)",(ULong_t)
this)) ;
206 client->setAttribute(attr.Data());
207 client->removeServer(*
this,kTRUE);
212 cxcoutD(Tracing) <<
"RooAbsArg::dtor(" << GetName() <<
"," <<
this <<
") DeleteWatch: object is being destroyed" << endl ;
216 cxcoutD(Tracing) << fName <<
"::" << ClassName() <<
":~RooAbsArg: dependent \""
217 << client->GetName() <<
"\" should have been deleted first" << endl ;
221 if (_ownedComponents) {
222 delete _ownedComponents ;
223 _ownedComponents = 0 ;
233 void RooAbsArg::setDirtyInhibit(Bool_t flag)
235 _inhibitDirty = flag ;
242 void RooAbsArg::verboseDirty(Bool_t flag)
244 _verboseDirty = flag ;
250 Bool_t RooAbsArg::isCloneOf(
const RooAbsArg& other)
const
252 return (getAttribute(Form(
"CloneOf(%lx)",(ULong_t)&other)) ||
253 other.getAttribute(Form(
"CloneOf(%lx)",(ULong_t)
this))) ;
260 void RooAbsArg::setAttribute(
const Text_t* name, Bool_t value)
263 if(
string(
"Constant")==name) {
264 _isConstant = value ;
268 _boolAttrib.insert(name) ;
270 set<string>::iterator iter = _boolAttrib.find(name) ;
271 if (iter != _boolAttrib.end()) {
272 _boolAttrib.erase(iter) ;
283 Bool_t RooAbsArg::getAttribute(
const Text_t* name)
const
285 return (_boolAttrib.find(name) != _boolAttrib.end()) ;
292 void RooAbsArg::setStringAttribute(
const Text_t* key,
const Text_t* value)
295 _stringAttrib[key] = value ;
297 _stringAttrib.erase(key) ;
305 const Text_t* RooAbsArg::getStringAttribute(
const Text_t* key)
const
307 map<string,string>::const_iterator iter = _stringAttrib.find(key) ;
308 if (iter!=_stringAttrib.end()) {
309 return iter->second.c_str() ;
319 void RooAbsArg::setTransientAttribute(
const Text_t* name, Bool_t value)
323 _boolAttribTransient.insert(name) ;
327 set<string>::iterator iter = _boolAttribTransient.find(name) ;
328 if (iter != _boolAttribTransient.end()) {
329 _boolAttribTransient.erase(iter) ;
341 Bool_t RooAbsArg::getTransientAttribute(
const Text_t* name)
const
343 return (_boolAttribTransient.find(name) != _boolAttribTransient.end()) ;
357 void RooAbsArg::addServer(RooAbsArg& server, Bool_t valueProp, Bool_t shapeProp, std::size_t refCount)
359 if (_prohibitServerRedirect) {
360 cxcoutF(LinkStateMgmt) <<
"RooAbsArg::addServer(" <<
this <<
"," << GetName()
361 <<
"): PROHIBITED SERVER ADDITION REQUESTED: adding server " << server.GetName()
362 <<
"(" << &server <<
") for " << (valueProp?
"value ":
"") << (shapeProp?
"shape":
"") << endl ;
366 cxcoutD(LinkStateMgmt) <<
"RooAbsArg::addServer(" <<
this <<
"," << GetName() <<
"): adding server " << server.GetName()
367 <<
"(" << &server <<
") for " << (valueProp?
"value ":
"") << (shapeProp?
"shape":
"") << endl ;
369 if (server.operMode()==ADirty && operMode()!=ADirty && valueProp) {
370 setOperMode(ADirty) ;
380 _serverList.Add(&server, refCount) ;
382 server._clientList.Add(
this, refCount);
383 if (valueProp) server._clientListValue.Add(
this, refCount);
384 if (shapeProp) server._clientListShape.Add(
this, refCount);
393 void RooAbsArg::addServerList(RooAbsCollection& serverList, Bool_t valueProp, Bool_t shapeProp)
395 _serverList.reserve(_serverList.size() + serverList.size());
397 for (
const auto arg : serverList) {
398 addServer(*arg,valueProp,shapeProp) ;
408 void RooAbsArg::removeServer(RooAbsArg& server, Bool_t force)
410 if (_prohibitServerRedirect) {
411 cxcoutF(LinkStateMgmt) <<
"RooAbsArg::addServer(" <<
this <<
"," << GetName() <<
"): PROHIBITED SERVER REMOVAL REQUESTED: removing server "
412 << server.GetName() <<
"(" << &server <<
")" << endl ;
417 cxcoutD(LinkStateMgmt) <<
"RooAbsArg::removeServer(" << GetName() <<
"): removing server "
418 << server.GetName() <<
"(" << &server <<
")" << endl ;
422 _serverList.Remove(&server, force) ;
424 server._clientList.Remove(
this, force) ;
425 server._clientListValue.Remove(
this, force) ;
426 server._clientListShape.Remove(
this, force) ;
433 void RooAbsArg::replaceServer(RooAbsArg& oldServer, RooAbsArg& newServer, Bool_t propValue, Bool_t propShape)
435 Int_t count = _serverList.refCount(&oldServer);
436 removeServer(oldServer, kTRUE);
437 addServer(newServer, propValue, propShape, count);
444 void RooAbsArg::changeServer(RooAbsArg& server, Bool_t valueProp, Bool_t shapeProp)
446 if (!_serverList.containsByNamePtr(&server)) {
447 coutE(LinkStateMgmt) <<
"RooAbsArg::changeServer(" << GetName() <<
"): Server "
448 << server.GetName() <<
" not registered" << endl ;
453 if (!server._clientList.containsByNamePtr(
this)) {
454 coutE(LinkStateMgmt) <<
"RooAbsArg::changeServer(" << GetName() <<
"): Server "
455 << server.GetName() <<
" doesn't have us registered as client" << endl ;
460 Int_t vcount = server._clientListValue.refCount(
this) ;
461 Int_t scount = server._clientListShape.refCount(
this) ;
462 server._clientListValue.RemoveAll(
this) ;
463 server._clientListShape.RemoveAll(
this) ;
465 server._clientListValue.Add(
this, vcount) ;
468 server._clientListShape.Add(
this, scount) ;
478 void RooAbsArg::leafNodeServerList(RooAbsCollection* list,
const RooAbsArg* arg, Bool_t recurseNonDerived)
const
480 treeNodeServerList(list,arg,kFALSE,kTRUE,kFALSE,recurseNonDerived) ;
489 void RooAbsArg::branchNodeServerList(RooAbsCollection* list,
const RooAbsArg* arg, Bool_t recurseNonDerived)
const
491 treeNodeServerList(list,arg,kTRUE,kFALSE,kFALSE,recurseNonDerived) ;
505 void RooAbsArg::treeNodeServerList(RooAbsCollection* list,
const RooAbsArg* arg, Bool_t doBranch, Bool_t doLeaf, Bool_t valueOnly, Bool_t recurseFundamental)
const
517 if ((doBranch&&doLeaf) ||
518 (doBranch&&arg->isDerived()) ||
519 (doLeaf&&arg->isFundamental()&&(!(recurseFundamental&&arg->isDerived()))) ||
520 (doLeaf && !arg->isFundamental() && !arg->isDerived())) {
522 list->add(*arg,kTRUE) ;
526 if (arg->isDerived() && (!arg->isFundamental() || recurseFundamental)) {
527 for (
const auto server : arg->_serverList) {
530 Bool_t isValueSrv = server->_clientListValue.containsByNamePtr(arg);
531 if (valueOnly && !isValueSrv) {
534 treeNodeServerList(list,server,doBranch,doLeaf,valueOnly,recurseFundamental) ;
547 RooArgSet* RooAbsArg::getParameters(
const RooAbsData* set, Bool_t stripDisconnected)
const
549 return getParameters(set?set->get():0,stripDisconnected) ;
556 void RooAbsArg::addParameters(RooArgSet& params,
const RooArgSet* nset,Bool_t stripDisconnected)
const
560 RooArgSet nodeParamServers ;
561 RooArgSet nodeBranchServers ;
562 for (
const auto server : _serverList) {
563 if (server->isValueServer(*
this)) {
564 if (server->isFundamental()) {
565 if (!nset || !server->dependsOn(*nset)) {
566 nodeParamServers.add(*server) ;
569 nodeBranchServers.add(*server) ;
575 getParametersHook(nset,&nodeParamServers,stripDisconnected) ;
578 params.add(nodeParamServers,kTRUE) ;
581 for (
const auto server : nodeBranchServers) {
582 server->addParameters(params,nset) ;
594 RooArgSet* RooAbsArg::getParameters(
const RooArgSet* nset, Bool_t stripDisconnected)
const
599 RooNameSet nsetObs(nset ? *nset : RooArgSet());
600 const RooArgSet *paramSet = _myws->set(Form(
"CACHE_PARAMS_OF_PDF_%s_FOR_OBS_%s", GetName(), nsetObs.content()));
604 return new RooArgSet(*paramSet);
608 RooArgSet *parList =
new RooArgSet(
"parameters");
610 addParameters(*parList, nset, stripDisconnected);
615 if (_myws && parList->getSize() > 10) {
616 RooNameSet nsetObs(nset ? *nset : RooArgSet());
617 _myws->defineSetInternal(Form(
"CACHE_PARAMS_OF_PDF_%s_FOR_OBS_%s", GetName(), nsetObs.content()), *parList);
633 RooArgSet* RooAbsArg::getObservables(
const RooAbsData* set)
const
635 if (!set)
return new RooArgSet ;
637 return getObservables(set->get()) ;
648 RooArgSet* RooAbsArg::getObservables(
const RooArgSet* dataList, Bool_t valueOnly)
const
652 RooArgSet* depList =
new RooArgSet(
"dependents") ;
653 if (!dataList)
return depList ;
656 RooArgSet leafList(
"leafNodeServerList") ;
657 treeNodeServerList(&leafList,0,kFALSE,kTRUE,valueOnly) ;
660 for (
const auto arg : leafList) {
661 if (arg->dependsOnValue(*dataList) && arg->isLValue()) {
666 for (
const auto arg : leafList) {
667 if (arg->dependsOn(*dataList) && arg->isLValue()) {
677 RooArgSet* RooAbsArg::getComponents()
const
682 TString name(GetName()) ;
683 name.Append(
"_components") ;
685 RooArgSet* set =
new RooArgSet(name) ;
686 branchNodeServerList(set) ;
698 Bool_t RooAbsArg::checkObservables(
const RooArgSet*)
const
707 Bool_t RooAbsArg::recursiveCheckObservables(
const RooArgSet* nset)
const
710 treeNodeServerList(&nodeList) ;
711 RooFIter iter = nodeList.fwdIterator() ;
715 while((arg=iter.next())) {
716 if (arg->getAttribute(
"ServerDied")) {
717 coutE(LinkStateMgmt) <<
"RooAbsArg::recursiveCheckObservables(" << GetName() <<
"): ERROR: one or more servers of node "
718 << arg->GetName() <<
" no longer exists!" << endl ;
722 ret |= arg->checkObservables(nset) ;
733 Bool_t RooAbsArg::dependsOn(
const RooAbsCollection& serverList,
const RooAbsArg* ignoreArg, Bool_t valueOnly)
const
738 for (
auto server : serverList) {
739 if (dependsOn(*server,ignoreArg,valueOnly)) {
752 Bool_t RooAbsArg::dependsOn(
const RooAbsArg& testArg,
const RooAbsArg* ignoreArg, Bool_t valueOnly)
const
754 if (
this==ignoreArg)
return kFALSE ;
758 if (testArg.namePtr()==namePtr())
return kTRUE ;
762 RooAbsArg* foundServer = findServer(testArg) ;
766 if ( !valueOnly || foundServer->isValueServer(*
this)) {
772 for (
const auto server : _serverList) {
773 if ( !valueOnly || server->isValueServer(*
this)) {
774 if (server->dependsOn(testArg,ignoreArg,valueOnly)) {
788 Bool_t RooAbsArg::overlaps(
const RooAbsArg& testArg, Bool_t valueOnly)
const
790 RooArgSet list(
"treeNodeList") ;
791 treeNodeServerList(&list) ;
793 return valueOnly ? testArg.dependsOnValue(list) : testArg.dependsOn(list) ;
802 Bool_t RooAbsArg::observableOverlaps(
const RooAbsData* dset,
const RooAbsArg& testArg)
const
804 return observableOverlaps(dset->get(),testArg) ;
812 Bool_t RooAbsArg::observableOverlaps(
const RooArgSet* nset,
const RooAbsArg& testArg)
const
814 RooArgSet* depList = getObservables(nset) ;
815 Bool_t ret = testArg.dependsOn(*depList) ;
827 void RooAbsArg::setValueDirty(
const RooAbsArg* source)
829 _allBatchesDirty =
true;
831 if (_operMode!=Auto || _inhibitDirty) return ;
834 if (_clientListValue.size() == 0) {
835 _valueDirty = kTRUE ;
842 }
else if (source==
this) {
844 coutE(LinkStateMgmt) <<
"RooAbsArg::setValueDirty(" << GetName()
845 <<
"): cyclical dependency detected, source = " << source->GetName() << endl ;
852 cxcoutD(LinkStateMgmt) <<
"RooAbsArg::setValueDirty(" << (source?source->GetName():
"self") <<
"->" << GetName() <<
"," <<
this
853 <<
"): dirty flag " << (_valueDirty?
"already ":
"") <<
"raised" << endl ;
856 _valueDirty = kTRUE ;
859 for (
auto client : _clientListValue) {
860 client->setValueDirty(source) ;
871 void RooAbsArg::setShapeDirty(
const RooAbsArg* source)
874 cxcoutD(LinkStateMgmt) <<
"RooAbsArg::setShapeDirty(" << GetName()
875 <<
"): dirty flag " << (_shapeDirty?
"already ":
"") <<
"raised" << endl ;
878 if (_clientListShape.empty()) {
879 _shapeDirty = kTRUE ;
886 }
else if (source==
this) {
888 coutE(LinkStateMgmt) <<
"RooAbsArg::setShapeDirty(" << GetName()
889 <<
"): cyclical dependency detected" << endl ;
896 for (
auto client : _clientListShape) {
897 client->setShapeDirty(source) ;
898 client->setValueDirty(source) ;
912 Bool_t RooAbsArg::redirectServers(
const RooAbsCollection& newSetOrig, Bool_t mustReplaceAll, Bool_t nameChange, Bool_t isRecursionStep)
915 if (_serverList.empty())
return kFALSE ;
916 if (newSetOrig.getSize()==0)
return kFALSE ;
919 RooAbsCollection* newSet ;
922 newSet =
new RooArgSet ;
923 for (
auto arg : newSetOrig) {
925 if (
string(
"REMOVAL_DUMMY")==arg->GetName()) {
927 if (arg->getAttribute(
"REMOVE_ALL")) {
930 }
else if (arg->getAttribute(Form(
"REMOVE_FROM_%s",getStringAttribute(
"ORIGNAME")))) {
942 newSet = (RooAbsCollection*) &newSetOrig ;
949 std::vector<RooAbsArg*> origServerList, origServerValue, origServerShape;
950 auto origSize = _serverList.size();
951 origServerList.reserve(origSize);
952 origServerValue.reserve(origSize);
954 for (
const auto oldServer : _serverList) {
955 origServerList.push_back(oldServer) ;
958 if (oldServer->_clientListValue.containsByNamePtr(
this)) {
959 origServerValue.push_back(oldServer) ;
961 if (oldServer->_clientListShape.containsByNamePtr(
this)) {
962 origServerShape.push_back(oldServer) ;
967 for (
auto oldServer : origServerList) {
969 RooAbsArg * newServer= oldServer->findNewServer(*newSet, nameChange);
971 if (newServer && _verboseDirty) {
972 cxcoutD(LinkStateMgmt) <<
"RooAbsArg::redirectServers(" << (
void*)
this <<
"," << GetName() <<
"): server " << oldServer->GetName()
973 <<
" redirected from " << oldServer <<
" to " << newServer << endl ;
977 if (mustReplaceAll) {
978 coutE(LinkStateMgmt) <<
"RooAbsArg::redirectServers(" << (
void*)
this <<
"," << GetName() <<
"): server " << oldServer->GetName()
979 <<
" (" << (
void*)oldServer <<
") not redirected" << (nameChange?
"[nameChange]":
"") << endl ;
985 auto findByNamePtr = [&oldServer](
const RooAbsArg * item) {
986 return oldServer->namePtr() == item->namePtr();
988 bool propValue = std::any_of(origServerValue.begin(), origServerValue.end(), findByNamePtr);
989 bool propShape = std::any_of(origServerShape.begin(), origServerShape.end(), findByNamePtr);
991 if (newServer !=
this) {
992 replaceServer(*oldServer,*newServer,propValue,propShape) ;
1001 Bool_t allReplaced=kTRUE ;
1002 for (
int i=0 ; i<numProxies() ; i++) {
1003 RooAbsProxy* p = getProxy(i) ;
1005 Bool_t ret2 = p->changePointer(*newSet,nameChange,kFALSE) ;
1006 allReplaced &= ret2 ;
1009 if (mustReplaceAll && !allReplaced) {
1010 coutE(LinkStateMgmt) <<
"RooAbsArg::redirectServers(" << GetName()
1011 <<
"): ERROR, some proxies could not be adjusted" << endl ;
1016 for (Int_t i=0 ;i<numCaches() ; i++) {
1017 ret |= getCache(i)->redirectServersHook(*newSet,mustReplaceAll,nameChange,isRecursionStep) ;
1019 ret |= redirectServersHook(*newSet,mustReplaceAll,nameChange,isRecursionStep) ;
1034 RooAbsArg *RooAbsArg::findNewServer(
const RooAbsCollection &newSet, Bool_t nameChange)
const
1036 RooAbsArg *newServer = 0;
1038 newServer = newSet.find(*
this) ;
1043 TString nameAttrib(
"ORIGNAME:") ;
1044 nameAttrib.Append(GetName()) ;
1046 RooArgSet* tmp = (RooArgSet*) newSet.selectByAttrib(nameAttrib,kTRUE) ;
1050 if (tmp->getSize()==0) {
1056 if(tmp->getSize()>1) {
1057 coutF(LinkStateMgmt) <<
"RooAbsArg::redirectServers(" << GetName() <<
"): FATAL Error, " << tmp->getSize() <<
" servers with "
1058 << nameAttrib <<
" attribute" << endl ;
1064 newServer= tmp->first();
1071 Bool_t RooAbsArg::recursiveRedirectServers(
const RooAbsCollection& newSet, Bool_t mustReplaceAll, Bool_t nameChange, Bool_t recurseInNewSet)
1083 static std::set<const RooAbsArg*> callStack;
1085 std::set<const RooAbsArg*>::iterator it = callStack.lower_bound(
this);
1086 if (it != callStack.end() &&
this == *it) {
1089 callStack.insert(it,
this);
1100 Bool_t ret(kFALSE) ;
1102 cxcoutD(LinkStateMgmt) <<
"RooAbsArg::recursiveRedirectServers(" <<
this <<
"," << GetName() <<
") newSet = " << newSet <<
" mustReplaceAll = "
1103 << (mustReplaceAll?
"T":
"F") <<
" nameChange = " << (nameChange?
"T":
"F") <<
" recurseInNewSet = " << (recurseInNewSet?
"T":
"F") << endl ;
1106 ret |= redirectServers(newSet,mustReplaceAll,nameChange,kTRUE) ;
1109 for (
const auto server : _serverList){
1110 ret |= server->recursiveRedirectServers(newSet,mustReplaceAll,nameChange,recurseInNewSet) ;
1113 callStack.erase(
this);
1126 void RooAbsArg::registerProxy(RooArgProxy& proxy)
1129 if (_proxyList.FindObject(&proxy)) {
1130 coutE(LinkStateMgmt) <<
"RooAbsArg::registerProxy(" << GetName() <<
"): proxy named "
1131 << proxy.GetName() <<
" for arg " << proxy.absArg()->GetName()
1132 <<
" already registered" << endl ;
1141 if (proxy.absArg()) {
1142 addServer(*proxy.absArg(),proxy.isValueServer(),proxy.isShapeServer()) ;
1146 _proxyList.Add(&proxy) ;
1154 void RooAbsArg::unRegisterProxy(RooArgProxy& proxy)
1156 _proxyList.Remove(&proxy) ;
1157 _proxyList.Compress() ;
1168 void RooAbsArg::registerProxy(RooSetProxy& proxy)
1171 if (_proxyList.FindObject(&proxy)) {
1172 coutE(LinkStateMgmt) <<
"RooAbsArg::registerProxy(" << GetName() <<
"): proxy named "
1173 << proxy.GetName() <<
" already registered" << endl ;
1178 _proxyList.Add(&proxy) ;
1187 void RooAbsArg::unRegisterProxy(RooSetProxy& proxy)
1189 _proxyList.Remove(&proxy) ;
1190 _proxyList.Compress() ;
1201 void RooAbsArg::registerProxy(RooListProxy& proxy)
1204 if (_proxyList.FindObject(&proxy)) {
1205 coutE(LinkStateMgmt) <<
"RooAbsArg::registerProxy(" << GetName() <<
"): proxy named "
1206 << proxy.GetName() <<
" already registered" << endl ;
1211 Int_t nProxyOld = _proxyList.GetEntries() ;
1212 _proxyList.Add(&proxy) ;
1213 if (_proxyList.GetEntries()!=nProxyOld+1) {
1214 cout <<
"RooAbsArg::registerProxy(" << GetName() <<
") proxy registration failure! nold=" << nProxyOld <<
" nnew=" << _proxyList.GetEntries() << endl ;
1224 void RooAbsArg::unRegisterProxy(RooListProxy& proxy)
1226 _proxyList.Remove(&proxy) ;
1227 _proxyList.Compress() ;
1235 RooAbsProxy* RooAbsArg::getProxy(Int_t index)
const
1240 return dynamic_cast<RooAbsProxy*
> (_proxyList.At(index)) ;
1248 Int_t RooAbsArg::numProxies()
const
1250 return _proxyList.GetEntriesFast();
1259 void RooAbsArg::setProxyNormSet(
const RooArgSet* nset)
1261 for (
int i=0 ; i<numProxies() ; i++) {
1262 RooAbsProxy* p = getProxy(i) ;
1264 getProxy(i)->changeNormSet(nset) ;
1274 void RooAbsArg::attachToTree(TTree& ,Int_t)
1276 coutE(Contents) <<
"RooAbsArg::attachToTree(" << GetName()
1277 <<
"): Cannot be attached to a TTree" << endl ;
1285 Bool_t RooAbsArg::isValid()
const
1296 void RooAbsArg::printName(ostream& os)
const
1306 void RooAbsArg::printTitle(ostream& os)
const
1316 void RooAbsArg::printClassName(ostream& os)
const
1318 os << IsA()->GetName() ;
1322 void RooAbsArg::printAddress(ostream& os)
const
1333 void RooAbsArg::printArgs(ostream& os)
const
1336 if (numProxies()==0) return ;
1339 for (Int_t i=0 ; i<numProxies() ; i++) {
1340 RooAbsProxy* p = getProxy(i) ;
1341 if (p==0) continue ;
1342 if (!TString(p->name()).BeginsWith(
"!")) {
1356 Int_t RooAbsArg::defaultPrintContents(Option_t* )
const
1358 return kName|kClassName|kValue|kArgs ;
1366 void RooAbsArg::printMultiline(ostream& os, Int_t , Bool_t , TString indent)
const
1368 os << indent <<
"--- RooAbsArg ---" << endl;
1370 os << indent <<
" Value State: " ;
1372 case ADirty: os <<
"FORCED DIRTY" ; break ;
1373 case AClean: os <<
"FORCED clean" ; break ;
1374 case Auto: os << (isValueDirty() ?
"DIRTY":
"clean") ; break ;
1377 << indent <<
" Shape State: " << (isShapeDirty() ?
"DIRTY":
"clean") << endl;
1379 os << indent <<
" Attributes: " ;
1380 printAttribList(os) ;
1383 os << indent <<
" Address: " << (
void*)
this << endl;
1385 os << indent <<
" Clients: " << endl;
1386 for (
const auto client : _clientList) {
1387 os << indent <<
" (" << (
void*)client <<
","
1388 << (_clientListValue.containsByNamePtr(client)?
"V":
"-")
1389 << (_clientListShape.containsByNamePtr(client)?
"S":
"-")
1391 client->printStream(os,kClassName|kTitle|kName,kSingleLine);
1395 os << indent <<
" Servers: " << endl;
1396 for (
const auto server : _serverList) {
1397 os << indent <<
" (" << (
void*)server <<
","
1398 << (server->_clientListValue.containsByNamePtr(
this)?
"V":
"-")
1399 << (server->_clientListShape.containsByNamePtr(
this)?
"S":
"-")
1401 server->printStream(os,kClassName|kName|kTitle,kSingleLine);
1405 os << indent <<
" Proxies: " << endl ;
1406 for (
int i=0 ; i<numProxies() ; i++) {
1407 RooAbsProxy* proxy=getProxy(i) ;
1408 if (!proxy) continue ;
1409 if (proxy->IsA()->InheritsFrom(RooArgProxy::Class())) {
1410 os << indent <<
" " << proxy->name() <<
" -> " ;
1411 RooAbsArg* parg = ((RooArgProxy*)proxy)->absArg() ;
1413 parg->printStream(os,kName,kSingleLine) ;
1415 os <<
" (empty)" << endl ; ;
1418 os << indent <<
" " << proxy->name() <<
" -> " ;
1420 TString moreIndent(indent) ;
1421 moreIndent.Append(
" ") ;
1422 ((RooSetProxy*)proxy)->printStream(os,kName,kStandard,moreIndent.Data()) ;
1431 void RooAbsArg::printTree(ostream& os, TString )
const
1433 const_cast<RooAbsArg*
>(
this)->printCompactTree(os) ;
1440 ostream& operator<<(ostream& os, RooAbsArg &arg)
1442 arg.writeToStream(os,kTRUE) ;
1449 istream& operator>>(istream& is, RooAbsArg &arg)
1451 arg.readFromStream(is,kTRUE,kFALSE) ;
1458 void RooAbsArg::printAttribList(ostream& os)
const
1460 set<string>::const_iterator iter = _boolAttrib.begin() ;
1461 Bool_t first(kTRUE) ;
1462 while (iter != _boolAttrib.end()) {
1463 os << (first?
" [":
",") << *iter ;
1467 if (!first) os <<
"] " ;
1474 void RooAbsArg::attachDataSet(
const RooAbsData &data)
1476 const RooArgSet* set = data.get() ;
1477 RooArgSet branches ;
1478 branchNodeServerList(&branches,0,kTRUE) ;
1480 RooFIter iter = branches.fwdIterator() ;
1482 while((branch=iter.next())) {
1483 branch->redirectServers(*set,kFALSE,kFALSE) ;
1493 void RooAbsArg::attachDataStore(
const RooAbsDataStore &dstore)
1495 const RooArgSet* set = dstore.get() ;
1496 RooArgSet branches ;
1497 branchNodeServerList(&branches,0,kTRUE) ;
1499 RooFIter iter = branches.fwdIterator() ;
1501 while((branch=iter.next())) {
1502 branch->redirectServers(*set,kFALSE,kFALSE) ;
1512 Int_t RooAbsArg::Compare(
const TObject* other)
const
1514 return strcmp(GetName(),other->GetName()) ;
1524 void RooAbsArg::printDirty(Bool_t depth)
const
1528 RooArgSet branchList ;
1529 branchNodeServerList(&branchList) ;
1530 RooFIter bIter = branchList.fwdIterator() ;
1532 while((branch=bIter.next())) {
1533 branch->printDirty(kFALSE) ;
1537 cout << GetName() <<
" : " ;
1538 switch (_operMode) {
1539 case AClean: cout <<
"FORCED clean" ; break ;
1540 case ADirty: cout <<
"FORCED DIRTY" ; break ;
1541 case Auto: cout <<
"Auto " << (isValueDirty()?
"DIRTY":
"clean") ;
1556 void RooAbsArg::optimizeCacheMode(
const RooArgSet& observables)
1560 optimizeCacheMode(observables,opt,proc) ;
1562 coutI(Optimization) <<
"RooAbsArg::optimizeCacheMode(" << GetName() <<
") nodes " << opt <<
" depend on observables, "
1563 <<
"changing cache operation mode from change tracking to unconditional evaluation" << endl ;
1575 void RooAbsArg::optimizeCacheMode(
const RooArgSet& observables, RooArgSet& optimizedNodes, RooLinkedList& processedNodes)
1584 if (processedNodes.findArg(
this)) {
1587 processedNodes.Add(
this) ;
1591 if (dependsOnValue(observables)) {
1593 if (dynamic_cast<RooRealIntegral*>(
this)) {
1594 cxcoutI(Integration) <<
"RooAbsArg::optimizeCacheMode(" << GetName() <<
") integral depends on value of one or more observables and will be evaluated for every event" << endl ;
1596 optimizedNodes.add(*
this,kTRUE) ;
1597 if (operMode()==AClean) {
1599 setOperMode(ADirty,kTRUE) ;
1604 for (Int_t i=0 ;i<numCaches() ; i++) {
1605 getCache(i)->optimizeCacheMode(observables,optimizedNodes,processedNodes) ;
1609 for (
const auto server : _serverList) {
1610 server->optimizeCacheMode(observables,optimizedNodes,processedNodes) ;
1619 Bool_t RooAbsArg::findConstantNodes(
const RooArgSet& observables, RooArgSet& cacheList)
1621 RooLinkedList proc ;
1622 Bool_t ret = findConstantNodes(observables,cacheList,proc) ;
1625 coutI(Optimization) <<
"RooAbsArg::findConstantNodes(" << GetName() <<
"): components "
1626 << cacheList <<
" depend exclusively on constant parameters and will be precalculated and cached" << endl ;
1637 Bool_t RooAbsArg::findConstantNodes(
const RooArgSet& observables, RooArgSet& cacheList, RooLinkedList& processedNodes)
1645 if (processedNodes.findArg(
this)) {
1648 processedNodes.Add(
this) ;
1652 Bool_t canOpt(kTRUE) ;
1653 RooArgSet* paramSet = getParameters(observables) ;
1654 RooFIter iter = paramSet->fwdIterator() ;
1656 while((param = iter.next())) {
1657 if (!param->isConstant()) {
1665 if (getAttribute(
"NeverConstant")) {
1670 setAttribute(
"ConstantExpression") ;
1674 if (canOpt||getAttribute(
"CacheAndTrack")) {
1676 if (!cacheList.find(*
this) && dependsOnValue(observables) && !observables.find(*
this) ) {
1679 cxcoutD(Optimization) <<
"RooAbsArg::findConstantNodes(" << GetName() <<
") adding self to list of constant nodes" << endl ;
1681 if (canOpt) setAttribute(
"ConstantExpressionCached") ;
1682 cacheList.add(*
this,kFALSE) ;
1689 for (
const auto server : _serverList) {
1690 if (server->isDerived()) {
1691 server->findConstantNodes(observables,cacheList,processedNodes) ;
1697 for (Int_t i=0 ;i<numCaches() ; i++) {
1698 getCache(i)->findConstantNodes(observables,cacheList,processedNodes) ;
1712 void RooAbsArg::constOptimizeTestStatistic(ConstOpCode opcode, Bool_t doAlsoTrackingOpt)
1714 for (
const auto server : _serverList) {
1715 server->constOptimizeTestStatistic(opcode,doAlsoTrackingOpt) ;
1725 void RooAbsArg::setOperMode(OperMode mode, Bool_t recurseADirty)
1728 if (mode==_operMode) return ;
1731 _fast = ((mode==AClean) || dynamic_cast<RooRealVar*>(
this)!=0 ||
dynamic_cast<RooConstVar*
>(
this)!=0 ) ;
1732 for (Int_t i=0 ;i<numCaches() ; i++) {
1733 getCache(i)->operModeHook() ;
1738 if (mode==ADirty && recurseADirty) {
1739 for (
auto clientV : _clientListValue) {
1740 clientV->setOperMode(mode) ;
1752 void RooAbsArg::printCompactTree(
const char* indent,
const char* filename,
const char* namePat, RooAbsArg* client)
1755 ofstream ofs(filename) ;
1756 printCompactTree(ofs,indent,namePat,client) ;
1758 printCompactTree(cout,indent,namePat,client) ;
1769 void RooAbsArg::printCompactTree(ostream& os,
const char* indent,
const char* namePat, RooAbsArg* client)
1771 if ( !namePat || TString(GetName()).Contains(namePat)) {
1772 os << indent << this ;
1775 if (isValueServer(*client)) os <<
"V" ;
else os <<
"-" ;
1776 if (isShapeServer(*client)) os <<
"S" ;
else os <<
"-" ;
1780 os << IsA()->GetName() <<
"::" << GetName() <<
" = " ;
1783 if (!_serverList.empty()) {
1784 switch(operMode()) {
1785 case Auto: os <<
" [Auto," << (isValueDirty()?
"Dirty":
"Clean") <<
"] " ; break ;
1786 case AClean: os <<
" [ACLEAN] " ; break ;
1787 case ADirty: os <<
" [ADIRTY] " ; break ;
1792 for (Int_t i=0 ;i<numCaches() ; i++) {
1793 getCache(i)->printCompactTreeHook(os,indent) ;
1795 printCompactTreeHook(os,indent) ;
1798 TString indent2(indent) ;
1800 for (
const auto arg : _serverList) {
1801 arg->printCompactTree(os,indent2,namePat,
this) ;
1812 void RooAbsArg::printComponentTree(
const char* indent,
const char* namePat, Int_t nLevel)
1814 if (nLevel==0) return ;
1815 if (isFundamental()) return ;
1816 RooResolutionModel* rmodel =
dynamic_cast<RooResolutionModel*
>(
this) ;
1817 if (rmodel && rmodel->isConvolved())
return ;
1818 if (InheritsFrom(
"RooConstVar"))
return ;
1820 if ( !namePat || TString(GetName()).Contains(namePat)) {
1825 TString indent2(indent) ;
1827 for (
const auto arg : _serverList) {
1828 arg->printComponentTree(indent2.Data(),namePat,nLevel-1) ;
1837 TString RooAbsArg::cleanBranchName()
const
1840 TString rawBranchName = GetName() ;
1841 if (getStringAttribute(
"BranchName")) {
1842 rawBranchName = getStringAttribute(
"BranchName") ;
1845 TString cleanName(rawBranchName) ;
1846 cleanName.ReplaceAll(
"/",
"D") ;
1847 cleanName.ReplaceAll(
"-",
"M") ;
1848 cleanName.ReplaceAll(
"+",
"P") ;
1849 cleanName.ReplaceAll(
"*",
"X") ;
1850 cleanName.ReplaceAll(
"[",
"L") ;
1851 cleanName.ReplaceAll(
"]",
"R") ;
1852 cleanName.ReplaceAll(
"(",
"L") ;
1853 cleanName.ReplaceAll(
")",
"R") ;
1854 cleanName.ReplaceAll(
"{",
"L") ;
1855 cleanName.ReplaceAll(
"}",
"R") ;
1866 void RooAbsArg::printCompactTreeHook(ostream&,
const char *)
1879 void RooAbsArg::registerCache(RooAbsCache& cache)
1881 _cacheList.push_back(&cache) ;
1888 void RooAbsArg::unRegisterCache(RooAbsCache& cache)
1890 _cacheList.erase(std::remove(_cacheList.begin(), _cacheList.end(), &cache),
1898 Int_t RooAbsArg::numCaches()
const
1900 return _cacheList.size() ;
1907 RooAbsCache* RooAbsArg::getCache(Int_t index)
const
1909 return _cacheList[index] ;
1916 RooArgSet* RooAbsArg::getVariables(Bool_t stripDisconnected)
const
1918 return getParameters(RooArgSet(),stripDisconnected) ;
1926 RooLinkedList RooAbsArg::getCloningAncestors()
const
1928 RooLinkedList retVal ;
1930 set<string>::const_iterator iter= _boolAttrib.begin() ;
1931 while(iter != _boolAttrib.end()) {
1932 if (TString(*iter).BeginsWith(
"CloneOf(")) {
1934 strlcpy(buf,iter->c_str(),128) ;
1936 char* ptrToken = strtok(0,
")") ;
1937 RooAbsArg* ptr = (RooAbsArg*) strtol(ptrToken,0,16) ;
1953 void RooAbsArg::graphVizTree(
const char* fileName,
const char* delimiter,
bool useTitle,
bool useLatex)
1955 ofstream ofs(fileName) ;
1957 coutE(InputArguments) <<
"RooAbsArg::graphVizTree() ERROR: Cannot open graphViz output file with name " << fileName << endl ;
1960 graphVizTree(ofs, delimiter, useTitle, useLatex) ;
1969 void RooAbsArg::graphVizTree(ostream& os,
const char* delimiter,
bool useTitle,
bool useLatex)
1972 coutE(InputArguments) <<
"RooAbsArg::graphVizTree() ERROR: output stream provided as input argument is in invalid state" << endl ;
1976 os <<
"digraph " << GetName() <<
"{" << endl ;
1980 treeNodeServerList(&nodeSet) ;
1981 RooFIter iter = nodeSet.fwdIterator() ;
1985 while((node=iter.next())) {
1986 string nodeName = node->GetName();
1987 string nodeTitle = node->GetTitle();
1988 string nodeLabel = (useTitle && !nodeTitle.empty()) ? nodeTitle : nodeName;
1991 string::size_type position = nodeLabel.find(
"#") ;
1992 while(useLatex && position!=nodeLabel.npos){
1993 nodeLabel.replace(position, 1,
"\\");
1996 string typeFormat =
"\\texttt{";
1997 string nodeType = (useLatex) ? typeFormat+node->IsA()->GetName()+
"}" : node->IsA()->GetName();
1999 os <<
"\"" << nodeName <<
"\" [ color=" << (node->isFundamental()?
"blue":
"red")
2000 <<
", label=\"" << nodeType << delimiter << nodeLabel <<
"\"];" << endl ;
2005 set<pair<RooAbsArg*,RooAbsArg*> > links ;
2006 graphVizAddConnections(links) ;
2009 set<pair<RooAbsArg*,RooAbsArg*> >::iterator liter = links.begin() ;
2010 for( ; liter != links.end() ; ++liter ) {
2011 os <<
"\"" << liter->first->GetName() <<
"\" -> \"" << liter->second->GetName() <<
"\";" << endl ;
2024 void RooAbsArg::graphVizAddConnections(set<pair<RooAbsArg*,RooAbsArg*> >& linkSet)
2026 for (
const auto server : _serverList) {
2027 linkSet.insert(make_pair(
this,server)) ;
2028 server->graphVizAddConnections(linkSet) ;
2114 Bool_t RooAbsArg::addOwnedComponents(
const RooArgSet& comps)
2116 if (!_ownedComponents) {
2117 _ownedComponents =
new RooArgSet(
"owned components") ;
2119 return _ownedComponents->addOwned(comps) ;
2128 RooAbsArg* RooAbsArg::cloneTree(
const char* newname)
const
2131 RooArgSet* clonedNodes = (RooArgSet*) RooArgSet(*this).snapshot(kTRUE) ;
2134 RooAbsArg* head = clonedNodes->find(*
this) ;
2139 clonedNodes->remove(*head) ;
2142 head->addOwnedComponents(*clonedNodes) ;
2145 clonedNodes->releaseOwnership() ;
2146 delete clonedNodes ;
2150 head->TNamed::SetName(newname) ;
2151 head->_namePtr = (TNamed*) RooNameReg::instance().constPtr(newname) ;
2162 void RooAbsArg::attachToStore(RooAbsDataStore& store)
2164 if (dynamic_cast<RooTreeDataStore*>(&store)) {
2165 attachToTree(((RooTreeDataStore&)store).tree()) ;
2166 }
else if (dynamic_cast<RooVectorDataStore*>(&store)) {
2167 attachToVStore((RooVectorDataStore&)store) ;
2175 RooExpensiveObjectCache& RooAbsArg::expensiveObjectCache()
const
2180 return RooExpensiveObjectCache::instance() ;
2187 const char* RooAbsArg::aggregateCacheUniqueSuffix()
const
2191 RooArgSet branches ;
2192 branchNodeServerList(&branches) ;
2193 RooFIter iter = branches.fwdIterator();
2195 while((arg=iter.next())) {
2196 const char* tmp = arg->cacheUniqueSuffix() ;
2197 if (tmp) suffix += tmp ;
2199 return Form(
"%s",suffix.c_str()) ;
2205 void RooAbsArg::wireAllCaches()
2207 RooArgSet branches ;
2208 branchNodeServerList(&branches) ;
2209 RooFIter iter = branches.fwdIterator() ;
2211 while((arg=iter.next())) {
2213 for (deque<RooAbsCache*>::iterator iter2 = arg->_cacheList.begin() ; iter2 != arg->_cacheList.end() ; ++iter2) {
2214 (*iter2)->wireCache() ;
2223 void RooAbsArg::SetName(
const char* name)
2225 TNamed::SetName(name) ;
2226 TNamed* newPtr = (TNamed*) RooNameReg::instance().constPtr(GetName()) ;
2227 if (newPtr != _namePtr) {
2230 _namePtr->SetBit(RooNameReg::kRenamedArg);
2239 void RooAbsArg::SetNameTitle(
const char *name,
const char *title)
2241 TNamed::SetNameTitle(name,title) ;
2242 TNamed* newPtr = (TNamed*) RooNameReg::instance().constPtr(GetName()) ;
2243 if (newPtr != _namePtr) {
2246 _namePtr->SetBit(RooNameReg::kRenamedArg);
2254 void RooAbsArg::Streamer(TBuffer &R__b)
2256 if (R__b.IsReading()) {
2257 _ioReadStack.push(
this) ;
2258 R__b.ReadClassBuffer(RooAbsArg::Class(),
this);
2259 _ioReadStack.pop() ;
2260 _namePtr = (TNamed*) RooNameReg::instance().constPtr(GetName()) ;
2261 _isConstant = getAttribute(
"Constant") ;
2263 R__b.WriteClassBuffer(RooAbsArg::Class(),
this);
2278 void RooAbsArg::ioStreamerPass2()
2282 map<RooAbsArg*,TRefArray*>::iterator iter = _ioEvoList.find(
this) ;
2283 if (iter != _ioEvoList.end()) {
2286 if (!_proxyList.GetEntriesFast())
2287 _proxyList.Expand(iter->second->GetEntriesFast());
2288 for (
int i = 0; i < iter->second->GetEntriesFast(); i++) {
2289 _proxyList.Add(iter->second->At(i));
2292 delete iter->second ;
2293 _ioEvoList.erase(iter) ;
2308 void RooAbsArg::ioStreamerPass2Finalize()
2312 map<RooAbsArg*,TRefArray*>::iterator iter = _ioEvoList.begin() ;
2313 while (iter != _ioEvoList.end()) {
2316 if (!iter->first->_proxyList.GetEntriesFast())
2317 iter->first->_proxyList.Expand(iter->second->GetEntriesFast());
2318 for (
int i = 0; i < iter->second->GetEntriesFast(); i++) {
2319 iter->first->_proxyList.Add(iter->second->At(i));
2323 map<RooAbsArg*,TRefArray*>::iterator iter_tmp = iter ;
2328 delete iter_tmp->second ;
2329 _ioEvoList.erase(iter_tmp) ;
2335 RooAbsArg::RefCountListLegacyIterator_t *
2336 RooAbsArg::makeLegacyIterator(
const RooAbsArg::RefCountList_t& list)
const {
2337 return new RefCountListLegacyIterator_t(list.containedObjects());
2343 void RooRefArray::Streamer(TBuffer &R__b)
2346 if (R__b.IsReading()) {
2348 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
2351 TRefArray* refArray =
new TRefArray ;
2352 refArray->Streamer(R__b) ;
2353 R__b.CheckByteCount(R__s, R__c, refArray->IsA());
2356 RooAbsArg::_ioEvoList[RooAbsArg::_ioReadStack.top()] = refArray ;
2360 R__c = R__b.WriteVersion(RooRefArray::IsA(), kTRUE);
2363 TRefArray refArray(GetEntriesFast());
2364 TIterator* iter = MakeIterator() ;
2365 TObject* tmpObj ;
while ((tmpObj = iter->Next())) {
2366 refArray.Add(tmpObj) ;
2370 refArray.Streamer(R__b) ;
2371 R__b.SetByteCount(R__c, kTRUE) ;
2378 std::string printValue(RooAbsArg *raa)
2380 std::stringstream s;
2381 if (0 == *raa->GetName() && 0 == *raa->GetTitle()) {
2382 s <<
"An instance of " << raa->ClassName() <<
".";
2385 raa->printStream(s, raa->defaultPrintContents(
""), raa->defaultPrintStyle(
""));