118using std::string, std::map, std::list, std::pair, std::vector;
124 std::string create(
RooFactoryWSTool& ft,
const char* typeName,
const char* instanceName, std::vector<std::string> args)
override ;
129Int_t dummy = init() ;
133 static SimWSIFace iface{};
176 BuildConfig bc(protoPdfName,arg1,arg2,arg3,arg4,arg5,arg6) ;
177 return build(simPdfName,bc) ;
189 if (!obc)
return nullptr;
209 auto obc = std::make_unique<ObjBuildConfig>();
211 if (!bc._masterCatName.empty()) {
212 obc->_masterCat =
_ws->
cat(bc._masterCatName);
213 if (!obc->_masterCat) {
214 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: associated workspace " <<
_ws->
GetName()
215 <<
" does not contain a category named " << bc._masterCatName
216 <<
" that was designated as master index category in the build configuration"
221 obc->_masterCat =
nullptr;
224 map<string,SplitRule>::iterator pdfiter ;
226 for (pdfiter = bc._pdfmap.begin() ; pdfiter != bc._pdfmap.end() ; ++pdfiter) {
231 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: associated workspace " <<
_ws->
GetName()
232 <<
" does not contain a pdf named " << pdfiter->second.GetName() << std::endl ;
242 map<string, pair<list<string>,
string> >::iterator pariter ;
248 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: associated workspace " <<
_ws->
GetName()
249 <<
" does not contain a variable named " << pariter->first.c_str()
250 <<
" as specified in splitting rule of parameter " << pariter->first <<
" of p.d.f " << pdf << std::endl ;
256 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: specified parameter " << pariter->first
257 <<
" in split is not function of p.d.f " << pdf->
GetName() << std::endl ;
263 list<string>::iterator catiter ;
264 for (catiter = pariter->second.first.begin() ; catiter!=pariter->second.first.end() ; ++catiter) {
267 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: associated workspace " <<
_ws->
GetName()
268 <<
" does not contain a category named " << catiter->c_str()
269 <<
" as specified in splitting rule of parameter " << pariter->first <<
" of p.d.f " << pdf << std::endl ;
272 splitCatSet.add(*cat) ;
279 if (arg->dependsOnValue(tmp)) {
280 oocoutE(
nullptr, InputArguments) <<
"RooSimWSTool::build() ERROR: Ill defined split: splitting category function " << arg->GetName()
281 <<
" used in composite split " << splitCatSet <<
" of parameter " << farg->GetName() <<
" of pdf " << pdf->
GetName()
282 <<
" depends on one or more of the other splitting categories in the composite split" << std::endl ;
288 if (!pariter->second.second.empty()) {
290 oocoutE(
nullptr, InputArguments) <<
"RooSimWSTool::build() ERROR: Constrained split specified in non real-valued parameter " << farg->GetName() << std::endl ;
296 osr._paramSplitMap[farg].first.add(splitCatSet) ;
297 osr._paramSplitMap[farg].second = pariter->second.second ;
300 if (obc->_masterCat) {
301 list<string>::iterator misi ;
303 const RooCatType* ctype = obc->_masterCat->lookupType(misi->c_str(),
false) ;
304 if (ctype==
nullptr) {
305 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: master index category " << obc->_masterCat->
GetName()
306 <<
" does not have a state named " << *misi <<
" which was specified as state associated with p.d.f "
310 osr._miStateList.push_back(ctype) ;
315 obc->_usedSplitCats.add(splitCatSet,
true) ;
321 if (obc->_masterCat) {
322 list<string>::iterator misi ;
324 const RooCatType* ctype = obc->_masterCat->lookupType(misi->c_str(),
false) ;
325 if (ctype==
nullptr) {
326 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: master index category " << obc->_masterCat->
GetName()
327 <<
" does not have a state named " << *misi <<
" which was specified as state associated with p.d.f "
331 osr._miStateList.push_back(ctype) ;
336 obc->_pdfmap[pdf] = osr ;
341 map<string,string>::iterator riter ;
342 for (riter=bc._restr.begin() ; riter!=bc._restr.end() ; ++riter) {
345 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: associated workspace " <<
_ws->
GetName()
346 <<
" does not contain a category named " << riter->first
347 <<
" for which build was requested to be restricted to states " << riter->second << std::endl ;
352 list<const RooCatType*> rlist ;
353 strlcpy(buf,riter->second.c_str(),4096) ;
355 char* tok = strtok(buf,
"{,}") ;
359 oocoutE(
nullptr, ObjectHandling) <<
"RooSimWSTool::build() ERROR: restricted build category " << cat->
GetName()
360 <<
" does not have state " << tok <<
" as specified in restriction list" << std::endl ;
363 rlist.push_back(ctype) ;
364 tok = strtok(
nullptr,
"{,}") ;
367 obc->_restr[cat] = rlist ;
386 map<string,RooAbsPdf*> stateMap ;
388 map<RooAbsPdf*,ObjSplitRule>::iterator physIter = obc._pdfmap.
begin() ;
389 while(physIter!=obc._pdfmap.end()) {
393 physModelSet.add(*physModel,
true) ;
395 list<const RooCatType*>::iterator stiter ;
396 for (stiter=physIter->second._miStateList.begin() ; stiter!=physIter->second._miStateList.end() ; ++stiter) {
397 stateMap[(*stiter)->GetName()] = physModel ;
404 oocoutI(
nullptr, ObjectHandling) <<
"RooSimWSTool::executeBuild: list of prototype pdfs " << physModelSet << std::endl ;
407 RooArgSet splitCatSet(obc._usedSplitCats) ;
408 if (physCat) splitCatSet.add(*physCat) ;
411 for(
auto * scat : static_range_cast<RooAbsCategory*>(splitCatSet)) {
412 if (scat->isFundamental()) {
413 splitCatSetFund.
add(*scat) ;
415 std::unique_ptr<RooArgSet> scatvars{scat->getVariables()};
416 splitCatSetFund.add(*scatvars) ;
422 if (splitCatSetFund.size()>1) {
423 auto masterSplitCatOwner = std::make_unique<RooSuperCategory>(
"masterSplitCat",
"Master splitting category",splitCatSetFund);
424 masterSplitCat = masterSplitCatOwner.get();
425 cleanupList.addOwned(std::move(masterSplitCatOwner));
430 oocoutI(
nullptr, ObjectHandling) <<
"RooSimWSTool::executeBuild: list of splitting categories " << splitCatSet << std::endl ;
435 std::vector<std::unique_ptr<RooCustomizer>> customizerList ;
438 for(
auto * physModel : static_range_cast<RooAbsPdf*>(physModelSet)) {
440 oocoutI(
nullptr, ObjectHandling) <<
"RooSimPdfBuilder::executeBuild: processing prototype pdf " << physModel->
GetName() << std::endl ;
443 customizerList.push_back(std::make_unique<RooCustomizer>(*physModel,*masterSplitCat,splitNodeListOwned,&splitNodeListAll));
446 map<RooAbsArg*, pair<RooArgSet,string> >::iterator splitIter ;
447 for (splitIter = obc._pdfmap[physModel]._paramSplitMap.begin() ; splitIter != obc._pdfmap[physModel]._paramSplitMap.end() ; ++splitIter) {
458 auto splitCatOwner = std::make_unique<RooMultiCategory>(splitName.c_str(),splitName.c_str(),splitCatSetTmp);
459 splitCat = splitCatOwner.get();
461 cleanupList.addOwned(std::move(splitCatOwner)) ;
465 if(!splitIter->second.second.empty()) {
468 if (!splitCat->hasLabel(splitIter->second.second)) {
469 oocoutE(
nullptr, InputArguments) <<
"RooSimWSTool::executeBuild() ERROR: name of remainder state for constrained split, '"
470 << splitIter->second.second <<
"' , does not match any state name of (composite) split category " << splitCat->GetName() << std::endl ;
476 for(
auto const&
type : *splitCat) {
478 std::string
const& typeName =
type.first;
481 if (splitIter->second.second == typeName) continue ;
484 std::string splitLeafName = std::string{splitIter->first->GetName()} +
"_" + typeName;
490 splitLeaf =
static_cast<RooAbsArg*
>(splitIter->first->clone(splitLeafName.c_str()));
493 fracLeafList.add(*splitLeaf) ;
498 auto fracRem = std::make_unique<RooFracRemainder>(
Form(
"%s_%s",splitIter->first->GetName(),splitIter->second.second.c_str()),
"Remainder fraction",fracLeafList);
500 cleanupList.addOwned(std::move(fracRem));
506 physCustomizer->splitArgs(*splitIter->first,*splitCat) ;
514 oocoutI(
nullptr, ObjectHandling) <<
"RooSimWSTool::executeBuild: configured customizers for all prototype pdfs" << std::endl ;
519 if (physCat) fitCatList.
add(*physCat) ;
523 for(
auto * scat : static_range_cast<RooAbsCategory*>(splitCatSet)) {
524 if (scat->isFundamental()) {
525 fitCatList.add(*scat) ;
527 fitCatList.add(*std::unique_ptr<RooArgSet>{scat->getVariables()}) ;
532 string mcatname = string(simPdfName) +
"_index" ;
534 if (fitCatList.size()>1) {
535 auto fitCatOwner = std::make_unique<RooSuperCategory>(mcatname.c_str(),mcatname.c_str(),fitCatList);
536 fitCat = fitCatOwner.get();
537 cleanupList.addOwned(std::move(fitCatOwner));
543 auto simPdfOwner = std::make_unique<RooSimultaneous>(simPdfName,simPdfName,*fitCat);
545 cleanupList.addOwned(std::move(simPdfOwner));
548 for (
auto const& fcState : *fitCat) {
549 const std::string fcStateName = fcState.first;
552 fitCat->setLabel(fcStateName.c_str());
556 if (!obc._restr.empty()) {
557 for(
auto * splitCat : static_range_cast<RooAbsCategory*>(fitCatList)) {
560 list<const RooCatType*> slist = obc._restr[splitCat] ;
565 list<const RooCatType*>::iterator sli ;
566 for (sli=slist.begin() ; sli!=slist.end() ; ++sli) {
567 if (
string(splitCat->getCurrentLabel())==(*sli)->GetName()) {
572 if (!select) continue ;
580 RooAbsPdf* pdf = stateMap[physCat->getCurrentLabel()] ;
584 const std::string pdfName = pdf->
GetName();
585 auto found = std::find_if(customizerList.begin(), customizerList.end(),
586 [&](
auto const&
c){ return pdfName == c->pdf().GetName(); });
587 physCustomizer = found != customizerList.end() ? found->get() :
nullptr;
589 physCustomizer = customizerList.front().get();
593 oocoutI(
nullptr, ObjectHandling) <<
"RooSimWSTool::executeBuild: Customizing prototype pdf " << physCustomizer->pdf().GetName()
594 <<
" for mode " << fcStateName << std::endl ;
598 RooAbsPdf* fcPdf =
static_cast<RooAbsPdf*
>(physCustomizer->build(masterSplitCat->getCurrentLabel(),
false)) ;
599 simPdf->addPdf(*fcPdf,fcStateName.c_str()) ;
624 name += arg->GetName() ;
639 char paramBuf[4096] ;
641 strlcpy(paramBuf,paramNameList,4096) ;
642 strlcpy(catBuf,categoryNameList,4096) ;
645 list<string> catList ;
646 char* cat = strtok(catBuf,
"{,}") ;
648 catList.push_back(cat) ;
649 cat = strtok(
nullptr,
"{,}") ;
653 char* param = strtok(paramBuf,
"{,}") ;
656 param = strtok(
nullptr,
"{,}") ;
667 char paramBuf[4096] ;
669 strlcpy(paramBuf,paramNameList,4096) ;
670 strlcpy(catBuf,categoryNameList,4096) ;
673 list<string> catList ;
674 char* cat = strtok(catBuf,
"{,}") ;
676 catList.push_back(cat) ;
677 cat = strtok(
nullptr,
"{,}") ;
681 char* param = strtok(paramBuf,
"{,}") ;
683 _paramSplitMap[param] = pair<list<string>,
string>(catList,remainderStateName) ;
684 param = strtok(
nullptr,
"{,}") ;
696 list<const RooCmdArg*> cmdList ;
697 cmdList.push_back(&arg1) ; cmdList.push_back(&arg2) ;
698 cmdList.push_back(&arg3) ; cmdList.push_back(&arg4) ;
699 cmdList.push_back(&arg5) ; cmdList.push_back(&arg6) ;
701 list<const RooCmdArg*>::iterator iter ;
702 for (iter=cmdList.begin() ; iter!=cmdList.end() ; ++iter) {
704 if ((*iter)->opcode()==
nullptr)
continue ;
706 string name = (*iter)->opcode() ;
708 if (
name==
"SplitParam") {
709 splitParameter((*iter)->getString(0),(*iter)->getString(1)) ;
710 }
else if (
name==
"SplitParamConstrained") {
711 splitParameterConstrained((*iter)->getString(0),(*iter)->getString(1),(*iter)->getString(2)) ;
724 internalAddPdf(pdfName,
"",sr) ;
737 sr.
configure(arg1,arg2,arg3,arg4,arg5,arg6) ;
738 internalAddPdf(pdfName,
"",sr) ;
741 list<const RooCmdArg*> cmdList ;
742 cmdList.push_back(&arg1) ; cmdList.push_back(&arg2) ;
743 cmdList.push_back(&arg3) ; cmdList.push_back(&arg4) ;
744 cmdList.push_back(&arg5) ; cmdList.push_back(&arg6) ;
746 list<const RooCmdArg*>::iterator iter ;
747 for (iter=cmdList.begin() ; iter!=cmdList.end() ; ++iter) {
748 if ((*iter)->opcode()==
nullptr)
continue ;
749 string name = (*iter)->opcode() ;
750 if (
name==
"Restrict") {
751 restrictBuild((*iter)->getString(0),(*iter)->getString(1)) ;
753 if (
name==
"RenameConflictNodes") {
754 _conflProtocol = *(*iter) ;
776 strlcpy(buf,miStateNameList,4096) ;
778 char* tok = strtok(buf,
",") ;
781 tok = strtok(
nullptr,
",") ;
784 _pdfmap[pdfName] = sr ;
793 _restr[catName] = stateList ;
806 _masterCatName = masterIndexCat ;
819 sr.
configure(arg1,arg2,arg3,arg4,arg5,arg6) ;
820 internalAddPdf(pdfName,miStateList,sr) ;
830 internalAddPdf(pdfName,miStateList,sr) ;
852 map<RooAbsPdf*,ObjSplitRule>::iterator ri ;
853 for (ri = _pdfmap.begin() ; ri != _pdfmap.end() ; ++ri ) {
854 std::cout <<
"Splitrule for p.d.f " << ri->first->GetName() <<
" with state list " ;
855 for (std::list<const RooCatType*>::iterator misi= ri->second._miStateList.begin() ; misi!=ri->second._miStateList.end() ; ++misi) {
856 std::cout << (*misi)->GetName() <<
" " ;
858 std::cout << std::endl ;
860 map<RooAbsArg*,pair<RooArgSet,string> >::iterator csi ;
861 for (csi = ri->second._paramSplitMap.begin() ; csi != ri->second._paramSplitMap.end() ; ++csi ) {
862 if (!csi->second.second.empty()) {
863 std::cout <<
" parameter " << csi->first->GetName() <<
" is split with constraint in categories "
864 << csi->second.first <<
" with remainder in state " << csi->second.second << std::endl;
866 std::cout <<
" parameter " << csi->first->GetName() <<
" is split with constraint in categories "
867 << csi->second.first << std::endl;
872 map<RooAbsCategory*,list<const RooCatType*> >::iterator riter ;
873 for (riter=_restr.begin() ; riter!=_restr.end() ; ++riter) {
874 std::cout <<
"Restricting build in category " << riter->first->GetName() <<
" to states " ;
875 list<const RooCatType*>::iterator i ;
876 for (i=riter->second.begin() ; i!=riter->second.end() ; ++i) {
877 if (i!=riter->second.begin()) std::cout <<
"," ;
878 std::cout << (*i)->GetName() ;
880 std::cout << std::endl ;
890std::string SimWSIFace::create(
RooFactoryWSTool& ft,
const char* typeName,
const char* instanceName, std::vector<std::string> args)
892 string tn(typeName) ;
893 if (tn==
"SIMCLONE") {
896 for (
unsigned int i=1 ; i<args.size() ; i++) {
897 if (args[i].find(
"$SplitParam(")!=0 &&
898 args[i].find(
"$SplitParamConstrained(")!=0 &&
899 args[i].find(
"$SplitRestrict(")!=0 &&
900 args[i].find(
"$Verbose(")!=0) {
901 throw string(
Form(
"RooSimWSTool::SimWSIFace::create() ERROR: unknown token %s encountered",args[i].c_str())) ;
907 for (
unsigned int i=1 ; i<args.size() ; i++) {
908 if (args[i].find(
"$SplitParam(")==0) {
909 vector<string> subargs = ft.splitFunctionArgs(args[i].c_str()) ;
910 if (subargs.size()!=2) {
911 throw string(
Form(
"Incorrect number of arguments in $SplitParam, have %d, expect 2",(
Int_t)subargs.size())) ;
913 sr.splitParameter(subargs[0].c_str(),subargs[1].c_str()) ;
914 }
else if (args[i].find(
"$SplitParamConstrained(")==0) {
915 vector<string> subargs = ft.splitFunctionArgs(args[i].c_str()) ;
916 if (subargs.size()!=3) {
917 throw string(
Form(
"Incorrect number of arguments in $SplitParamConstrained, have %d, expect 3",(
Int_t)subargs.size())) ;
919 sr.splitParameterConstrained(subargs[0].c_str(), subargs[1].c_str(), subargs[2].c_str()) ;
925 for (
unsigned int i=1 ; i<args.size() ; i++) {
926 if (args[i].find(
"$Restrict(")==0) {
927 vector<string> subargs = ft.splitFunctionArgs(args[i].c_str()) ;
928 if (subargs.size()!=2) {
929 throw string(
Form(
"Incorrect number of arguments in $Restrict, have %d, expect 2",(
Int_t)subargs.size())) ;
931 bc.restrictBuild(subargs[0].c_str(),subargs[1].c_str()) ;
937 for (
unsigned int i=1 ; i<args.size() ; i++) {
938 if (args[i].find(
"$Verbose(")==0) {
939 vector<string> subargs = ft.splitFunctionArgs(args[i].c_str()) ;
940 if (!subargs.empty()) {
941 verbose = atoi(subargs[0].c_str()) ;
948 RooAbsPdf* pdf = sct.build(instanceName,bc,verbose) ;
950 throw string(
Form(
"RooSimWSTool::SimWSIFace::create() error in RooSimWSTool::build() for %s",instanceName)) ;
956 }
else if (tn==
"MSIMCLONE") {
961 for (
unsigned int i=1 ; i<args.size() ; i++) {
962 if (args[i].find(
"$AddPdf(")==0) {
964 vector<string> subargs = ft.splitFunctionArgs(args[i].c_str()) ;
968 for (
unsigned int j=2 ; j<subargs.size() ; j++) {
969 if (subargs[j].find(
"$SplitParam(")==0) {
970 vector<string> subsubargs = ft.splitFunctionArgs(subargs[j].c_str()) ;
971 if (subsubargs.size()!=2) {
972 throw string(
Form(
"Incorrect number of arguments in $SplitParam, have %d, expect 2",(
Int_t)subsubargs.size())) ;
974 sr.splitParameter(subsubargs[0].c_str(),subsubargs[1].c_str()) ;
975 }
else if (subargs[j].find(
"$SplitParamConstrained(")==0) {
976 vector<string> subsubargs = ft.splitFunctionArgs(subargs[j].c_str()) ;
977 if (subsubargs.size()!=3) {
978 throw string(
Form(
"Incorrect number of arguments in $SplitParamConstrained, have %d, expect 3",(
Int_t)subsubargs.size())) ;
980 sr.splitParameterConstrained(subsubargs[0].c_str(), subsubargs[1].c_str(), subsubargs[2].c_str()) ;
983 mbc.addPdf(subargs[0].c_str(),subargs[1].c_str(),sr) ;
985 }
else if (args[i].find(
"$Restrict(")==0) {
988 vector<string> subargs = ft.splitFunctionArgs(args[i].c_str()) ;
989 if (subargs.size()!=2) {
990 throw string(
Form(
"Incorrect number of arguments in $Restrict, have %d, expect 2",(
Int_t)subargs.size())) ;
992 mbc.restrictBuild(subargs[0].c_str(),subargs[1].c_str()) ;
995 throw string(
Form(
"RooSimWSTool::SimWSIFace::create() ERROR: unknown token in MSIMCLONE: %s",args[i].c_str())) ;
1001 RooAbsPdf* pdf = sct.build(instanceName,mbc,
false) ;
1003 throw string(
Form(
"RooSimWSTool::SimWSIFace::create() error in RooSimWSTool::build() for %s",instanceName)) ;
1011 throw string(
Form(
"RooSimWSTool::SimWSIFace::create() ERROR: Unknown meta-type %s requested",typeName)) ;
1014 return string(instanceName) ;
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 Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
Abstract base class for objects that represent a discrete value that can be set from the outside,...
A space to attach TBranches.
const RooCatType * lookupType(value_type index, bool printError=false) const
Find our type corresponding to the specified index, or return nullptr for no match.
const char * GetName() const override
Returns name of object.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
RooAbsArg * first() const
const_iterator begin() const
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value and implements functionality common to al...
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooCatType is an auxiliary class for RooAbsCategory and defines a a single category state.
const Text_t * GetName() const override
Returns name of object.
Object to represent discrete states.
Named container for two doubles, two integers two object points and three string pointers that can be...
RooCustomizer is a factory class to produce clones of a prototype composite PDF object with the same ...
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
Persistable container for RooFit projects.
RooAbsCategory * catfunc(RooStringView name) const
Retrieve discrete function (RooAbsCategory) with given name. A null pointer is returned if not found.
RooAbsPdf * pdf(RooStringView name) const
Retrieve p.d.f (RooAbsPdf) 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.
RooAbsArg * fundArg(RooStringView name) const
Return fundamental (i.e.
const RooArgSet & components() const
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.
const char * GetName() const override
Returns name of object.
RooCmdArg Silence(bool flag=true)
RooCmdArg RenameConflictNodes(const char *suffix, bool renameOrigNodes=false)