Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/analysis/factory/src/G4GenericFileManager.cc

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, 15/06/2011  (ivana@ipno.in2p3.fr)
 28 
 29 #include "G4GenericFileManager.hh"
 30 #include "G4AnalysisManagerState.hh"
 31 #include "G4AnalysisUtilities.hh"
 32 #include "G4CsvFileManager.hh"
 33 #include "G4CsvNtupleFileManager.hh"
 34 #ifdef TOOLS_USE_HDF5
 35 #include "G4Hdf5FileManager.hh"
 36 #include "G4Hdf5NtupleFileManager.hh"
 37 #endif
 38 #include "G4RootFileManager.hh"
 39 #include "G4RootNtupleFileManager.hh"
 40 #include "G4XmlFileManager.hh"
 41 #include "G4XmlNtupleFileManager.hh"
 42 
 43 using namespace G4Analysis;
 44 
 45 namespace {
 46 
 47 //_____________________________________________________________________________
 48 void FileManagerWarning(const G4String& fileName,
 49                         std::string_view className,
 50                         std::string_view functionName,
 51                         G4bool hdf5Warn = true)
 52 {
 53   if ( GetExtension(fileName) == "hdf5" && ( ! hdf5Warn ) ) return;
 54 
 55   Warn("Cannot get file manager for " + fileName,
 56        className, functionName);
 57 }
 58 
 59 }
 60 
 61 //_____________________________________________________________________________
 62 G4GenericFileManager::G4GenericFileManager(const G4AnalysisManagerState& state)
 63  : G4VFileManager(state)
 64 {}
 65 
 66 //
 67 // private methods
 68 //
 69 
 70 //_____________________________________________________________________________
 71 void G4GenericFileManager::CreateFileManager(G4AnalysisOutput output)
 72 {
 73   Message(kVL4, "create", "file manager", GetOutputName(output));
 74 
 75   auto outputId = static_cast<size_t>(output);
 76   if ( fFileManagers[outputId] ) {
 77     Warn("The file manager of " + G4Analysis::GetOutputName(output) +
 78          " type already exists.",
 79          fkClass, "CreateFileManager");
 80     return;
 81   }
 82 
 83   // Create the manager
 84   switch ( output ) {
 85     case G4AnalysisOutput::kCsv:
 86       fCsvFileManager = std::make_shared<G4CsvFileManager>(fState);
 87       fFileManagers[outputId] = fCsvFileManager;
 88       break;
 89     case G4AnalysisOutput::kHdf5:
 90 #ifdef TOOLS_USE_HDF5
 91       fHdf5FileManager = std::make_shared<G4Hdf5FileManager>(fState);
 92       fFileManagers[outputId] = fHdf5FileManager;
 93 #else
 94       if ( fHdf5Warn) {
 95         Warn("Hdf5 type is not available.", fkClass, "CreateFileManager");
 96         fHdf5Warn = false;
 97       }
 98 #endif
 99       break;
100     case G4AnalysisOutput::kRoot:
101       fRootFileManager = std::make_shared<G4RootFileManager>(fState);
102       fFileManagers[outputId] = fRootFileManager;
103       break;
104     case G4AnalysisOutput::kXml:
105       fXmlFileManager = std::make_shared<G4XmlFileManager>(fState);
106       fFileManagers[outputId] = fXmlFileManager ;
107       break;
108     case G4AnalysisOutput::kNone:
109       Warn(G4Analysis::GetOutputName(output) + " type is not supported.",
110         fkClass, "CreateFileManager");
111       return;
112   }
113 
114   // Pass directory names (only if set)
115   if ( ! GetHistoDirectoryName().empty() ) {
116     fFileManagers[outputId]->SetHistoDirectoryName(GetHistoDirectoryName());
117   }
118   if ( ! GetNtupleDirectoryName().empty() ) {
119     fFileManagers[outputId]->SetNtupleDirectoryName(GetNtupleDirectoryName());
120   }
121 
122   Message(kVL3, "create", "file manager", GetOutputName(output));
123 }
124 
125 //_____________________________________________________________________________
126 std::shared_ptr<G4VFileManager>
127 G4GenericFileManager::GetFileManager(G4AnalysisOutput output) const
128 {
129   return fFileManagers[static_cast<size_t>(output)];
130 }
131 
132 //_____________________________________________________________________________
133 std::shared_ptr<G4VFileManager>
134 G4GenericFileManager::GetFileManager(const G4String& fileName)
135 {
136   // Get file extension
137   G4String extension = GetExtension(fileName);
138   if (extension.size() == 0u) {
139     // use the default
140     extension = fDefaultFileType;
141   }
142 
143   auto output = G4Analysis::GetOutput(extension);
144   if ( output == G4AnalysisOutput::kNone ) {
145     Warn("The file extension " + extension + "is not supported.",
146       fkClass, "GetFileManager");
147     return nullptr;
148   }
149 
150   std::shared_ptr<G4VFileManager> fileManager = GetFileManager(output);
151   if ( ! GetFileManager(output) ) {
152     CreateFileManager(output);
153     fileManager = GetFileManager(output);
154   }
155 
156   return GetFileManager(output);
157 }
158 
159 //
160 // public methods
161 //
162 
163 //_____________________________________________________________________________
164 G4bool G4GenericFileManager::OpenFile(const G4String& fileName)
165 {
166   auto fileManager = GetFileManager(fileName);
167   if ( ! fileManager ) return false;
168 
169   if ( fDefaultFileManager && (fDefaultFileManager != fileManager) ) {
170     // Print warning if default output changed
171     // (maybe be not needed?)
172     Warn("Default file manager changed "
173          "(old: " +fDefaultFileManager->GetFileType() +
174          ", new:" + fileManager->GetFileType() + ")",
175          fkClass, "OpenFile");
176   }
177   fDefaultFileManager = fileManager;
178   fDefaultFileType = fileManager->GetFileType();
179 
180   Message(kVL4, "open", "analysis file", fileName);
181 
182   auto result = true;
183 
184   // Save the default file name
185   // both in the generic file manager and the output specific one
186   result &= SetFileName(fileName);
187   result &= fDefaultFileManager->SetFileName(fileName);
188   result &= fDefaultFileManager->OpenFile(fileName);
189 
190   LockDirectoryNames();
191   fIsOpenFile = true;
192 
193   Message(kVL1, "open", "analysis file", fileName, result);
194 
195   return result;
196 }
197 
198 //_____________________________________________________________________________
199 G4bool G4GenericFileManager::OpenFiles()
200 {
201 // Open all files regeistered with objects
202 
203   Message(kVL4, "open", "analysis files");
204 
205   auto result = true;
206 
207   // process names registered in base file manager
208   for ( const auto& fileName : GetFileNames() ) {
209     auto fileManager = GetFileManager(fileName);
210     if ( ! fileManager ) {
211       FileManagerWarning(fileName, fkClass, "OpenFiles", fHdf5Warn);
212       continue;
213     }
214 
215     // filenames for csv need to be updated
216     auto newFileName = fileName;
217     if (fileManager == fCsvFileManager) {
218       newFileName = fileManager->GetHnFileName(fileName, GetCycle());
219     }
220 
221     result &= fileManager->CreateFile(newFileName);
222   }
223 
224   Message(kVL3, "open", "analysis files", "", result);
225 
226   return result;
227 }
228 
229 //_____________________________________________________________________________
230 G4bool G4GenericFileManager::WriteFiles()
231 {
232 // Finish write for all files registered with objects
233 
234   Message(kVL4, "write", "analysis files");
235 
236   auto result = true;
237 
238   for ( const auto& fileManager : fFileManagers ) {
239     if ( ! fileManager ) continue;
240 
241     Message(kVL4, "write", fileManager->GetFileType(), "files");
242 
243     result &= fileManager->WriteFiles();
244   }
245 
246   Message(kVL3, "write", "analysis files", "", result);
247 
248   return result;
249 }
250 
251 //_____________________________________________________________________________
252 G4bool G4GenericFileManager::CloseFiles()
253 {
254 // Close all files regeistered with objects
255 
256   Message(kVL4, "close", "analysis files");
257 
258   auto result = true;
259 
260   for ( const auto& fileManager : fFileManagers ) {
261     if ( ! fileManager ) continue;
262 
263     Message(kVL4, "close", fileManager->GetFileType(), "files");
264 
265     result &= fileManager->CloseFiles();
266   }
267 
268   fIsOpenFile = false;
269 
270   Message(kVL3, "close", "analysis files", "", result);
271 
272   return result;
273 }
274 
275 //_____________________________________________________________________________
276 G4bool G4GenericFileManager::DeleteEmptyFiles()
277 {
278 // Close all files regeistered with objects
279 
280   Message(kVL4, "delete", "empty files");
281 
282   auto result = true;
283 
284   for ( const auto& fileManager : fFileManagers ) {
285     if ( ! fileManager ) continue;
286 
287     Message(kVL4, "delete", fileManager->GetFileType(), "empty files");
288 
289     result &= fileManager->DeleteEmptyFiles();
290   }
291 
292   // Clear all saved file names in base file manager
293   G4BaseFileManager::ClearData();
294 
295   Message(kVL3, "delete", "empty files", "", result);
296 
297   return result;
298 }
299 
300 //_____________________________________________________________________________
301 void G4GenericFileManager::Clear()
302 {
303 // Clear files data
304 
305   for ( const auto& fileManager : fFileManagers ) {
306     if ( ! fileManager ) continue;
307 
308     fileManager->Clear();
309   }
310   UnlockDirectoryNames();
311 }
312 
313 //_____________________________________________________________________________
314 G4bool G4GenericFileManager::CreateFile(const G4String& fileName)
315 {
316 // New prototype, fully implemented in templated base class
317 
318   auto fileManager = GetFileManager(fileName);
319   if ( ! fileManager ) {
320     FileManagerWarning(fileName, fkClass, "CreateFile", fHdf5Warn);
321     return false;
322   }
323 
324   return fileManager->CreateFile(fileName);
325 }
326 
327 //_____________________________________________________________________________
328 G4bool G4GenericFileManager::WriteFile(const G4String& fileName)
329 {
330 // New prototype, fully implemented in templated base class
331 
332   auto fileManager = GetFileManager(fileName);
333   if ( ! fileManager ) {
334     FileManagerWarning(fileName, fkClass, "WriteFile", fHdf5Warn);
335     return false;
336   }
337 
338   return fileManager->WriteFile(fileName);
339 }
340 
341 //_____________________________________________________________________________
342 G4bool G4GenericFileManager::CloseFile(const G4String& fileName)
343 {
344 // New prototype, fully implemented in templated base class
345 
346   auto fileManager = GetFileManager(fileName);
347   if ( ! fileManager ) {
348     FileManagerWarning(fileName, fkClass, "CloseFile", fHdf5Warn);
349     return false;
350   }
351 
352   return fileManager->CloseFile(fileName);
353 }
354 
355 //_____________________________________________________________________________
356 G4bool G4GenericFileManager::SetIsEmpty(const G4String& fileName, G4bool isEmpty)
357 {
358   auto fileManager = GetFileManager(fileName);
359   if ( ! fileManager ) {
360     FileManagerWarning(fileName, fkClass, "SetIsEmpty", fHdf5Warn);
361     return false;
362   }
363 
364   return fileManager->SetIsEmpty(fileName, isEmpty);
365 }
366 
367 //_____________________________________________________________________________
368 G4bool G4GenericFileManager::SetHistoDirectoryName(const G4String& dirName)
369 {
370   auto result = G4VFileManager::SetHistoDirectoryName(dirName);
371 
372   for (auto& fileManager : fFileManagers ) {
373     if ( fileManager != nullptr ) {
374       result &= fileManager->SetHistoDirectoryName(dirName);
375     }
376   }
377   return result;
378 }
379 
380 //_____________________________________________________________________________
381 G4bool G4GenericFileManager::SetNtupleDirectoryName(const G4String& dirName)
382 {
383   auto result = G4VFileManager::SetNtupleDirectoryName(dirName);
384 
385   for (auto& fileManager : fFileManagers ) {
386     if ( fileManager != nullptr ) {
387       result &= fileManager->SetNtupleDirectoryName(dirName);
388     }
389   }
390   return result;
391 }
392 
393 //_____________________________________________________________________________
394 void G4GenericFileManager::SetCompressionLevel(G4int level)
395 {
396   G4BaseFileManager::SetCompressionLevel(level);
397 
398   for (auto& fileManager : fFileManagers ) {
399     if ( fileManager != nullptr ) {
400       fileManager->SetCompressionLevel(level);
401     }
402   }
403 }
404 
405 //_____________________________________________________________________________
406 void G4GenericFileManager::SetDefaultFileType(const G4String& value)
407 {
408   // Check if value correspond to a valid file type
409   auto output = G4Analysis::GetOutput(value);
410   if ( output == G4AnalysisOutput::kNone ) {
411     Warn("The file type " + value + "is not supported.\n" +
412          "The default type " + fDefaultFileType + " will be used.",
413          fkClass, "SetDeafultFileType");
414     return;
415   }
416 
417   fDefaultFileType = value;
418 }
419 
420 //_____________________________________________________________________________
421 std::shared_ptr<G4VNtupleFileManager>
422 G4GenericFileManager::CreateNtupleFileManager(G4AnalysisOutput output)
423 {
424   if ( ! GetFileManager(output) ) {
425     CreateFileManager(output);
426   }
427 
428   std::shared_ptr<G4VNtupleFileManager> vNtupleFileManager = nullptr;
429   G4String failure;
430 
431   switch ( output ) {
432     case G4AnalysisOutput::kCsv: {
433       auto ntupleFileManager = std::make_shared<G4CsvNtupleFileManager>(fState);
434       ntupleFileManager->SetFileManager(fCsvFileManager);
435       vNtupleFileManager = ntupleFileManager;
436       break;
437     }
438     case G4AnalysisOutput::kHdf5: {
439 #ifdef TOOLS_USE_HDF5
440       auto ntupleFileManager = std::make_shared<G4Hdf5NtupleFileManager>(fState);
441       ntupleFileManager->SetFileManager(fHdf5FileManager);
442       vNtupleFileManager = ntupleFileManager;
443 #else
444       failure = " Hdf5 is not available";
445 #endif
446       break;
447     }
448     case G4AnalysisOutput::kRoot: {
449       auto ntupleFileManager = std::make_shared<G4RootNtupleFileManager>(fState);
450       ntupleFileManager->SetFileManager(fRootFileManager);
451       vNtupleFileManager = ntupleFileManager;
452       break;
453     }
454     case G4AnalysisOutput::kXml: {
455       auto ntupleFileManager = std::make_shared<G4XmlNtupleFileManager>(fState);
456       ntupleFileManager->SetFileManager(fXmlFileManager);
457       vNtupleFileManager = ntupleFileManager;
458       break;
459     }
460     case G4AnalysisOutput::kNone:
461       break;
462   }
463 
464   if ( ! vNtupleFileManager ) {
465       Warn("Failed to create ntuple file manager of " +
466            G4Analysis::GetOutputName(output) + " type.\n" + failure,
467            fkClass, "CreateNtupleFileManager");
468   }
469 
470   return vNtupleFileManager;
471 }
472