63 using namespace RooFit ;
66 #define BUFFER_SIZE 64000
68 ClassImp(RooFactoryWSTool);
71 RooFactoryWSTool* RooFactoryWSTool::_of = 0 ;
72 map<string,RooFactoryWSTool::IFace*>* RooFactoryWSTool::_hooks=0 ;
76 static Int_t dummy = init() ;
80 RooFactoryWSTool::IFace* iface =
new RooFactoryWSTool::SpecialsIFace ;
83 RooFactoryWSTool::registerSpecial(
"SUM",iface) ;
84 RooFactoryWSTool::registerSpecial(
"RSUM",iface) ;
85 RooFactoryWSTool::registerSpecial(
"ASUM",iface) ;
86 RooFactoryWSTool::registerSpecial(
"PROD",iface) ;
87 RooFactoryWSTool::registerSpecial(
"SIMUL",iface) ;
88 RooFactoryWSTool::registerSpecial(
"EXPR",iface) ;
89 RooFactoryWSTool::registerSpecial(
"FCONV",iface) ;
90 RooFactoryWSTool::registerSpecial(
"NCONV",iface) ;
93 RooFactoryWSTool::registerSpecial(
"sum",iface) ;
94 RooFactoryWSTool::registerSpecial(
"prod",iface) ;
95 RooFactoryWSTool::registerSpecial(
"expr",iface) ;
96 RooFactoryWSTool::registerSpecial(
"nconv",iface) ;
99 RooFactoryWSTool::registerSpecial(
"nll",iface) ;
100 RooFactoryWSTool::registerSpecial(
"chi2",iface) ;
101 RooFactoryWSTool::registerSpecial(
"profile",iface) ;
104 RooFactoryWSTool::registerSpecial(
"int",iface) ;
105 RooFactoryWSTool::registerSpecial(
"deriv",iface) ;
106 RooFactoryWSTool::registerSpecial(
"cdf",iface) ;
107 RooFactoryWSTool::registerSpecial(
"PROJ",iface) ;
110 RooFactoryWSTool::registerSpecial(
"dataobs",iface) ;
111 RooFactoryWSTool::registerSpecial(
"set",iface) ;
126 RooFactoryWSTool::RooFactoryWSTool(RooWorkspace& inws) : _ws(&inws), _errorCount(0), _autoClassPostFix(
"")
137 RooFactoryWSTool::~RooFactoryWSTool()
147 RooRealVar* RooFactoryWSTool::createVariable(
const char* name, Double_t xmin, Double_t xmax)
150 if (_ws->var(name)) {
151 coutE(ObjectHandling) <<
"RooFactoryWSTool::createFactory() ERROR: variable with name '" << name <<
"' already exists" << endl ;
157 RooRealVar var(name,name,xmin,xmax) ;
160 if (_ws->import(var,Silence())) logError() ;
162 return _ws->var(name) ;
171 RooCategory* RooFactoryWSTool::createCategory(
const char* name,
const char* stateNameList)
174 RooCategory cat(name,name) ;
178 const size_t tmpSize = strlen(stateNameList)+1;
179 char *tmp =
new char[tmpSize] ;
180 strlcpy(tmp,stateNameList,tmpSize) ;
182 char* tok = R__STRTOK_R(tmp,
",",&save) ;
184 char* sep = strchr(tok,
'=') ;
187 Int_t
id = atoi(sep+1) ;
188 cat.defineType(tok,
id) ;
191 cat.defineType(tok) ;
193 tok = R__STRTOK_R(0,
",",&save) ;
198 cat.setStringAttribute(
"factory_tag",Form(
"%s[%s]",name,stateNameList)) ;
201 if (_ws->import(cat,Silence())) logError() ;
203 return _ws->cat(name) ;
207 static bool isEnum(
const char* classname) {
209 ClassInfo_t* cls = gInterpreter->ClassInfo_Factory(classname);
210 long property = gInterpreter->ClassInfo_Property(cls);
211 gInterpreter->ClassInfo_Delete(cls);
212 return (property&kIsEnum);
216 static bool isValidEnumValue(
const char* enumName,
const char* enumConstantName) {
219 if (!enumName)
return false;
221 auto theEnum = TEnum::GetEnum(enumName);
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);
246 while(gInterpreter->MethodInfo_Next(func)) {
253 if (!(gInterpreter->MethodInfo_Property(func) & kIsPublic)) {
258 if (
string(classname) != gInterpreter->MethodInfo_TypeName(func)) {
263 int nargs = gInterpreter->MethodInfo_NArg(func);
264 if (nargs==0 || nargs==gInterpreter->MethodInfo_NDefaultArg(func)) {
268 MethodArgInfo_t* arg = gInterpreter->MethodArgInfo_Factory(func);
269 while (gInterpreter->MethodArgInfo_Next(arg)) {
271 const char* argTypeName = gInterpreter->MethodArgInfo_TypeName(arg);
272 if (nreq<2 && ((
string(
"char*") != argTypeName
273 && !(gInterpreter->MethodArgInfo_Property(arg) & kIsConstPointer))
274 && string(
"const char*") != argTypeName)) {
277 ret.push_back(argTypeName) ;
278 if(!gInterpreter->MethodArgInfo_DefaultValue(arg)) nreq++;
280 gInterpreter->MethodArgInfo_Delete(arg);
283 if (ret.size()<nMinArg) {
289 gInterpreter->MethodInfo_Delete(func);
290 gInterpreter->ClassInfo_Delete(cls);
291 return pair<list<string>,
unsigned int>(ret,nreq);
301 RooAbsArg* RooFactoryWSTool::createArg(
const char* className,
const char* objName,
const char* varList)
304 TClass* tc = resolveClassName(className);
306 coutE(ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR class " << className <<
" not found in factory alias table, nor in ROOT class table" << endl;
311 className = tc->GetName();
314 if (!tc->InheritsFrom(RooAbsArg::Class())) {
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&") {
377 RooFactoryWSTool::as_FUNC(i) ;
378 cintExpr += Form(
",RooFactoryWSTool::as_FUNC(%d)",i) ;
379 }
else if ((*ti)==
"RooAbsArg&" || (*ti)==
"const RooAbsArg&") {
380 RooFactoryWSTool::as_ARG(i) ;
381 cintExpr += Form(
",RooFactoryWSTool::as_ARG(%d)",i) ;
382 }
else if ((*ti)==
"RooRealVar&" || (*ti)==
"const RooRealVar&") {
383 RooFactoryWSTool::as_VAR(i) ;
384 cintExpr += Form(
",RooFactoryWSTool::as_VAR(%d)",i) ;
385 }
else if ((*ti)==
"RooAbsRealLValue&" || (*ti)==
"const RooAbsRealLValue&") {
386 RooFactoryWSTool::as_VARLV(i) ;
387 cintExpr += Form(
",RooFactoryWSTool::as_VARLV(%d)",i) ;
388 }
else if ((*ti)==
"RooCategory&" || (*ti)==
"const RooCategory&") {
389 RooFactoryWSTool::as_CAT(i) ;
390 cintExpr += Form(
",RooFactoryWSTool::as_CAT(%d)",i) ;
391 }
else if ((*ti)==
"RooAbsCategory&" || (*ti)==
"const RooAbsCategory&") {
392 RooFactoryWSTool::as_CATFUNC(i) ;
393 cintExpr += Form(
",RooFactoryWSTool::as_CATFUNC(%d)",i) ;
394 }
else if ((*ti)==
"RooAbsCategoryLValue&" || (*ti)==
"const RooAbsCategoryLValue&") {
395 RooFactoryWSTool::as_CATLV(i) ;
396 cintExpr += Form(
",RooFactoryWSTool::as_CATLV(%d)",i) ;
397 }
else if ((*ti)==
"RooAbsPdf&" || (*ti)==
"const RooAbsPdf&") {
398 RooFactoryWSTool::as_PDF(i) ;
399 cintExpr += Form(
",RooFactoryWSTool::as_PDF(%d)",i) ;
400 }
else if ((*ti)==
"RooResolutionModel&" || (*ti)==
"const RooResolutionModel&") {
401 RooFactoryWSTool::as_RMODEL(i) ;
402 cintExpr += Form(
",RooFactoryWSTool::as_RMODEL(%d)",i) ;
403 }
else if ((*ti)==
"RooAbsData&" || (*ti)==
"const RooAbsData&") {
404 RooFactoryWSTool::as_DATA(i) ;
405 cintExpr += Form(
",RooFactoryWSTool::as_DATA(%d)",i) ;
406 }
else if ((*ti)==
"RooDataSet&" || (*ti)==
"const RooDataSet&") {
407 RooFactoryWSTool::as_DSET(i) ;
408 cintExpr += Form(
",RooFactoryWSTool::as_DSET(%d)",i) ;
409 }
else if ((*ti)==
"RooDataHist&" || (*ti)==
"const RooDataHist&") {
410 RooFactoryWSTool::as_DHIST(i) ;
411 cintExpr += Form(
",RooFactoryWSTool::as_DHIST(%d)",i) ;
412 }
else if ((*ti)==
"const RooArgSet&") {
413 RooFactoryWSTool::as_SET(i) ;
414 cintExpr += Form(
",RooFactoryWSTool::as_SET(%d)",i) ;
415 }
else if ((*ti)==
"const RooArgList&") {
416 RooFactoryWSTool::as_LIST(i) ;
417 cintExpr += Form(
",RooFactoryWSTool::as_LIST(%d)",i) ;
418 }
else if ((*ti)==
"const char*") {
419 RooFactoryWSTool::as_STRING(i) ;
420 cintExpr += Form(
",RooFactoryWSTool::as_STRING(%d)",i) ;
421 }
else if ((*ti)==
"Int_t" || (*ti)==
"int" || (*ti)==
"Bool_t" || (*ti)==
"bool") {
422 RooFactoryWSTool::as_INT(i) ;
423 cintExpr += Form(
",RooFactoryWSTool::as_INT(%d)",i) ;
424 }
else if ((*ti)==
"Double_t") {
425 RooFactoryWSTool::as_DOUBLE(i) ;
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())) ;
442 TObject& obj = RooFactoryWSTool::as_OBJ(i) ;
446 if (ti->find(
"const ")==0) {
447 btype = ti->c_str()+6 ;
451 if (btype.find(
"&")) {
452 btype.erase(btype.size()-1,btype.size()) ;
456 btype = string(TEnum::GetEnum(btype.c_str())->GetName());
458 if (obj.InheritsFrom(btype.c_str())) {
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 ;
475 RooAbsArg* arg = (RooAbsArg*) gROOT->ProcessLineFast(cintExpr.c_str()) ;
478 if (
string(className)==
"RooGenericPdf") {
479 arg->setStringAttribute(
"factory_tag",Form(
"EXPR::%s(%s)",objName,varList)) ;
480 }
else if (
string(className)==
"RooFormulaVar") {
481 arg->setStringAttribute(
"factory_tag",Form(
"expr::%s(%s)",objName,varList)) ;
483 arg->setStringAttribute(
"factory_tag",Form(
"%s::%s(%s)",className,objName,varList)) ;
485 if (_ws->import(*arg,Silence())) logError() ;
486 RooAbsArg* ret = _ws->arg(objName) ;
490 coutE(ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR in CINT constructor call to create object" << endl ;
498 RooAddPdf* RooFactoryWSTool::add(
const char *objName,
const char* specList, Bool_t recursiveCoefs)
503 RooArgList coefList ;
504 RooArgList pdfList2 ;
508 char buf[BUFFER_SIZE] ;
509 strlcpy(buf,specList,BUFFER_SIZE) ;
511 char* tok = R__STRTOK_R(buf,
",",&save) ;
513 char* star=strchr(tok,
'*') ;
516 pdfList.add(asPDF(star+1)) ;
517 coefList.add(asFUNC(tok)) ;
519 pdfList2.add(asPDF(tok)) ;
521 tok = R__STRTOK_R(0,
",",&save) ;
523 pdfList.add(pdfList2) ;
525 }
catch (
const string &err) {
526 coutE(ObjectHandling) <<
"RooFactoryWSTool::add(" << objName <<
") ERROR creating RooAddPdf: " << err << endl ;
531 RooAddPdf* pdf =
new RooAddPdf(objName,objName,pdfList,coefList,recursiveCoefs) ;
532 pdf->setStringAttribute(
"factory_tag",Form(
"SUM::%s(%s)",objName,specList)) ;
533 if (_ws->import(*pdf,Silence())) logError() ;
534 return (RooAddPdf*) _ws->pdf(objName) ;
540 RooRealSumPdf* RooFactoryWSTool::amplAdd(
const char *objName,
const char* specList)
544 RooArgList amplList ;
545 RooArgList coefList ;
546 RooArgList amplList2 ;
550 char buf[BUFFER_SIZE] ;
551 strlcpy(buf,specList,BUFFER_SIZE) ;
553 char* tok = R__STRTOK_R(buf,
",",&save) ;
555 char* star=strchr(tok,
'*') ;
558 amplList.add(asFUNC(star+1)) ;
559 coefList.add(asFUNC(tok)) ;
561 amplList2.add(asFUNC(tok)) ;
563 tok = R__STRTOK_R(0,
",",&save) ;
565 amplList.add(amplList2) ;
567 }
catch (
const string &err) {
568 coutE(ObjectHandling) <<
"RooFactoryWSTool::add(" << objName <<
") ERROR creating RooRealSumPdf: " << err << endl ;
573 RooRealSumPdf* pdf =
new RooRealSumPdf(objName,objName,amplList,coefList,(amplList.getSize()==coefList.getSize())) ;
574 pdf->setStringAttribute(
"factory_tag",Form(
"ASUM::%s(%s)",objName,specList)) ;
575 if (_ws->import(*pdf,Silence())) logError() ;
576 return (RooRealSumPdf*) _ws->pdf(objName) ;
582 RooProdPdf* RooFactoryWSTool::prod(
const char *objName,
const char* pdfList)
587 RooLinkedList cmdList ;
588 string regPdfList=
"{" ;
589 char buf[BUFFER_SIZE] ;
590 strlcpy(buf,pdfList,BUFFER_SIZE) ;
592 char* tok = R__STRTOK_R(buf,
",",&save) ;
594 char *sep = strchr(tok,
'|') ;
601 Bool_t invCond(kFALSE) ;
608 cmdList.Add(Conditional(asSET(tok),asSET(sep),!invCond).Clone()) ;
609 }
catch (
const string &err) {
610 coutE(ObjectHandling) <<
"RooFactoryWSTool::prod(" << objName <<
") ERROR creating RooProdPdf Conditional argument: " << err << endl ;
617 if (regPdfList.size()>1) {
622 tok = R__STRTOK_R(0,
",",&save) ;
626 RooProdPdf* pdf = 0 ;
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 ;
637 pdf->setStringAttribute(
"factory_tag",Form(
"PROD::%s(%s)",objName,pdfList)) ;
638 if (_ws->import(*pdf,Silence())) logError() ;
640 return (RooProdPdf*) _ws->pdf(objName) ;
650 RooSimultaneous* RooFactoryWSTool::simul(
const char* objName,
const char* indexCat,
const char* pdfMap)
652 map<string,RooAbsPdf*> theMap ;
654 char buf[BUFFER_SIZE] ;
655 strlcpy(buf,pdfMap,BUFFER_SIZE) ;
657 char* tok = R__STRTOK_R(buf,
",",&save) ;
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 ;
675 tok = R__STRTOK_R(0,
",",&save) ;
680 RooSimultaneous* pdf(0) ;
682 pdf =
new RooSimultaneous(objName,objName,theMap,asCATLV(indexCat)) ;
683 }
catch (
const string &err) {
684 coutE(ObjectHandling) <<
"RooFactoryWSTool::simul(" << objName <<
") ERROR creating RooSimultaneous::" << objName <<
" " << err << endl ;
689 pdf->setStringAttribute(
"factory_tag",Form(
"SIMUL::%s(%s,%s)",objName,indexCat,pdfMap)) ;
690 if (_ws->import(*pdf,Silence())) logError() ;
691 return (RooSimultaneous*) _ws->pdf(objName) ;
699 RooAddition* RooFactoryWSTool::addfunc(
const char *objName,
const char* specList)
701 RooArgList sumlist1 ;
702 RooArgList sumlist2 ;
706 char buf[BUFFER_SIZE] ;
707 strlcpy(buf,specList,BUFFER_SIZE) ;
709 char* tok = R__STRTOK_R(buf,
",",&save) ;
711 char* star=strchr(tok,
'*') ;
714 sumlist2.add(asFUNC(star+1)) ;
715 sumlist1.add(asFUNC(tok)) ;
717 sumlist1.add(asFUNC(tok)) ;
719 tok = R__STRTOK_R(0,
",",&save) ;
722 }
catch (
const string &err) {
723 coutE(ObjectHandling) <<
"RooFactoryWSTool::addfunc(" << objName <<
") ERROR creating RooAddition: " << err << endl ;
728 if (sumlist2.getSize()>0 && (sumlist1.getSize()!=sumlist2.getSize())) {
729 coutE(ObjectHandling) <<
"RooFactoryWSTool::addfunc(" << objName <<
") ERROR creating RooAddition: syntax error: either all sum terms must be products or none" << endl ;
736 if (sumlist2.getSize()>0) {
737 sum =
new RooAddition(objName,objName,sumlist1,sumlist2) ;
739 sum =
new RooAddition(objName,objName,sumlist1) ;
742 sum->setStringAttribute(
"factory_tag",Form(
"sum::%s(%s)",objName,specList)) ;
743 if (_ws->import(*sum,Silence())) logError() ;
745 return (RooAddition*) _ws->pdf(objName) ;
754 RooProduct* RooFactoryWSTool::prodfunc(
const char *objName,
const char* pdfList)
756 return (RooProduct*) createArg(
"RooProduct",objName,Form(
"{%s}",pdfList)) ;
867 RooAbsArg* RooFactoryWSTool::process(
const char* expr)
873 if (checkSyntax(expr)) {
878 char* buf =
new char[strlen(expr)+1] ;
883 if (!isspace(*expr)) {
894 ws().startTransaction() ;
899 out = processExpression(buf) ;
900 }
catch (
const string &error) {
901 coutE(ObjectHandling) <<
"RooFactoryWSTool::processExpression() ERROR in parsing: " << error << endl ;
906 if (errorCount()>0) {
907 coutE(ObjectHandling) <<
"RooFactoryWSTool::processExpression() ERRORS detected, transaction to workspace aborted, no objects committed" << endl ;
908 ws().cancelTransaction() ;
910 ws().commitTransaction() ;
917 return out.size() ? ws().arg(out.c_str()) : 0 ;
932 std::string RooFactoryWSTool::processExpression(
const char* token)
936 if (
string(token).find(
"$Alias(")==0) {
937 processAliasExpression(token) ;
942 return processListExpression(token) ;
945 return processCompositeExpression(token) ;
959 std::string RooFactoryWSTool::processCompositeExpression(
const char* token)
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 ;
971 Bool_t litmode(kFALSE) ;
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) {
995 string ret = processSingleExpression(token) ;
1001 list<char>::iterator ic = separator.begin() ;
1002 for (list<string>::iterator ii = singleExpr.begin() ; ii!=singleExpr.end() ; ++ii) {
1003 ret += processSingleExpression(ii->c_str()) ;
1004 if (ic != separator.end()) {
1024 std::string RooFactoryWSTool::processSingleExpression(
const char* arg)
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 ;
1047 char* tmpx = R__STRTOK_R(buf,
"([",&save) ;
1048 func = tmpx ? tmpx :
"" ;
1049 char* p = R__STRTOK_R(0,
"",&save) ;
1060 Bool_t litmode(kFALSE) ;
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)==
']')) {
1094 p = R__STRTOK_R(0,
"",&save) ;
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(),
"::")) {
1117 ret= processCreateArg(func,args) ;
1119 coutE(ObjectHandling) <<
"RooFactoryWSTool::processSingleExpression(" << arg <<
"): ERROR: Syntax error: Class::Instance must be followed by (...)" << endl ;
1122 }
else if (func[0]!=
'$'){
1125 ret= processCreateVar(func,args) ;
1126 }
else if (lb==
'(') {
1130 if (!_autoNamePrefix.empty()) {
1133 autoname = (Form(
"%s::%s",func.c_str(),_autoNamePrefix.top().c_str())) ;
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()) ;
1146 ret= processCreateArg(autoname,args) ;
1148 coutE(ObjectHandling) <<
"RooFactoryWSTool::processSingleExpression(" << arg <<
"): ERROR: Syntax error: expect either Class(...) or Instance[...]" << endl ;
1154 ret= processMetaArg(func,args) ;
1156 coutE(ObjectHandling) <<
"RooFactoryWSTool::processSingleExpression(" << arg <<
"): ERROR: Syntax error: $MetaClass must be followed by (...)" << endl ;
1173 string RooFactoryWSTool::processListExpression(
const char* arg)
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 +=
"," ;
1223 if (!_autoNamePrefix.empty()) {
1224 _autoNamePrefix.push(Form(
"%s%d",_autoNamePrefix.top().c_str(),i+1)) ;
1226 ret += processSingleExpression(iter->c_str()) ;
1227 if (!_autoNamePrefix.empty()) {
1228 _autoNamePrefix.pop() ;
1243 string RooFactoryWSTool::processAliasExpression(
const char* token)
1245 vector<string> args = splitFunctionArgs(token) ;
1246 if (args.size()!=2) {
1247 coutE(ObjectHandling) <<
"RooFactorWSTool::processAliasExpression() ERROR $Alias() takes exactly two arguments, " << args.size() <<
" args found" << endl ;
1253 _typeAliases[args[1]] = args[0] ;
1263 TClass* RooFactoryWSTool::resolveClassName(
const char* className)
1267 map<string,string>::iterator item = _typeAliases.find(className) ;
1270 if (item != _typeAliases.end()) {
1271 className = item->second.c_str() ;
1278 TClass* tc = TClass::GetClass(className,kTRUE,kTRUE) ;
1282 tc = TClass::GetClass(Form(
"Roo%s",className)) ;
1284 coutE(ObjectHandling) <<
"RooFactoryWSTool::createArg() ERROR class " << className <<
" not defined in ROOT class table" << endl ;
1296 string RooFactoryWSTool::varTag(
string& func, vector<string>& args)
1301 for (vector<string>::iterator iter = args.begin() ; iter!=args.end() ; ++iter) {
1302 if (iter!=args.begin()) {
1325 string RooFactoryWSTool::processCreateVar(
string& func, vector<string>& args)
1329 string first = *(args.begin()) ;
1330 if (isdigit(first[0]) || first[0]==
'.' || first[0]==
'+' || first[0]==
'-') {
1333 vector<string>::iterator ai = args.begin() ;
1334 if (args.size()==1) {
1337 Double_t xinit = atof((ai)->c_str()) ;
1338 cxcoutD(ObjectHandling) <<
"CREATE variable " << func <<
" xinit = " << xinit << endl ;
1339 RooRealVar tmp(func.c_str(),func.c_str(),xinit) ;
1340 tmp.setStringAttribute(
"factory_tag",varTag(func,args).c_str()) ;
1341 if (_ws->import(tmp,Silence())) {
1345 }
else if (args.size()==2) {
1348 Double_t xlo = atof((ai++)->c_str()) ;
1349 Double_t xhi = 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) ;
1352 tmp.setStringAttribute(
"factory_tag",varTag(func,args).c_str()) ;
1353 if (_ws->import(tmp,Silence())) {
1357 }
else if (args.size()==3) {
1360 Double_t xinit = atof((ai++)->c_str()) ;
1361 Double_t xlo = atof((ai++)->c_str()) ;
1362 Double_t xhi = 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) ;
1365 tmp.setStringAttribute(
"factory_tag",varTag(func,args).c_str()) ;
1366 if (_ws->import(tmp,Silence())) {
1374 for (vector<string>::iterator ai = args.begin() ; ai!=args.end() ; ++ai) {
1375 if (allStates.size()>0) {
1380 createCategory(func.c_str(),allStates.c_str()) ;
1395 string RooFactoryWSTool::processCreateArg(
string& func, vector<string>& args)
1398 char buf[BUFFER_SIZE] ;
1399 strlcpy(buf,func.c_str(),BUFFER_SIZE) ;
1403 const char *className = R__STRTOK_R(buf,
":",&save) ;
1404 const char *instName = R__STRTOK_R(0,
":",&save) ;
1405 if (!className) className =
"";
1406 if (!instName) instName =
"" ;
1409 char pargs[BUFFER_SIZE] ;
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) ;
1416 _autoNamePrefix.push(Form(
"%s_%d",instName,iarg+1)) ;
1417 string tmp = processExpression(iter->c_str()) ;
1418 _autoNamePrefix.pop() ;
1419 strlcat(pargs,tmp.c_str(),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()) {
1429 IFace* iface = hooks()[className] ;
1430 return iface->create(*
this, className,instName,pargv) ;
1433 createArg(className,instName,pargs) ;
1435 return string(instName) ;
1443 std::string RooFactoryWSTool::processMetaArg(std::string& func, std::vector<std::string>& args)
1445 char pargs[BUFFER_SIZE] ;
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) ;
1451 string tmp = processExpression(iter->c_str()) ;
1452 strlcat(pargs,tmp.c_str(),BUFFER_SIZE) ;
1453 pargv.push_back(tmp) ;
1457 string ret = func+
"("+pargs+
")" ;
1467 vector<string> RooFactoryWSTool::splitFunctionArgs(
const char* funcExpr)
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 ;
1479 char* tmpx = R__STRTOK_R(buf,
"(",&save) ;
1480 func = tmpx ? tmpx :
"" ;
1481 char* p = R__STRTOK_R(0,
"",&save) ;
1491 Bool_t litmode(kFALSE) ;
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)==
')') {
1525 p = R__STRTOK_R(0,
"",&save) ;
1527 args.push_back(tmp) ;
1543 Bool_t RooFactoryWSTool::checkSyntax(
const char* arg)
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 ;
1576 void RooFactoryWSTool::checkIndex(UInt_t idx)
1578 if (idx>_of->_args.size()-1) {
1579 throw string(Form(
"Need argument number %d, but only %d args are provided",idx,(Int_t)_of->_args.size())) ;
1588 RooAbsArg& RooFactoryWSTool::asARG(
const char* arg)
1591 if (arg[0]==
'.' || arg[0]==
'+' || arg[0] ==
'-' || isdigit(arg[0])) {
1592 return RooConst(atof(arg)) ;
1596 RooAbsArg* rarg = ws().arg(arg) ;
1598 throw string(Form(
"RooAbsArg named %s not found",arg)) ;
1608 RooAbsReal& RooFactoryWSTool::asFUNC(
const char* arg)
1611 if (arg[0]==
'.' || arg[0]==
'+' || arg[0] ==
'-' || isdigit(arg[0])) {
1612 return RooConst(atof(arg)) ;
1615 RooAbsArg* rarg = ws().arg(arg) ;
1617 throw string(Form(
"RooAbsReal named %s not found",arg)) ;
1619 RooAbsReal* real =
dynamic_cast<RooAbsReal*
>(rarg) ;
1621 throw string(Form(
"Object named %s is not of type RooAbsReal",arg)) ;
1631 RooAbsRealLValue& RooFactoryWSTool::asVARLV(
const char* 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)) ;
1638 RooAbsArg* rarg = ws().arg(arg) ;
1640 throw string(Form(
"RooAbsRealLValue named %s not found",arg)) ;
1642 RooAbsRealLValue* reallv =
dynamic_cast<RooAbsRealLValue*
>(rarg) ;
1644 throw string(Form(
"Object named %s is not of type RooAbsRealLValue",arg)) ;
1654 RooRealVar& RooFactoryWSTool::asVAR(
const char* arg)
1656 RooRealVar* var = ws().var(arg) ;
1658 throw string(Form(
"RooRealVar named %s not found",arg)) ;
1669 RooAbsPdf& RooFactoryWSTool::asPDF(
const char* arg)
1671 RooAbsPdf* pdf = ws().pdf(arg) ;
1673 throw string(Form(
"RooAbsPdf named %s not found",arg)) ;
1684 RooResolutionModel& RooFactoryWSTool::asRMODEL(
const char* arg)
1686 RooAbsArg* rarg = ws().arg(arg) ;
1688 throw string(Form(
"RooResolutionModel named %s not found",arg)) ;
1690 RooResolutionModel * rmodel =
dynamic_cast<RooResolutionModel*
>(rarg) ;
1692 throw string(Form(
"Object named %s is not of type RooResolutionModel",arg)) ;
1703 RooAbsCategory& RooFactoryWSTool::asCATFUNC(
const char* arg)
1705 RooAbsArg* rarg = ws().arg(arg) ;
1707 throw string(Form(
"RooAbsCategory named %s not found",arg)) ;
1709 RooAbsCategory* catf =
dynamic_cast<RooAbsCategory*
>(rarg) ;
1711 throw string(Form(
"Object named %s is not of type RooAbsCategory",arg)) ;
1721 RooAbsCategoryLValue& RooFactoryWSTool::asCATLV(
const char* arg)
1723 RooAbsArg* rarg = ws().arg(arg) ;
1725 throw string(Form(
"RooAbsCategoryLValue named %s not found",arg)) ;
1728 RooAbsCategoryLValue* catlv =
dynamic_cast<RooAbsCategoryLValue*
>(rarg) ;
1730 throw string(Form(
"Object named %s is not of type RooAbsCategoryLValue",arg)) ;
1740 RooCategory& RooFactoryWSTool::asCAT(
const char* arg)
1742 RooCategory* cat = ws().cat(arg) ;
1744 throw string(Form(
"RooCategory named %s not found",arg)) ;
1756 RooArgSet RooFactoryWSTool::asSET(
const char* arg)
1758 char tmp[BUFFER_SIZE] ;
1759 strlcpy(tmp,arg,BUFFER_SIZE) ;
1766 const RooArgSet* defSet = ws().set(arg) ;
1775 char* tok = R__STRTOK_R(tmp,
",{}",&save) ;
1780 if (tok[0]==
'.' || tok[0]==
'+' || tok[0] ==
'-' || isdigit(tok[0])) {
1781 s.add(RooConst(atof(tok))) ;
1782 }
else if (tok[0] ==
'\'') {
1783 tok[strlen(tok) - 1] = 0;
1784 RooStringVar *sv =
new RooStringVar(Form(
"string_set_item%03d", i++),
"string_set_item", tok + 1);
1787 RooAbsArg* aarg = ws().arg(tok) ;
1791 throw string(Form(
"RooAbsArg named %s not found",tok)) ;
1794 tok = R__STRTOK_R(0,
",{}",&save) ;
1805 RooArgList RooFactoryWSTool::asLIST(
const char* arg)
1807 char tmp[BUFFER_SIZE] ;
1808 strlcpy(tmp,arg,BUFFER_SIZE) ;
1812 char* tok = R__STRTOK_R(tmp,
",{}",&save) ;
1816 if (tok[0]==
'.' || tok[0]==
'+' || tok[0] ==
'-' || isdigit(tok[0])) {
1817 l.add(RooConst(atof(tok))) ;
1818 }
else if (tok[0] ==
'\'') {
1819 tok[strlen(tok) - 1] = 0;
1820 RooStringVar *sv =
new RooStringVar(
"listarg",
"listarg", tok + 1);
1823 RooAbsArg* aarg = ws().arg(tok) ;
1827 throw string(Form(
"RooAbsArg named %s not found",tok)) ;
1830 tok = R__STRTOK_R(0,
",{}",&save) ;
1841 RooAbsData& RooFactoryWSTool::asDATA(
const char* arg)
1843 RooAbsData* data = ws().data(arg) ;
1845 throw string(Form(
"RooAbsData named %s not found",arg)) ;
1855 RooDataHist& RooFactoryWSTool::asDHIST(
const char* arg)
1857 RooAbsData* data = ws().data(arg) ;
1859 throw string(Form(
"RooAbsData named %s not found",arg)) ;
1861 RooDataHist* hist =
dynamic_cast<RooDataHist*
>(data) ;
1863 throw string(Form(
"Dataset named %s is not of type RooDataHist",arg)) ;
1872 RooDataSet& RooFactoryWSTool::asDSET(
const char* arg)
1874 RooAbsData* data = ws().data(arg) ;
1876 throw string(Form(
"RooAbsData named %s not found",arg)) ;
1878 RooDataSet* dset =
dynamic_cast<RooDataSet*
>(data) ;
1880 throw string(Form(
"Dataset named %s is not of type RooDataSet",arg)) ;
1889 TObject& RooFactoryWSTool::asOBJ(
const char* arg)
1891 TObject* obj = ws().obj(arg) ;
1893 throw string(Form(
"Object named %s not found",arg)) ;
1903 const char* RooFactoryWSTool::asSTRING(
const char* 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 ;
1933 Int_t RooFactoryWSTool::asINT(
const char* arg)
1942 Double_t RooFactoryWSTool::asDOUBLE(
const char* arg)
1951 void RooFactoryWSTool::registerSpecial(
const char* typeName, RooFactoryWSTool::IFace* iface)
1953 hooks()[typeName] = iface ;
1960 std::map<std::string,RooFactoryWSTool::IFace*>& RooFactoryWSTool::hooks()
1962 if (_hooks)
return *_hooks ;
1963 _hooks =
new map<string,IFace*> ;
1972 std::string RooFactoryWSTool::SpecialsIFace::create(RooFactoryWSTool& ft,
const char* typeName,
const char* instName, std::vector<std::string> args)
1974 char pargs[BUFFER_SIZE] ;
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) ;
1980 string tmp = ft.processExpression(iter->c_str()) ;
1981 strlcat(pargs,tmp.c_str(),BUFFER_SIZE) ;
1982 pargv.push_back(tmp) ;
1987 string cl(typeName) ;
1991 ft.add(instName,pargs,kFALSE) ;
1993 }
else if (cl==
"RSUM") {
1996 ft.add(instName,pargs,kTRUE) ;
1998 }
else if (cl==
"ASUM") {
2001 ft.amplAdd(instName,pargs) ;
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) ;
2023 char genargs[BUFFER_SIZE] ;
2024 strlcpy(genargs,args[0].c_str(),BUFFER_SIZE) ;
2025 strlcat(genargs,
",{",BUFFER_SIZE) ;
2026 for (UInt_t i=1 ; i<args.size() ; i++) {
2027 if (i!=1) strlcat(genargs,
",",BUFFER_SIZE) ;
2028 strlcat(genargs,args[i].c_str(),BUFFER_SIZE) ;
2030 strlcat(genargs,
"}",BUFFER_SIZE) ;
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") {
2047 ft.addfunc(instName,pargs) ;
2049 }
else if (cl==
"prod") {
2052 ft.prodfunc(instName,pargs) ;
2054 }
else if (cl==
"expr") {
2057 if (args.size()<=2) {
2058 ft.createArg(
"RooFormulaVar",instName,pargs) ;
2060 char genargs[BUFFER_SIZE] ;
2061 strlcpy(genargs,args[0].c_str(),BUFFER_SIZE) ;
2062 strlcat(genargs,
",{",BUFFER_SIZE) ;
2063 for (UInt_t i=1 ; i<args.size() ; i++) {
2064 if (i!=1) strlcat(genargs,
",",BUFFER_SIZE) ;
2065 strlcat(genargs,args[i].c_str(),BUFFER_SIZE) ;
2067 strlcat(genargs,
"}",BUFFER_SIZE) ;
2068 ft.createArg(
"RooFormulaVar",instName,genargs) ;
2071 }
else if (cl==
"nconv") {
2074 ft.createArg(
"RooNumConvolution",instName,pargs) ;
2076 }
else if (cl==
"nll") {
2079 RooNLLVar nll(instName,instName,ft.asPDF(pargv[0].c_str()),ft.asDATA(pargv[1].c_str())) ;
2080 if (ft.ws().import(nll,Silence())) ft.logError() ;
2082 }
else if (cl==
"chi2") {
2085 RooChi2Var nll(instName,instName,ft.asPDF(pargv[0].c_str()),ft.asDHIST(pargv[1].c_str())) ;
2086 if (ft.ws().import(nll,Silence())) ft.logError() ;
2088 }
else if (cl==
"profile") {
2091 ft.createArg(
"RooProfileLL",instName,pargs) ;
2093 }
else if (cl==
"dataobs") {
2096 RooAbsArg* funcClone =
static_cast<RooAbsArg*
>(ft.asARG(pargv[1].c_str()).clone(instName)) ;
2097 RooAbsArg* arg = ft.asDSET(pargv[0].c_str()).addColumn(*funcClone) ;
2098 if (!ft.ws().fundArg(arg->GetName())) {
2099 if (ft.ws().import(*arg,Silence())) ft.logError() ;
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())) ;
2114 RooAbsReal& func = ft.asFUNC(pargv[0].c_str()) ;
2117 strlcpy(buf,pargv[1].c_str(),256) ;
2119 const char* intobs = R__STRTOK_R(buf,
"|",&save) ;
2120 if (!intobs) intobs=
"" ;
2122 const char* range = R__STRTOK_R(0,
"",&save) ;
2123 if (!range) range=
"" ;
2125 RooAbsReal* integral = 0 ;
2126 if (pargv.size()==2) {
2127 if (range && strlen(range)) {
2128 integral = func.createIntegral(ft.asSET(intobs),Range(range)) ;
2130 integral = func.createIntegral(ft.asSET(intobs)) ;
2133 if (range && strlen(range)) {
2134 integral = func.createIntegral(ft.asSET(intobs),Range(range),NormSet(ft.asSET(pargv[2].c_str()))) ;
2136 integral = func.createIntegral(ft.asSET(intobs),NormSet(ft.asSET(pargv[2].c_str()))) ;
2140 integral->SetName(instName) ;
2141 if (ft.ws().import(*integral,Silence())) ft.logError() ;
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())) ;
2151 RooAbsReal& func = ft.asFUNC(pargv[0].c_str()) ;
2153 RooAbsReal* derivative(0) ;
2154 if (pargv.size()==2) {
2155 derivative = func.derivative(ft.asVAR(pargv[1].c_str()),1) ;
2157 derivative = func.derivative(ft.asVAR(pargv[1].c_str()),ft.asINT(pargv[2].c_str())) ;
2160 derivative->SetName(instName) ;
2161 if (ft.ws().import(*derivative,Silence())) ft.logError() ;
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())) ;
2171 RooAbsPdf& pdf = ft.asPDF(pargv[0].c_str()) ;
2173 RooAbsReal* cdf(0) ;
2174 if (pargv.size()==2) {
2175 cdf = pdf.createCdf(ft.asSET(pargv[1].c_str())) ;
2177 cdf = pdf.createCdf(ft.asSET(pargv[1].c_str()),ft.asSET(pargv[2].c_str())) ;
2180 cdf->SetName(instName) ;
2181 if (ft.ws().import(*cdf,Silence())) ft.logError() ;
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())) ;
2191 RooAbsPdf& pdf = ft.asPDF(pargv[0].c_str()) ;
2192 RooAbsPdf* projection = pdf.createProjection(ft.asSET(pargv[1].c_str())) ;
2193 projection->SetName(instName) ;
2195 if (ft.ws().import(*projection,Silence())) ft.logError() ;
2197 }
else if (cl==
"set") {
2200 if (ft.ws().defineSet(instName,pargs)) {
2202 return string(instName) ;
2207 throw string(Form(
"RooFactoryWSTool::SpecialsIFace::create() ERROR: Unknown meta-type %s",typeName)) ;
2210 return string(instName) ;
2214 RooFactoryWSTool* RooFactoryWSTool::of()