Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/analysis/management/include/G4TFileManager.icc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 //_____________________________________________________________________________
 32 template <typename FT>
 33 inline
 34 G4TFileManager<FT>::G4TFileManager(const G4AnalysisManagerState& state)
 35  : fAMState(state)
 36 {}
 37 
 38 //_____________________________________________________________________________
 39 template <typename FT>
 40 inline
 41 G4TFileManager<FT>::~G4TFileManager()
 42 {
 43   for ( const auto& mapElement : fFileMap ) {
 44     delete mapElement.second;
 45   }
 46 }
 47 
 48 //
 49 // private functions
 50 //
 51 
 52 //_____________________________________________________________________________
 53 template <typename FT>
 54 inline
 55 void
 56 G4TFileManager<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 //_____________________________________________________________________________
 63 template <typename FT>
 64 inline
 65 G4TFileInformation<FT>*
 66 G4TFileManager<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 //_____________________________________________________________________________
 82 template <typename FT>
 83 inline
 84 std::shared_ptr<FT>
 85 G4TFileManager<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 //_____________________________________________________________________________
104 template <typename FT>
105 inline
106 G4bool 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 //_____________________________________________________________________________
120 template <typename FT>
121 inline
122 G4bool 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 //_____________________________________________________________________________
136 template <typename FT>
137 inline
138 G4bool 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 //_____________________________________________________________________________
150 template <typename FT>
151 inline
152 void 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 //_____________________________________________________________________________
167 template <typename FT>
168 inline
169 std::shared_ptr<FT> G4TFileManager<FT>::CreateTFile(const G4String& fileName)
170 {
171   // Just return the file if it already exists
172   if ( auto file = GetFileInFunction(fileName, "CreateTFile", false);
173       file != nullptr ) {
174     return file;
175     // should we also update fileInformation ??
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 //_____________________________________________________________________________
209 template <typename FT>
210 inline
211 G4bool 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 //_____________________________________________________________________________
222 template <typename FT>
223 inline
224 G4bool 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 //_____________________________________________________________________________
251 template <typename FT>
252 inline
253 G4bool 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 //_____________________________________________________________________________
277 template <typename FT>
278 inline
279 std::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 //_____________________________________________________________________________
287 template <typename FT>
288 inline
289 G4bool 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 //_____________________________________________________________________________
306 template <typename FT>
307 inline
308 G4bool 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 //_____________________________________________________________________________
323 template <typename FT>
324 inline
325 G4bool 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 //_____________________________________________________________________________
348 template <typename FT>
349 inline
350 G4bool 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 }
368