78#ifdef ROOFIT_LEGACY_EVAL_BACKEND
95bool isCacheSet(std::string
const& setName) {
97 return setName.rfind(
"CACHE_", 0) == 0;
102using std::string, std::list, std::map, std::vector, std::ifstream, std::ofstream, std::fstream, std::make_unique;
203 auto snapClone = new RooArgSet;
204 snap->snapshot(*snapClone);
205 snapClone->setName(snap->GetName()) ;
206 _snapshots.Add(snapClone) ;
210 for (map<string,RooArgSet>::const_iterator iter3 = other.
_namedSets.begin() ; iter3 != other.
_namedSets.end() ; ++iter3) {
212 _namedSets[iter3->first].add(*std::unique_ptr<RooArgSet>{_allOwnedNodes.selectCommon(iter3->second)});
216 for(
TObject * gobj : other._genObjects) {
217 _genObjects.Add(gobj->Clone());
220 for(
TObject * gobj : allGenericObjects()) {
222 handle->ReplaceWS(
this);
232 if(newname && std::string(newname) !=
GetName()) {
233 out->SetName(newname);
273 std::vector<std::string> tokens =
ROOT::Split(fileSpec,
":");
276 if (tokens.size() != 3) {
277 std::ostringstream stream;
278 for (
const auto& token : tokens) {
279 stream <<
"\n\t" << token;
281 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR in file specification, expecting 'filename:wsname:objname', but '" << fileSpec <<
"' given."
282 <<
"\nTokens read are:" << stream.str() << std::endl;
286 const std::string& filename = tokens[0];
287 const std::string& wsname = tokens[1];
288 const std::string& objname = tokens[2];
291 std::unique_ptr<TFile>
f{
TFile::Open(filename.c_str())};
293 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR opening file " << filename << std::endl ;
300 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR: No object named " << wsname <<
" in file " << filename
301 <<
" or object is not a RooWorkspace" << std::endl ;
306 RooAbsArg* warg = w->arg(objname.c_str()) ;
308 bool ret =
import(*warg,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) ;
311 RooAbsData* wdata = w->data(objname.c_str()) ;
313 bool ret =
import(*wdata,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) ;
317 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR: No RooAbsArg or RooAbsData object named " << objname
318 <<
" in workspace " << wsname <<
" in file " << filename << std::endl ;
335 ret |=
import(*oneArg,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) ;
388 pc.
defineString(
"conflictSuffix",
"RenameConflictNodes",0) ;
389 pc.
defineInt(
"renameConflictOrig",
"RenameConflictNodes",0,0) ;
391 pc.
defineString(
"allVarsSuffix",
"RenameAllVariables",0) ;
392 pc.
defineString(
"allVarsExcept",
"RenameAllVariables",1) ;
396 pc.
defineInt(
"useExistingNodes",
"RecycleConflictNodes",0,0) ;
398 pc.
defineInt(
"noRecursion",
"NoRecursion",0,0) ;
399 pc.
defineMutex(
"RenameConflictNodes",
"RenameAllNodes") ;
400 pc.
defineMutex(
"RenameConflictNodes",
"RecycleConflictNodes") ;
401 pc.
defineMutex(
"RenameAllNodes",
"RecycleConflictNodes") ;
402 pc.
defineMutex(
"RenameVariable",
"RenameAllVariables") ;
411 const char* suffixC = pc.
getString(
"conflictSuffix") ;
412 const char* suffixA = pc.
getString(
"allSuffix") ;
413 const char* suffixV = pc.
getString(
"allVarsSuffix") ;
414 const char* exceptVars = pc.
getString(
"allVarsExcept") ;
415 const char* varChangeIn = pc.
getString(
"varChangeIn") ;
416 const char* varChangeOut = pc.
getString(
"varChangeOut") ;
417 bool renameConflictOrig = pc.
getInt(
"renameConflictOrig") ;
418 Int_t useExistingNodes = pc.
getInt(
"useExistingNodes") ;
424 if (suffixC && strlen(suffixC)==0) suffixC = nullptr ;
425 if (suffixA && strlen(suffixA)==0) suffixA = nullptr ;
427 bool conflictOnly = suffixA ? false : true ;
428 const char* suffix = suffixA ? suffixA : suffixC ;
431 std::map<string,string> varMap ;
432 if (strlen(varChangeIn)>0) {
435 const std::vector<std::string> tokIn =
ROOT::Split(varChangeIn,
", ",
true);
436 const std::vector<std::string> tokOut =
ROOT::Split(varChangeOut,
", ",
true);
437 for (
unsigned int i=0; i < tokIn.size(); ++i) {
438 varMap.insert(std::make_pair(tokIn[i], tokOut[i]));
441 assert(tokIn.size() == tokOut.size());
446 std::set<string> exceptVarNames ;
447 if (exceptVars && strlen(exceptVars)) {
448 const std::vector<std::string> toks =
ROOT::Split(exceptVars,
", ",
true);
449 exceptVarNames.insert(toks.begin(), toks.end());
452 if (suffixV !=
nullptr && strlen(suffixV)>0) {
454 for (
const auto v : *vars) {
455 if (exceptVarNames.find(
v->GetName())==exceptVarNames.end()) {
456 varMap[
v->GetName()] =
Form(
"%s_%s",
v->GetName(),suffixV) ;
467 bool factoryMatch = (tagIn && tagWs && !strcmp(tagIn,tagWs)) ;
469 ((
RooAbsArg&)inArg).setAttribute(
"RooWorkspace::Recycle") ;
472 if (!suffix && wsarg && !useExistingNodes && !(inArg.
isFundamental() && !varMap[inArg.
GetName()].empty())) {
475 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR importing object named " << inArg.
GetName()
476 <<
": another instance with same name already in the workspace and no conflict resolution protocol specified" << std::endl ;
480 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") Object " << inArg.
GetName() <<
" is already in workspace!" << std::endl ;
486 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") Recycling existing object " << inArg.
GetName() <<
" created with identical factory specification" << std::endl ;
495 branchSet.
add(inArg) ;
500 for (
const auto branch : branchSet) {
502 if (wsbranch && wsbranch!=branch && !branch->
getAttribute(
"RooWorkspace::Recycle") && !useExistingNodes) {
503 conflictNodes.
add(*branch) ;
508 if (!conflictNodes.
empty() && !suffix && !useExistingNodes) {
509 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR object named " << inArg.
GetName() <<
": component(s) "
510 << conflictNodes <<
" already in the workspace and no conflict resolution protocol specified" << std::endl ;
523 conflictNodes.
add(branchSet) ;
527 string topName2 = cloneTop->
GetName() ;
528 if (!renameConflictOrig) {
530 for (
const auto cnode : conflictNodes) {
532 string origName = cnode2->
GetName() ;
535 string tag =
"ORIGNAME:" + origName;
542 if (cnode2==cloneTop) {
547 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName()
548 <<
") Resolving name conflict in workspace by changing name of imported node "
549 << origName <<
" to " << cnode2->
GetName() << std::endl ;
555 for (
const auto cnode : conflictNodes) {
557 string origName = cnode->GetName() ;
566 wsnode->
SetName(
Form(
"%s_%s",cnode->GetName(),suffix)) ;
567 wsnode->
SetTitle(
Form(
"%s (%s)",cnode->GetTitle(),suffix)) ;
570 for (
unsigned int n=1;
true; ++
n) {
571 string newname =
Form(
"%s_%s_%d",cnode->GetName(),suffix,
n) ;
573 wsnode->
SetName(newname.c_str()) ;
574 wsnode->
SetTitle(
Form(
"%s (%s %d)",cnode->GetTitle(),suffix,
n)) ;
580 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName()
581 <<
") Resolving name conflict in workspace by changing name of original node "
582 << origName <<
" to " << wsnode->
GetName() << std::endl ;
585 coutW(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") Internal error: expected to find existing node "
586 << origName <<
" to be renamed, but didn't find it..." << std::endl ;
593 if (strlen(varChangeIn)>0 || (suffixV && strlen(suffixV)>0)) {
596 for (
const auto cnode : cloneSet) {
598 if (varMap.find(cnode->GetName())!=varMap.end()) {
599 string origName = cnode->GetName() ;
600 cnode->SetName(varMap[cnode->GetName()].c_str()) ;
601 string tag =
"ORIGNAME:" + origName;
602 cnode->setAttribute(tag.c_str()) ;
603 if (!cnode->getStringAttribute(
"origName")) {
604 cnode->setStringAttribute(
"origName",origName.c_str()) ;
608 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") Changing name of variable "
609 << origName <<
" to " << cnode->GetName() <<
" on request" << std::endl ;
612 if (cnode==cloneTop) {
613 topName2 = cnode->GetName() ;
627 for (
const auto node : cloneSet2) {
628 if (node->importWorkspaceHook(*
this)) {
629 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR object named " << node->GetName()
630 <<
" has an error in importing in one or more of its auxiliary objects, aborting" << std::endl ;
637 for (
const auto node : cloneSet2) {
639 if (!
_classes.autoImportClass(node->IsA())) {
640 coutW(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") WARNING: problems import class code of object "
641 << node->ClassName() <<
"::" << node->GetName() <<
", reading of workspace will require external definition of class" << std::endl ;
647 node->setExpensiveObjectCache(
_eocache) ;
655 if (!silence && useExistingNodes) {
656 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") using existing copy of " << node->ClassName()
657 <<
"::" << node->GetName() <<
" for import of " << cloneTop2->
ClassName() <<
"::"
658 << cloneTop2->
GetName() << std::endl ;
663 nodesToBeDeleted.
addOwned(std::unique_ptr<RooAbsArg>{node});
670 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") importing " << node->ClassName() <<
"::"
671 << node->GetName() << std::endl ;
674 node->setWorkspace(*
this);
679 _dir->InternalAppend(node) ;
686 if (!recycledNodes.
empty()) {
687 for (
const auto node : cloneSet2) {
688 node->redirectServers(recycledNodes) ;
734 pc.
defineInt(
"embedded",
"Embedded",0,0) ;
744 const char* dsetName = pc.
getString(
"dsetName") ;
745 const char* varChangeIn = pc.
getString(
"varChangeIn") ;
746 const char* varChangeOut = pc.
getString(
"varChangeOut") ;
747 bool embedded = pc.
getInt(
"embedded") ;
751 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") importing dataset " << inData.
GetName() << std::endl ;
754 if (dsetName && strlen(dsetName)==0) {
765 if (dsetName && dataList.
FindObject(dsetName)) {
766 coutE(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") ERROR dataset with name " << dsetName <<
" already exists in workspace, import aborted" << std::endl ;
770 coutE(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") ERROR dataset with name " << inData.
GetName() <<
" already exists in workspace, import aborted" << std::endl ;
778 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") changing name of dataset from " << inData.
GetName() <<
" to " << dsetName << std::endl ;
786 if (strlen(varChangeIn)>0) {
788 const std::vector<std::string> tokIn =
ROOT::Split(varChangeIn,
",");
789 const std::vector<std::string> tokOut =
ROOT::Split(varChangeOut,
",");
790 for (
unsigned int i=0; i < tokIn.size(); ++i) {
792 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") changing name of dataset observable " << tokIn[i] <<
" to " << tokOut[i] << std::endl ;
800 if (!
arg(carg->GetName())) {
806 dataList.
Add(clone) ;
808 _dir->InternalAppend(clone) ;
833 coutW(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") WARNING redefining previously defined named set " <<
name << std::endl ;
841 if (!
arg(sarg->GetName())) {
845 coutE(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") ERROR set constituent \"" << sarg->GetName()
846 <<
"\" is not in workspace and importMissing option is disabled" << std::endl ;
850 wsargs.
add(*
arg(sarg->GetName())) ;
872 coutW(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName()
873 <<
") WARNING redefining previously defined named set " <<
name << std::endl;
892 coutW(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") WARNING redefining previously defined named set " <<
name << std::endl ;
898 for (
const std::string& token :
ROOT::Split(contentList,
",")) {
900 if (!
arg(token.c_str())) {
901 coutE(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") ERROR proposed set constituent \"" << token
902 <<
"\" is not in workspace" << std::endl ;
905 wsargs.
add(*
arg(token.c_str())) ;
927 for (
const std::string& token :
ROOT::Split(newContents,
",")) {
929 if (!
arg(token.c_str())) {
930 coutE(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") ERROR proposed set constituent \"" << token
931 <<
"\" is not in workspace" << std::endl ;
934 wsargs.
add(*
arg(token.c_str())) ;
951 std::map<string,RooArgSet>::iterator i =
_namedSets.find(
name.c_str());
952 return (i!=
_namedSets.end()) ? &(i->second) :
nullptr;
965 coutE(InputArguments) <<
"RooWorkspace::renameSet(" <<
GetName() <<
") ERROR a set with name " <<
name
966 <<
" does not exist" << std::endl ;
972 coutE(InputArguments) <<
"RooWorkspace::renameSet(" <<
GetName() <<
") ERROR a set with name " << newName
973 <<
" already exists" << std::endl ;
996 coutE(InputArguments) <<
"RooWorkspace::removeSet(" <<
GetName() <<
") ERROR a set with name " <<
name
997 <<
" does not exist" << std::endl ;
1065 _dir->InternalAppend(sarg) ;
1086 return _classes.autoImportClass(theClass,doReplace) ;
1103 TString className = carg->ClassName() ;
1104 if (className.
Index(re)>=0 && !
_classes.autoImportClass(carg->IsA(),doReplace)) {
1105 coutW(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") WARNING: problems import class code of object "
1106 << carg->ClassName() <<
"::" << carg->GetName() <<
", reading of workspace will require external definition of class" << std::endl ;
1148 snapshot->assign(params) ;
1152 coutI(ObjectHandling) <<
"RooWorkspace::saveSnapshot(" <<
GetName() <<
") replacing previous snapshot with name " <<
name << std::endl ;
1172 coutE(ObjectHandling) <<
"RooWorkspace::loadSnapshot(" <<
GetName() <<
") no snapshot with name " <<
name <<
" is available" << std::endl ;
1178 actualParams.
assign(*snap) ;
1260 for (
const std::string& token :
ROOT::Split(nameList,
",")) {
1265 std::stringstream ss;
1266 ss <<
" RooWorkspace::argSet(" <<
GetName() <<
") no RooAbsArg named \"" << token <<
"\" in workspace" ;
1267 const std::string errorMsg = ss.str();
1268 coutE(InputArguments) << errorMsg << std::endl;
1269 throw std::runtime_error(errorMsg);
1432 std::list<RooAbsData*>
ret ;
1434 ret.push_back(dat) ;
1445 std::list<RooAbsData*>
ret ;
1447 ret.push_back(dat) ;
1459 std::list<TObject*>
ret ;
1463 if (gobj->
IsA()==RooTObjWrap::Class()) {
1464 ret.push_back((
static_cast<RooTObjWrap*
>(gobj))->
obj()) ;
1466 ret.push_back(gobj) ;
1475std::string findFileInPath(std::string
const &file, std::list<std::string>
const &dirList)
1478 for (std::string
const &diter : dirList) {
1480 const char *cpath =
gSystem->PrependPathName(diter.c_str(), temp);
1481 std::string path = cpath;
1482 if (!
gSystem->AccessPathName(path.c_str())) {
1504 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo(" <<
_wspace->GetName() <<
") request to import code of class " << tc->
GetName() << std::endl ;
1510 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo(" <<
_wspace->GetName() <<
") code of class " << tc->
GetName() <<
" already imported, skipping" << std::endl ;
1516 if (mapEntry && strlen(mapEntry)>0) {
1517 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo(" <<
_wspace->GetName() <<
") code of class " << tc->
GetName() <<
" is in ROOT distribution, skipping " << std::endl ;
1526 if (implfile.empty() || declfile.empty()) {
1527 oocoutE(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo(" <<
_wspace->GetName() <<
") ERROR: cannot retrieve code file names for class "
1528 << tc->
GetName() <<
" through ROOT TClass interface, unable to import code" << std::endl ;
1535 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo(" <<
_wspace->GetName() <<
") code of class " << tc->
GetName() <<
" is in ROOT distribution, skipping " << std::endl ;
1543 oocoutW(
_wspace,ObjectHandling) <<
"RooWorkspace::autoImportClass(" <<
_wspace->GetName() <<
") WARNING cannot import class "
1544 << tc->
GetName() <<
" : it cannot be persisted because it doesn't have a default constructor. Please fix " << std::endl ;
1551 std::string declpath;
1552 std::string implpath;
1556 if (
gSystem->AccessPathName(declfile.c_str())) {
1561 if (declpath.empty()) {
1562 oocoutW(
_wspace,ObjectHandling) <<
"RooWorkspace::autoImportClass(" <<
_wspace->GetName() <<
") WARNING Cannot access code of class "
1563 << tc->
GetName() <<
" because header file " << declfile <<
" is not found in current directory nor in $ROOTSYS" ;
1577 ooccoutW(
_wspace,ObjectHandling) <<
". To fix this problem, add the required directory to the search "
1578 <<
"path using RooWorkspace::addClassDeclImportDir(const char* dir)" << std::endl ;
1587 if (
gSystem->AccessPathName(implfile.c_str())) {
1592 if (implpath.empty()) {
1593 oocoutW(
_wspace,ObjectHandling) <<
"RooWorkspace::autoImportClass(" <<
_wspace->GetName() <<
") WARNING Cannot access code of class "
1594 << tc->
GetName() <<
" because implementation file " << implfile <<
" is not found in current directory nor in $ROOTSYS" ;
1608 ooccoutW(
_wspace,ObjectHandling) <<
". To fix this problem add the required directory to the search "
1609 <<
"path using RooWorkspace::addClassImplImportDir(const char* dir)" << std::endl;
1627 const std::string declfilename = !declpath.empty() ?
gSystem->BaseName(declpath.c_str())
1628 :
gSystem->BaseName(declfile.c_str());
1631 int dotpos2 = strrchr(declfilename.c_str(),
'.') - declfilename.c_str() ;
1632 string declfilebase = declfilename.substr(0,dotpos2) ;
1633 string declfileext = declfilename.substr(dotpos2+1) ;
1635 list<string> extraHeaders ;
1638 if (
_fmap.find(declfilebase) ==
_fmap.end()) {
1641 std::fstream fdecl(!declpath.empty() ? declpath.c_str() : declfile.c_str());
1646 <<
") ERROR opening declaration file " << declfile << std::endl ;
1651 <<
") importing code of class " << tc->
GetName()
1652 <<
" from " << (!implpath.empty() ? implpath.c_str() : implfile.c_str())
1653 <<
" and " << (!declpath.empty() ? declpath.c_str() : declfile.c_str()) << std::endl ;
1658 while(fdecl.getline(buf,1023)) {
1661 bool processedInclude = false ;
1662 char* extincfile = nullptr ;
1665 if (strstr(buf,
"#include")) {
1668 strlcpy(tmp, buf, 64000);
1669 bool stdinclude = strchr(buf,
'<');
1670 strtok(tmp,
" <\"");
1671 char *incfile = strtok(
nullptr,
" <>\"");
1676 hpath +=
"/include/";
1680 <<
") scheduling include file " << incfile <<
" for import" << std::endl;
1681 extraHeaders.push_back(incfile);
1682 extincfile = incfile;
1683 processedInclude =
true;
1688 if (processedInclude) {
1689 decl +=
"// external include file below retrieved from workspace code storage\n" ;
1690 decl +=
Form(
"#include \"%s\"\n",extincfile) ;
1698 fstream fimpl(!implpath.empty() ? implpath.c_str() : implfile.c_str()) ;
1703 <<
") ERROR opening implementation file " << implfile << std::endl ;
1710 while(fimpl.getline(buf,1023)) {
1714 bool foundSelfInclude=false ;
1715 bool processedInclude = false ;
1716 char* extincfile = nullptr ;
1719 if (strstr(buf,
"#include")) {
1722 strlcpy(tmp, buf, 64000);
1723 bool stdinclude = strchr(buf,
'<');
1724 strtok(tmp,
" <\"");
1725 char *incfile = strtok(
nullptr,
" <>\"");
1727 if (strstr(incfile, declfilename.c_str())) {
1728 foundSelfInclude =
true;
1731 if (!stdinclude && !foundSelfInclude) {
1734 hpath +=
"/include/";
1739 <<
") scheduling include file " << incfile <<
" for import" << std::endl;
1740 extraHeaders.push_back(incfile);
1741 extincfile = incfile;
1742 processedInclude =
true;
1749 if (foundSelfInclude) {
1752 impl +=
"// class declaration include file below retrieved from workspace code storage\n" ;
1753 impl +=
Form(
"#include \"%s.%s\"\n",declfilebase.c_str(),declfileext.c_str()) ;
1754 }
else if (processedInclude) {
1755 impl +=
"// external include file below retrieved from workspace code storage\n" ;
1756 impl +=
Form(
"#include \"%s\"\n",extincfile) ;
1764 _fmap[declfilebase]._hfile = decl ;
1765 _fmap[declfilebase]._cxxfile = impl ;
1766 _fmap[declfilebase]._hext = declfileext ;
1769 for (list<string>::iterator ehiter = extraHeaders.begin() ; ehiter != extraHeaders.end() ; ++ehiter ) {
1773 eh.
_hname = ehiter->c_str() ;
1774 fstream fehdr(ehiter->c_str()) ;
1777 while(fehdr.getline(buf2,1023)) {
1780 if (strstr(buf2,
"#include")) {
1783 strlcpy(tmp, buf2, 64000);
1784 bool stdinclude = strchr(buf,
'<');
1785 strtok(tmp,
" <\"");
1786 char *incfile = strtok(
nullptr,
" <>\"");
1791 hpath +=
"/include/";
1795 <<
") scheduling recursive include file " << incfile <<
" for import"
1797 extraHeaders.push_back(incfile);
1805 eh.
_hfile = ehimpl.c_str();
1807 _ehmap[ehiter->c_str()] = eh;
1815 <<
") code of class " << tc->
GetName()
1816 <<
" was already imported from " << (!implpath.empty() ? implpath : implfile)
1817 <<
" and " << (!declpath.empty() ? declpath.c_str() : declfile.c_str()) << std::endl;
1830 std::list<TClass*> bases ;
1832 if (baseNameList.
Length()>0) {
1833 baseNameList +=
"," ;
1835 baseNameList += base->GetClassPointer()->GetName() ;
1836 bases.push_back(base->GetClassPointer()) ;
1845 for(
TClass* bclass : bases) {
1865 if (
_dir)
return true ;
1867 std::string title=
"TDirectory representation of RooWorkspace " + std::string(
GetName());
1872 _dir->InternalAppend(darg) ;
1892 if (oldObj && !replaceExisting) {
1893 coutE(InputArguments) <<
"RooWorkspace::import(" <<
GetName() <<
") generic object with name "
1894 <<
object.GetName() <<
" is already in workspace and replaceExisting flag is set to false" << std::endl ;
1900 object.IsA()->SetDirectoryAutoAdd(
nullptr);
1904 _genObjects.Replace(oldObj.get(),
object.Clone()) ;
1910 object.IsA()->SetDirectoryAutoAdd(func);
1931 std::unique_ptr<TObject> oldObj{
_genObjects.FindObject(aliasName)};
1932 if (oldObj && !replaceExisting) {
1933 coutE(InputArguments) <<
"RooWorkspace::import(" <<
GetName() <<
") generic object with name "
1934 << aliasName <<
" is already in workspace and replaceExisting flag is set to false" << std::endl ;
1939 auto wrapper =
new RooTObjWrap(
object.
Clone());
1940 wrapper->setOwning(
true) ;
1941 wrapper->SetName(aliasName) ;
1942 wrapper->SetTitle(aliasName) ;
2007 if (!gobj)
return nullptr;
2010 if (gobj->
IsA()==RooTObjWrap::Class())
return (
static_cast<RooTObjWrap*
>(gobj))->obj() ;
2023 return _dir->cd(path) ;
2034 std::unique_ptr<TFile>
f{
TFile::Open(fileName, recreate ?
"RECREATE" :
"UPDATE") };
2035 if (!
f ||
f->IsZombie())
2037 auto bytes =
Write();
2051 cxcoutD(ObjectHandling) <<
"INFO: Creating RooFactoryWSTool associated with this workspace" << std::endl ;
2052 _factory = make_unique<RooFactoryWSTool>(*
this);
2076 bool treeMode(
false) ;
2077 bool verbose(
false);
2078 if (
TString(opts).Contains(
"t")) {
2081 if (
TString(opts).Contains(
"v")) {
2085 std::cout << std::endl <<
"RooWorkspace(" <<
GetName() <<
") " <<
GetTitle() <<
" contents" << std::endl << std::endl ;
2105 if (!parg->hasClients()) {
2114 if (!parg->hasClients()) {
2115 funcSet.
add(*parg) ;
2122 if (!parg->hasClients()) {
2123 catfuncSet.
add(*parg) ;
2131 convResoSet.
add(*parg) ;
2133 resoSet.
add(*parg) ;
2146 funcSet.
add(*parg) ;
2151 catfuncSet.
add(*parg) ;
2169 if (!varSet.
empty()) {
2171 std::cout <<
"variables" << std::endl ;
2172 std::cout <<
"---------" << std::endl ;
2173 std::cout << varSet << std::endl ;
2174 std::cout << std::endl ;
2177 if (!pdfSet.
empty()) {
2178 std::cout <<
"p.d.f.s" << std::endl ;
2179 std::cout <<
"-------" << std::endl ;
2183 parg->printComponentTree() ;
2188 std::cout << std::endl ;
2192 if (!resoSet.
empty()) {
2193 std::cout <<
"analytical resolution models" << std::endl ;
2194 std::cout <<
"----------------------------" << std::endl ;
2199 std::cout << std::endl ;
2203 if (!funcSet.
empty()) {
2204 std::cout <<
"functions" << std::endl ;
2205 std::cout <<
"--------" << std::endl ;
2209 parg->printComponentTree() ;
2214 std::cout << std::endl ;
2217 if (!catfuncSet.
empty()) {
2218 std::cout <<
"category functions" << std::endl ;
2219 std::cout <<
"------------------" << std::endl ;
2223 parg->printComponentTree() ;
2228 std::cout << std::endl ;
2232 std::cout <<
"datasets" << std::endl ;
2233 std::cout <<
"--------" << std::endl ;
2235 std::cout << data2->ClassName() <<
"::" << data2->GetName() << *data2->get() << std::endl;
2237 std::cout << std::endl ;
2241 std::cout <<
"embedded datasets (in pdfs and functions)" << std::endl ;
2242 std::cout <<
"-----------------------------------------" << std::endl ;
2244 std::cout << data2->ClassName() <<
"::" << data2->GetName() << *data2->get() << std::endl ;
2246 std::cout << std::endl ;
2250 std::cout <<
"parameter snapshots" << std::endl ;
2251 std::cout <<
"-------------------" << std::endl ;
2253 std::cout << snap->GetName() <<
" = (" ;
2256 if (first) { first=false ; }
else { std::cout <<
"," ; }
2257 std::cout <<
a->GetName() <<
"=" ;
2258 a->printValue(std::cout) ;
2259 if (
a->isConstant()) {
2260 std::cout <<
"[C]" ;
2263 std::cout <<
")" << std::endl ;
2265 std::cout << std::endl ;
2270 std::cout <<
"named sets" << std::endl ;
2271 std::cout <<
"----------" << std::endl ;
2272 for (map<string,RooArgSet>::const_iterator it =
_namedSets.begin() ; it !=
_namedSets.end() ; ++it) {
2273 if (verbose || !isCacheSet(it->first)) {
2274 std::cout << it->first <<
":" << it->second << std::endl;
2278 std::cout << std::endl ;
2283 std::cout <<
"generic objects" << std::endl ;
2284 std::cout <<
"---------------" << std::endl ;
2286 if (gobj->
IsA()==RooTObjWrap::Class()) {
2287 std::cout << (static_cast<RooTObjWrap*>(gobj))->
obj()->
ClassName() <<
"::" << gobj->
GetName() << std::endl ;
2292 std::cout << std::endl ;
2297 std::cout <<
"study modules" << std::endl ;
2298 std::cout <<
"-------------" << std::endl ;
2300 std::cout << smobj->ClassName() <<
"::" << smobj->GetName() << std::endl ;
2302 std::cout << std::endl ;
2306 if (!
_classes.listOfClassNames().empty()) {
2307 std::cout <<
"embedded class code" << std::endl ;
2308 std::cout <<
"-------------------" << std::endl ;
2309 std::cout <<
_classes.listOfClassNames() << std::endl ;
2310 std::cout << std::endl ;
2314 std::cout <<
"embedded precalculated expensive components" << std::endl ;
2315 std::cout <<
"-------------------------------------------" << std::endl ;
2347 name.Streamer(R__b);
2358 name.Streamer(R__b);
2369 name.Streamer(R__b);
2388 map<TString, ClassFiles>::iterator iter =
_fmap.begin();
2389 while (iter !=
_fmap.end()) {
2390 TString key_copy(iter->first);
2392 iter->second._hext.Streamer(R__b);
2393 iter->second._hfile.Streamer(R__b);
2394 iter->second._cxxfile.Streamer(R__b);
2402 map<TString, ClassRelInfo>::iterator iter2 =
_c2fmap.begin();
2403 while (iter2 !=
_c2fmap.end()) {
2404 TString key_copy(iter2->first);
2406 iter2->second._baseName.Streamer(R__b);
2407 iter2->second._fileBase.Streamer(R__b);
2414 map<TString, ExtraHeader>::iterator iter3 =
_ehmap.begin();
2415 while (iter3 !=
_ehmap.end()) {
2416 TString key_copy(iter3->first);
2418 iter3->second._hname.Streamer(R__b);
2419 iter3->second._hfile.Streamer(R__b);
2444 node->ioStreamerPass2();
2451 node->setExpensiveObjectCache(
_eocache);
2452 node->setWorkspace(*
this);
2453#ifdef ROOFIT_LEGACY_EVAL_BACKEND
2454 if (
dynamic_cast<RooAbsOptTestStatistic *
>(node)) {
2455 RooAbsOptTestStatistic *tmp =
static_cast<RooAbsOptTestStatistic *
>(node);
2456 if (tmp->isSealed() && tmp->sealNotice() && strlen(tmp->sealNotice()) > 0) {
2457 std::cout <<
"RooWorkspace::Streamer(" <<
GetName() <<
") " << node->ClassName() <<
"::" << node->GetName()
2458 <<
" : " << tmp->sealNotice() << std::endl;
2466 handle->ReplaceWS(
this);
2474 map<RooAbsArg *, vector<RooAbsArg *>> extClients;
2475 map<RooAbsArg *, vector<RooAbsArg *>> extValueClients;
2476 map<RooAbsArg *, vector<RooAbsArg *>> extShapeClients;
2481 std::vector<RooAbsArg *> clientsTmp{tmparg->_clientList.begin(), tmparg->_clientList.end()};
2482 for (
auto client : clientsTmp) {
2485 const auto refCount = tmparg->_clientList.refCount(client);
2486 auto &bufferVec = extClients[tmparg];
2488 bufferVec.insert(bufferVec.end(), refCount, client);
2489 tmparg->_clientList.Remove(client,
true);
2494 clientsTmp.assign(tmparg->_clientListValue.begin(), tmparg->_clientListValue.end());
2495 for (
auto vclient : clientsTmp) {
2497 cxcoutD(ObjectHandling) <<
"RooWorkspace::Streamer(" <<
GetName() <<
") element " << tmparg->GetName()
2498 <<
" has external value client link to " << vclient <<
" (" << vclient->GetName()
2499 <<
") with ref count " << tmparg->_clientListValue.refCount(vclient) << std::endl;
2501 const auto refCount = tmparg->_clientListValue.refCount(vclient);
2502 auto &bufferVec = extValueClients[tmparg];
2504 bufferVec.insert(bufferVec.end(), refCount, vclient);
2505 tmparg->_clientListValue.Remove(vclient,
true);
2510 clientsTmp.assign(tmparg->_clientListShape.begin(), tmparg->_clientListShape.end());
2511 for (
auto sclient : clientsTmp) {
2513 cxcoutD(ObjectHandling) <<
"RooWorkspace::Streamer(" <<
GetName() <<
") element " << tmparg->GetName()
2514 <<
" has external shape client link to " << sclient <<
" (" << sclient->GetName()
2515 <<
") with ref count " << tmparg->_clientListShape.refCount(sclient) << std::endl;
2517 const auto refCount = tmparg->_clientListShape.refCount(sclient);
2518 auto &bufferVec = extShapeClients[tmparg];
2520 bufferVec.insert(bufferVec.end(), refCount, sclient);
2521 tmparg->_clientListShape.Remove(sclient,
true);
2530 for (
auto &iterx : extClients) {
2531 for (
auto client : iterx.second) {
2532 iterx.first->_clientList.Add(client);
2536 for (
auto &iterx : extValueClients) {
2537 for (
auto client : iterx.second) {
2538 iterx.first->_clientListValue.Add(client);
2542 for (
auto &iterx : extShapeClients) {
2543 for (
auto client : iterx.second) {
2544 iterx.first->_clientListShape.Add(client);
2559 map<TString,ClassRelInfo>::const_iterator iter =
_c2fmap.begin() ;
2564 ret += iter->first ;
2577 static const UInt_t crctab[256] = { 0x00000000,
2578 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
2579 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
2580 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
2581 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
2582 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
2583 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
2584 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
2585 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
2586 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
2587 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
2588 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
2589 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
2590 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
2591 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
2592 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
2593 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
2594 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
2595 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
2596 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
2597 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
2598 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
2599 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
2600 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
2601 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
2602 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
2603 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
2604 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
2605 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
2606 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
2607 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
2608 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
2609 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
2610 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
2611 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
2612 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
2613 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
2614 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
2615 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
2616 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
2617 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
2618 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
2619 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
2620 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
2621 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
2622 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
2623 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
2624 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
2625 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
2626 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
2627 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
2628 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
2632 while (sz--) crc = (crc << 8) ^
UInt_t(*
data++) ^ crctab[crc >> 24];
2640 unsigned long sz = strlen(
data);
2641 switch (strlen(
data)) {
2653 return crc32(
data + 4, sz - 4, (
data[0] << 24) | (
data[1] << 16) |
2672 bool haveDir=false ;
2677 bool writeExtraHeaders(
false) ;
2680 map<TString,ClassRelInfo>::iterator iter =
_c2fmap.begin() ;
2683 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() now processing class " << iter->first.Data() << std::endl ;
2687 oocoutI(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Embedded class "
2688 << iter->first <<
" already in ROOT class table, skipping" << std::endl ;
2697 if (!
gSystem->AccessPathName(dirName.c_str())) {
2698 oocoutI(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() reusing code export directory " << dirName.c_str()
2699 <<
" to extract coded embedded in workspace" << std::endl ;
2701 if (
gSystem->MakeDirectory(dirName.c_str())==0) {
2702 oocoutI(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() creating code export directory " << dirName.c_str()
2703 <<
" to extract coded embedded in workspace" << std::endl ;
2705 oocoutE(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR creating code export directory " << dirName.c_str()
2706 <<
" to extract coded embedded in workspace" << std::endl ;
2715 if (!writeExtraHeaders) {
2716 writeExtraHeaders = true ;
2718 map<TString,ExtraHeader>::iterator extraIter =
_ehmap.begin() ;
2719 while(extraIter!=
_ehmap.end()) {
2722 bool needEHWrite=true ;
2723 string fdname =
Form(
"%s/%s",dirName.c_str(),extraIter->second._hname.Data()) ;
2724 ifstream ifdecl(fdname.c_str()) ;
2728 while (ifdecl.getline(buf, 64000)) {
2733 UInt_t crcWS = crc32(extraIter->second._hfile.Data());
2734 needEHWrite = (crcFile != crcWS);
2739 oocoutI(
_wspace, ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Extracting extra header file "
2740 << fdname << std::endl;
2745 ofstream fdecl(fdname.c_str());
2747 oocoutE(
_wspace, ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR opening file " << fdname
2748 <<
" for writing" << std::endl;
2751 fdecl << extraIter->second._hfile.Data();
2762 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() now processing file with base " << iter->second._fileBase << std::endl ;
2766 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() file with base name " << iter->second._fileBase
2767 <<
" has already been extracted, skipping to next class" << std::endl ;
2772 bool needDeclWrite=true ;
2773 string fdname =
Form(
"%s/%s.%s",dirName.c_str(),iter->second._fileBase.Data(),cfinfo.
_hext.
Data()) ;
2774 ifstream ifdecl(fdname.c_str()) ;
2778 while (ifdecl.getline(buf, 64000)) {
2784 needDeclWrite = (crcFile!=crcWS) ;
2788 if (needDeclWrite) {
2789 oocoutI(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Extracting declaration code of class " << iter->first <<
", file " << fdname << std::endl ;
2790 ofstream fdecl(fdname.c_str()) ;
2792 oocoutE(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR opening file "
2793 << fdname <<
" for writing" << std::endl ;
2801 bool needImplWrite=true ;
2802 string finame =
Form(
"%s/%s.cxx",dirName.c_str(),iter->second._fileBase.Data()) ;
2803 ifstream ifimpl(finame.c_str()) ;
2807 while (ifimpl.getline(buf, 64000)) {
2813 needImplWrite = (crcFile!=crcWS) ;
2817 if (needImplWrite) {
2818 oocoutI(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Extracting implementation code of class " << iter->first <<
", file " << finame << std::endl ;
2819 ofstream fimpl(finame.c_str()) ;
2821 oocoutE(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR opening file"
2822 << finame <<
" for writing" << std::endl ;
2831 oocxcoutD(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() marking code unit " << iter->second._fileBase <<
" as extracted" << std::endl ;
2834 oocoutI(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Compiling code unit " << iter->second._fileBase.Data() <<
" to define class " << iter->first << std::endl ;
2835 bool ok =
gSystem->CompileMacro(finame.c_str(),
"k") ;
2838 oocoutE(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR compiling class " << iter->first.Data() <<
", to fix this you can do the following: " << std::endl
2839 <<
" 1) Fix extracted source code files in directory " << dirName.c_str() <<
"/" << std::endl
2840 <<
" 2) In clean ROOT session compiled fixed classes by hand using '.x " << dirName.c_str() <<
"/ClassName.cxx+'" << std::endl
2841 <<
" 3) Reopen file with RooWorkspace with broken source code in UPDATE mode. Access RooWorkspace to force loading of class" << std::endl
2842 <<
" Broken instances in workspace will _not_ be compiled, instead precompiled fixed instances will be used." << std::endl
2843 <<
" 4) Reimport fixed code in workspace using 'RooWorkspace::importClassCode(\"*\",true)' method, Write() updated workspace to file and close file" << std::endl
2844 <<
" 5) Reopen file in clean ROOT session to confirm that problems are fixed" << std::endl ;
2871 coutE(ObjectHandling) <<
"RooWorkspace::WSDir::Add(" <<
GetName() <<
") ERROR: Directory is read-only representation of a RooWorkspace, use RooWorkspace::import() to add objects" << std::endl ;
2884 coutE(ObjectHandling) <<
"RooWorkspace::WSDir::Add(" <<
GetName() <<
") ERROR: Directory is read-only representation of a RooWorkspace, use RooWorkspace::import() to add objects" << std::endl ;
2898 if (removedObj ==
_dir)
_dir =
nullptr;
2904 _views.RecursiveRemove(removedObj);
2909 std::vector<std::string> invalidSets;
2912 auto const& setName =
c.first;
2913 auto&
set =
c.second;
2914 std::size_t oldSize =
set.size();
2915 set.RecursiveRemove(removedObj);
2919 if(
set.size() < oldSize && isCacheSet(setName)) {
2920 invalidSets.emplace_back(setName);
2925 for(std::string
const& setName : invalidSets) {
2929 _eocache.RecursiveRemove(removedObj);
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
int Int_t
Signed integer 4 bytes (int).
short Version_t
Class version identifier (short).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
const char Option_t
Option string (const char).
externTClassTable * gClassTable
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
static void ioStreamerPass2Finalize()
Method called by workspace container to finalize schema evolution issues that cannot be handled in a ...
void SetName(const char *name) override
Set the name of the TNamed.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree).
void setAttribute(const Text_t *name, bool value=true)
Set (default) or clear a named boolean attribute of this object.
void branchNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool recurseNonDerived=false) const
Fill supplied list with all branch nodes of the arg tree starting with ourself as top node.
virtual bool isFundamental() const
Is this object a fundamental type that can be added to a dataset?
A space to attach TBranches.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
void sort(bool reverse=false)
Sort collection using std::sort and name comparison.
void useHashMapForFind(bool flag) const
void setName(const char *name)
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for binned and unbinned datasets.
virtual const RooArgSet * get() const
virtual bool changeObservableName(const char *from, const char *to)
Abstract base class for objects that represent a real value and implements functionality common to al...
Abstract base class for RooStudyManager modules.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Object to represent discrete states.
Named container for two doubles, two integers two object points and three string pointers that can be...
Configurable parser for RooCmdArg named arguments.
void defineMutex(const char *head, Args_t &&... tail)
Define arguments where any pair is mutually exclusive.
bool process(const RooCmdArg &arg)
Process given RooCmdArg.
bool ok(bool verbose) const
Return true of parsing was successful.
const char * getString(const char *name, const char *defaultValue="", bool convEmptyToNull=false) const
Return string property registered with name 'name'.
bool defineString(const char *name, const char *argName, int stringNum, const char *defValue="", bool appendMode=false)
Define double property name 'name' mapped to double in slot 'stringNum' in RooCmdArg with name argNam...
bool defineInt(const char *name, const char *argName, int intNum, int defValue=0)
Define integer property name 'name' mapped to integer in slot 'intNum' in RooCmdArg with name argName...
int getInt(const char *name, int defaultValue=0) const
Return integer property registered with name 'name'.
Singleton class that serves as repository for objects that are expensive to calculate.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
Int_t getHashTableSize() const
virtual void Add(TObject *arg)
void setHashTableSize(Int_t size)
Change the threshold for hash-table use to given size.
TObject * FindObject(const char *name) const override
Return pointer to object with given name.
static RooMsgService & instance()
Return reference to singleton instance.
void setGlobalKillBelow(RooFit::MsgLevel level)
RooFit::MsgLevel globalKillBelow() const
static bool setAddDirectoryStatus(bool flag)
Configure whether new instances of RooPlot will add themselves to gDirectory.
Variable that can be changed from the outside.
RooResolutionModel is the base class for PDFs that represent a resolution model that can be convolute...
The RooStringView is a wrapper around a C-style string that can also be constructed from a std::strin...
const char * c_str() const
An interface to set and retrieve a workspace.
bool _compiledOK
! Flag indicating that classes compiled OK
std::map< TString, ExtraHeader > _ehmap
void Streamer(TBuffer &) override
Custom streamer for the workspace.
std::string listOfClassNames() const
Return STL string with last of class names contained in the code repository.
bool autoImportClass(TClass *tc, bool doReplace=false)
Import code of class 'tc' into the repository.
bool compileClasses()
For all classes in the workspace for which no class definition is found in the ROOT class table extra...
std::map< TString, ClassRelInfo > _c2fmap
std::map< TString, ClassFiles > _fmap
void InternalAppend(TObject *obj)
Internal access to TDirectory append method.
void Add(TObject *, bool) override
Overload TDirectory interface method to prohibit insertion of objects in read-only directory workspac...
void Append(TObject *, bool) override
Overload TDirectory interface method to prohibit insertion of objects in read-only directory workspac...
RooExpensiveObjectCache _eocache
Cache for expensive objects.
TObject * obj(RooStringView name) const
Return any type of object (RooAbsArg, RooAbsData or generic object) with given name).
RooLinkedList _genObjects
List of generic objects.
static std::list< std::string > _classDeclDirList
const RooArgSet * getSnapshot(const char *name) const
Return the RooArgSet containing a snapshot of variables contained in the workspace.
static void addClassDeclImportDir(const char *dir)
Add dir to search path for class declaration (header) files.
void Print(Option_t *opts=nullptr) const override
Print contents of the workspace.
RooLinkedList _dataList
List of owned datasets.
RooAbsCategory * catfunc(RooStringView name) const
Retrieve discrete function (RooAbsCategory) with given name. A null pointer is returned if not found.
WSDir * _dir
! Transient ROOT directory representation of workspace
static void addClassImplImportDir(const char *dir)
Add dir to search path for class implementation (.cxx) files.
RooAbsPdf * pdf(RooStringView name) const
Retrieve p.d.f (RooAbsPdf) with given name. A null pointer is returned if not found.
std::map< std::string, RooArgSet > _namedSets
Map of named RooArgSets.
RooAbsData * embeddedData(RooStringView name) const
Retrieve dataset (binned or unbinned) with given name. A null pointer is returned if not found.
RooCategory * cat(RooStringView name) const
Retrieve discrete variable (RooCategory) with given name. A null pointer is returned if not found.
void clearStudies()
Remove all RooStudyManager modules.
bool renameSet(const char *name, const char *newName)
Rename set to a new name.
std::unique_ptr< RooFactoryWSTool > _factory
! Factory tool associated with workspace
RooArgSet allVars() const
Return set with all variable objects.
RooArgSet argSet(RooStringView nameList) const
Return set of RooAbsArgs matching to given list of names.
bool writeToFile(const char *fileName, bool recreate=true)
Save this current workspace into given file.
const RooArgSet * set(RooStringView name)
Return pointer to previously defined named set with given nmame If no such set is found a null pointe...
bool cd(const char *path=nullptr)
RooArgSet allCats() const
Return set with all category objects.
void RecursiveRemove(TObject *obj) override
If one of the TObject we have a referenced to is deleted, remove the reference.
RooAbsArg * fundArg(RooStringView name) const
Return fundamental (i.e.
RooLinkedList _views
List of model views.
bool commitTransaction()
Commit an ongoing import transaction.
~RooWorkspace() override
Workspace destructor.
bool cancelTransaction()
Cancel an ongoing import transaction.
bool startTransaction()
Open an import transaction operations.
TObject * Clone(const char *newname="") const override
TObject::Clone() needs to be overridden.
RooArgSet allResolutionModels() const
Return set with all resolution model objects.
RooLinkedList _snapshots
List of parameter snapshots.
bool saveSnapshot(RooStringView, const char *paramNames)
Save snapshot of values and attributes (including "Constant") of given parameters.
RooArgSet allPdfs() const
Return set with all probability density function objects.
void Streamer(TBuffer &) override
Stream an object of class RooWorkspace.
TObject * genobj(RooStringView name) const
Return generic object with given name.
std::list< RooAbsData * > allData() const
Return list of all dataset in the workspace.
RooLinkedList _studyMods
List if StudyManager modules.
std::list< TObject * > allGenericObjects() const
Return list of all generic objects in the workspace.
static void setClassFileExportDir(const char *dir=nullptr)
Specify the name of the directory in which embedded source code is unpacked and compiled.
bool importClassCode(const char *pat="*", bool doReplace=false)
Import code of all classes in the workspace that have a class name that matches pattern 'pat' and whi...
bool makeDir()
Create transient TDirectory representation of this workspace.
RooArgSet allCatFunctions() const
Return set with all category function objects.
static std::string _classFileExportDir
static std::list< std::string > _classImplDirList
RooAbsReal * function(RooStringView name) const
Retrieve function (RooAbsReal) with given name. Note that all RooAbsPdfs are also RooAbsReals....
RooAbsArg * arg(RooStringView name) const
Return RooAbsArg with given name. A null pointer is returned if none is found.
RooWorkspace()
Default constructor.
bool removeSet(const char *name)
Remove a named set from the workspace.
RooArgSet allFunctions() const
Return set with all function objects.
RooFactoryWSTool & factory()
Return instance to factory tool.
bool extendSet(const char *name, const char *newContents)
Define a named set in the workspace through a comma separated list of names of objects already in the...
RooExpensiveObjectCache & expensiveObjectCache()
RooArgSet _sandboxNodes
! Sandbox for incoming objects in a transaction
bool defineSetInternal(const char *name, const RooArgSet &aset)
bool _openTrans
! Is there a transaction open?
RooRealVar * var(RooStringView name) const
Retrieve real-valued variable (RooRealVar) with given name. A null pointer is returned if not found.
bool addStudy(RooAbsStudy &study)
Insert RooStudyManager module.
static void autoImportClassCode(bool flag)
If flag is true, source code of classes not the ROOT distribution is automatically imported if on obj...
RooLinkedList _embeddedDataList
List of owned datasets that are embedded in pdfs.
RooArgSet _allOwnedNodes
List of owned pdfs and components.
RooAbsData * data(RooStringView name) const
Retrieve dataset (binned or unbinned) with given name. A null pointer is returned if not found.
std::list< RooAbsData * > allEmbeddedData() const
Return list of all dataset in the workspace.
bool loadSnapshot(const char *name)
Load the values and attributes of the parameters in the snapshot saved with the given name.
bool defineSet(const char *name, const RooArgSet &aset, bool importMissing=false)
Define a named RooArgSet with given constituents.
bool import(const RooAbsArg &arg, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={})
Import a RooAbsArg object, e.g.
Buffer base class used for serializing objects.
virtual Version_t ReadVersion(UInt_t *start=nullptr, UInt_t *bcnt=nullptr, const TClass *cl=nullptr)=0
virtual void SetByteCount(UInt_t cntpos, Bool_t packInVersion=kFALSE)=0
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
virtual UInt_t WriteVersion(const TClass *cl, Bool_t useBcnt=kFALSE)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
TClass instances represent classes, structs and namespaces in the ROOT type system.
const char * GetImplFileName() const
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
Long_t Property() const override
Returns the properties of the TClass as a bit field stored as a Long_t value.
Bool_t HasDefaultConstructor(Bool_t testio=kFALSE) const
Return true if we have access to a constructor usable for I/O.
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
TDirectory::TContext keeps track and restore the current directory.
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
virtual TClass * IsA() const
TObject()
TObject constructor.
Regular expression class.
const char * Data() const
virtual void Streamer(TBuffer &)
Stream a string object.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
void(* DirAutoAdd_t)(void *, TDirectory *)
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.