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
G4AnalysisUtilities.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
27// Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr)
28
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
37using std::to_string;
38
39namespace {
40
41//_____________________________________________________________________________
42G4bool 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
62namespace G4Analysis
63{
64
65//_____________________________________________________________________________
66void 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//_____________________________________________________________________________
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//_____________________________________________________________________________
86void 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//_____________________________________________________________________________
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//_____________________________________________________________________________
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//_____________________________________________________________________________
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//_____________________________________________________________________________
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//_____________________________________________________________________________
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//_____________________________________________________________________________
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//_____________________________________________________________________________
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;
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//_____________________________________________________________________________
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//_____________________________________________________________________________
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;
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//_____________________________________________________________________________
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}
G4AnalysisOutput
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
static G4double GetValueOf(const G4String &)
G4String GetExtension(const G4String &fileName, const G4String &defaultExtension="")
void Tokenize(const G4String &line, std::vector< G4String > &tokens)
G4String GetTnFileName(const G4String &fileName, const G4String &fileType, G4int cycle=0)
G4String GetPlotFileName(const G4String &fileName)
constexpr std::string_view kNamespaceName
G4double GetUnitValue(const G4String &unit)
G4String GetOutputName(G4AnalysisOutput outputType)
G4AnalysisOutput GetOutput(const G4String &outputName, G4bool warn=true)
G4String GetNtupleFileName(const G4String &fileName, const G4String &fileType, const G4String &ntupleName, G4int cycle=0)
G4String GetHnFileName(const G4String &fileName, const G4String &fileType, const G4String &hnType, const G4String &hnName)
G4String GetBaseName(const G4String &fileName)
void Warn(const G4String &message, const std::string_view inClass, const std::string_view inFunction)
G4bool IsMasterThread()
Definition: G4Threading.cc:124
G4int G4GetThreadId()
Definition: G4Threading.cc:122