14 if (code < 0)
throw std::runtime_error(std::format(
"error setting {}",
error));
18 const std::string& key,
19 const std::string& val)
21 H5::StrType strtype(H5::PredType::C_S1, H5T_VARIABLE);
22 H5::DataSpace scalar(H5S_SCALAR);
23 H5::Attribute attr = obj.createAttribute(key, strtype, scalar);
24 const char* cstr = val.c_str();
25 attr.write(strtype, &cstr);
32 H5::DataSpace scalar(H5S_SCALAR);
33 uint8_t v = val ? 1 : 0;
34 H5::Attribute attr = obj.createAttribute(
35 key, H5::PredType::NATIVE_UINT8, scalar);
36 attr.write(H5::PredType::NATIVE_UINT8, &v);
40 const std::string& key,
43 H5::DataSpace scalar(H5S_SCALAR);
44 H5::Attribute attr = obj.createAttribute(
45 key, H5::PredType::NATIVE_INT64, scalar);
46 attr.write(H5::PredType::NATIVE_INT64, &val);
50 const std::string& key,
53 H5::DataSpace scalar(H5S_SCALAR);
54 H5::Attribute attr = obj.createAttribute(
55 key, H5::PredType::NATIVE_DOUBLE, scalar);
56 attr.write(H5::PredType::NATIVE_DOUBLE, &val);
60size_t n_bins(
const std::vector<double>& e) {
return e.size() - 1; }
61size_t n_bins(
const std::vector<int64_t>& e) {
return e.size(); }
62size_t n_bins(
const std::vector<std::string>& e) {
return e.size(); }
63size_t n_bins(
const std::pair<int64_t,int64_t>&
r) {
return static_cast<size_t>(
r.second -
r.first + 1); }
66 const std::string& name,
67 const std::vector<std::string>& values)
69 H5::StrType strtype(H5::PredType::C_S1, H5T_VARIABLE);
70 hsize_t n = values.size();
71 H5::DataSpace space(1, &n);
72 H5::DSetCreatPropList props;
73 props.setChunk(1, &n);
75 std::vector<const char*> cstrs;
77 for (
const auto& s : values) cstrs.push_back(s.c_str());
78 parent.createDataSet(name, strtype, space, props)
79 .write(cstrs.data(), strtype);
95 hsize_t nedges = edges.size();
96 H5::DataSpace edge_space(1, &nedges);
97 H5::DSetCreatPropList props;
98 props.setChunk(1, &nedges);
100 ax_grp.createDataSet(
"edges",
101 H5::PredType::NATIVE_DOUBLE, edge_space, props)
102 .write(edges.data(), H5::PredType::NATIVE_DOUBLE);
115 hsize_t n = vals.size();
116 H5::DataSpace space(1, &n);
117 H5::DSetCreatPropList props;
118 props.setChunk(1, &n);
120 ax_grp.createDataSet(
"categories",
121 H5::PredType::NATIVE_INT64, space, props)
122 .write(vals.data(), H5::PredType::NATIVE_INT64);
131void write_axes(H5::Group& hist_grp,
const std::vector<Axis>& axes)
133 H5::Group ref_axes_grp = hist_grp.createGroup(
"ref_axes");
134 for (
size_t ax_n = 0; ax_n < axes.size(); ++ax_n) {
135 const auto& ax = axes.at(ax_n);
136 H5::Group ax_grp = ref_axes_grp.createGroup(
"axis_" + std::to_string(ax_n));
138 std::visit([&ax_grp](
const auto& e) {
146 H5::Group ax_meta = ax_grp.createGroup(
"metadata");
147 if (!ax.name.empty()) {
150 ax_grp.createGroup(
"writer_info");
154 std::vector<hobj_ref_t> axis_refs(axes.size());
155 for (
size_t ax_n = 0; ax_n < axes.size(); ++ax_n) {
156 std::string ax_path =
"ref_axes/axis_" + std::to_string(ax_n);
157 chkerr(H5Rcreate(&axis_refs.at(ax_n), hist_grp.getId(),
158 ax_path.c_str(), H5R_OBJECT, -1),
159 "axis object reference");
161 hsize_t ref_dim = axes.size();
162 H5::DataSpace ref_space(1, &ref_dim);
163 hist_grp.createDataSet(
"axes", H5::PredType::STD_REF_OBJ, ref_space)
164 .write(axis_refs.data(), H5::PredType::STD_REF_OBJ);
size_t n_bins(const regular_axis_t &r)
void write_axes(H5::Group &hist_grp, const std::vector< Axis > &axes)
void write_str_attr(H5::H5Object &obj, const std::string &key, const std::string &val)
void write_str_dataset(H5::Group &parent, const std::string &name, const std::vector< std::string > &values)
void chkerr(herr_t code, std::string_view error)
void write_int_attr(H5::H5Object &obj, const std::string &key, int64_t val)
void write_double_attr(H5::H5Object &obj, const std::string &key, double val)
void write_axis_edges(H5::Group &ax_grp, const regular_axis_t &r)
void write_bool_attr(H5::H5Object &obj, const char *key, bool val)