File indexing completed on 2024-04-06 12:01:30
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <cassert>
0015
0016
0017 #include "h5_DataSet.h"
0018 #include "h5_Attribute.h"
0019 #include "FWCore/Utilities/interface/Exception.h"
0020
0021
0022
0023
0024
0025
0026
0027
0028 namespace {
0029 struct Type {
0030 explicit Type(hid_t iID) : id_(iID) { assert(id_ >= 0); }
0031 ~Type() noexcept { H5Tclose(id_); }
0032
0033 void insertMember(const char* iName, size_t offset, hid_t member_id) { H5Tinsert(id_, iName, offset, member_id); }
0034 hid_t id_;
0035 };
0036
0037 struct DataSpace {
0038 explicit DataSpace(hid_t iID) : id_(iID) { assert(id_ >= 0); }
0039 ~DataSpace() noexcept { H5Sclose(id_); }
0040 hid_t id_;
0041 };
0042 }
0043
0044 namespace cms::h5 {
0045
0046
0047
0048 DataSet::DataSet(hid_t iParentID, std::string const& iName) : id_(H5Dopen2(iParentID, iName.c_str(), H5P_DEFAULT)) {
0049 if (id_ < 0) {
0050 throw cms::Exception("UnknownH5DataSet") << "unable to find dataset " << iName;
0051 }
0052 }
0053
0054 DataSet::DataSet(hid_t iParentID, const void* iRef) : id_(H5Rdereference2(iParentID, H5P_DEFAULT, H5R_OBJECT, iRef)) {
0055 if (id_ < 0) {
0056 throw cms::Exception("BadH5DataSetRef") << "unable to derenfence dataset from parent " << iParentID;
0057 }
0058 }
0059
0060
0061
0062
0063
0064
0065 DataSet::~DataSet() { H5Dclose(id_); }
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 std::shared_ptr<Attribute> DataSet::findAttribute(std::string const& iName) const {
0087 return std::make_shared<Attribute>(id_, iName);
0088 }
0089
0090 std::size_t DataSet::size() const {
0091 DataSpace space_id{H5Dget_space(id_)};
0092
0093 hssize_t num_elements = H5Sget_simple_extent_npoints(space_id.id_);
0094 assert(num_elements >= 0);
0095
0096 return num_elements;
0097 }
0098
0099 std::size_t DataSet::storageSize() const { return H5Dget_storage_size(id_); }
0100 std::size_t DataSet::memorySize() const { return size(); }
0101 uint64_t DataSet::fileOffset() const { return H5Dget_offset(id_); }
0102
0103 uint32_t DataSet::layout() const {
0104 auto pl = H5Dget_create_plist(id_);
0105 auto ret = H5Pget_layout(pl);
0106 H5Pclose(pl);
0107 return ret;
0108 }
0109
0110 std::vector<hobj_ref_t> DataSet::readRefs() const {
0111 Type type_id{H5Dget_type(id_)};
0112 auto class_type = H5Tget_class(type_id.id_);
0113 if (class_type != H5T_REFERENCE) {
0114 throw cms::Exception("BadDataSetType") << "asked to read dataset as a ref, but it is a " << class_type;
0115 }
0116
0117 std::vector<hobj_ref_t> refs;
0118 refs.resize(size());
0119
0120 auto ret_value = H5Dread(id_, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, refs.data());
0121 if (ret_value < 0) {
0122 throw cms::Exception("BadH5Read") << "unable to read ref dataset " << id_;
0123 }
0124 return refs;
0125 }
0126
0127 std::vector<char> DataSet::readBytes() const {
0128 Type type_id{H5Dget_type(id_)};
0129 auto class_type = H5Tget_class(type_id.id_);
0130 if (class_type != H5T_INTEGER) {
0131 throw cms::Exception("BadDataSetType") << "asked to read dataset as a byte, but it is a " << class_type;
0132 }
0133
0134 std::vector<char> bytes;
0135 bytes.resize(size());
0136
0137 auto ret_value = H5Dread(id_, H5T_STD_I8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, bytes.data());
0138 if (ret_value < 0) {
0139 throw cms::Exception("BadH5Read") << "unable to read bytes dataset " << id_;
0140 }
0141 return bytes;
0142 }
0143
0144 std::vector<cond::hdf5::IOVSyncValue> DataSet::readSyncValues() const {
0145 Type sv_type_id{H5Tcreate(H5T_COMPOUND, sizeof(cond::hdf5::IOVSyncValue))};
0146 sv_type_id.insertMember("high", HOFFSET(cond::hdf5::IOVSyncValue, high_), H5T_NATIVE_UINT32);
0147 sv_type_id.insertMember("low", HOFFSET(cond::hdf5::IOVSyncValue, low_), H5T_NATIVE_UINT32);
0148
0149 {
0150 const Type type_id{H5Dget_type(id_)};
0151 if (not H5Tequal(sv_type_id.id_, type_id.id_)) {
0152 throw cms::Exception("BadDataSetType")
0153 << "asked to read dataset as a IOVSyncValue, but it is a " << type_id.id_;
0154 }
0155 }
0156
0157 std::vector<cond::hdf5::IOVSyncValue> syncValues;
0158 syncValues.resize(size());
0159
0160 auto ret_value = H5Dread(id_, sv_type_id.id_, H5S_ALL, H5S_ALL, H5P_DEFAULT, syncValues.data());
0161 if (ret_value < 0) {
0162 throw cms::Exception("BadH5Read") << "unable to read IOVSyncValue dataset " << id_;
0163 }
0164 return syncValues;
0165 }
0166
0167
0168
0169
0170 }