MsPASS C++ API  2.4.1.dev4+g92330b7a
Defines the C++ API for MsPASS
Loading...
Searching...
No Matches
Ensemble.h
1#ifndef _MSPASS_ENSEMBLE_H_
2#define _MSPASS_ENSEMBLE_H_
3#include "mspass/seismic/Seismogram.h"
4#include "mspass/seismic/TimeSeries.h"
5#include "mspass/utility/memory_constants.h"
6#include <vector>
7
8namespace mspass::seismic {
14template <typename Tdata> class Ensemble : public mspass::utility::Metadata {
15public:
25 std::vector<Tdata> member;
36 Ensemble(const size_t n) { member.reserve(n); };
38 Ensemble(const mspass::utility::Metadata &md, const size_t n)
39 : mspass::utility::Metadata(md) {
40 member.reserve(n);
41 };
43 Ensemble(const Ensemble &parent)
44 : mspass::utility::Metadata(
45 dynamic_cast<const mspass::utility::Metadata &>(parent)),
46 member(parent.member) {};
48 Ensemble &operator=(const Ensemble &parent) {
49 if (this != (&parent)) {
50 this->Metadata::operator=(parent);
51 member = parent.member;
52 }
53 return *this;
54 };
66 Tdata &operator[](const size_t n) const try {
67 return (this->member[n]);
68 } catch (...) {
69 throw;
70 };
84 md = dynamic_cast<mspass::utility::Metadata *>(this);
85 (*md) += newmd;
86 } catch (...) {
87 throw;
88 };
98 size_t i;
99 for (i = 0; i < this->member.size(); ++i) {
100 mspass::utility::Metadata *mdmember = &(this->member[i]);
101 (*mdmember) += dynamic_cast<mspass::utility::Metadata &>(*this);
102 }
103 };
106 void sync_metadata(std::vector<std::string> exclude) {
107 mspass::utility::Metadata sync_md(*this);
108 for (size_t i = 0; i < exclude.size(); i++) {
109 if (sync_md.is_defined(exclude[i])) {
110 sync_md.erase(exclude[i]);
111 }
112 }
113 for (size_t i = 0; i < this->member.size(); ++i) {
114 mspass::utility::Metadata *mdmember = &(this->member[i]);
115 (*mdmember) += sync_md;
116 }
117 };
118};
119
140template <typename T> class LoggingEnsemble : public Ensemble<T> {
141public:
146 LoggingEnsemble() : Ensemble<T>(), elog() { ensemble_is_live = false; };
147
148 /* The next two constructors are used to provide a parallel qpi to
149 CoreEnsemble - there might be another way to do this in the C++ code or
150 in pybind11 wrappers but this works*/
159 LoggingEnsemble(const size_t n) : Ensemble<T>(n), elog() {
160 ensemble_is_live = false;
161 }
169 : Ensemble<T>(md, n), elog() {
170 /* Might be advised to set this true, but since an object created by
171 this method has only slots but no data validate would return false.*/
172 ensemble_is_live = false;
173 }
181 const mspass::utility::ErrorLogger &elogin,
182 const size_t ndata)
183 : Ensemble<T>(md, ndata), elog(elogin) {};
186 : Ensemble<T>(parent), elog(parent.elog) {
187 ensemble_is_live = parent.ensemble_is_live;
188 };
191 LoggingEnsemble(const Ensemble<T> &parent) : Ensemble<T>(parent), elog() {
192 ensemble_is_live = true;
193 };
195 void kill() { ensemble_is_live = false; };
197 bool live() const { return ensemble_is_live; };
200 bool dead() const { return !ensemble_is_live; };
208 bool validate();
216 bool set_live() {
217 if (this->validate()) {
218 ensemble_is_live = true;
219 return true;
220 } else
221 return false;
222 };
223
226 if (&parent != this) {
228 this->member.reserve(parent.member.size());
229 this->member = parent.member;
230 elog = parent.elog;
231 ensemble_is_live = parent.ensemble_is_live;
232 }
233 return *this;
234 };
241 size_t memory_use() const {
242 size_t memuse;
243 memuse = sizeof(*this);
244 for (auto p = this->member.begin(); p != this->member.end(); ++p) {
245 memuse += p->memory_use();
246 }
247 /* Account for ensemble metadata */
248 /* We can only estimate the size of the Metadata container.
249 These constants are defined in memory_constants.h */
250 memuse +=
251 mspass::utility::memory_constants::MD_AVERAGE_SIZE * this->md.size();
252 memuse += mspass::utility::memory_constants::KEY_AVERAGE_SIZE *
253 this->changed_or_set.size();
254 /* Account for error log size */
255 memuse += mspass::utility::memory_constants::ELOG_AVERAGE_SIZE *
256 this->elog.size();
257 return memuse;
258 };
259
260private:
261 bool ensemble_is_live;
262};
263
264template <typename T> bool LoggingEnsemble<T>::validate() {
265 for (auto dptr = this->member.begin(); dptr != this->member.end(); ++dptr) {
266 if (dptr->live())
267 return true;
268 }
269 return false;
270}
271
296/* Disable temporarily - needs a revision to match new history approach
297template <typename Tdata>
298 size_t set_inputs(ProcessingHistoryRecord& rec, const
299mspass::seismic::Ensemble<Tdata>& d)
300{
301 try{
302 for(size_t i=0;i<d.member.size();++i)
303 {
304 // Ignore any data not defined as live
305 if(d.member[i].live())
306 {
307 list<ProcessingHistoryRecord> h(d.member[i].history());
308 // do nothing if the container is empty
309 if(h.size()>0)rec.inputs.push_back(h);
310 }
311 }
312 return rec.inputs.size();
313 }catch(...){throw;};
314};
315*/
316} // namespace mspass::seismic
317#endif // End guard
Metadata-bearing container for a collection of seismic data objects.
Definition Ensemble.h:14
Ensemble()
Definition Ensemble.h:27
void sync_metadata(std::vector< std::string > exclude)
copy ensemble metadata to all members except for the ones excluded.
Definition Ensemble.h:106
std::vector< Tdata > member
Container holding data objects.
Definition Ensemble.h:25
void sync_metadata()
copy ensemble metadata to all members.
Definition Ensemble.h:97
Ensemble(const size_t n)
Reserve space but build empty ensemble.
Definition Ensemble.h:36
void update_metadata(const mspass::utility::Metadata &newmd)
updates ensemble header (Metadata).
Definition Ensemble.h:82
Ensemble(const mspass::utility::Metadata &md, const size_t n)
Definition Ensemble.h:38
Ensemble(const Ensemble &parent)
Definition Ensemble.h:43
Ensemble & operator=(const Ensemble &parent)
Definition Ensemble.h:48
Tdata & operator[](const size_t n) const
Indexing operator.
Definition Ensemble.h:66
Template class that extends Ensemble to include an error log and live tests.
Definition Ensemble.h:140
LoggingEnsemble(const Ensemble< T > &parent)
Definition Ensemble.h:191
LoggingEnsemble(const mspass::utility::Metadata &md, const mspass::utility::ErrorLogger &elogin, const size_t ndata)
Definition Ensemble.h:180
LoggingEnsemble< T > & operator=(const LoggingEnsemble< T > &parent)
Definition Ensemble.h:225
LoggingEnsemble(const mspass::utility::Metadata &md, const size_t n)
Definition Ensemble.h:168
LoggingEnsemble()
Definition Ensemble.h:146
size_t memory_use() const
Estimate memory used by this ensemble.
Definition Ensemble.h:241
void kill()
Definition Ensemble.h:195
bool set_live()
Definition Ensemble.h:216
bool validate()
Definition Ensemble.h:264
mspass::utility::ErrorLogger elog
Definition Ensemble.h:143
LoggingEnsemble(const size_t n)
Definition Ensemble.h:159
bool live() const
Definition Ensemble.h:197
LoggingEnsemble(const LoggingEnsemble< T > &parent)
Definition Ensemble.h:185
bool dead() const
Definition Ensemble.h:200
Container to hold error logs for a data object.
Definition ErrorLogger.h:63
int size() const
Definition ErrorLogger.h:115
Type-safe metadata container used throughout MsPASS.
Definition Metadata.h:101
void erase(const std::string key)
Definition Metadata.cc:495
bool is_defined(const std::string key) const noexcept
Definition Metadata.cc:342
std::map< std::string, boost::any > md
Definition Metadata.h:473
Metadata & operator=(const Metadata &mdold)
Definition Metadata.cc:460
std::set< std::string > changed_or_set
Definition Metadata.h:475
Define metadata keys.
Definition BasicSpectrum.h:6
Ensemble< TimeSeries > TimeSeriesEnsemble
Definition Ensemble.h:273
Ensemble< Seismogram > ThreeComponentEnsemble
Definition Ensemble.h:275