Geant4-11
G4TFileManager.icc
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, 18/06/2013 (ivana@ipno.in2p3.fr)
28
29#include "G4AnalysisUtilities.hh"
30
31//_____________________________________________________________________________
32template <typename FT>
33inline
34G4TFileManager<FT>::G4TFileManager(const G4AnalysisManagerState& state)
35 : fAMState(state)
36{}
37
38//_____________________________________________________________________________
39template <typename FT>
40inline
41G4TFileManager<FT>::~G4TFileManager()
42{
43 for ( const auto& mapElement : fFileMap ) {
44 delete mapElement.second;
45 }
46}
47
48//
49// private functions
50//
51
52//_____________________________________________________________________________
53template <typename FT>
54inline
55void
56G4TFileManager<FT>::FileNotFoundWarning(const G4String& fileName,
57 std::string_view functionName) const
58{
59 G4Analysis::Warn("Failed to get file " + fileName, fkClass, functionName);
60}
61
62//_____________________________________________________________________________
63template <typename FT>
64inline
65G4TFileInformation<FT>*
66G4TFileManager<FT>::GetFileInfoInFunction(const G4String& fileName,
67 std::string_view functionName, G4bool warn ) const
68{
69 // Find the file information in the map
70 auto it = fFileMap.find(fileName);
71 if ( it == fFileMap.end() ) {
72 if (warn) {
73 FileNotFoundWarning(fileName, functionName);
74 }
75 return nullptr;
76 }
77
78 return it->second;
79}
80
81//_____________________________________________________________________________
82template <typename FT>
83inline
84std::shared_ptr<FT>
85G4TFileManager<FT>::GetFileInFunction(const G4String& fileName,
86 std::string_view functionName, G4bool warn) const
87{
88 // Find the file information in the map
89 auto fileInfo = GetFileInfoInFunction(fileName, functionName, warn);
90 if (! fileInfo) return nullptr;
91
92 // Check if the file is open
93 if ( ! fileInfo->fFile ) {
94 if (warn) {
95 FileNotFoundWarning(fileName, functionName);
96 }
97 return nullptr;
98 }
99
100 return fileInfo->fFile;
101}
102
103//_____________________________________________________________________________
104template <typename FT>
105inline
106G4bool G4TFileManager<FT>::WriteTFile(std::shared_ptr<FT> file,
107 [[maybe_unused]] const G4String& fileName)
108{
109 fAMState.Message(G4Analysis::kVL4, "write", "file", fileName);
110
111 // Write the found file
112 auto result = WriteFileImpl(file);
113
114 fAMState.Message(G4Analysis::kVL1, "write", "file", fileName, result);
115
116 return result;
117}
118
119//_____________________________________________________________________________
120template <typename FT>
121inline
122G4bool G4TFileManager<FT>::CloseTFile(std::shared_ptr<FT> file,
123 [[maybe_unused]] const G4String& fileName)
124{
125 fAMState.Message(G4Analysis::kVL4, "close", "file", fileName);
126
127 // Close the found file
128 auto result = CloseFileImpl(file);
129
130 fAMState.Message(G4Analysis::kVL1, "close", "file", fileName, result);
131
132 return result;
133}
134
135//_____________________________________________________________________________
136template <typename FT>
137inline
138G4bool G4TFileManager<FT>::DeleteEmptyFile(const G4String& fileName)
139{
140 fAMState.Message(G4Analysis::kVL4, "delete", "empty file", fileName);
141
142 auto result = ! std::remove(fileName);
143
144 fAMState.Message(G4Analysis::kVL1, "delete", "empty file", fileName, result);
145
146 return result;
147}
148
149//_____________________________________________________________________________
150template <typename FT>
151inline
152void G4TFileManager<FT>::ClearData()
153{
154 for ( const auto& mapElement : fFileMap ) {
155 delete mapElement.second;
156 }
157 fFileMap.clear();
158
159 fAMState.Message(G4Analysis::kVL2, "clear", "files");
160}
161
162//
163// public functions
164//
165
166//_____________________________________________________________________________
167template <typename FT>
168inline
169std::shared_ptr<FT> G4TFileManager<FT>::CreateTFile(const G4String& fileName)
170{
171 // Check if file already exists
172 if ( GetFileInFunction(fileName, "CreateTFile", false) ) {
173 G4Analysis::Warn("File " + fileName + " already exists.",
174 fkClass, "CreateTFile");
175 return nullptr;
176 }
177
178 auto fileInformation = GetFileInfoInFunction(fileName, "CreateTFile", false);
179 if ( ! fileInformation ) {
180 fAMState.Message(G4Analysis::kVL4, "create", "fileInformation", fileName);
181
182 // Create file information and save it in the map
183 fileInformation = new G4TFileInformation<FT>(fileName);
184 fFileMap[fileName] = fileInformation;
185 }
186
187 // Create file and save it in fileInformation
188 fAMState.Message(G4Analysis::kVL4, "create", "file", fileName);
189
190 // Let concrete class create a file
191 auto file = CreateFileImpl(fileName);
192 if ( ! file ) {
193 G4Analysis::Warn("Failed to create file " + fileName, fkClass, "CreateTFile");
194 return nullptr;
195 }
196 // Save file in fileInformation
197 fileInformation->fFile = file;
198 fileInformation->fIsOpen = true;
199 fileInformation->fIsEmpty = true;
200 fileInformation->fIsDeleted = false;
201
202 fAMState.Message(G4Analysis::kVL1, "create", "file", fileName);
203
204 // Return created file
205 return file;
206}
207
208//_____________________________________________________________________________
209template <typename FT>
210inline
211G4bool G4TFileManager<FT>::WriteTFile(const G4String& fileName)
212{
213 // Find the file in the map
214 auto file = GetFileInFunction(fileName, "WriteTFile");
215 // Warning is issued in GetFileInfoFunction
216 if (! file) return false;
217
218 return WriteTFile(file, fileName);
219}
220
221//_____________________________________________________________________________
222template <typename FT>
223inline
224G4bool G4TFileManager<FT>::CloseTFile(const G4String& fileName)
225{
226 // Find the file information in the map
227 auto fileInfo = GetFileInfoInFunction(fileName, "CloseTFile");
228 // Warning is issued in GetFileInfoFunction
229 if ( ! fileInfo ) return false;
230
231 // Do nothing if file is not open
232 if ( ! fileInfo->fIsOpen ) return false;
233
234 // Get file from the file information
235 auto file = fileInfo->fFile;
236 if ( ! file ) {
237 FileNotFoundWarning(fileName, "CloseTFile");
238 return false;
239 }
240
241 auto result = CloseTFile(file, fileName);
242
243 // Update the file information
244 fileInfo->fFile.reset();
245 fileInfo->fIsOpen = false;
246
247 return result;
248}
249
250//_____________________________________________________________________________
251template <typename FT>
252inline
253G4bool G4TFileManager<FT>::SetIsEmpty(const G4String& fileName, G4bool isEmpty)
254{
255 // Find the file information in the map
256 auto fileInfo = GetFileInfoInFunction(fileName, "SetIsEmpty");
257
258 // Warning is issued in GetFileFunction
259 if ( ! fileInfo ) return false;
260
261 fAMState.Message(G4Analysis::kVL4, "notify not empty", "file", fileName);
262
263 // Set notification to file information
264 if ( fileInfo->fIsEmpty ) {
265 // do not revert information if file is not empty
266 fileInfo->fIsEmpty = isEmpty;
267
268 if ( ! isEmpty ) {
269 fAMState.Message(G4Analysis::kVL3, "notify not empty", "file", fileName);
270 }
271 }
272
273 return true;
274}
275
276//_____________________________________________________________________________
277template <typename FT>
278inline
279std::shared_ptr<FT> G4TFileManager<FT>::GetTFile(
280 const G4String& fileName, G4bool warn) const
281{
282 // Find the file information in the map
283 return GetFileInFunction(fileName, "GetTFile", warn);
284}
285
286//_____________________________________________________________________________
287template <typename FT>
288inline
289G4bool G4TFileManager<FT>::OpenFiles()
290{
291 auto result = true;
292 for ( const auto& mapElement : fFileMap ) {
293 auto fileInformation = mapElement.second;
294 // Do nothing if file was open by user explicitly
295 if ( fileInformation->fFile ) {
296 // G4cout << "... skipping open file for " << fileInformation->fFileName << G4endl;
297 continue;
298 }
299
300 result &= (CreateTFile(fileInformation->fFileName) != nullptr);
301 }
302 return result;
303}
304
305//_____________________________________________________________________________
306template <typename FT>
307inline
308G4bool G4TFileManager<FT>::WriteFiles()
309{
310 auto result = true;
311 for ( const auto& mapElement : fFileMap ) {
312 auto fileInformation = mapElement.second;
313 if ( ! fileInformation->fIsOpen ) {
314 // G4cout << "skipping write for file " << fileInformation->fFileName << G4endl;
315 continue;
316 }
317 result &= WriteTFile(fileInformation->fFile, fileInformation->fFileName);
318 }
319 return result;
320}
321
322//_____________________________________________________________________________
323template <typename FT>
324inline
325G4bool G4TFileManager<FT>::CloseFiles()
326{
327 auto result = true;
328 for ( const auto& mapElement : fFileMap ) {
329 auto fileInformation = mapElement.second;
330 if ( ! fileInformation->fIsOpen ) {
331 // G4cout << "skipping close for file " << fileInformation->fFileName << G4endl;
332 continue;
333 }
334 result &= CloseTFile(fileInformation->fFile, fileInformation->fFileName);
335
336 // Update file information
337 fileInformation->fFile.reset();
338 fileInformation->fIsOpen = false;
339 }
340
341 // As the files were set to nullptr, clear should not be needed
342 // fFileMap.clear();
343
344 return result;
345}
346
347//_____________________________________________________________________________
348template <typename FT>
349inline
350G4bool G4TFileManager<FT>::DeleteEmptyFiles()
351{
352 auto result = true;
353 for ( const auto& mapElement : fFileMap ) {
354 auto fileInformation = mapElement.second;
355 if ( (! fileInformation->fIsEmpty) || fileInformation->fIsDeleted ) {
356 // G4cout << "skipping delete for file " << fileInformation->fFileName << G4endl;
357 continue;
358 }
359
360 result &= DeleteEmptyFile(fileInformation->fFileName);
361
362 // Update file information
363 fileInformation->fIsDeleted = true;
364 }
365
366 return result;
367}