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::cout, std::endl, std::map, std::vector, std::ifstream, std::ofstream, std::fstream, std::make_unique;
196 TNamed(other), _uuid(other._uuid), _classes(other._classes,this)
205 for(
auto * snap : static_range_cast<RooArgSet*>(other.
_snapshots)) {
208 snapClone->
setName(snap->GetName()) ;
213 for (map<string,RooArgSet>::const_iterator iter3 = other.
_namedSets.begin() ; iter3 != other.
_namedSets.end() ; ++iter3) {
237 if(newname && std::string(newname) !=
GetName()) {
238 out->SetName(newname);
277 std::vector<std::string> tokens =
ROOT::Split(fileSpec,
":");
280 if (tokens.size() != 3) {
281 std::ostringstream stream;
282 for (
const auto& token : tokens) {
283 stream <<
"\n\t" << token;
285 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR in file specification, expecting 'filename:wsname:objname', but '" << fileSpec <<
"' given."
286 <<
"\nTokens read are:" << stream.str() << endl;
290 const std::string&
filename = tokens[0];
291 const std::string& wsname = tokens[1];
292 const std::string& objname = tokens[2];
297 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR opening file " <<
filename << endl ;
304 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR: No object named " << wsname <<
" in file " <<
filename
305 <<
" or object is not a RooWorkspace" << endl ;
312 bool ret =
import(*warg,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) ;
317 bool ret =
import(*wdata,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) ;
321 coutE(InputArguments) <<
"RooWorkspace(" <<
GetName() <<
") ERROR: No RooAbsArg or RooAbsData object named " << objname
322 <<
" in workspace " << wsname <<
" in file " <<
filename << endl ;
338 ret |=
import(*oneArg,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) ;
390 pc.
defineString(
"conflictSuffix",
"RenameConflictNodes",0) ;
391 pc.
defineInt(
"renameConflictOrig",
"RenameConflictNodes",0,0) ;
393 pc.
defineString(
"allVarsSuffix",
"RenameAllVariables",0) ;
394 pc.
defineString(
"allVarsExcept",
"RenameAllVariables",1) ;
398 pc.
defineInt(
"useExistingNodes",
"RecycleConflictNodes",0,0) ;
400 pc.
defineInt(
"noRecursion",
"NoRecursion",0,0) ;
401 pc.
defineMutex(
"RenameConflictNodes",
"RenameAllNodes") ;
402 pc.
defineMutex(
"RenameConflictNodes",
"RecycleConflictNodes") ;
403 pc.
defineMutex(
"RenameAllNodes",
"RecycleConflictNodes") ;
404 pc.
defineMutex(
"RenameVariable",
"RenameAllVariables") ;
413 const char* suffixC = pc.
getString(
"conflictSuffix") ;
414 const char* suffixA = pc.
getString(
"allSuffix") ;
415 const char* suffixV = pc.
getString(
"allVarsSuffix") ;
416 const char* exceptVars = pc.
getString(
"allVarsExcept") ;
417 const char* varChangeIn = pc.
getString(
"varChangeIn") ;
418 const char* varChangeOut = pc.
getString(
"varChangeOut") ;
419 bool renameConflictOrig = pc.
getInt(
"renameConflictOrig") ;
420 Int_t useExistingNodes = pc.
getInt(
"useExistingNodes") ;
426 if (suffixC && strlen(suffixC)==0) suffixC = nullptr ;
427 if (suffixA && strlen(suffixA)==0) suffixA = nullptr ;
429 bool conflictOnly = suffixA ? false : true ;
430 const char* suffix = suffixA ? suffixA : suffixC ;
433 std::map<string,string> varMap ;
434 if (strlen(varChangeIn)>0) {
437 const std::vector<std::string> tokIn =
ROOT::Split(varChangeIn,
", ",
true);
438 const std::vector<std::string> tokOut =
ROOT::Split(varChangeOut,
", ",
true);
439 for (
unsigned int i=0; i < tokIn.size(); ++i) {
440 varMap.insert(std::make_pair(tokIn[i], tokOut[i]));
443 assert(tokIn.size() == tokOut.size());
448 std::set<string> exceptVarNames ;
449 if (exceptVars && strlen(exceptVars)) {
450 const std::vector<std::string> toks =
ROOT::Split(exceptVars,
", ",
true);
451 exceptVarNames.insert(toks.begin(), toks.end());
454 if (suffixV !=
nullptr && strlen(suffixV)>0) {
456 for (
const auto v : *vars) {
457 if (exceptVarNames.find(
v->GetName())==exceptVarNames.end()) {
458 varMap[
v->GetName()] =
Form(
"%s_%s",
v->GetName(),suffixV) ;
469 bool factoryMatch = (tagIn && tagWs && !strcmp(tagIn,tagWs)) ;
471 ((
RooAbsArg&)inArg).setAttribute(
"RooWorkspace::Recycle") ;
474 if (!suffix && wsarg && !useExistingNodes && !(inArg.
isFundamental() && !varMap[inArg.
GetName()].empty())) {
477 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR importing object named " << inArg.
GetName()
478 <<
": another instance with same name already in the workspace and no conflict resolution protocol specified" << endl ;
482 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") Object " << inArg.
GetName() <<
" is already in workspace!" << endl ;
488 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") Recycling existing object " << inArg.
GetName() <<
" created with identical factory specification" << endl ;
497 branchSet.
add(inArg) ;
502 for (
const auto branch : branchSet) {
504 if (wsbranch && wsbranch!=branch && !branch->
getAttribute(
"RooWorkspace::Recycle") && !useExistingNodes) {
505 conflictNodes.
add(*branch) ;
510 if (!conflictNodes.
empty() && !suffix && !useExistingNodes) {
511 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR object named " << inArg.
GetName() <<
": component(s) "
512 << conflictNodes <<
" already in the workspace and no conflict resolution protocol specified" << endl ;
525 conflictNodes.
add(branchSet) ;
529 string topName2 = cloneTop->
GetName() ;
530 if (!renameConflictOrig) {
532 for (
const auto cnode : conflictNodes) {
534 string origName = cnode2->
GetName() ;
537 string tag =
Form(
"ORIGNAME:%s",origName.c_str()) ;
544 if (cnode2==cloneTop) {
549 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName()
550 <<
") Resolving name conflict in workspace by changing name of imported node "
551 << origName <<
" to " << cnode2->
GetName() << endl ;
557 for (
const auto cnode : conflictNodes) {
559 string origName = cnode->GetName() ;
568 wsnode->
SetName(
Form(
"%s_%s",cnode->GetName(),suffix)) ;
569 wsnode->
SetTitle(
Form(
"%s (%s)",cnode->GetTitle(),suffix)) ;
572 for (
unsigned int n=1;
true; ++
n) {
573 string newname =
Form(
"%s_%s_%d",cnode->GetName(),suffix,
n) ;
575 wsnode->
SetName(newname.c_str()) ;
576 wsnode->
SetTitle(
Form(
"%s (%s %d)",cnode->GetTitle(),suffix,
n)) ;
582 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName()
583 <<
") Resolving name conflict in workspace by changing name of original node "
584 << origName <<
" to " << wsnode->
GetName() << endl ;
587 coutW(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") Internal error: expected to find existing node "
588 << origName <<
" to be renamed, but didn't find it..." << endl ;
595 if (strlen(varChangeIn)>0 || (suffixV && strlen(suffixV)>0)) {
598 for (
const auto cnode : cloneSet) {
600 if (varMap.find(cnode->GetName())!=varMap.end()) {
601 string origName = cnode->GetName() ;
602 cnode->SetName(varMap[cnode->GetName()].c_str()) ;
603 string tag =
Form(
"ORIGNAME:%s",origName.c_str()) ;
604 cnode->setAttribute(tag.c_str()) ;
605 if (!cnode->getStringAttribute(
"origName")) {
606 cnode->setStringAttribute(
"origName",origName.c_str()) ;
610 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") Changing name of variable "
611 << origName <<
" to " << cnode->GetName() <<
" on request" << endl ;
614 if (cnode==cloneTop) {
615 topName2 = cnode->GetName() ;
631 for (
const auto branch2 : branchSet2) {
633 conflictNodes2.
add(*branch2) ;
638 if (!conflictNodes2.
empty()) {
639 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR object named " << inArg.
GetName() <<
": component(s) "
640 << conflictNodes2 <<
" cause naming conflict after conflict resolution protocol was executed" << endl ;
645 for (
const auto node : cloneSet2) {
646 if (node->importWorkspaceHook(*
this)) {
647 coutE(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") ERROR object named " << node->
GetName()
648 <<
" has an error in importing in one or more of its auxiliary objects, aborting" << endl ;
655 for (
const auto node : cloneSet2) {
658 coutW(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") WARNING: problems import class code of object "
659 << node->
ClassName() <<
"::" << node->GetName() <<
", reading of workspace will require external definition of class" << endl ;
665 node->setExpensiveObjectCache(
_eocache) ;
673 if (!silence && useExistingNodes) {
674 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") using existing copy of " << node->
ClassName()
675 <<
"::" << node->GetName() <<
" for import of " << cloneTop2->
ClassName() <<
"::"
676 << cloneTop2->
GetName() << endl ;
681 nodesToBeDeleted.
addOwned(std::unique_ptr<RooAbsArg>{node});
688 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") importing " << node->ClassName() <<
"::"
689 << node->GetName() << endl ;
692 node->setWorkspace(*
this);
704 if (!recycledNodes.
empty()) {
705 for (
const auto node : cloneSet2) {
706 node->redirectServers(recycledNodes) ;
751 pc.
defineInt(
"embedded",
"Embedded",0,0) ;
761 const char* dsetName = pc.
getString(
"dsetName") ;
762 const char* varChangeIn = pc.
getString(
"varChangeIn") ;
763 const char* varChangeOut = pc.
getString(
"varChangeOut") ;
764 bool embedded = pc.
getInt(
"embedded") ;
768 coutI(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") importing dataset " << inData.
GetName() << endl ;
771 if (dsetName && strlen(dsetName)==0) {
782 if (dsetName && dataList.
FindObject(dsetName)) {
783 coutE(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") ERROR dataset with name " << dsetName <<
" already exists in workspace, import aborted" << endl ;
787 coutE(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") ERROR dataset with name " << inData.
GetName() <<
" already exists in workspace, import aborted" << endl ;
795 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") changing name of dataset from " << inData.
GetName() <<
" to " << dsetName << endl ;
803 if (strlen(varChangeIn)>0) {
805 const std::vector<std::string> tokIn =
ROOT::Split(varChangeIn,
",");
806 const std::vector<std::string> tokOut =
ROOT::Split(varChangeOut,
",");
807 for (
unsigned int i=0; i < tokIn.size(); ++i) {
809 coutI(ObjectHandling) <<
"RooWorkSpace::import(" <<
GetName() <<
") changing name of dataset observable " << tokIn[i] <<
" to " << tokOut[i] << endl ;
810 clone->changeObservableName(tokIn[i].c_str(), tokOut[i].c_str());
817 if (!
arg(carg->GetName())) {
850 coutW(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") WARNING redefining previously defined named set " <<
name << endl ;
858 if (!
arg(sarg->GetName())) {
862 coutE(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") ERROR set constituent \"" << sarg->
GetName()
863 <<
"\" is not in workspace and importMissing option is disabled" << endl ;
867 wsargs.
add(*
arg(sarg->GetName())) ;
888 coutW(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName()
889 <<
") WARNING redefining previously defined named set " <<
name << endl;
908 coutW(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") WARNING redefining previously defined named set " <<
name << endl ;
914 for (
const std::string& token :
ROOT::Split(contentList,
",")) {
916 if (!
arg(token.c_str())) {
917 coutE(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") ERROR proposed set constituent \"" << token
918 <<
"\" is not in workspace" << endl ;
921 wsargs.
add(*
arg(token.c_str())) ;
943 for (
const std::string& token :
ROOT::Split(newContents,
",")) {
945 if (!
arg(token.c_str())) {
946 coutE(InputArguments) <<
"RooWorkspace::defineSet(" <<
GetName() <<
") ERROR proposed set constituent \"" << token
947 <<
"\" is not in workspace" << endl ;
950 wsargs.
add(*
arg(token.c_str())) ;
968 return (i!=
_namedSets.end()) ? &(i->second) :
nullptr;
981 coutE(InputArguments) <<
"RooWorkspace::renameSet(" <<
GetName() <<
") ERROR a set with name " <<
name
982 <<
" does not exist" << endl ;
988 coutE(InputArguments) <<
"RooWorkspace::renameSet(" <<
GetName() <<
") ERROR a set with name " << newName
989 <<
" already exists" << endl ;
1012 coutE(InputArguments) <<
"RooWorkspace::removeSet(" <<
GetName() <<
") ERROR a set with name " <<
name
1013 <<
" does not exist" << endl ;
1119 TString className = carg->ClassName() ;
1121 coutW(ObjectHandling) <<
"RooWorkspace::import(" <<
GetName() <<
") WARNING: problems import class code of object "
1122 << carg->ClassName() <<
"::" << carg->GetName() <<
", reading of workspace will require external definition of class" << endl ;
1163 snapshot->assign(params) ;
1167 coutI(ObjectHandling) <<
"RooWorkspace::saveSnapshot(" <<
GetName() <<
") replacing previous snapshot with name " <<
name << endl ;
1187 coutE(ObjectHandling) <<
"RooWorkspace::loadSnapshot(" <<
GetName() <<
") no snapshot with name " <<
name <<
" is available" << endl ;
1193 actualParams.
assign(*snap) ;
1275 for (
const std::string& token :
ROOT::Split(nameList,
",")) {
1280 std::stringstream ss;
1281 ss <<
" RooWorkspace::argSet(" <<
GetName() <<
") no RooAbsArg named \"" << token <<
"\" in workspace" ;
1282 const std::string errorMsg = ss.str();
1283 coutE(InputArguments) << errorMsg << std::endl;
1284 throw std::runtime_error(errorMsg);
1302 return tmp->isFundamental() ? tmp :
nullptr;
1447 std::list<RooAbsData*> ret ;
1448 for(
auto * dat : static_range_cast<RooAbsData*>(
_dataList)) {
1449 ret.push_back(dat) ;
1460 std::list<RooAbsData*> ret ;
1462 ret.push_back(dat) ;
1474 std::list<TObject*> ret ;
1478 if (gobj->IsA()==RooTObjWrap::Class()) {
1479 ret.push_back((
static_cast<RooTObjWrap*
>(gobj))->obj()) ;
1481 ret.push_back(gobj) ;
1513 if (mapEntry && strlen(mapEntry)>0) {
1523 if (implfile.empty() || declfile.empty()) {
1524 oocoutE(
_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo(" <<
_wspace->
GetName() <<
") ERROR: cannot retrieve code file names for class "
1525 << tc->
GetName() <<
" through ROOT TClass interface, unable to import code" << endl ;
1541 << tc->
GetName() <<
" : it cannot be persisted because it doesn't have a default constructor. Please fix " << endl ;
1548 std::string declpath;
1549 std::string implpath;
1572 if (declpath.empty()) {
1574 << tc->
GetName() <<
" because header file " << declfile <<
" is not found in current directory nor in $ROOTSYS" ;
1588 ooccoutW(
_wspace,ObjectHandling) <<
". To fix this problem, add the required directory to the search "
1589 <<
"path using RooWorkspace::addClassDeclImportDir(const char* dir)" << endl ;
1617 if (implpath.empty()) {
1619 << tc->
GetName() <<
" because implementation file " << implfile <<
" is not found in current directory nor in $ROOTSYS" ;
1633 ooccoutW(
_wspace,ObjectHandling) <<
". To fix this problem add the required directory to the search "
1634 <<
"path using RooWorkspace::addClassImplImportDir(const char* dir)" << endl;
1652 const std::string declfilename = !declpath.empty() ?
gSystem->
BaseName(declpath.c_str())
1656 int dotpos2 = strrchr(declfilename.c_str(),
'.') - declfilename.c_str() ;
1657 string declfilebase = declfilename.substr(0,dotpos2) ;
1658 string declfileext = declfilename.substr(dotpos2+1) ;
1660 list<string> extraHeaders ;
1663 if (
_fmap.find(declfilebase) ==
_fmap.end()) {
1666 std::fstream fdecl(!declpath.empty() ? declpath.c_str() : declfile.c_str());
1671 <<
") ERROR opening declaration file " << declfile << endl ;
1676 <<
") importing code of class " << tc->
GetName()
1677 <<
" from " << (!implpath.empty() ? implpath.c_str() : implfile.c_str())
1678 <<
" and " << (!declpath.empty() ? declpath.c_str() : declfile.c_str()) << endl ;
1683 while(fdecl.getline(buf,1023)) {
1686 bool processedInclude = false ;
1687 char* extincfile = nullptr ;
1690 if (strstr(buf,
"#include")) {
1693 strlcpy(tmp, buf, 64000);
1694 bool stdinclude = strchr(buf,
'<');
1695 strtok(tmp,
" <\"");
1696 char *incfile = strtok(
nullptr,
" <>\"");
1701 hpath +=
"/include/";
1705 <<
") scheduling include file " << incfile <<
" for import" << endl;
1706 extraHeaders.push_back(incfile);
1707 extincfile = incfile;
1708 processedInclude =
true;
1713 if (processedInclude) {
1714 decl +=
"// external include file below retrieved from workspace code storage\n" ;
1715 decl +=
Form(
"#include \"%s\"\n",extincfile) ;
1723 fstream fimpl(!implpath.empty() ? implpath.c_str() : implfile.c_str()) ;
1728 <<
") ERROR opening implementation file " << implfile << endl ;
1735 while(fimpl.getline(buf,1023)) {
1739 bool foundSelfInclude=false ;
1740 bool processedInclude = false ;
1741 char* extincfile = nullptr ;
1744 if (strstr(buf,
"#include")) {
1747 strlcpy(tmp, buf, 64000);
1748 bool stdinclude = strchr(buf,
'<');
1749 strtok(tmp,
" <\"");
1750 char *incfile = strtok(
nullptr,
" <>\"");
1752 if (strstr(incfile, declfilename.c_str())) {
1753 foundSelfInclude =
true;
1756 if (!stdinclude && !foundSelfInclude) {
1759 hpath +=
"/include/";
1764 <<
") scheduling include file " << incfile <<
" for import" << endl;
1765 extraHeaders.push_back(incfile);
1766 extincfile = incfile;
1767 processedInclude =
true;
1774 if (foundSelfInclude) {
1777 impl +=
"// class declaration include file below retrieved from workspace code storage\n" ;
1778 impl +=
Form(
"#include \"%s.%s\"\n",declfilebase.c_str(),declfileext.c_str()) ;
1779 }
else if (processedInclude) {
1780 impl +=
"// external include file below retrieved from workspace code storage\n" ;
1781 impl +=
Form(
"#include \"%s\"\n",extincfile) ;
1789 _fmap[declfilebase]._hfile = decl ;
1790 _fmap[declfilebase]._cxxfile = impl ;
1791 _fmap[declfilebase]._hext = declfileext ;
1794 for (list<string>::iterator ehiter = extraHeaders.begin() ; ehiter != extraHeaders.end() ; ++ehiter ) {
1798 eh.
_hname = ehiter->c_str() ;
1799 fstream fehdr(ehiter->c_str()) ;
1802 while(fehdr.getline(buf2,1023)) {
1805 if (strstr(buf2,
"#include")) {
1808 strlcpy(tmp, buf2, 64000);
1809 bool stdinclude = strchr(buf,
'<');
1810 strtok(tmp,
" <\"");
1811 char *incfile = strtok(
nullptr,
" <>\"");
1816 hpath +=
"/include/";
1820 <<
") scheduling recursive include file " << incfile <<
" for import"
1822 extraHeaders.push_back(incfile);
1830 eh.
_hfile = ehimpl.c_str();
1832 _ehmap[ehiter->c_str()] = eh;
1840 <<
") code of class " << tc->
GetName()
1841 <<
" was already imported from " << (!implpath.empty() ? implpath : implfile)
1842 <<
" and " << (!declpath.empty() ? declpath.c_str() : declfile.c_str()) << std::endl;
1855 std::list<TClass*> bases ;
1856 for(
auto * base : static_range_cast<TBaseClass*>(*bl)) {
1857 if (baseNameList.
Length()>0) {
1858 baseNameList +=
"," ;
1860 baseNameList += base->GetClassPointer()->GetName() ;
1861 bases.push_back(base->GetClassPointer()) ;
1870 for(
TClass* bclass : bases) {
1890 if (
_dir)
return true ;
1892 std::string title=
"TDirectory representation of RooWorkspace " + std::string(
GetName());
1917 if (oldObj && !replaceExisting) {
1918 coutE(InputArguments) <<
"RooWorkspace::import(" <<
GetName() <<
") generic object with name "
1919 <<
object.
GetName() <<
" is already in workspace and replaceExisting flag is set to false" << endl ;
1925 object.IsA()->SetDirectoryAutoAdd(
nullptr);
1935 object.IsA()->SetDirectoryAutoAdd(func);
1957 if (oldObj && !replaceExisting) {
1958 coutE(InputArguments) <<
"RooWorkspace::import(" <<
GetName() <<
") generic object with name "
1959 << aliasName <<
" is already in workspace and replaceExisting flag is set to false" << endl ;
1964 auto wrapper =
new RooTObjWrap(
object.
Clone()) ;
1966 wrapper->setOwning(
true) ;
1967 wrapper->SetName(aliasName) ;
1968 wrapper->SetTitle(aliasName) ;
2012 if (ret)
return ret ;
2016 if (ret)
return ret ;
2033 if (!gobj)
return nullptr;
2036 if (gobj->
IsA()==RooTObjWrap::Class())
return (
static_cast<RooTObjWrap*
>(gobj))->obj() ;
2058 TFile f(fileName,recreate?
"RECREATE":
"UPDATE") ;
2073 cxcoutD(ObjectHandling) <<
"INFO: Creating RooFactoryWSTool associated with this workspace" << endl ;
2074 _factory = make_unique<RooFactoryWSTool>(*
this);
2098 bool treeMode(
false) ;
2099 bool verbose(
false);
2100 if (
TString(opts).Contains(
"t")) {
2103 if (
TString(opts).Contains(
"v")) {
2107 cout << endl <<
"RooWorkspace(" <<
GetName() <<
") " <<
GetTitle() <<
" contents" << endl << endl ;
2127 if (!parg->hasClients()) {
2136 if (!parg->hasClients()) {
2137 funcSet.
add(*parg) ;
2144 if (!parg->hasClients()) {
2145 catfuncSet.
add(*parg) ;
2153 convResoSet.
add(*parg) ;
2155 resoSet.
add(*parg) ;
2168 funcSet.
add(*parg) ;
2173 catfuncSet.
add(*parg) ;
2191 if (!varSet.
empty()) {
2193 cout <<
"variables" << endl ;
2194 cout <<
"---------" << endl ;
2195 cout << varSet << endl ;
2199 if (!pdfSet.
empty()) {
2200 cout <<
"p.d.f.s" << endl ;
2201 cout <<
"-------" << endl ;
2205 parg->printComponentTree() ;
2214 if (!resoSet.
empty()) {
2215 cout <<
"analytical resolution models" << endl ;
2216 cout <<
"----------------------------" << endl ;
2225 if (!funcSet.
empty()) {
2226 cout <<
"functions" << endl ;
2227 cout <<
"--------" << endl ;
2231 parg->printComponentTree() ;
2239 if (!catfuncSet.
empty()) {
2240 cout <<
"category functions" << endl ;
2241 cout <<
"------------------" << endl ;
2245 parg->printComponentTree() ;
2254 cout <<
"datasets" << endl ;
2255 cout <<
"--------" << endl ;
2256 for(
auto * data2 : static_range_cast<RooAbsData*>(
_dataList)) {
2257 std::cout << data2->ClassName() <<
"::" << data2->GetName() << *data2->get() << std::endl;
2259 std::cout << std::endl ;
2263 cout <<
"embedded datasets (in pdfs and functions)" << endl ;
2264 cout <<
"-----------------------------------------" << endl ;
2266 cout << data2->ClassName() <<
"::" << data2->GetName() << *data2->get() << endl ;
2272 cout <<
"parameter snapshots" << endl ;
2273 cout <<
"-------------------" << endl ;
2274 for(
auto * snap : static_range_cast<RooArgSet*>(
_snapshots)) {
2275 cout << snap->GetName() <<
" = (" ;
2278 if (first) { first=false ; }
else { cout <<
"," ; }
2279 cout <<
a->GetName() <<
"=" ;
2280 a->printValue(cout) ;
2281 if (
a->isConstant()) {
2285 cout <<
")" << endl ;
2292 cout <<
"named sets" << endl ;
2293 cout <<
"----------" << endl ;
2294 for (map<string,RooArgSet>::const_iterator it =
_namedSets.begin() ; it !=
_namedSets.end() ; ++it) {
2295 if (verbose || !isCacheSet(it->first)) {
2296 cout << it->first <<
":" << it->second << endl;
2305 cout <<
"generic objects" << endl ;
2306 cout <<
"---------------" << endl ;
2308 if (gobj->IsA()==RooTObjWrap::Class()) {
2309 cout << (static_cast<RooTObjWrap*>(gobj))->
obj()->
ClassName() <<
"::" << gobj->GetName() << endl ;
2311 cout << gobj->ClassName() <<
"::" << gobj->GetName() << endl ;
2319 cout <<
"study modules" << endl ;
2320 cout <<
"-------------" << endl ;
2322 cout << smobj->ClassName() <<
"::" << smobj->GetName() << endl ;
2329 cout <<
"embedded class code" << endl ;
2330 cout <<
"-------------------" << endl ;
2336 cout <<
"embedded precalculated expensive components" << endl ;
2337 cout <<
"-------------------------------------------" << endl ;
2370 _fmap[
name]._hext.Streamer(R__b);
2371 _fmap[
name]._hfile.Streamer(R__b);
2372 _fmap[
name]._cxxfile.Streamer(R__b);
2381 _c2fmap[
name]._baseName.Streamer(R__b);
2382 _c2fmap[
name]._fileBase.Streamer(R__b);
2392 _ehmap[
name]._hname.Streamer(R__b);
2393 _ehmap[
name]._hfile.Streamer(R__b);
2400 _compiledOK = !compileClasses();
2408 UInt_t count = _fmap.size();
2410 map<TString, ClassFiles>::iterator iter = _fmap.begin();
2411 while (iter != _fmap.end()) {
2412 TString key_copy(iter->first);
2414 iter->second._hext.Streamer(R__b);
2415 iter->second._hfile.Streamer(R__b);
2416 iter->second._cxxfile.Streamer(R__b);
2422 count = _c2fmap.size();
2424 map<TString, ClassRelInfo>::iterator iter2 = _c2fmap.begin();
2425 while (iter2 != _c2fmap.end()) {
2426 TString key_copy(iter2->first);
2428 iter2->second._baseName.Streamer(R__b);
2429 iter2->second._fileBase.Streamer(R__b);
2434 count = _ehmap.size();
2436 map<TString, ExtraHeader>::iterator iter3 = _ehmap.begin();
2437 while (iter3 != _ehmap.end()) {
2438 TString key_copy(iter3->first);
2440 iter3->second._hname.Streamer(R__b);
2441 iter3->second._hfile.Streamer(R__b);
2466 node->ioStreamerPass2();
2473 node->setExpensiveObjectCache(
_eocache);
2474 node->setWorkspace(*
this);
2475#ifdef ROOFIT_LEGACY_EVAL_BACKEND
2478 if (tmp->isSealed() && tmp->sealNotice() && strlen(tmp->sealNotice()) > 0) {
2479 cout <<
"RooWorkspace::Streamer(" <<
GetName() <<
") " << node->
ClassName() <<
"::" << node->GetName()
2480 <<
" : " << tmp->sealNotice() << endl;
2490 map<RooAbsArg *, vector<RooAbsArg *>> extClients;
2491 map<RooAbsArg *, vector<RooAbsArg *>> extValueClients;
2492 map<RooAbsArg *, vector<RooAbsArg *>> extShapeClients;
2497 std::vector<RooAbsArg *> clientsTmp{tmparg->_clientList.begin(), tmparg->_clientList.end()};
2498 for (
auto client : clientsTmp) {
2501 const auto refCount = tmparg->_clientList.refCount(client);
2502 auto &bufferVec = extClients[tmparg];
2504 bufferVec.insert(bufferVec.end(), refCount, client);
2505 tmparg->_clientList.Remove(client,
true);
2510 clientsTmp.assign(tmparg->_clientListValue.begin(), tmparg->_clientListValue.end());
2511 for (
auto vclient : clientsTmp) {
2513 cxcoutD(ObjectHandling) <<
"RooWorkspace::Streamer(" <<
GetName() <<
") element " << tmparg->GetName()
2514 <<
" has external value client link to " << vclient <<
" (" << vclient->GetName()
2515 <<
") with ref count " << tmparg->_clientListValue.refCount(vclient) << endl;
2517 const auto refCount = tmparg->_clientListValue.refCount(vclient);
2518 auto &bufferVec = extValueClients[tmparg];
2520 bufferVec.insert(bufferVec.end(), refCount, vclient);
2521 tmparg->_clientListValue.Remove(vclient,
true);
2526 clientsTmp.assign(tmparg->_clientListShape.begin(), tmparg->_clientListShape.end());
2527 for (
auto sclient : clientsTmp) {
2529 cxcoutD(ObjectHandling) <<
"RooWorkspace::Streamer(" <<
GetName() <<
") element " << tmparg->GetName()
2530 <<
" has external shape client link to " << sclient <<
" (" << sclient->GetName()
2531 <<
") with ref count " << tmparg->_clientListShape.refCount(sclient) << endl;
2533 const auto refCount = tmparg->_clientListShape.refCount(sclient);
2534 auto &bufferVec = extShapeClients[tmparg];
2536 bufferVec.insert(bufferVec.end(), refCount, sclient);
2537 tmparg->_clientListShape.Remove(sclient,
true);
2546 for (
auto &iterx : extClients) {
2547 for (
auto client : iterx.second) {
2548 iterx.first->_clientList.Add(client);
2552 for (
auto &iterx : extValueClients) {
2553 for (
auto client : iterx.second) {
2554 iterx.first->_clientListValue.Add(client);
2558 for (
auto &iterx : extShapeClients) {
2559 for (
auto client : iterx.second) {
2560 iterx.first->_clientListShape.Add(client);
2575 map<TString,ClassRelInfo>::const_iterator iter = _c2fmap.begin() ;
2576 while(iter!=_c2fmap.end()) {
2580 ret += iter->first ;
2593 static const UInt_t crctab[256] = { 0x00000000,
2594 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
2595 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
2596 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
2597 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
2598 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
2599 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
2600 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
2601 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
2602 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
2603 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
2604 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
2605 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
2606 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
2607 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
2608 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
2609 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
2610 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
2611 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
2612 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
2613 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
2614 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
2615 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
2616 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
2617 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
2618 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
2619 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
2620 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
2621 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
2622 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
2623 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
2624 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
2625 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
2626 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
2627 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
2628 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
2629 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
2630 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
2631 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
2632 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
2633 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
2634 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
2635 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
2636 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
2637 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
2638 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
2639 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
2640 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
2641 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
2642 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
2643 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
2644 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
2648 while (sz--) crc = (crc << 8) ^
UInt_t(*
data++) ^ crctab[crc >> 24];
2656 unsigned long sz = strlen(
data);
2657 switch (strlen(
data)) {
2669 return crc32(
data + 4, sz - 4, (
data[0] << 24) | (
data[1] << 16) |
2687 bool haveDir=false ;
2692 bool writeExtraHeaders(
false) ;
2695 map<TString,ClassRelInfo>::iterator iter = _c2fmap.begin() ;
2696 while(iter!=_c2fmap.end()) {
2698 oocxcoutD(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() now processing class " << iter->first.Data() << endl ;
2702 oocoutI(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Embedded class "
2703 << iter->first <<
" already in ROOT class table, skipping" << endl ;
2713 oocoutI(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() reusing code export directory " << dirName.c_str()
2714 <<
" to extract coded embedded in workspace" << endl ;
2717 oocoutI(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() creating code export directory " << dirName.c_str()
2718 <<
" to extract coded embedded in workspace" << endl ;
2720 oocoutE(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR creating code export directory " << dirName.c_str()
2721 <<
" to extract coded embedded in workspace" << endl ;
2730 if (!writeExtraHeaders) {
2731 writeExtraHeaders = true ;
2733 map<TString,ExtraHeader>::iterator extraIter = _ehmap.begin() ;
2734 while(extraIter!=_ehmap.end()) {
2737 bool needEHWrite=true ;
2738 string fdname =
Form(
"%s/%s",dirName.c_str(),extraIter->second._hname.Data()) ;
2739 ifstream ifdecl(fdname.c_str()) ;
2743 while (ifdecl.getline(buf, 64000)) {
2748 UInt_t crcWS = crc32(extraIter->second._hfile.Data());
2749 needEHWrite = (crcFile != crcWS);
2754 oocoutI(_wspace, ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Extracting extra header file "
2760 ofstream fdecl(fdname.c_str());
2762 oocoutE(_wspace, ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR opening file " << fdname
2763 <<
" for writing" << endl;
2766 fdecl << extraIter->second._hfile.Data();
2775 ClassFiles& cfinfo = _fmap[iter->second._fileBase] ;
2777 oocxcoutD(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() now processing file with base " << iter->second._fileBase << endl ;
2781 oocxcoutD(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() file with base name " << iter->second._fileBase
2782 <<
" has already been extracted, skipping to next class" << endl ;
2787 bool needDeclWrite=true ;
2788 string fdname =
Form(
"%s/%s.%s",dirName.c_str(),iter->second._fileBase.Data(),cfinfo.
_hext.
Data()) ;
2789 ifstream ifdecl(fdname.c_str()) ;
2793 while (ifdecl.getline(buf, 64000)) {
2799 needDeclWrite = (crcFile!=crcWS) ;
2803 if (needDeclWrite) {
2804 oocoutI(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Extracting declaration code of class " << iter->first <<
", file " << fdname << endl ;
2805 ofstream fdecl(fdname.c_str()) ;
2807 oocoutE(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR opening file "
2808 << fdname <<
" for writing" << endl ;
2816 bool needImplWrite=true ;
2817 string finame =
Form(
"%s/%s.cxx",dirName.c_str(),iter->second._fileBase.Data()) ;
2818 ifstream ifimpl(finame.c_str()) ;
2822 while (ifimpl.getline(buf, 64000)) {
2828 needImplWrite = (crcFile!=crcWS) ;
2832 if (needImplWrite) {
2833 oocoutI(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Extracting implementation code of class " << iter->first <<
", file " << finame << endl ;
2834 ofstream fimpl(finame.c_str()) ;
2836 oocoutE(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR opening file"
2837 << finame <<
" for writing" << endl ;
2846 oocxcoutD(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() marking code unit " << iter->second._fileBase <<
" as extracted" << endl ;
2849 oocoutI(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() Compiling code unit " << iter->second._fileBase.Data() <<
" to define class " << iter->first << endl ;
2853 oocoutE(_wspace,ObjectHandling) <<
"RooWorkspace::CodeRepo::compileClasses() ERROR compiling class " << iter->first.Data() <<
", to fix this you can do the following: " << endl
2854 <<
" 1) Fix extracted source code files in directory " << dirName.c_str() <<
"/" << endl
2855 <<
" 2) In clean ROOT session compiled fixed classes by hand using '.x " << dirName.c_str() <<
"/ClassName.cxx+'" << endl
2856 <<
" 3) Reopen file with RooWorkspace with broken source code in UPDATE mode. Access RooWorkspace to force loading of class" << endl
2857 <<
" Broken instances in workspace will _not_ be compiled, instead precompiled fixed instances will be used." << endl
2858 <<
" 4) Reimport fixed code in workspace using 'RooWorkspace::importClassCode(\"*\",true)' method, Write() updated workspace to file and close file" << endl
2859 <<
" 5) Reopen file in clean ROOT session to confirm that problems are fixed" << endl ;
2886 coutE(ObjectHandling) <<
"RooWorkspace::WSDir::Add(" <<
GetName() <<
") ERROR: Directory is read-only representation of a RooWorkspace, use RooWorkspace::import() to add objects" << endl ;
2888 InternalAppend(
obj) ;
2899 coutE(ObjectHandling) <<
"RooWorkspace::WSDir::Add(" <<
GetName() <<
") ERROR: Directory is read-only representation of a RooWorkspace, use RooWorkspace::import() to add objects" << endl ;
2901 InternalAppend(
obj) ;
2913 if (removedObj ==
_dir)
_dir =
nullptr;
2924 std::vector<std::string> invalidSets;
2927 auto const& setName =
c.first;
2928 auto&
set =
c.second;
2929 std::size_t oldSize =
set.
size();
2934 if(
set.
size() < oldSize && isCacheSet(setName)) {
2935 invalidSets.emplace_back(setName);
2940 for(std::string
const& setName : invalidSets) {
TObject * clone(const char *newname) const override
R__EXTERN TClassTable * gClassTable
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TSystem * gSystem
Common abstract base class for objects that represent a value and a "shape" in RooFit.
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? Fundamental-type subclasses overrid...
A space to attach TBranches.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
const char * GetName() const override
Returns name of object.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void RecursiveRemove(TObject *obj) override
If one of the TObject we have a referenced to is deleted, remove the reference.
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...
Storage_t::size_type size() const
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.
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
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.
Abstract base class for test statistics objects that evaluate a function or PDF at each point of a gi...
Abstract interface for all probability density functions.
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.
bool containsInstance(const RooAbsArg &var) const override
Check if this exact instance is in this collection.
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.
void importCacheObjects(RooExpensiveObjectCache &other, const char *ownerName, bool verbose=false)
A wrapper around TIterator derivatives.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
void RecursiveRemove(TObject *obj) override
If one of the TObject we have a referenced to is deleted, remove the reference.
bool Replace(const TObject *oldArg, const TObject *newArg)
Replace object 'oldArg' in collection with new object 'newArg'.
Int_t getHashTableSize() const
void Delete(Option_t *o=nullptr) override
Remove all elements in collection and delete all elements NB: Collection does not own elements,...
TObject * find(const char *name) const
Return pointer to object with given name in collection.
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.
virtual bool Remove(TObject *arg)
Remove object from collection.
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.
virtual void ReplaceWS(RooWorkspace *ws)=0
Set the workspace irrespective of what the previous workspace is.
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...
TClass * IsA() const override
void Append(TObject *, bool) override
Overload TDirectory interface method to prohibit insertion of objects in read-only directory workspac...
Persistable container for RooFit projects.
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.
TIterator * componentIterator() const R__DEPRECATED(6
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.
~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.
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.
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.
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
static DictFuncPtr_t GetDict(const char *cname)
Given the class name returns the Dictionary() function of a class (uses hash of name).
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.
Bool_t cd() override
Change current directory to "this" directory.
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
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.
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
Iterator abstract base class.
The TNamed class is the base class for all named ROOT classes.
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 void RecursiveRemove(TObject *obj)
Recursively remove this object from a list.
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
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
virtual const char * Getenv(const char *env)
Get environment variable.
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
virtual int MakeDirectory(const char *name)
Make a directory.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual int CompileMacro(const char *filename, Option_t *opt="", const char *library_name="", const char *build_dir="", UInt_t dirmode=0)
This method compiles and loads a shared library containing the code from the file "filename".
virtual TString GetDirName(const char *pathname)
Return the directory name in pathname.
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.