Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Hdf5RFileManager.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, 20/07/2017 (ivana@ipno.in2p3.fr)
28
29#include "G4Hdf5RFileManager.hh"
33
34#include "toolx/hdf5/h2file"
35#include "toolx/hdf5/group_exists"
36#include "toolx/zlib"
37
38using namespace G4Analysis;
39using namespace tools;
40
41//_____________________________________________________________________________
43 : G4VRFileManager(state)
44{
45 // Create helpers defined in the base class
46 fH1RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::h1d>>(this);
47 fH2RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::h2d>>(this);
48 fH3RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::h3d>>(this);
49 fP1RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::p1d>>(this);
50 fP2RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::p2d>>(this);
51}
52
53//
54// private methods
55//
56
57//_____________________________________________________________________________
58hid_t G4Hdf5RFileManager::OpenRFile(const G4String& fileName,
59 G4bool isPerThread)
60{
61 // Get full file name
62 G4String name = GetFullFileName(fileName, isPerThread);
63
64 Message(kVL4, "open", "read analysis file", name);
65
66 // create new file
67 hid_t newFile = H5Fopen(name, H5F_ACC_RDONLY, H5P_DEFAULT);
68 if ( newFile < 0 ) {
69 Warn("Cannot open file " + name, fkClass, "OpenRFile");
70 return kInvalidId;
71 }
72
73 // newFile->add_unziper('Z',toolx::decompress_buffer);
74
75 // add file in a map
76 fRFiles[name] = G4Hdf5File(newFile, kInvalidId, kInvalidId);
77
78 Message(kVL1, "open", "read analysis file", name);
79
80 return newFile;
81}
82
83//_____________________________________________________________________________
84hid_t G4Hdf5RFileManager::OpenDirectory(hid_t file, const G4String& directoryName)
85{
86 Message(kVL4, "open", "read directory", directoryName);
87
88 auto directory = toolx_H5Gopen(file, directoryName);
89 if ( directory < 0 ) {
90 Warn("Cannot open directory " + directoryName, fkClass, "OpenDirectory");
91 return kInvalidId;
92 }
93 Message(kVL2, "open", "read directory", directoryName);
94 return directory;
95}
96
97//_____________________________________________________________________________
98hid_t G4Hdf5RFileManager::GetRDirectory(const G4String& directoryType,
99 const G4String& fileName,
100 const G4String& dirName,
101 G4bool isPerThread)
102{
103 // Get or open a file
104 auto rfile = GetRFile(fileName, isPerThread);
105 if (rfile == nullptr) {
106 // Try to open it if not found in the map
107 if ( OpenRFile(fileName, isPerThread) < 0 ) return kInvalidId;
108 rfile = GetRFile(fileName, isPerThread);
109 }
110
111 auto isHistograms = (directoryType == "histograms");
112
113 // Get directory if already open
114 hid_t directory = kInvalidId;
115 if ( isHistograms ) {
116 directory = std::get<1>(*rfile);
117 } else {
118 directory = std::get<2>(*rfile);
119 }
120 if ( directory != kInvalidId ) {
121 return directory;
122 }
123
124 // Use default directory name if not specified
125 auto newDirName = dirName;
126 if ( newDirName == "" ) {
127 // Create the default directory if the name is not set and the default directory
128 // does not yet exist
129 newDirName = fgkDefaultDirectoryName;
130 newDirName += "_";
131 newDirName += directoryType;
132 }
133
134 // Open directory
135 directory = OpenDirectory(std::get<0>(*rfile), newDirName);
136
137 // Update
138 if ( isHistograms ) {
139 std::get<1>(*rfile) = directory;
140 } else {
141 std::get<2>(*rfile) = directory;
142 }
143
144 return directory;
145}
146
147//
148// public methods
149//
150
151//_____________________________________________________________________________
153 G4bool isPerThread)
154{
155 // Get full file name
156 G4String name = GetFullFileName(fileName, isPerThread);
157
158 auto it = fRFiles.find(name);
159 if (it != fRFiles.end()) {
160 return &(it->second);
161 }
162 return nullptr;
163}
164
165//_____________________________________________________________________________
166hid_t G4Hdf5RFileManager::GetHistoRDirectory(const G4String& fileName, const G4String& dirName,
167 G4bool isPerThread)
168{
169 return GetRDirectory("histograms", fileName, dirName, isPerThread);
170}
171
172//_____________________________________________________________________________
173hid_t G4Hdf5RFileManager::GetNtupleRDirectory(const G4String& fileName, const G4String& dirName,
174 G4bool isPerThread)
175{
176 return GetRDirectory("ntuples", fileName, dirName, isPerThread);
177}
178
179//_____________________________________________________________________________
181{
182 // Close all open directories and file
183 for ( auto [key, rfile] : fRFiles ) {
184 if (std::get<1>(rfile) != kInvalidId) {
185 ::H5Gclose(std::get<1>(rfile));
186 }
187 if (std::get<2>(rfile) != kInvalidId) {
188 ::H5Gclose(std::get<2>(rfile));
189 }
190 if (std::get<0>(rfile) != kInvalidId) {
191 ::H5Fclose(std::get<0>(rfile));
192 }
193 }
194}
std::tuple< hid_t, hid_t, hid_t > G4Hdf5File
bool G4bool
Definition G4Types.hh:86
G4String GetFullFileName(const G4String &baseFileName="", G4bool isPerThread=true) const
void Message(G4int level, const G4String &action, const G4String &objectType, const G4String &objectName="", G4bool success=true) const
G4Hdf5File * GetRFile(const G4String &fileName, G4bool isPerThread)
hid_t GetNtupleRDirectory(const G4String &fileName, const G4String &dirName, G4bool isPerThread)
hid_t GetHistoRDirectory(const G4String &fileName, const G4String &dirName, G4bool isPerThread)
G4Hdf5RFileManager()=delete
std::shared_ptr< G4VTHnRFileManager< tools::histo::h2d > > fH2RFileManager
std::shared_ptr< G4VTHnRFileManager< tools::histo::p2d > > fP2RFileManager
std::shared_ptr< G4VTHnRFileManager< tools::histo::h3d > > fH3RFileManager
std::shared_ptr< G4VTHnRFileManager< tools::histo::p1d > > fP1RFileManager
std::shared_ptr< G4VTHnRFileManager< tools::histo::h1d > > fH1RFileManager
constexpr G4int kVL1
constexpr G4int kVL2
constexpr G4int kVL4
constexpr G4int kInvalidId
void Warn(const G4String &message, const std::string_view inClass, const std::string_view inFunction)
const char * name(G4int ptype)