diff --git a/roofit/roofitcore/inc/RooHelpers.h b/roofit/roofitcore/inc/RooHelpers.h index 47a4d34bbb5bb9e63dbfd993e6aae521083cf3d9..7aa994a074b808928c55eeab403ec29fcbf3bdaf 100644 --- a/roofit/roofitcore/inc/RooHelpers.h +++ b/roofit/roofitcore/inc/RooHelpers.h @@ -25,32 +25,25 @@ namespace RooHelpers { -/// Switches the message service to verbose while the instance alive. +/// Switches the message service to verbose while the instance is alive. class LocalChangeMsgLevel { public: /// Change message level (and topics) while this object is alive, reset when it goes out of scope. /// \param[in] lvl The desired message level. Defaults to verbose. - /// \param[in] extraTopics Extra topics to be switched on. + /// \param[in] extraTopics Extra topics to be switched on. These will only switched on in the last stream to prevent all streams are printing. + /// \param[in] removeTopics Message topics to be switched off + /// \param[in] overrideExternalLevel Override the user message level. LocalChangeMsgLevel(RooFit::MsgLevel lvl = RooFit::DEBUG, - RooFit::MsgTopic extraTopics = static_cast<RooFit::MsgTopic>(0u)) { - auto& msg = RooMsgService::instance(); - fOldKillBelow = msg.globalKillBelow(); - msg.setGlobalKillBelow(lvl); - fOldConf = msg.getStream(0); - msg.getStream(0).minLevel = lvl; - msg.getStream(0).addTopic(extraTopics); - msg.setStreamStatus(0, true); - } + unsigned int extraTopics = 0u, + unsigned int removeTopics = 0u, + bool overrideExternalLevel = true); - ~LocalChangeMsgLevel() { - auto& msg = RooMsgService::instance(); - msg.setGlobalKillBelow(fOldKillBelow); - msg.getStream(0) = fOldConf; - } + ~LocalChangeMsgLevel(); private: RooFit::MsgLevel fOldKillBelow; - RooMsgService::StreamConfig fOldConf; + std::vector<RooMsgService::StreamConfig> fOldConf; + int fExtraStream{-1}; }; diff --git a/roofit/roofitcore/inc/RooMsgService.h b/roofit/roofitcore/inc/RooMsgService.h index 37bb50da5f9afc0ad2ed93c5dbe1c14efdacaa56..6476f151d1110d0d95b5efe506fe60a41b17b0b9 100644 --- a/roofit/roofitcore/inc/RooMsgService.h +++ b/roofit/roofitcore/inc/RooMsgService.h @@ -86,17 +86,17 @@ class RooWorkspace ; #define ccxcoutI(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE) #define oocxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a) #define ooccxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE) -#define cxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a) -#define ccxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE) -#define oocxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a) -#define ooccxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE) +#define cxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a) +#define ccxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a,kTRUE) +#define oocxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a) +#define ooccxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a,kTRUE) #define cxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a) #define ccxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a,kTRUE) #define oocxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a) #define ooccxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a,kTRUE) #define cxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a) #define ccxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a,kTRUE) -#define oocxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(to,RooFit::ERROR,RooFit::a) +#define oocxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a) #define ooccxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a,kTRUE) #define cxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a) #define ccxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a,kTRUE) diff --git a/roofit/roofitcore/src/RooHelpers.cxx b/roofit/roofitcore/src/RooHelpers.cxx index 7907d7b62aa9e8a473ca2d9a63613039a7f7678f..5bdb7dc17fc91e6f335e4c1e14c87523600a305c 100644 --- a/roofit/roofitcore/src/RooHelpers.cxx +++ b/roofit/roofitcore/src/RooHelpers.cxx @@ -19,6 +19,38 @@ namespace RooHelpers { +LocalChangeMsgLevel::LocalChangeMsgLevel(RooFit::MsgLevel lvl, + unsigned int extraTopics, unsigned int removeTopics, bool overrideExternalLevel) { + auto& msg = RooMsgService::instance(); + fOldKillBelow = msg.globalKillBelow(); + if (overrideExternalLevel) msg.setGlobalKillBelow(lvl); + + for (int i = 0; i < msg.numStreams(); ++i) { + fOldConf.push_back(msg.getStream(i)); + if (overrideExternalLevel) msg.getStream(i).minLevel = lvl; + msg.getStream(i).removeTopic(static_cast<RooFit::MsgTopic>(removeTopics)); + msg.setStreamStatus(i, true); + } + + if (extraTopics != 0) { + fExtraStream = msg.addStream(lvl); + msg.getStream(fExtraStream).addTopic(static_cast<RooFit::MsgTopic>(extraTopics)); + } +} + +LocalChangeMsgLevel::~LocalChangeMsgLevel() { + auto& msg = RooMsgService::instance(); + msg.setGlobalKillBelow(fOldKillBelow); + for (int i=0; i < msg.numStreams(); ++i) { + if (i < static_cast<int>(fOldConf.size())) + msg.getStream(i) = fOldConf[i]; + } + + if (fExtraStream > 0) + msg.deleteStream(fExtraStream); +} + + /// Tokenise the string by splitting at the characters in delims. /// Consecutive delimiters are collapsed, so that no delimiters will appear in the /// tokenised strings, and no emtpy strings are returned.