Geant4 Cross Reference |
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 27 // Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr) 28 29 #include "G4AnalysisUtilities.hh" 30 #include "G4BinScheme.hh" 31 #include "G4Exception.hh" 32 #include "G4UnitsTable.hh" 33 #include "G4String.hh" 34 #include "G4Threading.hh" 35 #include "G4Filesystem.hh" 36 37 using std::to_string; 38 39 namespace { 40 41 //_____________________________________________________________________________ 42 G4bool GetToken(const G4String& line, G4String& token, 43 std::string::size_type begIdx, std::string::size_type& endIdx) 44 { 45 while ( line[(G4int)begIdx] == ' ') ++begIdx; // Loop checking, 23.06.2015, I. Hrivnacova 46 if ( line[(G4int)begIdx] == '"' ) { 47 endIdx = line.find('"', begIdx+1); 48 if ( endIdx == std::string::npos ) endIdx = line.length(); 49 token = line.substr(begIdx+1, (endIdx-1)-begIdx); 50 ++endIdx; 51 } 52 else { 53 endIdx = line.find(' ', begIdx); 54 if ( endIdx == std::string::npos ) endIdx = line.length(); 55 token = line.substr(begIdx, endIdx-begIdx); 56 } 57 return ( token.length() > 0 ); 58 } 59 60 } 61 62 namespace G4Analysis 63 { 64 65 //_____________________________________________________________________________ 66 void Warn(const G4String& message, 67 const std::string_view inClass, 68 const std::string_view inFunction) 69 { 70 auto source = std::string(inClass) + "::" + std::string(inFunction); 71 G4Exception(source.data(), "Analysis_W001", JustWarning, message); 72 } 73 74 //_____________________________________________________________________________ 75 G4double GetUnitValue(const G4String& unit) 76 { 77 G4double value = 1.; 78 if ( unit != "none" ) { 79 value = G4UnitDefinition::GetValueOf(unit); 80 if ( value == 0. ) value = 1.; 81 } 82 return value; 83 } 84 85 //_____________________________________________________________________________ 86 void Tokenize(const G4String& line, std::vector<G4String>& tokens) 87 { 88 // Define start values 89 std::string::size_type begIdx = 0; 90 std::string::size_type endIdx = 0; 91 G4String token; 92 93 do { 94 if ( GetToken(line, token, begIdx, endIdx) ) { 95 //G4cout << "got token: '" << token << "'" << G4endl; 96 //G4cout << "beg, end: " << begIdx << ", " << endIdx << G4endl; 97 tokens.push_back(token); 98 } 99 begIdx = endIdx + 1; 100 } 101 while ( endIdx < line.length() ); // Loop checking, 23.06.2015, I. Hrivnacova 102 } 103 104 //_____________________________________________________________________________ 105 G4AnalysisOutput GetOutput(const G4String& outputName, G4bool warn) 106 { 107 if (outputName == "csv") return G4AnalysisOutput::kCsv; 108 if (outputName == "hdf5") return G4AnalysisOutput::kHdf5; 109 if (outputName == "root") return G4AnalysisOutput::kRoot; 110 if (outputName == "xml") return G4AnalysisOutput::kXml; 111 if (outputName == "none") return G4AnalysisOutput::kNone; 112 113 if (warn) { 114 Warn("\"" + outputName + "\" output type is not supported.", kNamespaceName, "GetOutput"); 115 } 116 return G4AnalysisOutput::kNone; 117 } 118 119 //_____________________________________________________________________________ 120 G4String GetOutputName(G4AnalysisOutput output) 121 { 122 switch ( output ) { 123 case G4AnalysisOutput::kCsv: 124 return "csv"; 125 break; 126 case G4AnalysisOutput::kHdf5: 127 return "hdf5"; 128 break; 129 case G4AnalysisOutput::kRoot: 130 return "root"; 131 break; 132 case G4AnalysisOutput::kXml: 133 return "xml"; 134 break; 135 case G4AnalysisOutput::kNone: 136 return "none"; 137 break; 138 } 139 // should never reach this line 140 Warn("\"" + to_string(static_cast<int>(output)) + 141 "\" output type is not supported.", 142 kNamespaceName, "CheckOutputName"); 143 return "none"; 144 } 145 146 //_____________________________________________________________________________ 147 G4String GetBaseName(const G4String& fileName) 148 { 149 // Get file base name (without dot) 150 151 G4fs::path filePath(fileName.data()); 152 if ( filePath.has_parent_path()) { 153 return filePath.parent_path().string() + "/" + filePath.stem().string(); 154 } 155 156 return filePath.stem().string(); 157 } 158 159 //_____________________________________________________________________________ 160 G4String GetExtension(const G4String& fileName, 161 const G4String& defaultExtension) 162 { 163 // Get file base extension (without dot) 164 // If fileName is provided without extension, return defaultExtension 165 166 G4fs::path filePath(fileName.data()); 167 if ( filePath.has_extension() ) { 168 auto extension = filePath.extension().string(); 169 // remove "." 170 return extension.substr(1, extension.length()); 171 } 172 173 return defaultExtension; 174 } 175 176 //_____________________________________________________________________________ 177 G4String GetHnFileName( 178 const G4String& fileName, 179 const G4String& fileType, 180 const G4String& hnType, 181 const G4String& hnName) 182 { 183 // Compose and return the histogram or profile specific file name: 184 // - add _hn_hnName suffix to the file base name 185 // - add _vN suffix if cycle > 0 186 // - add file extension if not present 187 188 auto name = GetBaseName(fileName); 189 190 // Add _hnType_hnName 191 name.append("_"); 192 name.append(hnType); 193 name.append("_"); 194 name.append(hnName); 195 196 // Add file extension 197 auto extension = GetExtension(fileName, fileType); 198 if (extension.size() != 0u) { 199 name.append("."); 200 name.append(extension); 201 } 202 203 return name; 204 } 205 206 //_____________________________________________________________________________ 207 G4String GetHnFileName( 208 const G4String& fileName, 209 const G4String& fileType, 210 G4int cycle) 211 { 212 // Update Hn file name: 213 // - add _vN suffix to the base namer if cycle > 0 214 215 auto name = GetBaseName(fileName); 216 217 // Add cycle number 218 if (cycle > 0) { 219 name.append("_v"); 220 name.append(std::to_string(cycle)); 221 } 222 223 // Add file extension 224 auto extension = GetExtension(fileName, fileType); 225 if (extension.size() != 0u) { 226 name.append("."); 227 name.append(extension); 228 } 229 230 return name; 231 } 232 233 //_____________________________________________________________________________ 234 G4String GetNtupleFileName( 235 const G4String& fileName, 236 const G4String& fileType, 237 const G4String& ntupleName, 238 G4int cycle) 239 { 240 // Compose and return the ntuple specific file name: 241 // - add _nt_ntupleName suffix to the file base name 242 // - add _vN suffix if cycle > 0 243 // - add _tN suffix if called on thread worker 244 // - add file extension if not present 245 246 auto name = GetBaseName(fileName); 247 248 // Add ntupleName 249 name.append("_nt_"); 250 name.append(ntupleName); 251 252 // Add cycle number 253 if (cycle > 0) { 254 name.append("_v"); 255 name.append(std::to_string(cycle)); 256 } 257 258 // Add thread Id to a file name if MT processing 259 if ( ! G4Threading::IsMasterThread() ) { 260 std::ostringstream os; 261 os << G4Threading::G4GetThreadId(); 262 name.append("_t"); 263 name.append(os.str()); 264 } 265 266 // Add file extension 267 auto extension = GetExtension(fileName, fileType); 268 if (extension.size() != 0u) { 269 name.append("."); 270 name.append(extension); 271 } 272 273 return name; 274 } 275 276 //_____________________________________________________________________________ 277 G4String GetNtupleFileName( 278 const G4String& fileName, 279 const G4String& fileType, 280 G4int ntupleFileNumber, 281 G4int cycle) 282 { 283 // Compose and return the ntuple specific file name: 284 // - add _mFN suffix to the file base name where FN = ntupleFileNumber 285 // - add _vN suffix if cycle > 0 286 // - add file extension if not present 287 288 auto name = GetBaseName(fileName); 289 290 // Add _M followed by ntupleFileNumber 291 std::ostringstream os; 292 os << ntupleFileNumber; 293 name.append("_m"); 294 name.append(os.str()); 295 296 // Add cycle number 297 if (cycle > 0) { 298 name.append("_v"); 299 name.append(std::to_string(cycle)); 300 } 301 302 // Add file extension 303 auto extension = GetExtension(fileName, fileType); 304 if (extension.size() != 0u) { 305 name.append("."); 306 name.append(extension); 307 } 308 309 return name; 310 } 311 312 //_____________________________________________________________________________ 313 G4String GetTnFileName( 314 const G4String& fileName, 315 const G4String& fileType, 316 G4int cycle) 317 { 318 // Update file base name with the thread suffix: 319 // - add _tN suffix if called on thread worker 320 // - add file extension if not present 321 322 auto name = GetBaseName(fileName); 323 324 // Add cycle number 325 if (cycle > 0) { 326 name.append("_v"); 327 name.append(std::to_string(cycle)); 328 } 329 330 // Add thread Id to a file name if MT processing 331 if ( ! G4Threading::IsMasterThread() ) { 332 std::ostringstream os; 333 os << G4Threading::G4GetThreadId(); 334 name.append("_t"); 335 name.append(os.str()); 336 } 337 338 // Add file extension 339 auto extension = GetExtension(fileName, fileType); 340 if (extension.size() != 0u) { 341 name.append("."); 342 name.append(extension); 343 } 344 345 return name; 346 } 347 348 //_____________________________________________________________________________ 349 G4String GetPlotFileName(const G4String& fileName) 350 { 351 // Generate plot file name for an output file name 352 353 auto name = GetBaseName(fileName); 354 355 // Add .ps extension 356 name.append(".ps"); 357 358 return name; 359 } 360 361 } 362