MsPASS C++ API  2.4.4.dev114+gf4c3cfaca
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);
256 ProcessingHistory(const std::string jobnm, const std::string jid,
257 const std::multimap<std::string, NodeData> &nodesin,
258 const NodeData &current, const ErrorLogger &elogin);
268 bool is_empty() const;
271 bool is_raw() const;
274 bool is_origin() const;
277 bool is_volatile() const;
280 bool is_saved() const;
298 size_t number_of_stages() override;
345 void set_as_origin(const std::string alg, const std::string algid,
346 const std::string uuid, const AtomicType typ,
347 bool define_as_raw = false);
397 std::string
398 new_ensemble_process(const std::string alg, const std::string algid,
399 const AtomicType typ,
400 const std::vector<ProcessingHistory *> parents,
401 const bool create_newid = true);
418 void add_one_input(const ProcessingHistory &data_to_add);
427 void add_many_inputs(const std::vector<ProcessingHistory *> &d);
428
434 void merge(const ProcessingHistory &data_to_add);
453 void accumulate(const std::string alg, const std::string algid,
454 const AtomicType typ, const ProcessingHistory &newinput);
480 std::string clean_accumulate_uuids();
504 std::string
505 new_map(const std::string alg, const std::string algid, const AtomicType typ,
506 const ProcessingStatus newstatus = ProcessingStatus::VOLATILE);
535 std::string
536 new_map(const std::string alg, const std::string algid, const AtomicType typ,
537 const ProcessingHistory &data_to_clone,
538 const ProcessingStatus newstatus = ProcessingStatus::VOLATILE);
539
575 std::string map_as_saved(const std::string alg, const std::string algid,
576 const AtomicType typ);
578 void clear();
585 std::multimap<std::string, mspass::utility::NodeData> get_nodes() const;
586
595 int stage() const { return current_stage; };
597 ProcessingStatus status() const { return current_status; };
603 std::string id() const { return current_id; };
605 std::pair<std::string, std::string> created_by() const {
606 std::pair<std::string, std::string> result(algorithm, algid);
607 return result;
608 }
622 std::string newid();
628 int number_inputs() const;
637 int number_inputs(const std::string uuidstr) const;
638
647 void set_id(const std::string newid);
648
661 std::list<mspass::utility::NodeData>
662 inputs(const std::string id_to_find) const;
663
666 /* We make this protected to simplify expected extensions. In particular,
667 the process of reconstructing history is a complicated process we don't
668 want to add as baggage to regular data. Hence, tools to reconstruct history
669 (provenance) are expected to extend this class. */
670protected:
676 std::multimap<std::string, mspass::utility::NodeData> nodes;
677
678private:
679 /* This set of private variables are the values of attributes for
680 the same concepts in the NodeData struct/class. We break them out as
681 single variables because they are not always set lumped together. Hence
682 there are also separate getters and setters for each. */
683 ProcessingStatus current_status;
684 /* uuid of current data object */
685 std::string current_id;
686 int current_stage;
687 AtomicType mytype;
688 std::string algorithm;
689 std::string algid;
690
691 friend boost::serialization::access;
692 template <class Archive>
693 void serialize(Archive &ar, const unsigned int version) {
694 ar &boost::serialization::base_object<BasicProcessingHistory>(*this);
695 ar & nodes;
696 ar & current_status;
697 ar & current_id;
698 ar & current_stage;
699 ar & mytype;
700 ar & algorithm;
701 ar & algid;
702 ar & elog;
703 };
704};
705/* function prototypes of helpers */
706
722template <typename Tdata>
723void append_input(const Tdata &d, ProcessingHistory &his) {
724 if (d.live()) {
725 const ProcessingHistory *ptr = dynamic_cast<const ProcessingHistory *>(&d);
726 his.add_one_input(*ptr);
727 }
728};
729/* this pair of functions did things that were methods in an earlier
730prototype. What they do is still useful but making them functions
731reduced the baggage in the ProcessingHistory class. */
732
746std::list<std::tuple<int, std::string, std::string>>
747algorithm_history(const ProcessingHistory &h);
768std::list<std::string> algorithm_outputs(const ProcessingHistory &h,
769 const std::string alg,
770 const std::string algid);
771} // namespace utility
772} // namespace mspass
773#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:151
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:161
NodeData current_nodedata() const
Definition ProcessingHistory.cc:672
ProcessingStatus status() const
Definition ProcessingHistory.h:597
std::multimap< std::string, mspass::utility::NodeData > nodes
Definition ProcessingHistory.h:676
bool is_saved() const
Definition ProcessingHistory.cc:145
void clear()
Definition ProcessingHistory.cc:644
bool is_raw() const
Definition ProcessingHistory.cc:126
bool is_origin() const
Definition ProcessingHistory.cc:132
void merge(const ProcessingHistory &data_to_add)
Merge the history nodes from another.
Definition ProcessingHistory.cc:452
std::multimap< std::string, mspass::utility::NodeData > get_nodes() const
Definition ProcessingHistory.cc:625
void add_many_inputs(const std::vector< ProcessingHistory * > &d)
Define several data objects as inputs.
Definition ProcessingHistory.cc:316
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:331
ProcessingHistory()
Definition ProcessingHistory.cc:82
int number_inputs() const
Definition ProcessingHistory.cc:661
std::pair< std::string, std::string > created_by() const
Definition ProcessingHistory.h:605
bool is_volatile() const
Definition ProcessingHistory.cc:139
bool is_empty() const
Definition ProcessingHistory.cc:121
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:184
std::string newid()
Definition ProcessingHistory.cc:664
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:408
ProcessingHistory & operator=(const ProcessingHistory &parent)
Definition ProcessingHistory.cc:700
void add_one_input(const ProcessingHistory &data_to_add)
Add one datum as an input for current data.
Definition ProcessingHistory.cc:275
std::string id() const
Definition ProcessingHistory.h:603
void set_id(const std::string newid)
Definition ProcessingHistory.cc:671
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:683
std::string clean_accumulate_uuids()
Clean up inconsistent uuids that can be produced by reduce.
Definition ProcessingHistory.cc:559
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:487
int stage() const
Definition ProcessingHistory.h:595