Geant4-11
G4INCLLogger.cc
Go to the documentation of this file.
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#include "G4INCLLogger.hh"
39#include "G4INCLGlobals.hh"
40
41#ifdef INCLXX_IN_GEANT4_MODE
42#include <cstdlib>
43#endif
44
45namespace G4INCL {
46#if defined(INCL_DEBUG_LOG) && !defined(INCLXX_IN_GEANT4_MODE)
47 std::string typeToString(const MessageType t) {
48 if(t == ErrorMsg)
49 return std::string("Error");
50 else if(t == FatalMsg)
51 return std::string ("Fatal");
52 else if(t == WarningMsg)
53 return std::string("Warning");
54 else if(t == DebugMsg)
55 return std::string("Debug");
56 else if(t == InfoMsg)
57 return std::string("");
58 else if(t == DataBlockMsg)
59 return std::string("DataBlock");
60 else
61 return std::string("Unknown");
62 }
63
64 void LoggerSlave::logMessage(const MessageType type, const std::string &fileName, const G4int lineNumber, std::string const &s, const G4bool prefixHash) const {
65 std::string cont = (prefixHash ? "\n# " : "\n");
66 std::string header = (prefixHash ? "# " : "");
67 if(type!=InfoMsg) {
68 std::stringstream headerss;
69 headerss << typeToString(type) << " [";
70 cont += headerss.str();
71 headerss <<
72 fileName.substr(fileName.find_last_of("/")+1) <<
73 ":" << lineNumber << "] ";
74 header += headerss.str();
75 cont.append(header.size() - cont.size() - 1, '.');
76 cont += "] ";
77 }
78
79 std::string message(s);
80 String::replaceAll(message, "\n", cont, s.size()-2);
81 (*logStream) << header << message;
82
83 return;
84 }
85
86 void LoggerSlave::logDataBlock(const std::string &block, const std::string &fileName, const G4int lineNumber) const {
87 (*logStream) << typeToString(DataBlockMsg) << " [" <<
88 fileName.substr(fileName.find_last_of("/")+1) <<
89 ":" << lineNumber << "] " << '\n'
90 << "BEGINDATA"
91 << block
92 << "ENDDATA" << '\n';
93 }
94
95 namespace Logger {
96
97 namespace {
98 G4ThreadLocal LoggerSlave *theLoggerSlave = NULL;
99 }
100
101 void logMessage(const MessageType type, std::string const &fileName, const G4int lineNumber, std::string const &s, const G4bool prefixHash) {
102 if(theLoggerSlave)
103 theLoggerSlave->logMessage(type, fileName, lineNumber, s, prefixHash);
104 }
105
106 void flush() {
107 if(theLoggerSlave)
108 theLoggerSlave->flush();
109 }
110
111 void dataBlock(const std::string &block, const std::string &fileName, const G4int lineNumber) {
112 theLoggerSlave->logDataBlock(block, fileName, lineNumber);
113 }
114
115 void setLoggerSlave(LoggerSlave * const logger) { theLoggerSlave = logger; }
116
117 void setVerbosityLevel(G4int lvl) {
118 if(theLoggerSlave)
119 theLoggerSlave->setVerbosityLevel(lvl);
120 }
121
123 if(theLoggerSlave)
124 return theLoggerSlave->getVerbosityLevel();
125 else
126 return 0;
127 }
128
129 void deleteLoggerSlave() {
130 delete theLoggerSlave;
131 theLoggerSlave=NULL;
132 }
133
134 void initialize(Config const * const theConfig) {
135 setLoggerSlave(new LoggerSlave(theConfig->getLogFileName(), theConfig->getVerbosity()));
136 }
137
138 }
139
140#else // defined(INCL_DEBUG_LOG) && !defined(INCLXX_IN_GEANT4_MODE)
141
142 namespace Logger {
143
144 namespace {
146 }
147
149 const char * const envVar = std::getenv("G4INCL_DEBUG_VERBOSITY");
150 if(envVar) {
151 std::stringstream verbss(envVar);
152 verbss >> verbosityLevel;
153 } else {
154 verbosityLevel = 0;
155 }
156 }
157
159 return verbosityLevel;
160 }
161
162 }
163
164#endif // defined(INCL_DEBUG_LOG) && !defined(INCLXX_IN_GEANT4_MODE)
165}
static constexpr double s
Definition: G4SIunits.hh:154
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
void initialize(Config const *const theConfig)
Initialize the clustering model based on the Config object.
G4int getVerbosityLevel()
void initVerbosityLevelFromEnvvar()
@ WarningMsg
Definition: G4INCLLogger.hh:62
@ DataBlockMsg
Definition: G4INCLLogger.hh:64
#define G4ThreadLocal
Definition: tls.hh:77