MsPASS C++ API  2.4.4.dev113+gc53d735d5
Defines the C++ API for MsPASS
Loading...
Searching...
No Matches
waveform_arithmetic.h
1#ifndef MSPASS_SEISMIC_WAVEFORM_ARITHMETIC_H
2#define MSPASS_SEISMIC_WAVEFORM_ARITHMETIC_H
3
4#include "mspass/seismic/BasicTimeSeries.h"
5#include "mspass/utility/MsPASSError.h"
6#include <algorithm>
7#include <cmath>
8#include <cstddef>
9#include <sstream>
10#include <string>
11
12namespace mspass::seismic::detail {
14 std::size_t lhs_begin;
15 std::size_t rhs_begin;
16 std::size_t count;
17};
18
19inline ArithmeticOverlap arithmetic_overlap(const BasicTimeSeries &lhs,
20 const BasicTimeSeries &rhs,
21 const char *caller) {
22 using mspass::utility::ErrorSeverity;
24
25 if (lhs.timetype() != rhs.timetype())
26 throw MsPASSError(std::string(caller) +
27 ": operands use inconsistent time references",
28 ErrorSeverity::Invalid);
29
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);
40 }
41
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);
49 }
50
51 if (rounded_offset >= static_cast<double>(lhs.npts()) ||
52 rounded_offset <= -static_cast<double>(rhs.npts()))
53 return ArithmeticOverlap{0, 0, 0};
54
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())};
59 }
60
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)};
64}
65} // namespace mspass::seismic::detail
66
67#endif
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