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 // >> 27 // -------------------------------------------------------------------- >> 28 // >> 29 // G4coutFormatters.cc 27 // 30 // 28 // Author: A.Dotti (SLAC), April 2017 31 // Author: A.Dotti (SLAC), April 2017 29 // ------------------------------------------- 32 // -------------------------------------------------------------------- 30 33 31 #include "G4coutFormatters.hh" 34 #include "G4coutFormatters.hh" 32 35 33 namespace G4coutFormatters 36 namespace G4coutFormatters 34 { 37 { 35 // Internal functions and utilites used to s 38 // Internal functions and utilites used to setup default formatters 36 namespace 39 namespace 37 { 40 { 38 // Split a single string in an array of st 41 // Split a single string in an array of strings 39 // << 42 String_V split(const G4String& input, char separator='\n') 40 String_V split(const G4String& input, char << 41 { 43 { 42 String_V output; 44 String_V output; 43 G4String::size_type prev_pos = 0, pos = << 45 G4String::size_type prev_pos=0, pos=0; 44 while((pos = input.find(separator, pos)) << 46 while( (pos=input.find(separator,pos))!=G4String::npos) 45 { 47 { 46 // TBR: shouldn't be worse than push_b << 48 G4String substr( input.substr(prev_pos,pos-prev_pos)) ; 47 output.emplace_back(input.substr(prev_ << 49 output.push_back(substr); 48 prev_pos = ++pos; << 50 prev_pos = ++pos; 49 } 51 } >> 52 // output.push_back( input.substr(prev_pos,pos-prev_pos)); 50 return output; 53 return output; 51 } 54 } 52 55 53 // Return a syslog style message with inpu 56 // Return a syslog style message with input message, type identifies 54 // the type of the message 57 // the type of the message 55 // << 58 G4bool transform( G4String& input , const G4String& type) 56 G4bool transform(G4String& input, const G4 << 57 { 59 { 58 std::time_t result = std::time(nullptr); 60 std::time_t result = std::time(nullptr); 59 std::ostringstream newm; 61 std::ostringstream newm; 60 #if __GNUC__ >= 5 62 #if __GNUC__ >= 5 61 newm << std::put_time(std::localtime(&re << 63 newm << std::put_time(std::localtime(&result),"%d/%b/%Y:%H:%M:%S %z"); 62 #else 64 #else 63 std::tm* time_ = std::localtime(&result) 65 std::tm* time_ = std::localtime(&result); 64 newm << time_->tm_mday << "/" << time_-> 66 newm << time_->tm_mday << "/" << time_->tm_mon << "/" << time_->tm_year; 65 newm << ":" << time_->tm_hour << ":" << << 67 newm << ":" << time_->tm_hour << ":"<<time_->tm_min<<":"<<time_->tm_sec; 66 << 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 G4String masterStyle = ""; 85 G4String masterStyle = ""; 86 86 87 // Modify output to look like syslog messa 87 // Modify output to look like syslog messages: 88 // DATE TIME **LOG|ERROR** [ "multi","line 88 // DATE TIME **LOG|ERROR** [ "multi","line","message"] 89 // << 89 SetupStyle_f SysLogStyle = [](G4coutDestination* dest)->G4int 90 SetupStyle_f SysLogStyle = [](G4coutDestin << 90 { 91 if(dest != nullptr) << 91 if ( dest != nullptr ) 92 { 92 { 93 dest->AddCoutTransformer( << 93 dest->AddCoutTransformer(std::bind(&transform,std::placeholders::_1, 94 std::bind(&transform, std::placehold << 94 "INFO")); 95 dest->AddCerrTransformer( << 95 dest->AddCerrTransformer(std::bind(&transform,std::placeholders::_1, 96 std::bind(&transform, std::placehold << 96 "ERROR")); 97 } 97 } 98 return 0; 98 return 0; 99 }; 99 }; 100 100 101 // Bring back destination to original stat 101 // Bring back destination to original state 102 // << 102 SetupStyle_f DefaultStyle = [](G4coutDestination* dest)->G4int 103 SetupStyle_f DefaultStyle = [](G4coutDesti << 103 { 104 if(dest != nullptr) << 104 if ( dest != nullptr ) 105 { 105 { 106 dest->ResetTransformers(); << 106 dest->ResetTransformers(); 107 } 107 } 108 return 0; 108 return 0; 109 }; 109 }; 110 110 111 std::unordered_map<std::string, SetupStyle << 111 std::unordered_map<std::string,SetupStyle_f> transformers = 112 { ID::SYSLOG, SysLogStyle }, << 112 { 113 { ID::DEFAULT, DefaultStyle } << 113 {ID::SYSLOG,SysLogStyle}, >> 114 {ID::DEFAULT,DefaultStyle} 114 }; 115 }; 115 } // namespace << 116 } 116 117 117 void SetMasterStyle(const G4String& news) { << 118 void SetMasterStyle(const G4String& news ) >> 119 { >> 120 masterStyle = news; >> 121 } 118 122 119 G4String GetMasterStyle() { return masterSty << 123 G4String GetMasterStyle() >> 124 { >> 125 return masterStyle; >> 126 } 120 127 121 void SetupStyleGlobally(const G4String& news 128 void SetupStyleGlobally(const G4String& news) 122 { 129 { 123 static G4coutDestination ss; 130 static G4coutDestination ss; 124 G4iosSetDestination(&ss); << 131 G4coutbuf.SetDestination(&ss); 125 G4coutFormatters::HandleStyle(&ss, news); << 132 G4cerrbuf.SetDestination(&ss); >> 133 G4coutFormatters::HandleStyle(&ss,news); 126 G4coutFormatters::SetMasterStyle(news); 134 G4coutFormatters::SetMasterStyle(news); 127 } 135 } 128 136 129 String_V Names() 137 String_V Names() 130 { 138 { 131 String_V result; 139 String_V result; 132 for(const auto& el : transformers) << 140 for ( const auto& el : transformers ) 133 { 141 { 134 result.push_back(el.first); << 142 result.push_back(el.first); 135 } 143 } 136 return result; 144 return result; 137 } 145 } 138 146 139 G4int HandleStyle(G4coutDestination* dest, c << 147 G4int HandleStyle( G4coutDestination* dest , const G4String& style) 140 { 148 { 141 const auto& handler = transformers.find(st 149 const auto& handler = transformers.find(style); 142 return (handler != transformers.cend()) ? << 150 return ( handler != transformers.end() ) ? (handler->second)(dest) : -1; 143 } 151 } 144 152 145 void RegisterNewStyle(const G4String& name, << 153 void RegisterNewStyle(const G4String& name , SetupStyle_f& fmt) 146 { 154 { 147 if(transformers.find(name) != transformers << 155 if ( transformers.find(name) != transformers.end() ) 148 { 156 { 149 G4ExceptionDescription msg; << 157 G4ExceptionDescription msg; 150 msg << "Format Style with name " << name << 158 msg << "Format Style with name " << name 151 << " already exists. Replacing exist << 159 << " already exists. Replacing existing."; 152 G4Exception("G4coutFormatters::RegisterN << 160 G4Exception("G4coutFormatters::RegisterNewStyle()", 153 JustWarning, msg); << 161 "FORMATTER001", JustWarning, msg); 154 } 162 } 155 // transformers.insert(std::make_pair(name 163 // transformers.insert(std::make_pair(name,fmt)); 156 transformers[name] = fmt; << 164 transformers[name]=fmt; 157 } 165 } 158 } // namespace G4coutFormatters << 166 } 159 167