66#define BUFFER_SIZE 64000
151 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createFactory() ERROR: variable with name '" <<
name <<
"' already exists" << endl ;
178 const size_t tmpSize = strlen(stateNameList)+1;
179 char *tmp =
new char[tmpSize] ;
180 strlcpy(tmp,stateNameList,tmpSize) ;
184 char*
sep = strchr(tok,
'=') ;
207 static bool isEnum(
const char* classname) {
209 ClassInfo_t* cls =
gInterpreter->ClassInfo_Factory(classname);
216 static bool isValidEnumValue(
const char* enumName,
const char* enumConstantName) {
219 if (!enumName)
return false;
222 if (!enumName)
return false;
225 if (theEnum->GetConstant(enumConstantName))
return true;
227 auto tmp = strstr(enumConstantName,
"::");
229 auto enumConstantNameNoScope = tmp+2;
230 if (theEnum->GetConstant(enumConstantNameNoScope))
return true;
236 static pair<list<string>,
unsigned int> ctorArgs(
const char* classname,
UInt_t nMinArg) {
244 ClassInfo_t* cls =
gInterpreter->ClassInfo_Factory(classname);
245 MethodInfo_t* func =
gInterpreter->MethodInfo_Factory(cls);
258 if (
string(classname) !=
gInterpreter->MethodInfo_TypeName(func)) {
264 if (nargs==0 || nargs==
gInterpreter->MethodInfo_NDefaultArg(func)) {
268 MethodArgInfo_t* arg =
gInterpreter->MethodArgInfo_Factory(func);
271 const char* argTypeName =
gInterpreter->MethodArgInfo_TypeName(arg);
272 if (nreq<2 && ((
string(
"char*") != argTypeName
274 &&
string(
"const char*") != argTypeName)) {
277 ret.push_back(argTypeName) ;
278 if(!
gInterpreter->MethodArgInfo_DefaultValue(arg)) nreq++;
283 if (ret.size()<nMinArg) {
291 return pair<list<string>,
unsigned int>(ret,nreq);
306 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR class " << className <<
" not found in factory alias table, nor in ROOT class table" << endl;
315 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR class " << className <<
" does not inherit from RooAbsArg" << endl;
322 size_t blevel = 0, end_tok, start_tok = 0;
323 bool litmode =
false;
324 for (end_tok = 0; end_tok < tmp.length(); end_tok++) {
326 if (tmp[end_tok]==
'{' || tmp[end_tok]==
'(' || tmp[end_tok]==
'[') blevel++;
327 if (tmp[end_tok]==
'}' || tmp[end_tok]==
')' || tmp[end_tok]==
']') blevel--;
330 if (tmp[end_tok]==
'"' || tmp[end_tok]==
'\'') litmode = !litmode;
335 if (litmode ==
false && blevel == 0 && tmp[end_tok] ==
',') {
336 _args.push_back(tmp.substr(start_tok, end_tok - start_tok));
337 start_tok = end_tok+1;
340 _args.push_back(tmp.substr(start_tok, end_tok));
343 pair<list<string>,
unsigned int> ca = ctorArgs(className,
_args.size()+2) ;
344 if (ca.first.size()==0) {
345 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR no suitable constructor found for class " << className << endl ;
352 if (
_args.size()+2<ca.second ||
_args.size()+2>ca.first.size()) {
353 if (ca.second==ca.first.size()) {
354 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR number of arguments provided (" <<
_args.size() <<
") for class is invalid, " << className
355 <<
" expects " << ca.first.size()-2 << endl ;
358 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR number of arguments provided (" <<
_args.size() <<
") for class is invalid " << className
359 <<
" expect number between " << ca.second-2 <<
" and " << ca.first.size()-2 << endl ;
366 string cintExpr(
Form(
"new %s(\"%s\",\"%s\"",className,objName,objName)) ;
374 list<string>::iterator ti = ca.first.begin() ; ++ti ; ++ti ;
375 for (vector<string>::iterator ai =
_args.begin() ; ai !=
_args.end() ; ++ai,++ti,++i) {
376 if ((*ti)==
"RooAbsReal&" || (*ti)==
"const RooAbsReal&") {
378 cintExpr +=
Form(
",RooFactoryWSTool::as_FUNC(%d)",i) ;
379 }
else if ((*ti)==
"RooAbsArg&" || (*ti)==
"const RooAbsArg&") {
381 cintExpr +=
Form(
",RooFactoryWSTool::as_ARG(%d)",i) ;
382 }
else if ((*ti)==
"RooRealVar&" || (*ti)==
"const RooRealVar&") {
384 cintExpr +=
Form(
",RooFactoryWSTool::as_VAR(%d)",i) ;
385 }
else if ((*ti)==
"RooAbsRealLValue&" || (*ti)==
"const RooAbsRealLValue&") {
387 cintExpr +=
Form(
",RooFactoryWSTool::as_VARLV(%d)",i) ;
388 }
else if ((*ti)==
"RooCategory&" || (*ti)==
"const RooCategory&") {
390 cintExpr +=
Form(
",RooFactoryWSTool::as_CAT(%d)",i) ;
391 }
else if ((*ti)==
"RooAbsCategory&" || (*ti)==
"const RooAbsCategory&") {
393 cintExpr +=
Form(
",RooFactoryWSTool::as_CATFUNC(%d)",i) ;
394 }
else if ((*ti)==
"RooAbsCategoryLValue&" || (*ti)==
"const RooAbsCategoryLValue&") {
396 cintExpr +=
Form(
",RooFactoryWSTool::as_CATLV(%d)",i) ;
397 }
else if ((*ti)==
"RooAbsPdf&" || (*ti)==
"const RooAbsPdf&") {
399 cintExpr +=
Form(
",RooFactoryWSTool::as_PDF(%d)",i) ;
400 }
else if ((*ti)==
"RooResolutionModel&" || (*ti)==
"const RooResolutionModel&") {
402 cintExpr +=
Form(
",RooFactoryWSTool::as_RMODEL(%d)",i) ;
403 }
else if ((*ti)==
"RooAbsData&" || (*ti)==
"const RooAbsData&") {
405 cintExpr +=
Form(
",RooFactoryWSTool::as_DATA(%d)",i) ;
406 }
else if ((*ti)==
"RooDataSet&" || (*ti)==
"const RooDataSet&") {
408 cintExpr +=
Form(
",RooFactoryWSTool::as_DSET(%d)",i) ;
409 }
else if ((*ti)==
"RooDataHist&" || (*ti)==
"const RooDataHist&") {
411 cintExpr +=
Form(
",RooFactoryWSTool::as_DHIST(%d)",i) ;
412 }
else if ((*ti)==
"const RooArgSet&") {
414 cintExpr +=
Form(
",RooFactoryWSTool::as_SET(%d)",i) ;
415 }
else if ((*ti)==
"const RooArgList&") {
417 cintExpr +=
Form(
",RooFactoryWSTool::as_LIST(%d)",i) ;
418 }
else if ((*ti)==
"const char*") {
420 cintExpr +=
Form(
",RooFactoryWSTool::as_STRING(%d)",i) ;
421 }
else if ((*ti)==
"Int_t" || (*ti)==
"int" || (*ti)==
"Bool_t" || (*ti)==
"bool") {
423 cintExpr +=
Form(
",RooFactoryWSTool::as_INT(%d)",i) ;
424 }
else if ((*ti)==
"Double_t") {
426 cintExpr +=
Form(
",RooFactoryWSTool::as_DOUBLE(%d)",i) ;
427 }
else if (isEnum(ti->c_str())) {
430 if (
_args[i].find(
Form(
"%s::",className)) != string::npos) {
431 qualvalue =
_args[i].c_str() ;
433 qualvalue =
Form(
"%s::%s",className,
_args[i].c_str()) ;
435 if (isValidEnumValue(ti->c_str(),qualvalue.c_str())) {
436 cintExpr +=
Form(
",(%s)%s",ti->c_str(),qualvalue.c_str()) ;
438 throw string(
Form(
"Supplied argument %s does not represent a valid state of enum %s",
_args[i].c_str(),ti->c_str())) ;
446 if (ti->find(
"const ")==0) {
447 btype = ti->c_str()+6 ;
451 if (btype.find(
"&")) {
452 btype.erase(btype.size()-1,btype.size()) ;
459 cintExpr +=
Form(
",(%s&)RooFactoryWSTool::as_OBJ(%d)",ti->c_str(),i) ;
461 throw string(
Form(
"Required argument with name %s of type '%s' is not in the workspace",
_args[i].c_str(),ti->c_str())) ;
466 }
catch (
const string &err) {
467 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR constructing " << className <<
"::" << objName <<
": " << err << endl ;
472 cxcoutD(
ObjectHandling) <<
"RooFactoryWSTool::createArg() Construct expression is " << cintExpr << endl ;
478 if (
string(className)==
"RooGenericPdf") {
480 }
else if (
string(className)==
"RooFormulaVar") {
490 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR in CINT constructor call to create object" << endl ;
513 char* star=strchr(tok,
'*') ;
523 pdfList.
add(pdfList2) ;
525 }
catch (
const string &err) {
526 coutE(
ObjectHandling) <<
"RooFactoryWSTool::add(" << objName <<
") ERROR creating RooAddPdf: " << err << endl ;
555 char* star=strchr(tok,
'*') ;
565 amplList.
add(amplList2) ;
567 }
catch (
const string &err) {
568 coutE(
ObjectHandling) <<
"RooFactoryWSTool::add(" << objName <<
") ERROR creating RooRealSumPdf: " << err << endl ;
588 string regPdfList=
"{" ;
594 char *
sep = strchr(tok,
'|') ;
609 }
catch (
const string &err) {
610 coutE(
ObjectHandling) <<
"RooFactoryWSTool::prod(" << objName <<
") ERROR creating RooProdPdf Conditional argument: " << err << endl ;
617 if (regPdfList.size()>1) {
628 pdf =
new RooProdPdf(objName,objName,
asSET(regPdfList.c_str()),cmdList) ;
629 }
catch (
const string &err) {
630 coutE(
ObjectHandling) <<
"RooFactoryWSTool::prod(" << objName <<
") ERROR creating RooProdPdf input set of regular p.d.f.s: " << err << endl ;
652 map<string,RooAbsPdf*> theMap ;
659 char* eq = strchr(tok,
'=') ;
661 coutE(
ObjectHandling) <<
"RooFactoryWSTool::simul(" << objName <<
") ERROR creating RooSimultaneous::" << objName
662 <<
" expect mapping token of form 'state=pdfName', but found '" << tok <<
"'" << endl ;
669 theMap[tok] = &
asPDF(eq+1) ;
670 }
catch (
const string &err ) {
671 coutE(
ObjectHandling) <<
"RooFactoryWSTool::simul(" << objName <<
") ERROR creating RooSimultaneous: " << err << endl ;
683 }
catch (
const string &err) {
684 coutE(
ObjectHandling) <<
"RooFactoryWSTool::simul(" << objName <<
") ERROR creating RooSimultaneous::" << objName <<
" " << err << endl ;
711 char* star=strchr(tok,
'*') ;
722 }
catch (
const string &err) {
723 coutE(
ObjectHandling) <<
"RooFactoryWSTool::addfunc(" << objName <<
") ERROR creating RooAddition: " << err << endl ;
729 coutE(
ObjectHandling) <<
"RooFactoryWSTool::addfunc(" << objName <<
") ERROR creating RooAddition: syntax error: either all sum terms must be products or none" << endl ;
742 sum->setStringAttribute(
"factory_tag",
Form(
"sum::%s(%s)",objName,specList)) ;
878 char* buf =
new char[strlen(expr)+1] ;
883 if (!isspace(*expr)) {
900 }
catch (
const string &error) {
901 coutE(
ObjectHandling) <<
"RooFactoryWSTool::processExpression() ERROR in parsing: " << error << endl ;
907 coutE(
ObjectHandling) <<
"RooFactoryWSTool::processExpression() ERRORS detected, transaction to workspace aborted, no objects committed" << endl ;
917 return out.size() ?
ws().
arg(out.c_str()) : 0 ;
936 if (
string(token).find(
"$Alias(")==0) {
962 const size_t bufBaseSize = strlen(token)+1;
963 char* buf_base =
new char[bufBaseSize] ;
964 char* buf = buf_base ;
965 strlcpy(buf,token,bufBaseSize) ;
968 list<string> singleExpr ;
969 list<char> separator ;
975 if (*p==
'{' || *p==
'(' || *p==
'[') blevel++ ;
976 if (*p==
'}' || *p==
')' || *p==
']') blevel-- ;
979 if (*p==
'"' || *p==
'\'') litmode = !litmode ;
983 if (!litmode && blevel==0 && ( (*p)==
'=' || (*p) ==
'|' || (*p) ==
'*')) {
984 separator.push_back(*p) ;
986 singleExpr.push_back(buf) ;
992 singleExpr.push_back(buf) ;
994 if (singleExpr.size()==1) {
1001 list<char>::iterator ic = separator.begin() ;
1002 for (list<string>::iterator ii = singleExpr.begin() ; ii!=singleExpr.end() ; ++ii) {
1004 if (ic != separator.end()) {
1027 if (strlen(arg)==0) {
1032 if (arg[0]==
'\'' || arg[0]==
'"') {
1033 return string(arg) ;
1037 const size_t bufSize = strlen(arg)+1;
1038 char* buf =
new char[bufSize] ;
1039 strlcpy(buf,arg,bufSize) ;
1040 char* bufptr = buf ;
1042 string func,prefix ;
1043 vector<string> args ;
1048 func = tmpx ? tmpx :
"" ;
1064 if (*p==
'{' || *p==
'(' || *p==
'[') blevel++ ;
1065 if (*p==
'}' || *p==
')' || *p==
']') blevel-- ;
1068 if (*p==
'"' || *p==
'\'') litmode = !litmode ;
1074 if (!litmode && blevel==0 && ((*p)==
',')) {
1076 args.push_back(tok) ;
1085 if (p>bufptr && (*(p-1)==
')'||*(p-1)==
']')) {
1096 args.push_back(tmp) ;
1107 for(
const char* pp=arg ; *pp!=0 ; pp++) {
1108 if (*pp==
'(' || *pp==
'[' || *pp==
'{') {
1114 if (strstr(func.c_str(),
"::")) {
1119 coutE(
ObjectHandling) <<
"RooFactoryWSTool::processSingleExpression(" << arg <<
"): ERROR: Syntax error: Class::Instance must be followed by (...)" << endl ;
1122 }
else if (func[0]!=
'$'){
1126 }
else if (lb==
'(') {
1136 static Int_t globCounter = 0 ;
1138 autoname =
Form(
"gobj%d",globCounter) ;
1140 if (!
ws().arg(autoname.c_str())) {
1144 autoname =
Form(
"%s::%s",func.c_str(),autoname.c_str()) ;
1148 coutE(
ObjectHandling) <<
"RooFactoryWSTool::processSingleExpression(" << arg <<
"): ERROR: Syntax error: expect either Class(...) or Instance[...]" << endl ;
1156 coutE(
ObjectHandling) <<
"RooFactoryWSTool::processSingleExpression(" << arg <<
"): ERROR: Syntax error: $MetaClass must be followed by (...)" << endl ;
1176 const size_t bufSize = strlen(arg)+1;
1177 char* buf =
new char[bufSize] ;
1178 strlcpy(buf,arg,bufSize) ;
1180 vector<string> args ;
1191 if (*p==
'{' || *p==
'(' || *p==
'[') level++ ;
1192 if (*p==
'}' || *p==
')' || *p==
']') level-- ;
1198 if (level==0 && ((*p)==
',')) {
1200 args.push_back(tok) ;
1208 if (p>buf && *(p-1)==
'}') {
1211 args.push_back(tok) ;
1219 vector<string>::iterator iter = args.begin() ;
1221 while(iter!= args.end()) {
1222 if (strlen(ret.c_str())>1) ret +=
"," ;
1246 if (args.size()!=2) {
1247 coutE(
ObjectHandling) <<
"RooFactorWSTool::processAliasExpression() ERROR $Alias() takes exactly two arguments, " << args.size() <<
" args found" << endl ;
1267 map<string,string>::iterator item =
_typeAliases.find(className) ;
1271 className = item->second.c_str() ;
1284 coutE(
ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR class " << className <<
" not defined in ROOT class table" << endl ;
1301 for (vector<string>::iterator iter = args.begin() ; iter!=args.end() ; ++iter) {
1302 if (iter!=args.begin()) {
1329 string first = *(args.begin()) ;
1333 vector<string>::iterator ai = args.begin() ;
1334 if (args.size()==1) {
1337 Double_t xinit = atof((ai)->c_str()) ;
1339 RooRealVar tmp(func.c_str(),func.c_str(),xinit) ;
1345 }
else if (args.size()==2) {
1348 Double_t xlo = atof((ai++)->c_str()) ;
1350 cxcoutD(
ObjectHandling) <<
"CREATE variable " << func <<
" xlo = " << xlo <<
" xhi = " << xhi << endl ;
1351 RooRealVar tmp(func.c_str(),func.c_str(),xlo,xhi) ;
1357 }
else if (args.size()==3) {
1360 Double_t xinit = atof((ai++)->c_str()) ;
1361 Double_t xlo = atof((ai++)->c_str()) ;
1363 cxcoutD(
ObjectHandling) <<
"CREATE variable " << func <<
" xinit = " << xinit <<
" xlo = " << xlo <<
" xhi = " << xhi << endl ;
1364 RooRealVar tmp(func.c_str(),func.c_str(),xinit,xlo,xhi) ;
1374 for (vector<string>::iterator ai = args.begin() ; ai!=args.end() ; ++ai) {
1375 if (allStates.size()>0) {
1403 const char *className =
R__STRTOK_R(buf,
":",&save) ;
1405 if (!className) className =
"";
1406 if (!instName) instName =
"" ;
1411 vector<string>::iterator iter = args.begin() ;
1412 vector<string> pargv ;
1414 while(iter!=args.end()) {
1415 if (strlen(pargs)>0) strlcat(pargs,
",",
BUFFER_SIZE) ;
1420 pargv.push_back(tmp) ;
1426 for (map<string,IFace*>::iterator ii=
hooks().begin() ; ii!=
hooks().end() ; ++ii) {
1428 if (
hooks().find(className) !=
hooks().end()) {
1430 return iface->
create(*
this, className,instName,pargv) ;
1435 return string(instName) ;
1447 vector<string>::iterator iter = args.begin() ;
1448 vector<string> pargv ;
1449 while(iter!=args.end()) {
1450 if (strlen(pargs)>0) strlcat(pargs,
",",
BUFFER_SIZE) ;
1453 pargv.push_back(tmp) ;
1457 string ret = func+
"("+pargs+
")" ;
1469 const size_t bufSize = strlen(funcExpr)+1;
1470 char* buf =
new char[bufSize] ;
1471 strlcpy(buf,funcExpr,bufSize) ;
1472 char* bufptr = buf ;
1475 vector<string> args ;
1480 func = tmpx ? tmpx :
"" ;
1495 if (*p==
'{' || *p==
'(' || *p==
'[') blevel++ ;
1496 if (*p==
'}' || *p==
')' || *p==
']') blevel-- ;
1499 if (*p==
'"' || *p==
'\'') litmode = !litmode ;
1505 if (!litmode && blevel==0 && ((*p)==
',')) {
1507 args.push_back(tok) ;
1516 if (p>bufptr && *(p-1)==
')') {
1527 args.push_back(tmp) ;
1546 Int_t nParentheses(0), nBracket(0), nAccolade(0) ;
1547 const char* ptr = arg ;
1549 if (*ptr==
'(') nParentheses++ ;
1550 if (*ptr==
')') nParentheses-- ;
1551 if (*ptr==
'[') nBracket++ ;
1552 if (*ptr==
']') nBracket-- ;
1553 if (*ptr==
'{') nAccolade++ ;
1554 if (*ptr==
'}') nAccolade-- ;
1557 if (nParentheses!=0) {
1558 coutE(
ObjectHandling) <<
"RooFactoryWSTool::checkSyntax ERROR non-matching '" << (nParentheses>0?
"(":
")") <<
"' in expression" << endl ;
1562 coutE(
ObjectHandling) <<
"RooFactoryWSTool::checkSyntax ERROR non-matching '" << (nBracket>0?
"[":
"]") <<
"' in expression" << endl ;
1566 coutE(
ObjectHandling) <<
"RooFactoryWSTool::checkSyntax ERROR non-matching '" << (nAccolade>0?
"{":
"}") <<
"' in expression" << endl ;
1579 throw string(
Form(
"Need argument number %d, but only %d args are provided",idx,(
Int_t)
_of->
_args.size())) ;
1591 if (arg[0]==
'.' || arg[0]==
'+' || arg[0] ==
'-' || isdigit(arg[0])) {
1598 throw string(
Form(
"RooAbsArg named %s not found",arg)) ;
1611 if (arg[0]==
'.' || arg[0]==
'+' || arg[0] ==
'-' || isdigit(arg[0])) {
1617 throw string(
Form(
"RooAbsReal named %s not found",arg)) ;
1621 throw string(
Form(
"Object named %s is not of type RooAbsReal",arg)) ;
1634 if (arg[0]==
'.' || arg[0]==
'+' || arg[0] ==
'-' || isdigit(arg[0])) {
1635 throw string(
Form(
"Numeric literal provided for argument (%s), but lvalue is required",arg)) ;
1640 throw string(
Form(
"RooAbsRealLValue named %s not found",arg)) ;
1644 throw string(
Form(
"Object named %s is not of type RooAbsRealLValue",arg)) ;
1658 throw string(
Form(
"RooRealVar named %s not found",arg)) ;
1673 throw string(
Form(
"RooAbsPdf named %s not found",arg)) ;
1688 throw string(
Form(
"RooResolutionModel named %s not found",arg)) ;
1692 throw string(
Form(
"Object named %s is not of type RooResolutionModel",arg)) ;
1707 throw string(
Form(
"RooAbsCategory named %s not found",arg)) ;
1711 throw string(
Form(
"Object named %s is not of type RooAbsCategory",arg)) ;
1725 throw string(
Form(
"RooAbsCategoryLValue named %s not found",arg)) ;
1730 throw string(
Form(
"Object named %s is not of type RooAbsCategoryLValue",arg)) ;
1744 throw string(
Form(
"RooCategory named %s not found",arg)) ;
1780 if (tok[0]==
'.' || tok[0]==
'+' || tok[0] ==
'-' || isdigit(tok[0])) {
1782 }
else if (tok[0] ==
'\'') {
1783 tok[strlen(tok) - 1] = 0;
1791 throw string(
Form(
"RooAbsArg named %s not found",tok)) ;
1816 if (tok[0]==
'.' || tok[0]==
'+' || tok[0] ==
'-' || isdigit(tok[0])) {
1818 }
else if (tok[0] ==
'\'') {
1819 tok[strlen(tok) - 1] = 0;
1827 throw string(
Form(
"RooAbsArg named %s not found",tok)) ;
1845 throw string(
Form(
"RooAbsData named %s not found",arg)) ;
1859 throw string(
Form(
"RooAbsData named %s not found",arg)) ;
1863 throw string(
Form(
"Dataset named %s is not of type RooDataHist",arg)) ;
1876 throw string(
Form(
"RooAbsData named %s not found",arg)) ;
1880 throw string(
Form(
"Dataset named %s is not of type RooDataSet",arg)) ;
1893 throw string(
Form(
"Object named %s not found",arg)) ;
1905 static vector<string> cbuf(10) ;
1906 static unsigned int cbuf_idx = 0 ;
1909 if (arg==0 || strlen(arg)==0) {
1915 cbuf[cbuf_idx].clear() ;
1916 const char* p = arg+1 ;
1917 while(*p && (*p) !=
'"' && (*p) !=
'\'' ) {
1918 cbuf[cbuf_idx] += *(p++) ;
1920 const char* ret = cbuf[cbuf_idx].c_str() ;
1924 if (cbuf_idx==cbuf.size()) cbuf_idx=0 ;
1953 hooks()[typeName] = iface ;
1963 _hooks =
new map<string,IFace*> ;
1976 vector<string>::iterator iter = args.begin() ;
1977 vector<string> pargv ;
1978 while(iter!=args.end()) {
1979 if (strlen(pargs)>0) strlcat(pargs,
",",
BUFFER_SIZE) ;
1982 pargv.push_back(tmp) ;
1987 string cl(typeName) ;
1993 }
else if (cl==
"RSUM") {
1998 }
else if (cl==
"ASUM") {
2003 }
else if (cl==
"PROD") {
2006 ft.
prod(instName,pargs) ;
2008 }
else if (cl==
"SIMUL") {
2011 if (pargv.size()>1) {
2012 ft.
simul(instName,pargv[0].c_str(),strchr(pargs,
',')+1) ;
2014 throw string(
Form(
"Need at least two arguments in call to SIMUL::%s, have %d: %s",instName,(
Int_t)pargv.size(),pargs)) ;
2017 }
else if (cl==
"EXPR") {
2020 if (args.size()<=2) {
2021 ft.
createArg(
"RooGenericPdf",instName,pargs) ;
2026 for (
UInt_t i=1 ; i<args.size() ; i++) {
2031 ft.
createArg(
"RooGenericPdf",instName,genargs) ;
2034 }
else if (cl==
"FCONV") {
2037 ft.
createArg(
"RooFFTConvPdf",instName,pargs) ;
2039 }
else if (cl==
"NCONV") {
2042 ft.
createArg(
"RooNumConvPdf",instName,pargs) ;
2044 }
else if (cl==
"sum") {
2049 }
else if (cl==
"prod") {
2054 }
else if (cl==
"expr") {
2057 if (args.size()<=2) {
2058 ft.
createArg(
"RooFormulaVar",instName,pargs) ;
2063 for (
UInt_t i=1 ; i<args.size() ; i++) {
2068 ft.
createArg(
"RooFormulaVar",instName,genargs) ;
2071 }
else if (cl==
"nconv") {
2074 ft.
createArg(
"RooNumConvolution",instName,pargs) ;
2076 }
else if (cl==
"nll") {
2082 }
else if (cl==
"chi2") {
2088 }
else if (cl==
"profile") {
2091 ft.
createArg(
"RooProfileLL",instName,pargs) ;
2093 }
else if (cl==
"dataobs") {
2103 }
else if (cl==
"int") {
2110 if (pargv.size()<2 || pargv.size()>3) {
2111 throw string(
Form(
"int::%s, requires 2 or 3 arguments, have %d arguments",instName,(
Int_t)pargv.size())) ;
2117 strlcpy(buf,pargv[1].c_str(),256) ;
2120 if (!intobs) intobs=
"" ;
2123 if (!range) range=
"" ;
2126 if (pargv.size()==2) {
2127 if (range && strlen(range)) {
2133 if (range && strlen(range)) {
2143 }
else if (cl==
"deriv") {
2147 if (pargv.size()<2 || pargv.size()>3) {
2148 throw string(
Form(
"deriv::%s, requires 2 or 3 arguments, have %d arguments",instName,(
Int_t)pargv.size())) ;
2154 if (pargv.size()==2) {
2160 derivative->
SetName(instName) ;
2163 }
else if (cl==
"cdf") {
2167 if (pargv.size()<2 || pargv.size()>3) {
2168 throw string(
Form(
"cdf::%s, requires 2 or 3 arguments, have %d arguments",instName,(
Int_t)pargv.size())) ;
2174 if (pargv.size()==2) {
2184 }
else if (cl==
"PROJ") {
2187 if (pargv.size()!=2) {
2188 throw string(
Form(
"PROJ::%s, requires 2 arguments, have %d arguments",instName,(
Int_t)pargv.size())) ;
2193 projection->
SetName(instName) ;
2197 }
else if (cl==
"set") {
2202 return string(instName) ;
2207 throw string(
Form(
"RooFactoryWSTool::SpecialsIFace::create() ERROR: Unknown meta-type %s",typeName)) ;
2210 return string(instName) ;
char * R__STRTOK_R(char *str, const char *delim, char **saveptr)
char * Form(const char *fmt,...)
typedef void((*Func_t)())
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
virtual TObject * clone(const char *newname=0) const =0
void SetName(const char *name)
Set the name of the TNamed.
RooAbsCategoryLValue is the common abstract base class for objects that represent a discrete value th...
RooAbsCategory is the common abstract base class for objects that represent a discrete value with a f...
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
RooAbsData is the common abstract base class for binned and unbinned datasets.
RooAbsPdf is the abstract interface for all probability density functions The class provides hybrid a...
RooAbsReal * createCdf(const RooArgSet &iset, const RooArgSet &nset=RooArgSet())
Create a cumulative distribution function of this p.d.f in terms of the observables listed in iset.
virtual RooAbsPdf * createProjection(const RooArgSet &iset)
Return a p.d.f that represent a projection of this p.d.f integrated over given observables.
RooAbsRealLValue is the common abstract base class for objects that represent a real value that may a...
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
RooDerivative * derivative(RooRealVar &obs, Int_t order=1, Double_t eps=0.001)
Return function representing first, second or third order derivative of this function.
RooAbsReal * createIntegral(const RooArgSet &iset, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none()) const
Create an object that represents the integral of the function over one or more observables listed in ...
RooAddPdf is an efficient implementation of a sum of PDFs of the form.
RooAddition calculates the sum of a set of RooAbsReal terms, or when constructed with two sets,...
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooCategory represents a fundamental (non-derived) discrete value object.
Bool_t defineType(const char *label)
Define a state with given name, the lowest available positive integer is assigned as index.
RooDataSet is a container class to hold N-dimensional binned data.
RooDataSet is a container class to hold unbinned data.
RooLinkedList is an collection class for internal use, storing a collection of RooAbsArg pointers in ...
void Delete(Option_t *o=0)
Remove all elements in collection and delete all elements NB: Collection does not own elements,...
virtual void Add(TObject *arg)
Class RooNLLVar implements a a -log(likelihood) calculation from a dataset and a PDF.
RooProdPdf is an efficient implementation of a product of PDFs of the form.
RooProduct a RooAbsReal implementation that represent the product of a given set of other RooAbsReal ...
Class RooRealSumPdf implements a PDF constructed from a sum of functions:
RooRealVar represents a fundamental (non-derived) real valued object.
RooSimultaneous facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
RooStringVar implements a string values RooAbsArg.
The RooWorkspace is a persistable container for RooFit projects.
RooAbsData * data(const char *name) const
Retrieve dataset (binned or unbinned) with given name. A null pointer is returned if not found.
RooAbsArg * fundArg(const char *name) const
Return fundamental (i.e.
Bool_t commitTransaction()
Bool_t startTransaction()
Open an import transaction operations.
RooCategory * cat(const char *name) const
Retrieve discrete variable (RooCategory) with given name. A null pointer is returned if not found.
RooAbsArg * arg(const char *name) const
Return RooAbsArg with given name. A null pointer is returned if none is found.
Bool_t defineSet(const char *name, const RooArgSet &aset, Bool_t importMissing=kFALSE)
Define a named RooArgSet with given constituents.
RooRealVar * var(const char *name) const
Retrieve real-valued variable (RooRealVar) with given name. A null pointer is returned if not found.
Bool_t import(const RooAbsArg &arg, const RooCmdArg &arg1=RooCmdArg(), const RooCmdArg &arg2=RooCmdArg(), const RooCmdArg &arg3=RooCmdArg(), const RooCmdArg &arg4=RooCmdArg(), const RooCmdArg &arg5=RooCmdArg(), const RooCmdArg &arg6=RooCmdArg(), const RooCmdArg &arg7=RooCmdArg(), const RooCmdArg &arg8=RooCmdArg(), const RooCmdArg &arg9=RooCmdArg())
Import a RooAbsArg object, e.g.
Bool_t cancelTransaction()
Cancel an ongoing import transaction.
const RooArgSet * set(const char *name)
Return pointer to previously defined named set with given nmame If no such set is found a null pointe...
TObject * obj(const char *name) const
Return any type of object (RooAbsArg, RooAbsData or generic object) with given name)
RooAbsPdf * pdf(const char *name) const
Retrieve p.d.f (RooAbsPdf) with given name. A null pointer is returned if not found.
The ROOT global object gROOT contains a list of all defined classes.
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
virtual const char * GetName() const
Returns name of object.
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
RooCmdArg NormSet(const RooArgSet &nset)
RooCmdArg Silence(Bool_t flag=kTRUE)
RooConstVar & RooConst(Double_t val)
RooCmdArg Conditional(const RooArgSet &pdfSet, const RooArgSet &depSet, Bool_t depsAreCond=kFALSE)
static constexpr double s
static long int sum(long int i)