Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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 ([email protected])
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