1#ifndef MSPASS_SEISMIC_WAVEFORM_ARITHMETIC_H
2#define MSPASS_SEISMIC_WAVEFORM_ARITHMETIC_H
4#include "mspass/seismic/BasicTimeSeries.h"
5#include "mspass/utility/MsPASSError.h"
12namespace mspass::seismic::detail {
14 std::size_t lhs_begin;
15 std::size_t rhs_begin;
22 using mspass::utility::ErrorSeverity;
27 ": operands use inconsistent time references",
28 ErrorSeverity::Invalid);
30 const double lhs_dt = lhs.
dt();
31 const double rhs_dt = rhs.
dt();
32 const double dt_tolerance =
33 1.0e-6 * std::max(std::abs(lhs_dt), std::abs(rhs_dt));
34 if (!std::isfinite(lhs_dt) || !std::isfinite(rhs_dt) ||
35 !(std::abs(lhs_dt - rhs_dt) <= dt_tolerance)) {
36 std::ostringstream message;
37 message << caller <<
": sample intervals do not match: lhs dt=" << lhs_dt
38 <<
", rhs dt=" << rhs_dt;
39 throw MsPASSError(message.str(), ErrorSeverity::Invalid);
42 const double offset_samples = (rhs.
t0() - lhs.
t0()) / lhs_dt;
43 const double rounded_offset = std::round(offset_samples);
44 if (!(std::abs(offset_samples - rounded_offset) <= 1.0e-6)) {
45 std::ostringstream message;
46 message << caller <<
": start times are not aligned to the sample grid: "
47 <<
"offset=" << offset_samples <<
" samples";
48 throw MsPASSError(message.str(), ErrorSeverity::Invalid);
51 if (rounded_offset >=
static_cast<double>(lhs.
npts()) ||
52 rounded_offset <= -
static_cast<double>(rhs.
npts()))
53 return ArithmeticOverlap{0, 0, 0};
55 if (rounded_offset >= 0.0) {
56 const std::size_t lhs_begin =
static_cast<std::size_t
>(rounded_offset);
57 return ArithmeticOverlap{lhs_begin, 0,
58 std::min(lhs.
npts() - lhs_begin, rhs.
npts())};
61 const std::size_t rhs_begin =
static_cast<std::size_t
>(-rounded_offset);
62 return ArithmeticOverlap{0, rhs_begin,
63 std::min(lhs.
npts(), rhs.
npts() - rhs_begin)};
Base class for time series objects.
Definition BasicTimeSeries.h:35
size_t npts() const
Definition BasicTimeSeries.h:173
double t0() const
Definition BasicTimeSeries.h:176
TimeReferenceType timetype() const
Definition BasicTimeSeries.h:169
double dt() const
Definition BasicTimeSeries.h:153
Base class for error object thrown by MsPASS library routines.
Definition MsPASSError.h:38
Definition waveform_arithmetic.h:13