Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4coutFormatters.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// G4coutFormatters implementation
27//
28// Author: A.Dotti (SLAC), April 2017
29// --------------------------------------------------------------------
30
31#include "G4coutFormatters.hh"
32
33namespace G4coutFormatters
34{
35 // Internal functions and utilites used to setup default formatters
36 namespace
37 {
38 // Split a single string in an array of strings
39 //
40 String_V split(const G4String& input, char separator = '\n')
41 {
42 String_V output;
43 G4String::size_type prev_pos = 0, pos = 0;
44 while((pos = input.find(separator, pos)) != G4String::npos)
45 {
46 G4String substr(input.substr(prev_pos, pos - prev_pos));
47 output.push_back(substr);
48 prev_pos = ++pos;
49 }
50 // output.push_back( input.substr(prev_pos,pos-prev_pos));
51 return output;
52 }
53
54 // Return a syslog style message with input message, type identifies
55 // the type of the message
56 //
57 G4bool transform(G4String& input, const G4String& type)
58 {
59 std::time_t result = std::time(nullptr);
60 std::ostringstream newm;
61#if __GNUC__ >= 5
62 newm << std::put_time(std::localtime(&result), "%d/%b/%Y:%H:%M:%S %z");
63#else
64 std::tm* time_ = std::localtime(&result);
65 newm << time_->tm_mday << "/" << time_->tm_mon << "/" << time_->tm_year;
66 newm << ":" << time_->tm_hour << ":" << time_->tm_min << ":"
67 << time_->tm_sec;
68#endif
69 newm << " " << type << " [";
70 G4String delimiter = "";
71 for(const auto& el : split(input))
72 {
73 if(!el.empty())
74 {
75 newm << delimiter << el;
76 delimiter = "\\n";
77 }
78 }
79 newm << " ]" << G4endl;
80 input = newm.str();
81 return true;
82 }
83
84 // Style used in master thread
85 //
86 G4String masterStyle = "";
87
88 // Modify output to look like syslog messages:
89 // DATE TIME **LOG|ERROR** [ "multi","line","message"]
90 //
91 SetupStyle_f SysLogStyle = [](G4coutDestination* dest) -> G4int {
92 if(dest != nullptr)
93 {
94 dest->AddCoutTransformer(
95 std::bind(&transform, std::placeholders::_1, "INFO"));
96 dest->AddCerrTransformer(
97 std::bind(&transform, std::placeholders::_1, "ERROR"));
98 }
99 return 0;
100 };
101
102 // Bring back destination to original state
103 //
104 SetupStyle_f DefaultStyle = [](G4coutDestination* dest) -> G4int {
105 if(dest != nullptr)
106 {
107 dest->ResetTransformers();
108 }
109 return 0;
110 };
111
112 std::unordered_map<std::string, SetupStyle_f> transformers = {
113 { ID::SYSLOG, SysLogStyle },
114 { ID::DEFAULT, DefaultStyle }
115 };
116 } // namespace
117
118 void SetMasterStyle(const G4String& news) { masterStyle = news; }
119
120 G4String GetMasterStyle() { return masterStyle; }
121
122 void SetupStyleGlobally(const G4String& news)
123 {
124 static G4coutDestination ss;
129 }
130
132 {
133 String_V result;
134 for(const auto& el : transformers)
135 {
136 result.push_back(el.first);
137 }
138 return result;
139 }
140
142 {
143 const auto& handler = transformers.find(style);
144 return (handler != transformers.cend()) ? (handler->second)(dest) : -1;
145 }
146
147 void RegisterNewStyle(const G4String& name, SetupStyle_f& fmt)
148 {
149 if(transformers.find(name) != transformers.cend())
150 {
152 msg << "Format Style with name " << name
153 << " already exists. Replacing existing.";
154 G4Exception("G4coutFormatters::RegisterNewStyle()", "FORMATTER001",
155 JustWarning, msg);
156 }
157 // transformers.insert(std::make_pair(name,fmt));
158 transformers[name] = fmt;
159 }
160} // namespace G4coutFormatters
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL G4strstreambuf G4coutbuf
Definition: G4ios.cc:114
G4GLOB_DLL G4strstreambuf G4cerrbuf
Definition: G4ios.cc:115
void SetDestination(G4coutDestination *dest)
std::function< G4int(G4coutDestination *)> SetupStyle_f
void RegisterNewStyle(const G4String &name, SetupStyle_f &formatter)
G4String GetMasterStyle()
void SetupStyleGlobally(const G4String &news)
void SetMasterStyle(const G4String &)
std::vector< G4String > String_V
G4int HandleStyle(G4coutDestination *dest, const G4String &style)