Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4coutFormatters implementation 26 // G4coutFormatters implementation 27 // 27 // 28 // Author: A.Dotti (SLAC), April 2017 28 // Author: A.Dotti (SLAC), April 2017 29 // ------------------------------------------- 29 // -------------------------------------------------------------------- 30 30 31 #include "G4coutFormatters.hh" 31 #include "G4coutFormatters.hh" 32 32 33 namespace G4coutFormatters 33 namespace G4coutFormatters 34 { 34 { 35 // Internal functions and utilites used to s 35 // Internal functions and utilites used to setup default formatters 36 namespace 36 namespace 37 { 37 { 38 // Split a single string in an array of st 38 // Split a single string in an array of strings 39 // 39 // 40 String_V split(const G4String& input, char 40 String_V split(const G4String& input, char separator = '\n') 41 { 41 { 42 String_V output; 42 String_V output; 43 G4String::size_type prev_pos = 0, pos = 43 G4String::size_type prev_pos = 0, pos = 0; 44 while((pos = input.find(separator, pos)) 44 while((pos = input.find(separator, pos)) != G4String::npos) 45 { 45 { 46 // TBR: shouldn't be worse than push_b << 46 G4String substr(input.substr(prev_pos, pos - prev_pos)); 47 output.emplace_back(input.substr(prev_ << 47 output.push_back(substr); 48 prev_pos = ++pos; 48 prev_pos = ++pos; 49 } 49 } >> 50 // output.push_back( input.substr(prev_pos,pos-prev_pos)); 50 return output; 51 return output; 51 } 52 } 52 53 53 // Return a syslog style message with inpu 54 // Return a syslog style message with input message, type identifies 54 // the type of the message 55 // the type of the message 55 // 56 // 56 G4bool transform(G4String& input, const G4 57 G4bool transform(G4String& input, const G4String& type) 57 { 58 { 58 std::time_t result = std::time(nullptr); 59 std::time_t result = std::time(nullptr); 59 std::ostringstream newm; 60 std::ostringstream newm; 60 #if __GNUC__ >= 5 61 #if __GNUC__ >= 5 61 newm << std::put_time(std::localtime(&re 62 newm << std::put_time(std::localtime(&result), "%d/%b/%Y:%H:%M:%S %z"); 62 #else 63 #else 63 std::tm* time_ = std::localtime(&result) 64 std::tm* time_ = std::localtime(&result); 64 newm << time_->tm_mday << "/" << time_-> 65 newm << time_->tm_mday << "/" << time_->tm_mon << "/" << time_->tm_year; 65 newm << ":" << time_->tm_hour << ":" << 66 newm << ":" << time_->tm_hour << ":" << time_->tm_min << ":" 66 << time_->tm_sec; 67 << time_->tm_sec; 67 #endif 68 #endif 68 newm << " " << type << " ["; 69 newm << " " << type << " ["; 69 G4String delimiter = ""; 70 G4String delimiter = ""; 70 for(const auto& el : split(input)) 71 for(const auto& el : split(input)) 71 { 72 { 72 if(!el.empty()) 73 if(!el.empty()) 73 { 74 { 74 newm << delimiter << el; 75 newm << delimiter << el; 75 delimiter = "\\n"; 76 delimiter = "\\n"; 76 } 77 } 77 } 78 } 78 newm << " ]" << G4endl; 79 newm << " ]" << G4endl; 79 input = newm.str(); 80 input = newm.str(); 80 return true; 81 return true; 81 } 82 } 82 83 83 // Style used in master thread 84 // Style used in master thread 84 // 85 // 85 G4String masterStyle = ""; 86 G4String masterStyle = ""; 86 87 87 // Modify output to look like syslog messa 88 // Modify output to look like syslog messages: 88 // DATE TIME **LOG|ERROR** [ "multi","line 89 // DATE TIME **LOG|ERROR** [ "multi","line","message"] 89 // 90 // 90 SetupStyle_f SysLogStyle = [](G4coutDestin 91 SetupStyle_f SysLogStyle = [](G4coutDestination* dest) -> G4int { 91 if(dest != nullptr) 92 if(dest != nullptr) 92 { 93 { 93 dest->AddCoutTransformer( 94 dest->AddCoutTransformer( 94 std::bind(&transform, std::placehold 95 std::bind(&transform, std::placeholders::_1, "INFO")); 95 dest->AddCerrTransformer( 96 dest->AddCerrTransformer( 96 std::bind(&transform, std::placehold 97 std::bind(&transform, std::placeholders::_1, "ERROR")); 97 } 98 } 98 return 0; 99 return 0; 99 }; 100 }; 100 101 101 // Bring back destination to original stat 102 // Bring back destination to original state 102 // 103 // 103 SetupStyle_f DefaultStyle = [](G4coutDesti 104 SetupStyle_f DefaultStyle = [](G4coutDestination* dest) -> G4int { 104 if(dest != nullptr) 105 if(dest != nullptr) 105 { 106 { 106 dest->ResetTransformers(); 107 dest->ResetTransformers(); 107 } 108 } 108 return 0; 109 return 0; 109 }; 110 }; 110 111 111 std::unordered_map<std::string, SetupStyle 112 std::unordered_map<std::string, SetupStyle_f> transformers = { 112 { ID::SYSLOG, SysLogStyle }, 113 { ID::SYSLOG, SysLogStyle }, 113 { ID::DEFAULT, DefaultStyle } 114 { ID::DEFAULT, DefaultStyle } 114 }; 115 }; 115 } // namespace 116 } // namespace 116 117 117 void SetMasterStyle(const G4String& news) { 118 void SetMasterStyle(const G4String& news) { masterStyle = news; } 118 119 119 G4String GetMasterStyle() { return masterSty 120 G4String GetMasterStyle() { return masterStyle; } 120 121 121 void SetupStyleGlobally(const G4String& news 122 void SetupStyleGlobally(const G4String& news) 122 { 123 { 123 static G4coutDestination ss; 124 static G4coutDestination ss; 124 G4iosSetDestination(&ss); << 125 G4coutbuf.SetDestination(&ss); >> 126 G4cerrbuf.SetDestination(&ss); 125 G4coutFormatters::HandleStyle(&ss, news); 127 G4coutFormatters::HandleStyle(&ss, news); 126 G4coutFormatters::SetMasterStyle(news); 128 G4coutFormatters::SetMasterStyle(news); 127 } 129 } 128 130 129 String_V Names() 131 String_V Names() 130 { 132 { 131 String_V result; 133 String_V result; 132 for(const auto& el : transformers) 134 for(const auto& el : transformers) 133 { 135 { 134 result.push_back(el.first); 136 result.push_back(el.first); 135 } 137 } 136 return result; 138 return result; 137 } 139 } 138 140 139 G4int HandleStyle(G4coutDestination* dest, c 141 G4int HandleStyle(G4coutDestination* dest, const G4String& style) 140 { 142 { 141 const auto& handler = transformers.find(st 143 const auto& handler = transformers.find(style); 142 return (handler != transformers.cend()) ? 144 return (handler != transformers.cend()) ? (handler->second)(dest) : -1; 143 } 145 } 144 146 145 void RegisterNewStyle(const G4String& name, 147 void RegisterNewStyle(const G4String& name, SetupStyle_f& fmt) 146 { 148 { 147 if(transformers.find(name) != transformers 149 if(transformers.find(name) != transformers.cend()) 148 { 150 { 149 G4ExceptionDescription msg; 151 G4ExceptionDescription msg; 150 msg << "Format Style with name " << name 152 msg << "Format Style with name " << name 151 << " already exists. Replacing exist 153 << " already exists. Replacing existing."; 152 G4Exception("G4coutFormatters::RegisterN 154 G4Exception("G4coutFormatters::RegisterNewStyle()", "FORMATTER001", 153 JustWarning, msg); 155 JustWarning, msg); 154 } 156 } 155 // transformers.insert(std::make_pair(name 157 // transformers.insert(std::make_pair(name,fmt)); 156 transformers[name] = fmt; 158 transformers[name] = fmt; 157 } 159 } 158 } // namespace G4coutFormatters 160 } // namespace G4coutFormatters 159 161