MsPASS C++ API  2.4.1.dev4+g92330b7a
Defines the C++ API for MsPASS
Loading...
Searching...
No Matches
ProcessingHistory.h
1#ifndef _PROCESSING_HISTORY_H_
2#define _PROCESSING_HISTORY_H_
3#include "mspass/utility/ErrorLogger.h"
4#include <boost/archive/text_iarchive.hpp>
5#include <boost/archive/text_oarchive.hpp>
6#include <boost/serialization/map.hpp>
7#include <boost/serialization/serialization.hpp>
8#include <boost/uuid/uuid.hpp>
9#include <boost/uuid/uuid_generators.hpp>
10#include <boost/uuid/uuid_io.hpp>
11#include <boost/uuid/uuid_serialize.hpp>
12#include <list>
13#include <map>
14#include <string>
15#include <vector>
16// #include "mspass/seismic/Ensemble.h"
17namespace mspass {
18namespace utility {
24enum class ProcessingStatus { RAW, ORIGIN, VOLATILE, SAVED, UNDEFINED };
33enum class AtomicType { SEISMOGRAM, TIMESERIES, UNDEFINED };
53const std::string SAVED_ID_KEY("NODEDATA_AT_SAVE");
54
57public:
59 jid = std::string();
60 jnm = std::string();
61 };
62 virtual ~BasicProcessingHistory() {};
68 BasicProcessingHistory(const std::string jobname, const std::string jobid) {
69 jid = jobid;
70 jnm = jobname;
71 };
74 jid = parent.jid;
75 jnm = parent.jnm;
76 };
77
85 virtual size_t number_of_stages() { return 0; };
87 std::string jobid() const { return jid; };
89 void set_jobid(const std::string &newjid) { jid = newjid; };
91 std::string jobname() const { return jnm; };
93 void set_jobname(const std::string jobname) { jnm = jobname; };
96 if (this != (&parent)) {
97 jnm = parent.jnm;
98 jid = parent.jid;
99 }
100 return *this;
101 }
102
103protected:
105 std::string jid;
107 std::string jnm;
108
109private:
110 friend boost::serialization::access;
111 template <class Archive>
112 void serialize(Archive &ar, const unsigned int version) {
113 ar & jid;
114 ar & jnm;
115 };
116};
126class NodeData {
127public:
129 mspass::utility::ProcessingStatus status;
131 std::string uuid;
133 mspass::utility::AtomicType type;
136 int stage;
145 std::string algorithm;
155 std::string algid;
156 /* These standard elements could be defaulted, but we implement them
157 explicitly for clarity - implemented in the cc file. */
158 NodeData();
160 NodeData(const NodeData &parent);
162 NodeData &operator=(const NodeData &parent);
164 bool operator==(const NodeData &other);
166 bool operator!=(const NodeData &other);
167
168private:
169 friend boost::serialization::access;
170 template <class Archive>
171 void serialize(Archive &ar, const unsigned int version) {
172 ar & status;
173 ar & uuid;
174 ar & type;
175 ar & stage;
176 ar & algorithm;
177 ar & algid;
178 };
179};
244public:
254 ProcessingHistory(const std::string jobnm, const std::string jid);
264 bool is_empty() const;
267 bool is_raw() const;
270 bool is_origin() const;
273 bool is_volatile() const;
276 bool is_saved() const;
294 size_t number_of_stages() override;
341 void set_as_origin(const std::string alg, const std::string algid,
342 const std::string uuid, const AtomicType typ,
343 bool define_as_raw = false);
393 std::string
394 new_ensemble_process(const std::string alg, const std::string algid,
395 const AtomicType typ,
396 const std::vector<ProcessingHistory *> parents,
397 const bool create_newid = true);
414 void add_one_input(const ProcessingHistory &data_to_add);
423 void add_many_inputs(const std::vector<ProcessingHistory *> &d);
424
430 void merge(const ProcessingHistory &data_to_add);
449 void accumulate(const std::string alg, const std::string algid,
450 const AtomicType typ, const ProcessingHistory &newinput);
476 std::string clean_accumulate_uuids();
500 std::string
501 new_map(const std::string alg, const std::string algid, const AtomicType typ,
502 const ProcessingStatus newstatus = ProcessingStatus::VOLATILE);
531 std::string
532 new_map(const std::string alg, const std::string algid, const AtomicType typ,
533 const ProcessingHistory &data_to_clone,
534 const ProcessingStatus newstatus = ProcessingStatus::VOLATILE);
535
571 std::string map_as_saved(const std::string alg, const std::string algid,
572 const AtomicType typ);
574 void clear();
581 std::multimap<std::string, mspass::utility::NodeData> get_nodes() const;
582
591 int stage() const { return current_stage; };
593 ProcessingStatus status() const { return current_status; };
599 std::string id() const { return current_id; };
601 std::pair<std::string, std::string> created_by() const {
602 std::pair<std::string, std::string> result(algorithm, algid);
603 return result;
604 }
618 std::string newid();
624 int number_inputs() const;
633 int number_inputs(const std::string uuidstr) const;
634
643 void set_id(const std::string newid);
644
657 std::list<mspass::utility::NodeData>
658 inputs(const std::string id_to_find) const;
659
662 /* We make this protected to simplify expected extensions. In particular,
663 the process of reconstructing history is a complicated process we don't
664 want to add as baggage to regular data. Hence, tools to reconstruct history
665 (provenance) are expected to extend this class. */
666protected:
672 std::multimap<std::string, mspass::utility::NodeData> nodes;
673
674private:
675 /* This set of private variables are the values of attributes for
676 the same concepts in the NodeData struct/class. We break them out as
677 single variables because they are not always set lumped together. Hence
678 there are also separate getters and setters for each. */
679 ProcessingStatus current_status;
680 /* uuid of current data object */
681 std::string current_id;
682 int current_stage;
683 AtomicType mytype;
684 std::string algorithm;
685 std::string algid;
686
687 friend boost::serialization::access;
688 template <class Archive>
689 void serialize(Archive &ar, const unsigned int version) {
690 ar &boost::serialization::base_object<BasicProcessingHistory>(*this);
691 ar & nodes;
692 ar & current_status;
693 ar & current_id;
694 ar & current_stage;
695 ar & mytype;
696 ar & algorithm;
697 ar & algid;
698 ar & elog;
699 };
700};
701/* function prototypes of helpers */
702
718template <typename Tdata>
719void append_input(const Tdata &d, ProcessingHistory &his) {
720 if (d.live()) {
721 const ProcessingHistory *ptr = dynamic_cast<const ProcessingHistory *>(&d);
722 his.add_one_input(*ptr);
723 }
724};
725/* this pair of functions did things that were methods in an earlier
726prototype. What they do is still useful but making them functions
727reduced the baggage in the ProcessingHistory class. */
728
742std::list<std::tuple<int, std::string, std::string>>
743algorithm_history(const ProcessingHistory &h);
764std::list<std::string> algorithm_outputs(const ProcessingHistory &h,
765 const std::string alg,
766 const std::string algid);
767} // namespace utility
768} // namespace mspass
769#endif
Definition ProcessingHistory.h:56
std::string jobname() const
Definition ProcessingHistory.h:91
std::string jobid() const
Definition ProcessingHistory.h:87
BasicProcessingHistory & operator=(const BasicProcessingHistory &parent)
Definition ProcessingHistory.h:95
BasicProcessingHistory(const BasicProcessingHistory &parent)
Definition ProcessingHistory.h:73
std::string jnm
Definition ProcessingHistory.h:107
BasicProcessingHistory(const std::string jobname, const std::string jobid)
Definition ProcessingHistory.h:68
void set_jobid(const std::string &newjid)
Definition ProcessingHistory.h:89
virtual size_t number_of_stages()
Definition ProcessingHistory.h:85
std::string jid
Definition ProcessingHistory.h:105
void set_jobname(const std::string jobname)
Definition ProcessingHistory.h:93
Container to hold error logs for a data object.
Definition ErrorLogger.h:63
Holds properties of data used as input to algorithm that created this object.
Definition ProcessingHistory.h:126
std::string algorithm
Name of algorithm algorithm applied at this stage.
Definition ProcessingHistory.h:145
std::string uuid
Definition ProcessingHistory.h:131
bool operator==(const NodeData &other)
Definition ProcessingHistory.cc:59
mspass::utility::ProcessingStatus status
Definition ProcessingHistory.h:129
bool operator!=(const NodeData &other)
Definition ProcessingHistory.cc:77
int stage
Definition ProcessingHistory.h:136
std::string algid
Definition ProcessingHistory.h:155
mspass::utility::AtomicType type
Definition ProcessingHistory.h:133
NodeData & operator=(const NodeData &parent)
Definition ProcessingHistory.cc:48
Lightweight class to preserve procesing chain of atomic objects.
Definition ProcessingHistory.h:243
size_t number_of_stages() override
Return number of processing stages that have been applied to this object.
Definition ProcessingHistory.cc:140
void set_as_origin(const std::string alg, const std::string algid, const std::string uuid, const AtomicType typ, bool define_as_raw=false)
Definition ProcessingHistory.cc:150
NodeData current_nodedata() const
Definition ProcessingHistory.cc:661
ProcessingStatus status() const
Definition ProcessingHistory.h:593
std::multimap< std::string, mspass::utility::NodeData > nodes
Definition ProcessingHistory.h:672
bool is_saved() const
Definition ProcessingHistory.cc:134
void clear()
Definition ProcessingHistory.cc:633
bool is_raw() const
Definition ProcessingHistory.cc:115
bool is_origin() const
Definition ProcessingHistory.cc:121
void merge(const ProcessingHistory &data_to_add)
Merge the history nodes from another.
Definition ProcessingHistory.cc:441
std::multimap< std::string, mspass::utility::NodeData > get_nodes() const
Definition ProcessingHistory.cc:614
void add_many_inputs(const std::vector< ProcessingHistory * > &d)
Define several data objects as inputs.
Definition ProcessingHistory.cc:305
ErrorLogger elog
Definition ProcessingHistory.h:246
std::string new_map(const std::string alg, const std::string algid, const AtomicType typ, const ProcessingStatus newstatus=ProcessingStatus::VOLATILE)
Define this algorithm as a one-to-one map of same type data.
Definition ProcessingHistory.cc:320
ProcessingHistory()
Definition ProcessingHistory.cc:82
int number_inputs() const
Definition ProcessingHistory.cc:650
std::pair< std::string, std::string > created_by() const
Definition ProcessingHistory.h:601
bool is_volatile() const
Definition ProcessingHistory.cc:128
bool is_empty() const
Definition ProcessingHistory.cc:110
std::string new_ensemble_process(const std::string alg, const std::string algid, const AtomicType typ, const std::vector< ProcessingHistory * > parents, const bool create_newid=true)
Definition ProcessingHistory.cc:173
std::string newid()
Definition ProcessingHistory.cc:653
std::string map_as_saved(const std::string alg, const std::string algid, const AtomicType typ)
Prepare the current data for saving.
Definition ProcessingHistory.cc:397
ProcessingHistory & operator=(const ProcessingHistory &parent)
Definition ProcessingHistory.cc:689
void add_one_input(const ProcessingHistory &data_to_add)
Add one datum as an input for current data.
Definition ProcessingHistory.cc:264
std::string id() const
Definition ProcessingHistory.h:599
void set_id(const std::string newid)
Definition ProcessingHistory.cc:660
std::list< mspass::utility::NodeData > inputs(const std::string id_to_find) const
Return a list of data that define the inputs to a give uuids.
Definition ProcessingHistory.cc:672
std::string clean_accumulate_uuids()
Clean up inconsistent uuids that can be produced by reduce.
Definition ProcessingHistory.cc:548
void accumulate(const std::string alg, const std::string algid, const AtomicType typ, const ProcessingHistory &newinput)
Method to use with a spark reduce algorithm.
Definition ProcessingHistory.cc:476
int stage() const
Definition ProcessingHistory.h:591