Geant4 Cross Reference |
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" 30 #include "G4Hdf5HnRFileManager.hh" 31 #include "G4AnalysisManagerState.hh" 32 #include "G4AnalysisUtilities.hh" 33 34 #include "toolx/hdf5/h2file" 35 #include "toolx/hdf5/group_exists" 36 #include "toolx/zlib" 37 38 using namespace G4Analysis; 39 using namespace tools; 40 41 //_____________________________________________________________________________ 42 G4Hdf5RFileManager::G4Hdf5RFileManager(const G4AnalysisManagerState& state) 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 //_____________________________________________________________________________ 58 hid_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 //_____________________________________________________________________________ 84 hid_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 //_____________________________________________________________________________ 98 hid_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 //_____________________________________________________________________________ 152 G4Hdf5File* G4Hdf5RFileManager::GetRFile(const G4String& fileName, 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 //_____________________________________________________________________________ 166 hid_t G4Hdf5RFileManager::GetHistoRDirectory(const G4String& fileName, const G4String& dirName, 167 G4bool isPerThread) 168 { 169 return GetRDirectory("histograms", fileName, dirName, isPerThread); 170 } 171 172 //_____________________________________________________________________________ 173 hid_t G4Hdf5RFileManager::GetNtupleRDirectory(const G4String& fileName, const G4String& dirName, 174 G4bool isPerThread) 175 { 176 return GetRDirectory("ntuples", fileName, dirName, isPerThread); 177 } 178 179 //_____________________________________________________________________________ 180 void G4Hdf5RFileManager::CloseFiles() 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 } 195