RooMsgService.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  *    File: $Id: RooMsgService.h,v 1.2 2007/07/13 21:50:24 wouter Exp $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
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 // Shortcut definitions 
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 // Shortcuts definitions with conditional execution of print expression -- USE WITH CAUTION 
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   // Access to instance
00144   static RooMsgService& instance() ;
00145   static Bool_t anyDebug() ;
00146 
00147   // User interface -- Add or delete reporting streams ;
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   // Back end -- Send message or check if particular logging configuration is active
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   // Print level support for RooFit-related messages that are not routed through RooMsgService (such as Minuit printouts)
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   // Private ctor -- singleton class
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) // RooFit Message Service Singleton class
00220 };
00221 
00222 
00223 #ifdef INST_MSG_SERVICE 
00224 RooMsgService* gMsgService = 0 ;
00225 #else
00226 extern RooMsgService* gMsgService ;
00227 #endif 
00228 
00229 
00230 #endif

Generated on Tue Jul 5 14:26:14 2011 for ROOT_528-00b_version by  doxygen 1.5.1