Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
HDF5Reader.hpp
Go to the documentation of this file.
1
8
9#pragma once
10
11#include <Eigen/Core>
12#include <highfive/H5Easy.hpp>
13#include <highfive/H5File.hpp>
14#include <memory>
15#include <string>
16#include <vector>
17
19
20namespace vulcan::io {
21
42 public:
47 explicit HDF5Reader(const std::string &filename)
48 : impl_(std::make_unique<Impl>(filename)) {}
49
50 ~HDF5Reader() = default;
51
52 // Non-copyable, movable
53 HDF5Reader(const HDF5Reader &) = delete;
54 HDF5Reader &operator=(const HDF5Reader &) = delete;
55 HDF5Reader(HDF5Reader &&) noexcept = default;
56 HDF5Reader &operator=(HDF5Reader &&) noexcept = default;
57
59 TelemetrySchema schema() const { return impl_->schema(); }
60
62 size_t frame_count() const { return impl_->frame_count(); }
63
65 std::vector<double> times() const { return impl_->times(); }
66
68 std::vector<double> read_double(const std::string &signal) const {
69 return impl_->read_double(signal);
70 }
71
73 std::vector<int32_t> read_int32(const std::string &signal) const {
74 return impl_->read_int32(signal);
75 }
76
78 std::vector<int64_t> read_int64(const std::string &signal) const {
79 return impl_->read_int64(signal);
80 }
81
83 std::vector<double> read_double(const std::string &signal, size_t start,
84 size_t count) const {
85 return impl_->read_double_slice(signal, start, count);
86 }
87
89 std::vector<Eigen::Vector3d> read_vec3(const std::string &signal) const {
90 auto x = read_double(signal + ".x");
91 auto y = read_double(signal + ".y");
92 auto z = read_double(signal + ".z");
93
94 std::vector<Eigen::Vector3d> result;
95 result.reserve(x.size());
96 for (size_t i = 0; i < x.size(); ++i) {
97 result.emplace_back(x[i], y[i], z[i]);
98 }
99 return result;
100 }
101
103 std::vector<Eigen::Quaterniond> read_quat(const std::string &signal) const {
104 auto w = read_double(signal + ".w");
105 auto x = read_double(signal + ".x");
106 auto y = read_double(signal + ".y");
107 auto z = read_double(signal + ".z");
108
109 std::vector<Eigen::Quaterniond> result;
110 result.reserve(w.size());
111 for (size_t i = 0; i < w.size(); ++i) {
112 result.emplace_back(w[i], x[i], y[i], z[i]);
113 }
114 return result;
115 }
116
118 std::vector<std::string> signal_names() const {
119 return impl_->signal_names();
120 }
121
122 private:
123 struct Impl {
124 HighFive::File file;
125 mutable std::optional<TelemetrySchema> cached_schema;
126
127 explicit Impl(const std::string &filename)
128 : file(filename, HighFive::File::ReadOnly) {}
129
130 TelemetrySchema schema() const {
131 if (!cached_schema) {
132 auto metadata = file.getGroup("metadata");
133 std::string json;
134 metadata.getAttribute("schema").read(json);
135 cached_schema = TelemetrySchema::from_json(json);
136 }
137 return *cached_schema;
138 }
139
140 size_t frame_count() const {
141 return file.getDataSet("time").getDimensions()[0];
142 }
143
144 std::vector<double> times() const {
145 std::vector<double> result;
146 file.getDataSet("time").read(result);
147 return result;
148 }
149
150 std::vector<double> read_double(const std::string &signal) const {
151 std::vector<double> result;
152 file.getDataSet("signals/" + signal).read(result);
153 return result;
154 }
155
156 std::vector<int32_t> read_int32(const std::string &signal) const {
157 std::vector<int32_t> result;
158 file.getDataSet("signals/" + signal).read(result);
159 return result;
160 }
161
162 std::vector<int64_t> read_int64(const std::string &signal) const {
163 std::vector<int64_t> result;
164 file.getDataSet("signals/" + signal).read(result);
165 return result;
166 }
167
168 std::vector<double> read_double_slice(const std::string &signal,
169 size_t start,
170 size_t count) const {
171 auto ds = file.getDataSet("signals/" + signal);
172 std::vector<double> result(count);
173 ds.select({start}, {count}).read(result);
174 return result;
175 }
176
177 std::vector<std::string> signal_names() const {
178 auto signals = file.getGroup("signals");
179 return signals.listObjectNames();
180 }
181 };
182
183 std::unique_ptr<Impl> impl_;
184};
185
186} // namespace vulcan::io
Telemetry signal schema definition for Vulcan I/O.
std::vector< double > times() const
Read all timestamps.
Definition HDF5Reader.hpp:65
std::vector< double > read_double(const std::string &signal) const
Read double signal.
Definition HDF5Reader.hpp:68
TelemetrySchema schema() const
Get schema from file metadata.
Definition HDF5Reader.hpp:59
std::vector< std::string > signal_names() const
Get all signal names.
Definition HDF5Reader.hpp:118
HDF5Reader(const std::string &filename)
Open HDF5 file for reading.
Definition HDF5Reader.hpp:47
HDF5Reader & operator=(const HDF5Reader &)=delete
HDF5Reader(HDF5Reader &&) noexcept=default
std::vector< double > read_double(const std::string &signal, size_t start, size_t count) const
Read double signal slice.
Definition HDF5Reader.hpp:83
std::vector< Eigen::Quaterniond > read_quat(const std::string &signal) const
Read quaternion signal (reads .w, .x, .y, .z).
Definition HDF5Reader.hpp:103
size_t frame_count() const
Get number of frames in file.
Definition HDF5Reader.hpp:62
std::vector< Eigen::Vector3d > read_vec3(const std::string &signal) const
Read 3-component vector signal (reads .x, .y, .z).
Definition HDF5Reader.hpp:89
std::vector< int32_t > read_int32(const std::string &signal) const
Read int32 signal.
Definition HDF5Reader.hpp:73
std::vector< int64_t > read_int64(const std::string &signal) const
Read int64 signal.
Definition HDF5Reader.hpp:78
HDF5Reader(const HDF5Reader &)=delete
Telemetry schema builder and container.
Definition TelemetrySchema.hpp:41
static TelemetrySchema from_json(const std::string &json)
Deserialize from JSON string (basic parser).
Definition CSVExport.hpp:20