19#include <isce3/core/Attitude.h>
20#include <isce3/core/DateTime.h>
21#include <isce3/core/Ellipsoid.h>
22#include <isce3/core/Metadata.h>
23#include <isce3/core/Orbit.h>
24#include <isce3/core/Poly2d.h>
25#include <isce3/core/LUT1d.h>
26#include <isce3/core/LUT2d.h>
27#include <isce3/core/StateVector.h>
28#include <isce3/core/TimeDelta.h>
29#include <isce3/io/IH5.h>
44 std::vector<double> ellpsData;
47 ellps.
a(ellpsData[0]);
48 ellps.
e2(ellpsData[1]);
70 if (time_dims.size() != 1 || pos_dims.size() != 2 || vel_dims.size() != 2) {
71 throw std::runtime_error(
"unexpected orbit state vector dims");
73 if (pos_dims[1] != 3 || vel_dims[1] != 3) {
74 throw std::runtime_error(
"unexpected orbit position/velocity vector size");
76 std::size_t size = time_dims[0];
77 if (pos_dims[0] != size || vel_dims[0] != size) {
78 throw std::runtime_error(
"mismatched orbit state vector component sizes");
82 std::vector<double> time(size);
83 std::vector<double> pos(3 * size);
84 std::vector<double> vel(3 * size);
93 std::vector<StateVector> statevecs(size);
94 for (std::size_t i = 0; i < size; ++i) {
95 statevecs[i].datetime = reference_epoch +
TimeDelta(time[i]);
96 statevecs[i].position = { pos[3*i+0], pos[3*i+1], pos[3*i+2] };
97 statevecs[i].velocity = { vel[3*i+0], vel[3*i+1], vel[3*i+2] };
105 std::string interp_method =
"Hermite";
110 if (interp_method ==
"Hermite") {
113 else if (interp_method ==
"Legendre") {
117 throw std::runtime_error(
"unexpected orbit interpolation method '" + interp_method +
"'");
121 std::string orbit_type =
"Undefined";
125 orbit.
type(orbit_type);
139 const bool ensureEpochIntegerSeconds =
true)
142 std::vector<double> time(orbit.
size());
143 std::vector<double> pos(3 * orbit.
size());
144 std::vector<double> vel(3 * orbit.
size());
146 for (
int i = 0; i < orbit.
size(); ++i) {
147 time[i] = orbit.
time(i);
159 std::size_t size = orbit.
size();
160 std::array<std::size_t, 2> dims = {size, 3};
163 std::string interp_method;
164 if (orbit.
interpMethod() == OrbitInterpMethod::Hermite) {
165 interp_method =
"Hermite";
167 else if (orbit.
interpMethod() == OrbitInterpMethod::Legendre) {
168 interp_method =
"Legendre";
171 throw std::runtime_error(
"unexpected orbit interpolation method");
174 std::string orbit_type = orbit.
type();
175 if (orbit_type ==
"") {
176 orbit_type =
"Undefined";
182 ensureEpochIntegerSeconds);
223 std::vector<double> time, packed_quat;
227 int n = packed_quat.size() / 4;
228 std::vector<isce3::core::Quaternion> quat(n);
229 for (
int i = 0; i < n; ++i) {
230 const double* q = &packed_quat[i * 4];
249 const bool ensureEpochIntegerSeconds =
true)
253 std::vector<double> qflat(n * 4);
255 for (
int i = 0; i < n; ++i) {
256 double *q = &qflat[i * 4];
267 ensureEpochIntegerSeconds);
268 std::array<size_t, 2> dims = {
static_cast<size_t>(n), 4};
310 std::valarray<double> slantRange, zeroDopplerTime;
319 lut.
setFromData(slantRange, zeroDopplerTime, matrix);
335 const std::string & dsetName,
338 const std::string & units =
"",
339 const bool ensureEpochIntegerSeconds =
true)
342 const double x0 = lut.xStart();
343 const double x1 = lut.xEnd();
344 const std::vector<double> x = isce3::core::linspace(x0, x1, lut.width());
347 const double y0 = lut.yStart();
348 const double y1 = lut.yEnd();
349 const std::vector<double> y = isce3::core::linspace(y0, y1, lut.length());
355 ensureEpochIntegerSeconds);
370 std::string name_coords, std::string name_values)
373 std::valarray<double> x, y;
Store and interpolate attitude measurements.
Definition Attitude.h:17
const DateTime & referenceEpoch() const
Get reference epoch (UTC) for time tags.
Definition Attitude.h:46
int size() const
Return number of epochs.
Definition Attitude.h:43
const std::vector< double > & time() const
Return data vector of time.
Definition Attitude.h:37
const std::vector< Quaternion > & quaternions() const
Return data vector of quaternions.
Definition Attitude.h:40
Data structure to store date time to nano-sec precision.
Definition DateTime.h:18
Data structure to store Ellipsoid information.
Definition Ellipsoid.h:20
CUDA_HOSTDEV double a() const
Return semi-major axis.
Definition Ellipsoid.h:38
CUDA_HOSTDEV double e2() const
Return eccentricity^2.
Definition Ellipsoid.h:46
Data structure to hold a 1D Lookup table.
Definition LUT1d.h:15
std::valarray< T > & values()
Get a reference to the coordinates.
Definition LUT1d.h:82
std::valarray< double > & coords()
Get a reference to the coordinates.
Definition LUT1d.h:70
Data structure to store 2D Lookup table.
Definition LUT2d.h:20
void setFromData(const std::valarray< double > &xcoord, const std::valarray< double > &ycoord, const isce3::core::Matrix< T > &data)
Definition LUT2d.cpp:53
Data structure for a 2D row-major matrix.
Definition Matrix.h:23
Sequence of platform ephemeris samples (state vectors) with uniform temporal spacing,...
Definition Orbit.h:44
const Linspace< double > & time() const
Get state vector times relative to reference epoch (s)
Definition Orbit.h:157
const std::vector< Vec3 > & velocity() const
Get state vector velocities in ECEF coordinates (m/s)
Definition Orbit.h:163
const std::vector< Vec3 > & position() const
Get state vector positions in ECEF coordinates (m)
Definition Orbit.h:160
const DateTime & referenceEpoch() const
Reference epoch (UTC)
Definition Orbit.h:105
void setStateVectors(const std::vector< StateVector > &)
Set orbit state vectors.
Definition Orbit.cpp:52
OrbitInterpMethod interpMethod() const
Interpolation method.
Definition Orbit.h:116
const std::string & type() const
Orbit ephemeris precision type.
Definition Orbit.h:122
int size() const
Number of state vectors in orbit.
Definition Orbit.h:154
Data structure for representing 2D polynomials.
Definition Poly2d.h:20
int yOrder
Order of polynomial in azimuth or y.
Definition Poly2d.h:26
double yNorm
Norm in azimuth or y direction.
Definition Poly2d.h:34
double yMean
Mean in azimuth or y direction.
Definition Poly2d.h:30
double xNorm
Norm in range or x direction.
Definition Poly2d.h:32
int xOrder
Order of polynomial in range or x.
Definition Poly2d.h:24
std::vector< double > coeffs
Linearized vector of coefficients in row-major format.
Definition Poly2d.h:36
double xMean
Mean in range or x direction.
Definition Poly2d.h:28
Quaternion representation of rotations, based on double precision Eigen::Quaterniond.
Definition Quaternion.h:25
Data structure to store TimeDelta to double precision seconds.
Definition TimeDelta.h:16
Our derived dataset structure that includes utility functions.
Definition IH5.h:41
std::vector< int > getDimensions(const std::string &v="")
Get the size of each dimension of the dataset or given attribute.
Definition IH5.cpp:172
void read(T &v, const std::string &att="")
Reading scalar (non string) dataset or attributes.
Definition IH5.icc:143
IDataSet openDataSet(const H5std_string &name)
Open a given dataset.
Definition IH5.cpp:712
void loadCalGrid(isce3::io::IGroup &group, const std::string &dsetName, isce3::core::LUT2d< T > &lut)
Load LUT2d data from HDF5 product.
Definition Serialization.h:306
void saveToH5(isce3::io::IGroup &group, const Orbit &orbit, const bool ensureEpochIntegerSeconds=true)
Save orbit data to HDF5 product.
Definition Serialization.h:138
void loadFromH5(isce3::io::IGroup &group, Ellipsoid &ellps)
Load Ellipsoid parameters from HDF5.
Definition Serialization.h:41
void saveCalGrid(isce3::io::IGroup &group, const std::string &dsetName, const isce3::core::LUT2d< T > &lut, const isce3::core::DateTime &refEpoch, const std::string &units="", const bool ensureEpochIntegerSeconds=true)
Save LUT2d data to HDF5 product.
Definition Serialization.h:334
Serialization utilities using HDF5 API.
void saveToH5(H5obj &h5obj, const std::string &datasetPath, const T &val, const std::string &units="")
Write scalar dataset to HDF5 file.
Definition Serialization.h:116
bool exists(H5obj &h5obj, const std::string &name, const std::string start=".", const std::string type="BOTH")
Check existence of a dataset or group.
Definition Serialization.h:36
void setRefEpoch(H5obj &h5obj, const std::string &datasetPath, const isce3::core::DateTime &refEpoch, const bool ensureEpochIntegerSeconds=true)
Save reference epoch DateTime as an attribute.
Definition Serialization.h:307
isce3::core::DateTime getRefEpoch(H5obj &h5obj, const std::string &datasetPath)
Parse time units in a dataset attribute to get a reference epoch.
Definition Serialization.h:269
void loadFromH5(H5obj &h5obj, const std::string &datasetPath, T &v)
Load scalar dataset from HDF5 file.
Definition Serialization.h:56
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5