Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooMsgService.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * File: $Id: RooMsgService.h,v 1.2 2007/07/13 21:50:24 wouter Exp $
5  * Authors: *
6  * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7  * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8  * *
9  * Copyright (c) 2000-2005, Regents of the University of California *
10  * and Stanford University. All rights reserved. *
11  * *
12  * Redistribution and use in source and binary forms, *
13  * with or without modification, are permitted according to the terms *
14  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15  *****************************************************************************/
16 #ifndef ROO_MSG_SERVICE
17 #define ROO_MSG_SERVICE
18 
19 #include <assert.h>
20 #include "TObject.h"
21 #include <string>
22 #include <vector>
23 #include <stack>
24 #include <map>
25 #include "RooCmdArg.h"
26 #include "RooGlobalFunc.h"
27 class RooAbsArg ;
28 class RooWorkspace ;
29 
30 // Shortcut definitions
31 #define coutI(a) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a)
32 #define coutP(a) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a)
33 #define coutW(a) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a)
34 #define coutE(a) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a)
35 #define coutF(a) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a)
36 
37 // Skip the message prefix
38 #define ccoutD(a) RooMsgService::instance().log(this,RooFit::DEBUG,RooFit::a,kTRUE)
39 #define ccoutI(a) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE)
40 #define ccoutP(a) RooMsgService::instance().log(this,RooFit::PROGRESS,RooFit::a,kTRUE)
41 #define ccoutW(a) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a,kTRUE)
42 #define ccoutE(a) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a,kTRUE)
43 #define ccoutF(a) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a,kTRUE)
44 
45 // Message from given object instead of "this"
46 #define oocoutI(o,a) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a)
47 #define oocoutP(o,a) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a)
48 #define oocoutW(o,a) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a)
49 #define oocoutE(o,a) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a)
50 #define oocoutF(o,a) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a)
51 
52 // Message from given object instead of "this" and skip message prefix
53 #define ooccoutD(o,a) RooMsgService::instance().log(o,RooFit::DEBUG,RooFit::a,kTRUE)
54 #define ooccoutI(o,a) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE)
55 #define ooccoutP(o,a) RooMsgService::instance().log(o,RooFit::PROGRESS,RooFit::a,kTRUE)
56 #define ooccoutW(o,a) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a,kTRUE)
57 #define ooccoutE(o,a) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a,kTRUE)
58 #define ooccoutF(o,a) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a,kTRUE)
59 
60 #ifndef _WIN32
61 #define ANYDEBUG (RooMsgService::_debugCount>0)
62 #else
63 #define ANYDEBUG (RooMsgService::anyDebug())
64 #endif
65 
66 #define dologD(a) (ANYDEBUG && RooMsgService::instance().isActive(this,RooFit::a,RooFit::DEBUG))
67 #define dologI(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO))
68 #define dologP(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS))
69 #define dologW(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING))
70 #define dologE(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR))
71 #define dologF(a) (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL))
72 
73 #define oodologD(o,a) (ANYDEBUG && RooMsgService::instance().isActive(o,RooFit::a,RooFit::DEBUG))
74 #define oodologI(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO))
75 #define oodologP(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS))
76 #define oodologW(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING))
77 #define oodologE(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR))
78 #define oodologF(o,a) (RooMsgService::instance().isActive(o,RooFit::a,RooFit::FATAL))
79 
80 // Shortcuts definitions with conditional execution of print expression -- USE WITH CAUTION
81 
82 #define cxcoutD(a) if (ANYDEBUG && RooMsgService::instance().isActive(this,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(this,RooFit::DEBUG,RooFit::a)
83 #define ccxcoutD(a) if (ANYDEBUG && RooMsgService::instance().isActive(this,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(this,RooFit::DEBUG,RooFit::a,kTRUE)
84 #define oocxcoutD(o,a) if (ANYDEBUG && RooMsgService::instance().isActive(o,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(o,RooFit::DEBUG,RooFit::a)
85 #define ooccxcoutD(o,a) if (ANYDEBUG && RooMsgService::instance().isActive(o,RooFit::a,RooFit::DEBUG)) RooMsgService::instance().log(o,RooFit::DEBUG,RooFit::a,kTRUE)
86 #define cxcoutI(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a)
87 #define ccxcoutI(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE)
88 #define oocxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a)
89 #define ooccxcoutI(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::INFO)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE)
90 #define cxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a)
91 #define ccxcoutP(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(this,RooFit::INFO,RooFit::a,kTRUE)
92 #define oocxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a)
93 #define ooccxcoutP(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::PROGRESS)) RooMsgService::instance().log(o,RooFit::INFO,RooFit::a,kTRUE)
94 #define cxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a)
95 #define ccxcoutW(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(this,RooFit::WARNING,RooFit::a,kTRUE)
96 #define oocxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a)
97 #define ooccxcoutW(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::WARNING)) RooMsgService::instance().log(o,RooFit::WARNING,RooFit::a,kTRUE)
98 #define cxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a)
99 #define ccxcoutE(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(this,RooFit::ERROR,RooFit::a,kTRUE)
100 #define oocxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(to,RooFit::ERROR,RooFit::a)
101 #define ooccxcoutE(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::ERROR)) RooMsgService::instance().log(o,RooFit::ERROR,RooFit::a,kTRUE)
102 #define cxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a)
103 #define ccxcoutF(a) if (RooMsgService::instance().isActive(this,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(this,RooFit::FATAL,RooFit::a,kTRUE)
104 #define oocxcoutF(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a)
105 #define ooccxcoutF(o,a) if (RooMsgService::instance().isActive(o,RooFit::a,RooFit::FATAL)) RooMsgService::instance().log(o,RooFit::FATAL,RooFit::a,kTRUE)
106 
107 class RooMsgService : public TObject {
108 public:
109 
110  virtual ~RooMsgService() ;
111 
112  struct StreamConfig {
113  public:
114 
115  void addTopic(RooFit::MsgTopic newTopic) {
116  topic |= newTopic ;
117  }
118 
119  void removeTopic(RooFit::MsgTopic oldTopic) {
120  topic &= ~oldTopic ;
121  }
122 
123 
124  friend class RooMsgService ;
125 
126  Bool_t match(RooFit::MsgLevel level, RooFit::MsgTopic facility, const RooAbsArg* obj) ;
127  Bool_t match(RooFit::MsgLevel level, RooFit::MsgTopic facility, const TObject* obj) ;
128 
129  Bool_t active ;
130  Bool_t universal ;
131 
132  RooFit::MsgLevel minLevel ;
133  Int_t topic ;
134  std::string objectName ;
135  std::string className ;
136  std::string baseClassName ;
137  std::string tagName ;
138  Color_t color ;
139  Bool_t prefix ;
140 
141  std::ostream* os ;
142 
143  } ;
144 
145  // Access to instance
146  static RooMsgService& instance();
147  static Bool_t anyDebug() ;
148 
149  // User interface -- Add or delete reporting streams ;
150  Int_t addStream(RooFit::MsgLevel level, const RooCmdArg& arg1=RooCmdArg(), const RooCmdArg& arg2=RooCmdArg(), const RooCmdArg& arg3=RooCmdArg(),
151  const RooCmdArg& arg4=RooCmdArg(), const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg());
152  void deleteStream(Int_t id) ;
153  StreamConfig& getStream(Int_t id) { return _streams[id] ; }
154 
155  Int_t numStreams() const { return _streams.size() ; }
156  void setStreamStatus(Int_t id, Bool_t active) ;
157  Bool_t getStreamStatus(Int_t id) const ;
158 
159  void reset();
160 
161  void setGlobalKillBelow(RooFit::MsgLevel level) { _globMinLevel = level ; }
162  RooFit::MsgLevel globalKillBelow() const { return _globMinLevel ; }
163 
164  void Print(Option_t *options= 0) const ;
165  void showPid(Bool_t flag) { _showPid = flag ; }
166 
167  // Back end -- Send message or check if particular logging configuration is active
168  std::ostream& log(const RooAbsArg* self, RooFit::MsgLevel level, RooFit::MsgTopic facility, Bool_t forceSkipPrefix=kFALSE) ;
169  std::ostream& log(const TObject* self, RooFit::MsgLevel level, RooFit::MsgTopic facility, Bool_t forceSkipPrefix=kFALSE) ;
170  Bool_t isActive(const RooAbsArg* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
171  Bool_t isActive(const TObject* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
172 
173  static Int_t _debugCount ;
174  std::map<int,std::string> _levelNames ;
175  std::map<int,std::string> _topicNames ;
176 
177  // Print level support for RooFit-related messages that are not routed through RooMsgService (such as Minuit printouts)
178  Bool_t silentMode() const { return _silentMode ; }
179  void setSilentMode(Bool_t flag) { _silentMode = flag ; }
180 
181  Int_t errorCount() const { return _errorCount ; }
182  void clearErrorCount() { _errorCount = 0 ; }
183 
184  void saveState() ;
185  void restoreState() ;
186 
187  RooWorkspace* debugWorkspace() ;
188 
189  Int_t& debugCode() { return _debugCode ; }
190 
191 protected:
192 
193  Int_t activeStream(const RooAbsArg* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
194  Int_t activeStream(const TObject* self, RooFit::MsgTopic facility, RooFit::MsgLevel level) ;
195 
196  std::vector<StreamConfig> _streams ;
197  std::stack<std::vector<StreamConfig> > _streamsSaved ;
198  std::ostream* _devnull ;
199 
200  std::map<std::string,std::ostream*> _files ;
201  RooFit::MsgLevel _globMinLevel ;
202  RooFit::MsgLevel _lastMsgLevel ;
203 
204  Bool_t _silentMode ;
205  Bool_t _showPid ;
206 
207  Int_t _errorCount ;
208 
209  // Private ctor -- singleton class
210  RooMsgService() ;
211  RooMsgService(const RooMsgService&) ;
212 
213  RooWorkspace* _debugWorkspace ;
214 
215  Int_t _debugCode ;
216 
217  ClassDef(RooMsgService,0) // RooFit Message Service Singleton class
218 };
219 
220 #endif