62 #if (__GNUC__==3&&__GNUC_MINOR__==2&&__GNUC_PATCHLEVEL__==3)
63 char* operator+( streampos&,
char* );
70 #ifndef USEMEMPOOLFORARGSET
71 void RooArgSet::cleanup() { }
76 RooArgSet::MemPool* RooArgSet::memPool() {
77 RooSentinel::activate();
78 static auto * memPool =
new RooArgSet::MemPool();
85 void RooArgSet::cleanup()
87 auto pool = memPool();
88 memPool()->teardown();
103 void* RooArgSet::operator
new (
size_t bytes)
106 assert(
sizeof(RooArgSet) == bytes);
108 return memPool()->allocate(bytes);
117 void* RooArgSet::operator
new (
size_t bytes,
void* ptr) noexcept
119 return ::operator
new (bytes, ptr);
126 void RooArgSet::operator
delete (
void* ptr)
129 if (memPool()->deallocate(ptr))
132 std::cerr << __func__ <<
" " << ptr <<
" is not in any of the pools." << std::endl;
135 ::operator
delete(ptr);
144 RooArgSet::RooArgSet() :
157 RooArgSet::RooArgSet(
const RooArgList& list) :
158 RooAbsCollection(list.GetName())
171 RooArgSet::RooArgSet(
const RooArgList& list,
const RooAbsArg* var1) :
172 RooAbsCollection(list.GetName())
174 if (var1 && !list.contains(*var1)) {
186 RooArgSet::RooArgSet(
const char *name) :
187 RooAbsCollection(name)
198 RooArgSet::RooArgSet(
const RooArgSet& set1,
const RooArgSet& set2,
const char *name) : RooAbsCollection(name)
211 RooArgSet::RooArgSet(
const RooAbsArg& var1,
213 RooAbsCollection(name)
224 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
226 RooAbsCollection(name)
228 add(var1); add(var2);
237 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
238 const RooAbsArg& var3,
240 RooAbsCollection(name)
242 add(var1); add(var2); add(var3);
251 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
252 const RooAbsArg& var3,
const RooAbsArg& var4,
254 RooAbsCollection(name)
256 add(var1); add(var2); add(var3); add(var4);
265 RooArgSet::RooArgSet(
const RooAbsArg& var1,
266 const RooAbsArg& var2,
const RooAbsArg& var3,
267 const RooAbsArg& var4,
const RooAbsArg& var5,
269 RooAbsCollection(name)
271 add(var1); add(var2); add(var3); add(var4); add(var5);
280 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
281 const RooAbsArg& var3,
const RooAbsArg& var4,
282 const RooAbsArg& var5,
const RooAbsArg& var6,
284 RooAbsCollection(name)
286 add(var1); add(var2); add(var3); add(var4); add(var5); add(var6);
295 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
296 const RooAbsArg& var3,
const RooAbsArg& var4,
297 const RooAbsArg& var5,
const RooAbsArg& var6,
298 const RooAbsArg& var7,
300 RooAbsCollection(name)
302 add(var1); add(var2); add(var3); add(var4); add(var5); add(var6); add(var7) ;
311 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
312 const RooAbsArg& var3,
const RooAbsArg& var4,
313 const RooAbsArg& var5,
const RooAbsArg& var6,
314 const RooAbsArg& var7,
const RooAbsArg& var8,
316 RooAbsCollection(name)
318 add(var1); add(var2); add(var3); add(var4); add(var5); add(var6); add(var7) ;add(var8) ;
327 RooArgSet::RooArgSet(
const RooAbsArg& var1,
const RooAbsArg& var2,
328 const RooAbsArg& var3,
const RooAbsArg& var4,
329 const RooAbsArg& var5,
const RooAbsArg& var6,
330 const RooAbsArg& var7,
const RooAbsArg& var8,
331 const RooAbsArg& var9,
const char *name) :
332 RooAbsCollection(name)
334 add(var1); add(var2); add(var3); add(var4); add(var5); add(var6); add(var7); add(var8); add(var9);
345 RooArgSet::RooArgSet(
const TCollection& tcoll,
const char* name) :
346 RooAbsCollection(name)
348 TIterator* iter = tcoll.MakeIterator() ;
350 while((obj=iter->Next())) {
351 if (!dynamic_cast<RooAbsArg*>(obj)) {
352 coutW(InputArguments) <<
"RooArgSet::RooArgSet(TCollection) element " << obj->GetName()
353 <<
" is not a RooAbsArg, ignored" << endl ;
356 add(*(RooAbsArg*)obj) ;
369 RooArgSet::RooArgSet(
const RooArgSet& other,
const char *name)
370 : RooAbsCollection(other,name)
380 RooArgSet::~RooArgSet()
393 Bool_t RooArgSet::add(
const RooAbsArg& var, Bool_t silent)
395 return checkForDup(var,silent)? kFALSE : RooAbsCollection::add(var,silent) ;
406 Bool_t RooArgSet::addOwned(RooAbsArg& var, Bool_t silent)
408 return checkForDup(var,silent)? kFALSE : RooAbsCollection::addOwned(var,silent) ;
420 RooAbsArg* RooArgSet::addClone(
const RooAbsArg& var, Bool_t silent)
422 return checkForDup(var,silent)? 0 : RooAbsCollection::addClone(var,silent) ;
434 RooAbsArg& RooArgSet::operator[](
const char* name)
const
436 RooAbsArg* arg = find(name) ;
438 coutE(InputArguments) <<
"RooArgSet::operator[](" << GetName() <<
") ERROR: no element named " << name <<
" in set" << endl ;
439 RooErrorHandler::softAbort() ;
449 Bool_t RooArgSet::checkForDup(
const RooAbsArg& var, Bool_t silent)
const
451 RooAbsArg *other = find(var);
457 coutE(InputArguments) <<
"RooArgSet::checkForDup: ERROR argument with name " << var.GetName() <<
" is already in this set" << endl;
472 Double_t RooArgSet::getRealValue(
const char* name, Double_t defVal, Bool_t verbose)
const
474 RooAbsArg* raa = find(name) ;
476 if (verbose) coutE(InputArguments) <<
"RooArgSet::getRealValue(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
479 RooAbsReal* rar =
dynamic_cast<RooAbsReal*
>(raa) ;
481 if (verbose) coutE(InputArguments) <<
"RooArgSet::getRealValue(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsReal" << endl ;
484 return rar->getVal() ;
493 Bool_t RooArgSet::setRealValue(
const char* name, Double_t newVal, Bool_t verbose)
495 RooAbsArg* raa = find(name) ;
497 if (verbose) coutE(InputArguments) <<
"RooArgSet::setRealValue(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
500 RooAbsRealLValue* rar =
dynamic_cast<RooAbsRealLValue*
>(raa) ;
502 if (verbose) coutE(InputArguments) <<
"RooArgSet::setRealValue(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsRealLValue" << endl ;
505 rar->setVal(newVal) ;
515 const char* RooArgSet::getCatLabel(
const char* name,
const char* defVal, Bool_t verbose)
const
517 RooAbsArg* raa = find(name) ;
519 if (verbose) coutE(InputArguments) <<
"RooArgSet::getCatLabel(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
522 RooAbsCategory* rac =
dynamic_cast<RooAbsCategory*
>(raa) ;
524 if (verbose) coutE(InputArguments) <<
"RooArgSet::getCatLabel(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsCategory" << endl ;
527 return rac->getLabel() ;
536 Bool_t RooArgSet::setCatLabel(
const char* name,
const char* newVal, Bool_t verbose)
538 RooAbsArg* raa = find(name) ;
540 if (verbose) coutE(InputArguments) <<
"RooArgSet::setCatLabel(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
543 RooAbsCategoryLValue* rac =
dynamic_cast<RooAbsCategoryLValue*
>(raa) ;
545 if (verbose) coutE(InputArguments) <<
"RooArgSet::setCatLabel(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsCategory" << endl ;
548 rac->setLabel(newVal) ;
558 Int_t RooArgSet::getCatIndex(
const char* name, Int_t defVal, Bool_t verbose)
const
560 RooAbsArg* raa = find(name) ;
562 if (verbose) coutE(InputArguments) <<
"RooArgSet::getCatLabel(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
565 RooAbsCategory* rac =
dynamic_cast<RooAbsCategory*
>(raa) ;
567 if (verbose) coutE(InputArguments) <<
"RooArgSet::getCatLabel(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsCategory" << endl ;
570 return rac->getIndex() ;
579 Bool_t RooArgSet::setCatIndex(
const char* name, Int_t newVal, Bool_t verbose)
581 RooAbsArg* raa = find(name) ;
583 if (verbose) coutE(InputArguments) <<
"RooArgSet::setCatLabel(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
586 RooAbsCategoryLValue* rac =
dynamic_cast<RooAbsCategoryLValue*
>(raa) ;
588 if (verbose) coutE(InputArguments) <<
"RooArgSet::setCatLabel(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsCategory" << endl ;
591 rac->setIndex(newVal) ;
601 const char* RooArgSet::getStringValue(
const char* name,
const char* defVal, Bool_t verbose)
const
603 RooAbsArg* raa = find(name) ;
605 if (verbose) coutE(InputArguments) <<
"RooArgSet::getStringValue(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
608 RooAbsString* ras =
dynamic_cast<RooAbsString*
>(raa) ;
610 if (verbose) coutE(InputArguments) <<
"RooArgSet::getStringValue(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsString" << endl ;
613 return ras->getVal() ;
622 Bool_t RooArgSet::setStringValue(
const char* name,
const char* newVal, Bool_t verbose)
624 RooAbsArg* raa = find(name) ;
626 if (verbose) coutE(InputArguments) <<
"RooArgSet::setStringValue(" << GetName() <<
") ERROR no object with name '" << name <<
"' found" << endl ;
629 RooStringVar* ras =
dynamic_cast<RooStringVar*
>(raa) ;
631 if (verbose) coutE(InputArguments) <<
"RooArgSet::setStringValue(" << GetName() <<
") ERROR object '" << name <<
"' is not of type RooAbsString" << endl ;
634 ras->setVal(newVal) ;
644 void RooArgSet::writeToFile(
const char* fileName)
const
646 ofstream ofs(fileName) ;
648 coutE(InputArguments) <<
"RooArgSet::writeToFile(" << GetName() <<
") error opening file " << fileName << endl ;
651 writeToStream(ofs,kFALSE) ;
660 Bool_t RooArgSet::readFromFile(
const char* fileName,
const char* flagReadAtt,
const char* section, Bool_t verbose)
662 ifstream ifs(fileName) ;
664 coutE(InputArguments) <<
"RooArgSet::readFromFile(" << GetName() <<
") error opening file " << fileName << endl ;
667 return readFromStream(ifs,kFALSE,flagReadAtt,section,verbose) ;
686 void RooArgSet::writeToStream(ostream& os, Bool_t compact,
const char* section)
const
688 if (section && section[0] !=
'\0')
689 os <<
'[' << section <<
']' <<
'\n';
692 for (
const auto next : _list) {
693 next->writeToStream(os,
true);
698 for (
const auto next : _list) {
699 os << next->GetName() <<
" = " ;
700 next->writeToStream(os,kFALSE) ;
750 Bool_t RooArgSet::readFromStream(istream& is, Bool_t compact,
const char* flagReadAtt,
const char* section, Bool_t verbose)
753 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
") compact mode not supported" << endl ;
757 RooStreamParser parser(is) ;
758 parser.setPunctuation(
"=") ;
760 Bool_t retVal(kFALSE) ;
764 Bool_t anyCondTrue[100] ;
765 Bool_t condStack[100] ;
766 Bool_t lastLineWasElse=kFALSE ;
767 Int_t condStackLevel=0 ;
771 TString sectionHdr(
"[") ;
772 if (section) sectionHdr.Append(section) ;
773 sectionHdr.Append(
"]") ;
774 Bool_t inSection(section?kFALSE:kTRUE) ;
776 Bool_t reprocessToken = kFALSE ;
779 if (is.eof() || is.fail() || parser.atEOF()) {
784 if (!reprocessToken) {
785 token = parser.readToken() ;
787 reprocessToken = kFALSE ;
790 if (token.IsNull()) {
795 if (!token.CompareTo(
"include")) {
796 if (parser.atEOL()) {
797 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName()
798 <<
"): no filename found after include statement" << endl ;
801 TString filename = parser.readLine() ;
802 ifstream incfs(filename) ;
804 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): cannot open include file " << filename << endl ;
807 coutI(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): processing include file "
808 << filename << endl ;
809 if (readFromStream(incfs,compact,flagReadAtt,inSection?0:section,verbose))
return kTRUE ;
814 if (*token.Data()==
'[') {
816 const char* last = token.Data() + token.Length() -1 ;
819 hdr.Append(parser.readLine()) ;
824 inSection = !sectionHdr.CompareTo(hdr) ;
831 parser.zapToEnd(kTRUE) ;
836 if (!token.CompareTo(
"if")) {
839 TString expr = parser.readLine() ;
840 RooFormula form(expr,expr,*
this) ;
841 if (!form.ok())
return kTRUE ;
844 Bool_t status = form.eval()?kTRUE:kFALSE ;
845 if (lastLineWasElse) {
846 anyCondTrue[condStackLevel] |= status ;
847 lastLineWasElse=kFALSE ;
850 anyCondTrue[condStackLevel] = status ;
852 condStack[condStackLevel] = status ;
854 if (verbose) cxcoutD(Eval) <<
"RooArgSet::readFromStream(" << GetName()
855 <<
"): conditional expression " << expr <<
" = "
856 << (condStack[condStackLevel]?
"true":
"false") << endl ;
860 if (!token.CompareTo(
"else")) {
862 if (condStackLevel==0) {
863 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): unmatched 'else'" << endl ;
866 if (parser.atEOL()) {
868 condStack[condStackLevel] = !anyCondTrue[condStackLevel] ;
869 parser.zapToEnd(kFALSE) ;
873 token = parser.readToken() ;
874 if (token.CompareTo(
"if")) {
875 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): syntax error: 'else " << token <<
"'" << endl ;
878 if (anyCondTrue[condStackLevel]) {
880 condStack[condStackLevel] = kFALSE ;
881 parser.zapToEnd(kFALSE) ;
885 reprocessToken = kTRUE ;
886 lastLineWasElse=kTRUE ;
893 if (!token.CompareTo(
"endif")) {
895 if (condStackLevel==0) {
896 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): unmatched 'endif'" << endl ;
906 if (condStack[condStackLevel]) {
909 if (!token.CompareTo(
"echo")) {
910 TString message = parser.readLine() ;
911 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): >> " << message << endl ;
916 if (!token.CompareTo(
"abort")) {
917 TString message = parser.readLine() ;
918 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): USER ABORT" << endl ;
925 if ((arg = find(token)) && !arg->getAttribute(
"Dynamic")) {
926 if (parser.expectToken(
"=",kTRUE)) {
927 parser.zapToEnd(kTRUE) ;
929 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName()
930 <<
"): missing '=' sign: " << arg << endl ;
933 Bool_t argRet = arg->readFromStream(is,kFALSE,verbose) ;
934 if (!argRet && flagReadAtt) arg->setAttribute(flagReadAtt,kTRUE) ;
938 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): argument "
939 << token <<
" not in list, ignored" << endl ;
941 parser.zapToEnd(kTRUE) ;
949 if (condStackLevel!=0) {
950 coutE(InputArguments) <<
"RooArgSet::readFromStream(" << GetName() <<
"): missing 'endif'" << endl ;
958 Bool_t RooArgSet::isInRange(
const char* rangeSpec)
961 strlcpy(buf,rangeSpec,1024) ;
962 char* token = strtok(buf,
",") ;
964 TIterator* iter = createIterator() ;
968 Bool_t accept=kTRUE ;
971 while((arg=(RooAbsArg*)iter->Next())) {
972 RooAbsRealLValue* lvarg =
dynamic_cast<RooAbsRealLValue*
>(arg) ;
974 if (!lvarg->inRange(token)) {
986 token = strtok(0,
",") ;