Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 26 27 // Author: Ivana Hrivnacova, 20/07/2017 (ivana 27 // Author: Ivana Hrivnacova, 20/07/2017 (ivana@ipno.in2p3.fr) 28 28 29 #include "G4Hdf5RFileManager.hh" 29 #include "G4Hdf5RFileManager.hh" 30 #include "G4Hdf5HnRFileManager.hh" 30 #include "G4Hdf5HnRFileManager.hh" 31 #include "G4AnalysisManagerState.hh" 31 #include "G4AnalysisManagerState.hh" 32 #include "G4AnalysisUtilities.hh" 32 #include "G4AnalysisUtilities.hh" 33 33 34 #include "toolx/hdf5/h2file" 34 #include "toolx/hdf5/h2file" 35 #include "toolx/hdf5/group_exists" 35 #include "toolx/hdf5/group_exists" 36 #include "toolx/zlib" 36 #include "toolx/zlib" 37 37 38 using namespace G4Analysis; 38 using namespace G4Analysis; 39 using namespace tools; 39 using namespace tools; 40 40 41 //____________________________________________ 41 //_____________________________________________________________________________ 42 G4Hdf5RFileManager::G4Hdf5RFileManager(const G 42 G4Hdf5RFileManager::G4Hdf5RFileManager(const G4AnalysisManagerState& state) 43 : G4VRFileManager(state) 43 : G4VRFileManager(state) 44 { 44 { 45 // Create helpers defined in the base class 45 // Create helpers defined in the base class 46 fH1RFileManager = std::make_shared<G4Hdf5HnR 46 fH1RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::h1d>>(this); 47 fH2RFileManager = std::make_shared<G4Hdf5HnR 47 fH2RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::h2d>>(this); 48 fH3RFileManager = std::make_shared<G4Hdf5HnR 48 fH3RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::h3d>>(this); 49 fP1RFileManager = std::make_shared<G4Hdf5HnR 49 fP1RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::p1d>>(this); 50 fP2RFileManager = std::make_shared<G4Hdf5HnR 50 fP2RFileManager = std::make_shared<G4Hdf5HnRFileManager<histo::p2d>>(this); 51 } 51 } 52 52 53 // 53 // 54 // private methods 54 // private methods 55 // 55 // 56 56 57 //____________________________________________ 57 //_____________________________________________________________________________ 58 hid_t G4Hdf5RFileManager::OpenRFile(const G4St 58 hid_t G4Hdf5RFileManager::OpenRFile(const G4String& fileName, 59 G4bool is 59 G4bool isPerThread) 60 { 60 { 61 // Get full file name 61 // Get full file name 62 G4String name = GetFullFileName(fileName, is 62 G4String name = GetFullFileName(fileName, isPerThread); 63 63 64 Message(kVL4, "open", "read analysis file", 64 Message(kVL4, "open", "read analysis file", name); 65 65 66 // create new file 66 // create new file 67 hid_t newFile = H5Fopen(name, H5F_ACC_RDONLY 67 hid_t newFile = H5Fopen(name, H5F_ACC_RDONLY, H5P_DEFAULT); 68 if ( newFile < 0 ) { 68 if ( newFile < 0 ) { 69 Warn("Cannot open file " + name, fkClass, 69 Warn("Cannot open file " + name, fkClass, "OpenRFile"); 70 return kInvalidId; 70 return kInvalidId; 71 } 71 } 72 72 73 // newFile->add_unziper('Z',toolx::decompres 73 // newFile->add_unziper('Z',toolx::decompress_buffer); 74 74 75 // add file in a map 75 // add file in a map 76 fRFiles[name] = G4Hdf5File(newFile, kInvalid 76 fRFiles[name] = G4Hdf5File(newFile, kInvalidId, kInvalidId); 77 77 78 Message(kVL1, "open", "read analysis file", 78 Message(kVL1, "open", "read analysis file", name); 79 79 80 return newFile; 80 return newFile; 81 } 81 } 82 82 83 //____________________________________________ 83 //_____________________________________________________________________________ 84 hid_t G4Hdf5RFileManager::OpenDirectory(hid_t 84 hid_t G4Hdf5RFileManager::OpenDirectory(hid_t file, const G4String& directoryName) 85 { 85 { 86 Message(kVL4, "open", "read directory", dire 86 Message(kVL4, "open", "read directory", directoryName); 87 87 88 auto directory = toolx_H5Gopen(file, directo 88 auto directory = toolx_H5Gopen(file, directoryName); 89 if ( directory < 0 ) { 89 if ( directory < 0 ) { 90 Warn("Cannot open directory " + directoryN 90 Warn("Cannot open directory " + directoryName, fkClass, "OpenDirectory"); 91 return kInvalidId; 91 return kInvalidId; 92 } 92 } 93 Message(kVL2, "open", "read directory", dire 93 Message(kVL2, "open", "read directory", directoryName); 94 return directory; 94 return directory; 95 } 95 } 96 96 97 //____________________________________________ 97 //_____________________________________________________________________________ 98 hid_t G4Hdf5RFileManager::GetRDirectory(const 98 hid_t G4Hdf5RFileManager::GetRDirectory(const G4String& directoryType, 99 const 99 const G4String& fileName, 100 const 100 const G4String& dirName, 101 G4boo 101 G4bool isPerThread) 102 { 102 { 103 // Get or open a file 103 // Get or open a file 104 auto rfile = GetRFile(fileName, isPerThread) 104 auto rfile = GetRFile(fileName, isPerThread); 105 if (rfile == nullptr) { 105 if (rfile == nullptr) { 106 // Try to open it if not found in the map 106 // Try to open it if not found in the map 107 if ( OpenRFile(fileName, isPerThread) < 0 107 if ( OpenRFile(fileName, isPerThread) < 0 ) return kInvalidId; 108 rfile = GetRFile(fileName, isPerThread); 108 rfile = GetRFile(fileName, isPerThread); 109 } 109 } 110 110 111 auto isHistograms = (directoryType == "histo 111 auto isHistograms = (directoryType == "histograms"); 112 112 113 // Get directory if already open 113 // Get directory if already open 114 hid_t directory = kInvalidId; 114 hid_t directory = kInvalidId; 115 if ( isHistograms ) { 115 if ( isHistograms ) { 116 directory = std::get<1>(*rfile); 116 directory = std::get<1>(*rfile); 117 } else { 117 } else { 118 directory = std::get<2>(*rfile); 118 directory = std::get<2>(*rfile); 119 } 119 } 120 if ( directory != kInvalidId ) { 120 if ( directory != kInvalidId ) { 121 return directory; 121 return directory; 122 } 122 } 123 123 124 // Use default directory name if not specifi 124 // Use default directory name if not specified 125 auto newDirName = dirName; 125 auto newDirName = dirName; 126 if ( newDirName == "" ) { 126 if ( newDirName == "" ) { 127 // Create the default directory if the n 127 // Create the default directory if the name is not set and the default directory 128 // does not yet exist 128 // does not yet exist 129 newDirName = fgkDefaultDirectoryName; 129 newDirName = fgkDefaultDirectoryName; 130 newDirName += "_"; 130 newDirName += "_"; 131 newDirName += directoryType; 131 newDirName += directoryType; 132 } 132 } 133 133 134 // Open directory 134 // Open directory 135 directory = OpenDirectory(std::get<0>(*rfile 135 directory = OpenDirectory(std::get<0>(*rfile), newDirName); 136 136 137 // Update 137 // Update 138 if ( isHistograms ) { 138 if ( isHistograms ) { 139 std::get<1>(*rfile) = directory; 139 std::get<1>(*rfile) = directory; 140 } else { 140 } else { 141 std::get<2>(*rfile) = directory; 141 std::get<2>(*rfile) = directory; 142 } 142 } 143 143 144 return directory; 144 return directory; 145 } 145 } 146 146 147 // 147 // 148 // public methods 148 // public methods 149 // 149 // 150 150 151 //____________________________________________ 151 //_____________________________________________________________________________ 152 G4Hdf5File* G4Hdf5RFileManager::GetRFile(const 152 G4Hdf5File* G4Hdf5RFileManager::GetRFile(const G4String& fileName, 153 G4boo 153 G4bool isPerThread) 154 { 154 { 155 // Get full file name 155 // Get full file name 156 G4String name = GetFullFileName(fileName, is 156 G4String name = GetFullFileName(fileName, isPerThread); 157 157 158 auto it = fRFiles.find(name); 158 auto it = fRFiles.find(name); 159 if (it != fRFiles.end()) { 159 if (it != fRFiles.end()) { 160 return &(it->second); 160 return &(it->second); 161 } 161 } 162 return nullptr; 162 return nullptr; 163 } 163 } 164 164 165 //____________________________________________ 165 //_____________________________________________________________________________ 166 hid_t G4Hdf5RFileManager::GetHistoRDirectory(c 166 hid_t G4Hdf5RFileManager::GetHistoRDirectory(const G4String& fileName, const G4String& dirName, 167 G 167 G4bool isPerThread) 168 { 168 { 169 return GetRDirectory("histograms", fileName, 169 return GetRDirectory("histograms", fileName, dirName, isPerThread); 170 } 170 } 171 171 172 //____________________________________________ 172 //_____________________________________________________________________________ 173 hid_t G4Hdf5RFileManager::GetNtupleRDirectory( 173 hid_t G4Hdf5RFileManager::GetNtupleRDirectory(const G4String& fileName, const G4String& dirName, 174 174 G4bool isPerThread) 175 { 175 { 176 return GetRDirectory("ntuples", fileName, di 176 return GetRDirectory("ntuples", fileName, dirName, isPerThread); 177 } 177 } 178 178 179 //____________________________________________ 179 //_____________________________________________________________________________ 180 void G4Hdf5RFileManager::CloseFiles() 180 void G4Hdf5RFileManager::CloseFiles() 181 { 181 { 182 // Close all open directories and file 182 // Close all open directories and file 183 for ( auto [key, rfile] : fRFiles ) { 183 for ( auto [key, rfile] : fRFiles ) { 184 if (std::get<1>(rfile) != kInvalidId) { 184 if (std::get<1>(rfile) != kInvalidId) { 185 ::H5Gclose(std::get<1>(rfile)); 185 ::H5Gclose(std::get<1>(rfile)); 186 } 186 } 187 if (std::get<2>(rfile) != kInvalidId) { 187 if (std::get<2>(rfile) != kInvalidId) { 188 ::H5Gclose(std::get<2>(rfile)); 188 ::H5Gclose(std::get<2>(rfile)); 189 } 189 } 190 if (std::get<0>(rfile) != kInvalidId) { 190 if (std::get<0>(rfile) != kInvalidId) { 191 ::H5Fclose(std::get<0>(rfile)); 191 ::H5Fclose(std::get<0>(rfile)); 192 } 192 } 193 } 193 } 194 } 194 } 195 195