Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 27 // Author: Ivana Hrivnacova, 20/07/2017 (ivana 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 G 43 : G4VRFileManager(state) 44 { 45 // Create helpers defined in the base class 46 fH1RFileManager = std::make_shared<G4Hdf5HnR 47 fH2RFileManager = std::make_shared<G4Hdf5HnR 48 fH3RFileManager = std::make_shared<G4Hdf5HnR 49 fP1RFileManager = std::make_shared<G4Hdf5HnR 50 fP2RFileManager = std::make_shared<G4Hdf5HnR 51 } 52 53 // 54 // private methods 55 // 56 57 //____________________________________________ 58 hid_t G4Hdf5RFileManager::OpenRFile(const G4St 59 G4bool is 60 { 61 // Get full file name 62 G4String name = GetFullFileName(fileName, is 63 64 Message(kVL4, "open", "read analysis file", 65 66 // create new file 67 hid_t newFile = H5Fopen(name, H5F_ACC_RDONLY 68 if ( newFile < 0 ) { 69 Warn("Cannot open file " + name, fkClass, 70 return kInvalidId; 71 } 72 73 // newFile->add_unziper('Z',toolx::decompres 74 75 // add file in a map 76 fRFiles[name] = G4Hdf5File(newFile, kInvalid 77 78 Message(kVL1, "open", "read analysis file", 79 80 return newFile; 81 } 82 83 //____________________________________________ 84 hid_t G4Hdf5RFileManager::OpenDirectory(hid_t 85 { 86 Message(kVL4, "open", "read directory", dire 87 88 auto directory = toolx_H5Gopen(file, directo 89 if ( directory < 0 ) { 90 Warn("Cannot open directory " + directoryN 91 return kInvalidId; 92 } 93 Message(kVL2, "open", "read directory", dire 94 return directory; 95 } 96 97 //____________________________________________ 98 hid_t G4Hdf5RFileManager::GetRDirectory(const 99 const 100 const 101 G4boo 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 108 rfile = GetRFile(fileName, isPerThread); 109 } 110 111 auto isHistograms = (directoryType == "histo 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 specifi 125 auto newDirName = dirName; 126 if ( newDirName == "" ) { 127 // Create the default directory if the n 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 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 153 G4boo 154 { 155 // Get full file name 156 G4String name = GetFullFileName(fileName, is 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(c 167 G 168 { 169 return GetRDirectory("histograms", fileName, 170 } 171 172 //____________________________________________ 173 hid_t G4Hdf5RFileManager::GetNtupleRDirectory( 174 175 { 176 return GetRDirectory("ntuples", fileName, di 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