Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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;
128 }
129
131 {
132 String_V result;
133 for(const auto& el : transformers)
134 {
135 result.push_back(el.first);
136 }
137 return result;
138 }
139
141 {
142 const auto& handler = transformers.find(style);
143 return (handler != transformers.cend()) ? (handler->second)(dest) : -1;
144 }
145
146 void RegisterNewStyle(const G4String& name, SetupStyle_f& fmt)
147 {
148 if(transformers.find(name) != transformers.cend())
149 {
151 msg << "Format Style with name " << name
152 << " already exists. Replacing existing.";
153 G4Exception("G4coutFormatters::RegisterNewStyle()", "FORMATTER001",
154 JustWarning, msg);
155 }
156 // transformers.insert(std::make_pair(name,fmt));
157 transformers[name] = fmt;
158 }
159} // namespace G4coutFormatters
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
void G4iosSetDestination(G4coutDestination *sink)
Definition G4ios.cc:270
std::vector< G4String > String_V
void RegisterNewStyle(const G4String &name, SetupStyle_f &formatter)
void SetupStyleGlobally(const G4String &news)
std::function< G4int(G4coutDestination *)> SetupStyle_f
void SetMasterStyle(const G4String &)
G4int HandleStyle(G4coutDestination *dest, const G4String &style)