ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4INCLLogger.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4INCLLogger.hh
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // INCL++ intra-nuclear cascade model
27 // Alain Boudard, CEA-Saclay, France
28 // Joseph Cugnon, University of Liege, Belgium
29 // Jean-Christophe David, CEA-Saclay, France
30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31 // Sylvie Leray, CEA-Saclay, France
32 // Davide Mancusi, CEA-Saclay, France
33 //
34 #define INCLXX_IN_GEANT4_MODE 1
35 
36 #include "globals.hh"
37 
38 #ifndef G4INCLLogger_hh
39 #define G4INCLLogger_hh 1
40 
41 #include <iostream>
42 #include <fstream>
43 #include <sstream>
44 #include <string>
45 #include <cstdlib>
46 
47 #ifdef INCLXX_IN_GEANT4_MODE
48 #include "G4ios.hh"
49 #endif
50 
51 #include "G4INCLRandom.hh"
52 #include "G4INCLConfig.hh"
53 
54 namespace G4INCL {
55 
59  enum MessageType { InfoMsg = 1,
60  FatalMsg = 2,
61  ErrorMsg = 3,
63  DebugMsg = 7,
65  ZeroMsg = 0 };
66 
67 #if defined(INCL_DEBUG_LOG) && !defined(INCLXX_IN_GEANT4_MODE)
68 
69  class LoggerSlave {
70  public:
71  // By default, log fatal errors, errors and warnings
72  LoggerSlave(std::string const &logFileName, const G4int verbosity=4) :
73  logStream(0),
74  verbosityLevel(verbosity)
75  {
76  if(logFileName=="-") {
77  logStream = &(std::cout);
78  logToStdout = true;
79  } else {
80  logToStdout = false;
81  logStream = new std::ofstream(logFileName.c_str());
82  if(!logStream)
83  {
84  std::cerr << "Fatal error: couldn't open log file " << logFileName << std::endl;
85  std::exit(EXIT_FAILURE);
86  }
87  }
88 
89  // Spell out "true" and "false" when logging G4bool variables
90  std::boolalpha(*logStream);
91  };
92  ~LoggerSlave() {
93  if(!logToStdout)
94  delete logStream;
95  };
96 
100  void setVerbosityLevel(G4int lvl) { verbosityLevel = lvl; }
101 
105  G4int getVerbosityLevel() { return verbosityLevel; }
106 
108  void logMessage(const MessageType type, const std::string &fileName, const G4int lineNumber, std::string const &s, const G4bool prefixHash=true) const;
109 
111  void flush() { logStream->flush(); }
112 
114  void logDataBlock(const std::string &block, const std::string &fileName, const G4int lineNumber) const;
115 
116  typedef std::basic_ostream<char, std::char_traits<char> > CoutType;
117  typedef CoutType& (*StandardEndLine)(CoutType&);
119  LoggerSlave const &operator<<(StandardEndLine const &manip) const {
120  manip(*logStream);
121  return *this;
122  }
123 
125  template<typename T>
126  LoggerSlave const &operator<<(const T &t) const {
127  (*logStream) << t;
128  return *this;
129  }
130 
131  private:
132  std::ostream *logStream;
133  G4int verbosityLevel;
134  G4bool logToStdout;
135  };
136 
137  namespace Logger {
139  void logMessage(const MessageType type, std::string const &fileName, const G4int lineNumber, std::string const &s, const G4bool prefixHash=true);
140 
142  void flush();
143 
145  void dataBlock(const std::string &block, const std::string &fileName, const G4int lineNumber);
146 
148  void setLoggerSlave(LoggerSlave * const logger);
149 
151  void setVerbosityLevel(G4int lvl);
152 
155 
157  void deleteLoggerSlave();
158 
160  void initialize(Config const * const theConfig);
161 
162  }
163 
164  // Macro definitions for line numbering in log files!
165 #define INCL_FATAL(x) \
166  if(true) {\
167  std::stringstream ss_;\
168  ss_ << x;\
169  ss_ << "Random seeds at the beginning of this event: " << G4INCL::Random::getSavedSeeds() << std::endl;\
170  G4INCL::Logger::logMessage(G4INCL::FatalMsg, __FILE__,__LINE__, ss_.str());\
171  G4INCL::Logger::flush();\
172  std::exit(EXIT_FAILURE);\
173  } else (void)0
174 #define INCL_ERROR(x) \
175  if(G4INCL::ErrorMsg <= G4INCL::Logger::getVerbosityLevel()) {\
176  std::stringstream ss_;\
177  ss_ << x;\
178  ss_ << "Random seeds at the beginning of this event: " << G4INCL::Random::getSavedSeeds() << std::endl;\
179  G4INCL::Logger::logMessage(G4INCL::ErrorMsg, __FILE__,__LINE__, ss_.str());\
180  } else (void)0
181 #define INCL_WARN(x) \
182  if(G4INCL::WarningMsg <= G4INCL::Logger::getVerbosityLevel()) {\
183  std::stringstream ss_;\
184  ss_ << x;\
185  G4INCL::Logger::logMessage(G4INCL::WarningMsg, __FILE__,__LINE__, ss_.str());\
186  } else (void)0
187 #define INCL_INFO(x) \
188  if(G4INCL::InfoMsg <= G4INCL::Logger::getVerbosityLevel()) {\
189  std::stringstream ss_;\
190  ss_ << x;\
191  G4INCL::Logger::logMessage(G4INCL::InfoMsg, __FILE__,__LINE__, ss_.str());\
192  } else (void)0
193 #define INCL_INFO_NOCOMMENT(x) \
194  if(G4INCL::InfoMsg <= G4INCL::Logger::getVerbosityLevel()) {\
195  std::stringstream ss_;\
196  ss_ << x;\
197  G4INCL::Logger::logMessage(G4INCL::InfoMsg, __FILE__,__LINE__, ss_.str(), false);\
198  } else (void)0
199 #define INCL_DEBUG(x) \
200  if(G4INCL::DebugMsg <= G4INCL::Logger::getVerbosityLevel()) {\
201  std::stringstream ss_;\
202  ss_ << x;\
203  G4INCL::Logger::logMessage(G4INCL::DebugMsg, __FILE__,__LINE__, ss_.str());\
204  } else (void)0
205 #define INCL_DATABLOCK(x) \
206  if(G4INCL::DataBlockMsg <= G4INCL::Logger::getVerbosityLevel()) {\
207  G4INCL::Logger::dataBlock(x,__FILE__,__LINE__);\
208  } else (void)0
209 
210 #else // defined(INCL_DEBUG_LOG) && !defined(INCLXX_IN_GEANT4_MODE)
211  namespace Logger {
214  }
215 
216 #define INCL_FATAL(x) \
217  if(true) {\
218  std::stringstream ss_;\
219  ss_ << x;\
220  std::stringstream location_;\
221  std::string fileName_(__FILE__);\
222  location_ << fileName_.substr(fileName_.find_last_of("/")+1) << ":" << __LINE__;\
223  G4Exception(location_.str().c_str(), "INCLXX0000", EventMustBeAborted, ss_.str().c_str());\
224  } else (void)0
225 #define INCL_ERROR(x) \
226  if(G4INCL::ErrorMsg <= G4INCL::Logger::getVerbosityLevel()) {\
227  std::string fileName_(__FILE__);\
228  std::stringstream ss_;\
229  ss_ << "INCL++ error [" << fileName_.substr(fileName_.find_last_of("/")+1) << ":" << __LINE__ << "] " << x;\
230  G4cout << ss_.str() << '\n';\
231  } else (void)0
232 #define INCL_WARN(x) \
233  if(G4INCL::WarningMsg <= G4INCL::Logger::getVerbosityLevel()) {\
234  std::string fileName_(__FILE__);\
235  std::stringstream ss_;\
236  ss_ << "INCL++ warning [" << fileName_.substr(fileName_.find_last_of("/")+1) << ":" << __LINE__ << "] " << x;\
237  G4cout << ss_.str() << '\n';\
238  } else (void)0
239 #define INCL_INFO(x);
240 #define INCL_DEBUG(x) \
241  if(G4INCL::DebugMsg <= G4INCL::Logger::getVerbosityLevel()) {\
242  std::string fileName_(__FILE__);\
243  std::stringstream ss_;\
244  ss_ << "INCL++ debug [" << fileName_.substr(fileName_.find_last_of("/")+1) << ":" << __LINE__ << "] " << x;\
245  G4cout << ss_.str() << '\n';\
246  } else (void)0
247 #define INCL_DATABLOCK(x);
248 
249 #endif // defined(INCL_DEBUG_LOG) && !defined(INCLXX_IN_GEANT4_MODE)
250 }
251 #endif