20 namespace RooHelpers {
25 std::vector<std::string> tokenise(
const std::string &str,
const std::string &delims) {
26 std::vector<std::string> tokens;
28 auto beg = str.find_first_not_of(delims, 0);
29 auto end = str.find_first_of(delims, beg);
31 tokens.emplace_back(str.substr(beg, end-beg));
32 beg = str.find_first_not_of(delims, end);
33 end = str.find_first_of(delims, beg);
34 }
while (beg != std::string::npos);
41 HijackMessageStream::HijackMessageStream(RooFit::MsgLevel level, RooFit::MsgTopic topics,
const char* objectName) :
44 auto& msg = RooMsgService::instance();
45 _oldKillBelow = msg.globalKillBelow();
46 msg.setGlobalKillBelow(level);
47 for (
int i = 0; i < msg.numStreams(); ++i) {
48 _oldConf.push_back(msg.getStream(i));
49 msg.getStream(i).removeTopic(topics);
50 msg.setStreamStatus(i,
true);
53 _thisStream = msg.addStream(level,
54 RooFit::Topic(topics),
55 RooFit::OutputStream(*
this),
56 objectName ? RooFit::ObjectName(objectName) : RooCmdArg());
59 HijackMessageStream::~HijackMessageStream() {
60 auto& msg = RooMsgService::instance();
61 msg.setGlobalKillBelow(_oldKillBelow);
62 for (
unsigned int i = 0; i < _oldConf.size(); ++i) {
63 msg.getStream(i) = _oldConf[i];
65 msg.deleteStream(_thisStream);
75 void checkRangeOfParameters(
const RooAbsReal* callingClass, std::initializer_list<const RooAbsReal*> pars,
76 double min,
double max,
bool limitsInAllowedRange, std::string extraMessage) {
77 const char openBr = limitsInAllowedRange ?
'[' :
'(';
78 const char closeBr = limitsInAllowedRange ?
']' :
')';
80 for (
auto parameter : pars) {
81 auto par =
dynamic_cast<const RooAbsRealLValue*
>(parameter);
83 (par->getMin() < min || par->getMax() > max)
84 || (!limitsInAllowedRange && (par->getMin() == min || par->getMax() == max)) )) {
85 std::stringstream rangeMsg;
87 if (min > -std::numeric_limits<double>::max())
88 rangeMsg << min <<
", ";
92 if (max < std::numeric_limits<double>::max())
93 rangeMsg << max << closeBr;
95 rangeMsg <<
"inf" << closeBr;
97 oocoutW(callingClass, InputArguments) <<
"The parameter '" << par->GetName() <<
"' with range [" << par->getMin(
"") <<
", "
98 << par->getMax() <<
"] of the " << callingClass->IsA()->GetName() <<
" '" << callingClass->GetName()
99 <<
"' exceeds the safe range of " << rangeMsg.str() <<
". Advise to limit its range."
100 << (!extraMessage.empty() ?
"\n" :
"") << extraMessage << std::endl;