00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_MSG_SERVICE
00017 #define ROO_MSG_SERVICE
00018
00019 #include "Riosfwd.h"
00020 #include <assert.h>
00021 #include "TObject.h"
00022 #include <string>
00023 #include <vector>
00024 #include <stack>
00025 #include <map>
00026 #include "RooCmdArg.h"
00027 #include "RooGlobalFunc.h"
00028 class RooAbsArg ;
00029 class RooWorkspace ;
00030
00031
00032 #define coutI(a) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a)
00033 #define coutP(a) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a)
00034 #define coutW(a) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a)
00035 #define coutE(a) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a)
00036 #define coutF(a) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a)
00037
00038 #define ccoutD(a) RooMsgService::instance().log(this,RooFit::DEBUG,RooFit::a,kTRUE)
00039 #define ccoutI(a) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE)
00040 #define ccoutP(a) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a,kTRUE)
00041 #define ccoutW(a) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a,kTRUE)
00042 #define ccoutE(a) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a,kTRUE)
00043 #define ccoutF(a) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a,kTRUE)
00044
00045 #define oocoutI(o,a) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a)
00046 #define oocoutP(o,a) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a)
00047 #define oocoutW(o,a) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a)
00048 #define oocoutE(o,a) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a)
00049 #define oocoutF(o,a) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a)
00050
00051 #define ooccoutD(o,a) RooMsgService::instance().log(o,RooFit::DEBUG,RooFit::a,kTRUE)
00052 #define ooccoutI(o,a) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE)
00053 #define ooccoutP(o,a) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a,kTRUE)
00054 #define ooccoutW(o,a) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a,kTRUE)
00055 #define ooccoutE(o,a) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a,kTRUE)
00056 #define ooccoutF(o,a) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a,kTRUE)
00057
00058 #ifndef _WIN32
00059 #define ANYDEBUG (RooMsgService::_debugCount>0)
00060 #else
00061 #define ANYDEBUG (RooMsgService::anyDebug())
00062 #endif
00063
00064 #define dologD(a) (ANYDEBUG && RooMsgService::instance().isActive(this,RooFit::a,RooFit::DEBUG))
00065 #define dologI(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO))
00066 #define dologP(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS))
00067 #define dologW(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING))
00068 #define dologE(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR))
00069 #define dologF(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL))
00070
00071 #define oodologD(o,a) (ANYDEBUG && RooMsgService::instance().isActive(o,RooFit::a,RooFit::DEBUG))
00072 #define oodologI(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO))
00073 #define oodologP(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS))
00074 #define oodologW(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING))
00075 #define oodologE(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR))
00076 #define oodologF(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::FATAL))
00077
00078
00079
00080 #define cxcoutD(a) if (ANYDEBUG && RooMsgService::instance().isActive(this,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(this,RooFit::DEBUG,RooFit::a)
00081 #define ccxcoutD(a) if (ANYDEBUG && RooMsgService::instance().isActive(this,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(this,RooFit::DEBUG,RooFit::a,kTRUE)
00082 #define oocxcoutD(o,a) if (ANYDEBUG && RooMsgService::instance().isActive(o,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(o,RooFit::DEBUG,RooFit::a)
00083 #define ooccxcoutD(o,a) if (ANYDEBUG && RooMsgService::instance().isActive(o,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(o,RooFit::DEBUG,RooFit::a,kTRUE)
00084 #define cxcoutI(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a)
00085 #define ccxcoutI(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE)
00086 #define oocxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a)
00087 #define ooccxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE)
00088 #define cxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a)
00089 #define ccxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE)
00090 #define oocxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a)
00091 #define ooccxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE)
00092 #define cxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a)
00093 #define ccxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a,kTRUE)
00094 #define oocxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a)
00095 #define ooccxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a,kTRUE)
00096 #define cxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a)
00097 #define ccxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a,kTRUE)
00098 #define oocxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(to,RooFit::ERROR,RooFit::a)
00099 #define ooccxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a,kTRUE)
00100 #define cxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a)
00101 #define ccxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a,kTRUE)
00102 #define oocxcoutF(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a)
00103 #define ooccxcoutF(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a,kTRUE)
00104
00105 class RooMsgService : public TObject {
00106 public:
00107
00108 virtual ~RooMsgService() ;
00109
00110 struct StreamConfig {
00111 public:
00112
00113 void addTopic(RooFit::MsgTopic newTopic) {
00114 topic |= newTopic ;
00115 }
00116
00117 void removeTopic(RooFit::MsgTopic oldTopic) {
00118 topic &= ~oldTopic ;
00119 }
00120
00121
00122 friend class RooMsgService ;
00123
00124 Bool_t match(RooFit::MsgLevel level, RooFit::MsgTopic facility, const RooAbsArg* obj) ;
00125 Bool_t match(RooFit::MsgLevel level, RooFit::MsgTopic facility, const TObject* obj) ;
00126
00127 Bool_t active ;
00128 Bool_t universal ;
00129
00130 RooFit::MsgLevel minLevel ;
00131 Int_t topic ;
00132 std::string objectName ;
00133 std::string className ;
00134 std::string baseClassName ;
00135 std::string tagName ;
00136 Color_t color ;
00137 Bool_t prefix ;
00138
00139 ostream* os ;
00140
00141 } ;
00142
00143
00144 static RooMsgService& instance() ;
00145 static Bool_t anyDebug() ;
00146
00147
00148 Int_t addStream(RooFit::MsgLevel level, const RooCmdArg& arg1=RooCmdArg(), const RooCmdArg& arg2=RooCmdArg(), const RooCmdArg& arg3=RooCmdArg(),
00149 const RooCmdArg& arg4=RooCmdArg(), const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg());
00150 void deleteStream(Int_t id) ;
00151 StreamConfig& getStream(Int_t id) { return _streams[id] ; }
00152
00153 Int_t numStreams() const { return _streams.size() ; }
00154 void setStreamStatus(Int_t id, Bool_t active) ;
00155 Bool_t getStreamStatus(Int_t id) const ;
00156
00157 void reset() { cleanup() ; }
00158
00159 void setGlobalKillBelow(RooFit::MsgLevel level) { _globMinLevel = level ; }
00160 RooFit::MsgLevel globalKillBelow() const { return _globMinLevel ; }
00161
00162 void Print(Option_t *options= 0) const ;
00163 void showPid(Bool_t flag) { _showPid = flag ; }
00164
00165
00166 ostream& log(const RooAbsArg* self, RooFit::MsgLevel level, RooFit::MsgTopic facility, Bool_t forceSkipPrefix=kFALSE) ;
00167 ostream& log(const TObject* self, RooFit::MsgLevel level, RooFit::MsgTopic facility, Bool_t forceSkipPrefix=kFALSE) ;
00168 Bool_t isActive(const RooAbsArg* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
00169 Bool_t isActive(const TObject* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
00170
00171 static Int_t _debugCount ;
00172 std::map<int,std::string> _levelNames ;
00173 std::map<int,std::string> _topicNames ;
00174
00175 static void cleanup() ;
00176
00177
00178 Bool_t silentMode() const { return _silentMode ; }
00179 void setSilentMode(Bool_t flag) { _silentMode = flag ; }
00180
00181 Int_t errorCount() const { return _errorCount ; }
00182 void clearErrorCount() { _errorCount = 0 ; }
00183
00184 void saveState() ;
00185 void restoreState() ;
00186
00187 RooWorkspace* debugWorkspace() ;
00188
00189 Int_t& debugCode() { return _debugCode ; }
00190
00191 protected:
00192
00193 Int_t activeStream(const RooAbsArg* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
00194 Int_t activeStream(const TObject* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
00195
00196 std::vector<StreamConfig> _streams ;
00197 std::stack<std::vector<StreamConfig> > _streamsSaved ;
00198 std::ostream* _devnull ;
00199
00200 std::map<std::string,std::ostream*> _files ;
00201 RooFit::MsgLevel _globMinLevel ;
00202 RooFit::MsgLevel _lastMsgLevel ;
00203
00204 Bool_t _silentMode ;
00205 Bool_t _showPid ;
00206
00207 Int_t _errorCount ;
00208
00209
00210 RooMsgService() ;
00211 RooMsgService(const RooMsgService&) ;
00212
00213 static RooMsgService* _instance ;
00214
00215 RooWorkspace* _debugWorkspace ;
00216
00217 Int_t _debugCode ;
00218
00219 ClassDef(RooMsgService,0)
00220 };
00221
00222
00223 #ifdef INST_MSG_SERVICE
00224 RooMsgService* gMsgService = 0 ;
00225 #else
00226 extern RooMsgService* gMsgService ;
00227 #endif
00228
00229
00230 #endif