MsPASS C++ API  2.4.3.dev1+g61b06b96
Defines the C++ API for MsPASS
Loading...
Searching...
No Matches
TimeDomainGIDDecon.h
1#ifndef __TIME_DOMAIN_GID_DECON__
2#define __TIME_DOMAIN_GID_DECON__
3#include "mspass/algorithms/TimeWindow.h"
4#include "mspass/algorithms/deconvolution/ComplexArray.h"
5#include "mspass/algorithms/deconvolution/CNRDeconEngine.h"
6#include "mspass/algorithms/deconvolution/FFTDeconOperator.h"
7#include "mspass/algorithms/deconvolution/ScalarDecon.h"
8#include "mspass/algorithms/deconvolution/ThreeCSpike.h"
9#include "mspass/seismic/CoreTimeSeries.h"
10#include "mspass/seismic/PowerSpectrum.h"
11#include "mspass/seismic/Seismogram.h"
12#include "mspass/seismic/TimeSeries.h"
13#include "mspass/utility/AntelopePf.h"
14#include "mspass/utility/Metadata.h"
15#include "mspass/utility/dmatrix.h"
16#include <list>
17#include <memory>
18#include <ostream>
19#include <string>
20#include <vector>
21namespace mspass::algorithms::deconvolution {
46public:
54 TimeDomainGIDDecon(const TimeDomainGIDDecon &parent) = delete;
82 int loadnoise(const mspass::seismic::TimeSeries &noise);
86 int loadnoise(const mspass::seismic::PowerSpectrum &noise_spectrum);
92 double deconvolution_window_start() const { return this->fftwin.start; };
94 double deconvolution_window_end() const { return this->fftwin.end; };
96 double wavelet_window_start() const { return this->waveletwin.start; };
98 double wavelet_window_end() const { return this->waveletwin.end; };
100 double output_window_start() const { return this->outputwin.start; };
102 double output_window_end() const { return this->outputwin.end; };
104 double noise_window_start() const { return this->nwin.start; };
106 double noise_window_end() const { return this->nwin.end; };
108 std::string configuration_pf_text() const { return this->config_pf_text; };
111 return this->leaf_parameters_changed;
112 };
115 return this->changed_leaf_metadata;
116 };
119 return this->external_wavelet_loaded;
120 };
122 bool external_noise_is_loaded() const { return this->external_noise_loaded; };
125 return this->external_noise_spectrum_loaded;
126 };
129 if (!this->external_wavelet_loaded)
131 return this->external_wavelet;
132 };
135 if (!this->external_noise_loaded)
137 return this->external_noise;
138 };
141 if (!this->external_noise_spectrum_loaded)
143 return this->external_noise_spectrum;
144 };
154 void process();
162 std::vector<double> lag_weight_vector() const;
173
174private:
175 /* These are data at different stages of process. d_all is the
176 largest signal window that is assumed to have been initialized by the
177 load method for this object. d_decon is the
178 result of applying the preprocessor (signal processing) deconvolution to
179 all three components. d_decon is computed from d, which is a windowed
180 version of the input data received by the load method. It has a
181 time duration less than or at least equal to that of d_all.
182 r is the residual, which is accumulated during the iterative method.
183 The time duration of r is the same as d. It is initialized by
184 convolving the inverse filter with d_all.
185 n is the noise data. It should normally be at least as long a d_all*/
186 mspass::seismic::CoreSeismogram d_all, d_decon, r, n;
187 /* We save the set of data lengths for clarity and a minor bit efficiency.
188 ndwin is the number of samples in d_all and r.
189 nnwin is the number of samples in n. */
190 int ndwin, nnwin;
191 /* Save the TimeWindow objects that define the extent of d_all, d_decon,
192 and n. Some things need at least some of these downstream */
193 mspass::algorithms::TimeWindow dwin, outputwin, nwin, fftwin, waveletwin;
194 int inverse_operator_nfft;
195 int gid_noise_samples_loaded, gid_noise_samples_used;
196 bool gid_noise_truncated;
197 std::string config_pf_text;
198 double target_dt;
201 int noise_component;
205 std::list<ThreeCSpike> spikes;
212 std::vector<double> lag_weights;
213 /* This vector contains the function time shifted and added to lag_weights
214 vector after each iteration. */
215 std::vector<double> wtf;
216 int nwtf; // size of wtf - cached because wtf is inside the deepest loop
217
218 /* This is a pointer to the BasicDeconOperator class used for preprocessing
219 Classic use of inheritance to simplify the api. */
220 std::unique_ptr<ScalarDecon> preprocessor;
221 std::unique_ptr<CNRDeconEngine> cnrprocessor;
222 mspass::seismic::TimeSeries current_wavelet;
223 mspass::seismic::TimeSeries external_wavelet;
224 mspass::seismic::TimeSeries external_noise;
225 mspass::seismic::PowerSpectrum external_noise_spectrum;
226 std::vector<std::vector<double>> ns_noise_components;
227 bool external_wavelet_loaded, external_noise_loaded,
228 external_noise_spectrum_loaded, external_wavelet_allowed;
229 bool processed;
230 bool residual_noise_from_external;
231 bool leaf_parameters_changed;
232 int gid_analysis_samples, gid_wavelet_samples, gid_alignment_offset_samples;
233 double gid_analysis_t0, gid_wavelet_t0;
234 mspass::utility::Metadata changed_leaf_metadata;
235 mspass::utility::Metadata leaf_operator_metadata;
236
237 /* Scalar leaves expose a normalized actual_output, while their process
238 * result retains the physical inverse gain. These values record the raw
239 * source-through-inverse zero-lag gain and the reciprocal applied to every
240 * inverse-domain quantity used by GID. */
241 double gid_leaf_raw_zero_lag_gain;
242 double gid_inverse_domain_amplitude_scale;
243
244 /* This parameter is set in the constructor. It would normally be half the
245 length of the fir representation of the inverse wavelet.*/
246 int wavelet_pad;
254 std::vector<double> actual_o_fir;
255 int actual_o_0; // offset from sample zero for zero lag position
256 IterDeconType decon_type;
257 /* This is called by the constructor to create the wtf penalty function */
258 void construct_weight_penalty_function(const mspass::utility::Metadata &md);
259 void invalidate_processing_state();
260 void ensure_inverse_operator_size(const int data_npts,
261 const int wavelet_npts,
262 const int noise_npts);
263 int actual_inverse_operator_size() const;
269 void update_residual_matrix(ThreeCSpike spk);
276 void update_lag_weights(int col, const double candidate_amplitude);
282 double compute_resid_linf_floor(
286 bool has_not_converged();
287 /* These are convergence attributes. lw_inf indicates Linf norm of
288 lag_weight array, lw_l2 is L2 metric of lag_weight, resid_inf is Linf
289 norm of residual vector, and resid_l2 is L2 of resid matrix. prev
290 modifier means the size of that quantity in the previous iteration. initial
291 means initial value at the top of the loop.*/
292 double lw_linf_initial, lw_linf_prev;
293 double lw_l2_initial, lw_l2_prev;
294 double resid_linf_initial, resid_linf_prev;
295 double resid_l2_initial, resid_l2_prev;
296 /* These are convergence parameters for the different tests */
297 int iter_count, iter_max; // actual iteration count and ceiling to break loop
298 /*lw metrics are scaled with range of 0 to 1. l2 gets scaled by number of
299 points and so can use a similar absolute scale. */
300 double lw_linf_floor, lw_l2_floor;
301 /* We use a probability level to define the floor Linf of the residual
302 matrix. For L2 we use the conventional fractional improvement metric. */
303 double resid_linf_prob, resid_linf_floor;
304 double resid_l2_tol;
305 double ns_peak_sigma_threshold, ns_peak_probability_threshold;
306 double ns_residual_noise_ratio_floor, ns_peak_threshold;
307 double ns_last_peak_significance, ns_noise_l2, ns_noise_amplitude_rms;
308 double ns_noise_component_sigma_rms, ns_noise_component_sigma_rms_robust;
309 double ns_noise_component_rms_aggregate;
310 bool ns_noise_component_sigma_rms_fallback_used;
311 double ns_residual_rms_initial, ns_residual_rms_final;
312 double ns_peak_threshold_empirical, ns_peak_threshold_sigma;
313 double ns_noise_amplitude_robust, ns_last_candidate_amplitude;
314 int ns_noise_samples_at_or_above_peak_threshold;
315 int ns_noise_amplitude_sample_count;
316 int ns_initial_stationary_null_search_lag_count;
317 double ns_initial_stationary_null_expected_noise_exceedances;
318 int ns_last_selected_candidate_lag;
319 double ns_last_selected_candidate_lag_weight;
320 double ns_last_selected_candidate_weighted_amplitude;
321 double ns_max_raw_candidate_amplitude, ns_max_raw_candidate_significance;
322 int ns_max_raw_candidate_lag;
323 bool ns_last_scan_raw_significant_candidate_remaining;
324 double ns_final_scan_max_raw_candidate_amplitude,
325 ns_final_scan_max_raw_candidate_significance;
326 int ns_final_scan_max_raw_candidate_lag;
327 bool ns_final_scan_raw_significant_candidate_remaining;
328 double ns_final_scan_existing_support_max_raw_amplitude,
329 ns_final_scan_existing_support_max_raw_significance;
330 int ns_final_scan_existing_support_max_raw_lag;
331 int ns_final_scan_significant_candidate_count;
332 int ns_final_scan_best_trial_lag;
333 double ns_final_scan_best_trial_residual_l2,
334 ns_final_scan_best_trial_fractional_improvement;
335 int ns_final_scan_decision_candidate_lag,
336 ns_final_scan_global_acceptable_candidate_count;
337 double ns_final_scan_decision_trial_residual_l2,
338 ns_final_scan_decision_trial_fractional_improvement;
339 std::string ns_final_scan_decision;
340 bool ns_final_scan_acceptable_candidate_remaining;
341 std::vector<double> ns_noise_component_rms;
342 std::vector<int> ns_candidate_lag_history, ns_candidate_accepted_history;
343 std::vector<double> ns_candidate_lag_time_history,
344 ns_candidate_amplitude_history,
345 ns_candidate_threshold_history, ns_candidate_significance_history;
346 std::vector<double> ns_candidate_post_residual_rms_ratio_history;
347 std::vector<double> ns_candidate_residual_l2_before_history,
348 ns_candidate_trial_residual_l2_history,
349 ns_candidate_post_refit_residual_l2_history,
350 ns_candidate_fractional_improvement_history,
351 ns_candidate_state_fractional_improvement_history;
352 std::vector<int> ns_candidate_periodic_refit_applied_history,
353 ns_candidate_final_refit_applied_history,
354 ns_candidate_trial_evaluated_history,
355 ns_candidate_metric_available_history;
356 std::vector<std::string> ns_candidate_stop_history;
357 /* Compatibility counters for legacy pre-trial candidate scans. */
358 int legacy_eq15_candidates_tested, legacy_eq15_candidates_rejected;
359 /* Counters for the actual post-acceptance Eq.(15) state comparison. */
360 int legacy_eq15_post_acceptance_state_tests,
361 legacy_eq15_post_acceptance_floor_stops;
362 int legacy_eq15_candidates_below_floor, legacy_eq15_candidates_non_decreasing,
363 legacy_eq15_candidates_nonfinite,
364 legacy_eq15_rejected_lag_samples_truncated,
365 legacy_eq15_rejected_iteration_samples_truncated;
366 double legacy_eq15_last_trial_fractional_improvement;
367 std::string legacy_eq15_stop_detail;
368 std::vector<double> legacy_eq15_rejected_lag_times;
369 std::vector<int> legacy_eq15_rejected_candidates_per_iteration;
370 int ns_max_spikes, ns_refit_interval;
371 /* Audit post-refit terminal scans and any continuation they unlock. */
372 int ns_refit_epochs, ns_refit_resume_count;
373 double ns_ridge_beta, ns_fractional_improvement_final,
374 ns_fractional_improvement_state_final;
375 bool ns_use_empirical_noise_threshold, ns_converged;
376 bool ns_final_refit_applied;
377 std::string ns_stop_reason, ns_provisional_stop_reason_before_final_refit;
378 bool gid_converged;
379 std::string gid_stop_reason;
380 std::string lag_weight_penalty_function;
381 double lag_weight_penalty_scale_factor;
382 int lag_weight_function_width;
383 std::vector<double> adaptive_penalty_memory;
384 std::vector<double> adaptive_penalty_retention;
385 double adaptive_penalty_last_confidence;
386 double adaptive_penalty_last_immediate_strength;
387 double adaptive_penalty_last_specificity;
388 double adaptive_penalty_last_decay_factor;
389 double adaptive_penalty_noise_amplitude;
390 double adaptive_penalty_memory_linf;
391 double adaptive_penalty_memory_l2;
392 double group_sparse_lambda, group_sparse_lambda_scale;
393 double group_sparse_lambda_used, group_sparse_tolerance;
394 double group_sparse_active_threshold, group_sparse_active_threshold_scale;
395 double group_sparse_active_threshold_quantile;
396 double group_sparse_active_threshold_quantile_value;
397 double group_sparse_active_threshold_used;
398 double group_sparse_objective_initial, group_sparse_objective_final;
399 double group_sparse_fractional_improvement_final;
400 double group_sparse_debiased_objective_final;
401 double group_sparse_debiased_fractional_improvement_final;
402 double group_sparse_refit_gram_condition_number;
403 double group_sparse_refit_relative_ridge_beta;
404 double group_sparse_refit_residual_l2_pre, group_sparse_refit_residual_l2_post;
405 double group_sparse_refit_maximum_amplitude_pre;
406 double group_sparse_refit_maximum_amplitude_post;
407 int group_sparse_max_iterations, group_sparse_iterations;
408 int group_sparse_active_groups;
409 bool group_sparse_converged, group_sparse_refit_condition_guard_applied;
410 bool group_sparse_refit_fallback_to_pre_debias;
411 std::string group_sparse_refit_fallback_reason;
412
413};
414} // namespace mspass::algorithms::deconvolution
415#endif
Defines a time window.
Definition TimeWindow.h:12
double start
Definition TimeWindow.h:17
double end
Definition TimeWindow.h:21
Base class decon operator for single station 3C decon (receiver functions).
Definition ScalarDecon.h:31
std::vector< double > wavelet
Source-wavelet estimate used by concrete scalar methods.
Definition ScalarDecon.h:144
Sparse three-component spike used by iterative deconvolution.
Definition ThreeCSpike.h:16
Three-component generalized iterative deconvolution in time.
Definition TimeDomainGIDDecon.h:45
mspass::utility::Metadata QCMetrics()
Definition TimeDomainGIDDecon.cc:2413
void clear_external_noise()
Definition TimeDomainGIDDecon.cc:838
mspass::seismic::TimeSeries loaded_external_noise() const
Definition TimeDomainGIDDecon.h:134
bool external_wavelet_is_loaded() const
Definition TimeDomainGIDDecon.h:118
int loadnoise(const mspass::seismic::CoreSeismogram &d, mspass::algorithms::TimeWindow nwin)
Definition TimeDomainGIDDecon.cc:654
double noise_window_end() const
Definition TimeDomainGIDDecon.h:106
int load(const mspass::seismic::CoreSeismogram &d, mspass::algorithms::TimeWindow dwin)
Definition TimeDomainGIDDecon.cc:619
mspass::seismic::CoreSeismogram getresult()
Definition TimeDomainGIDDecon.cc:2399
bool external_noise_is_loaded() const
Definition TimeDomainGIDDecon.h:122
double noise_window_start() const
Definition TimeDomainGIDDecon.h:104
std::string configuration_pf_text() const
Definition TimeDomainGIDDecon.h:108
double output_window_end() const
Definition TimeDomainGIDDecon.h:102
mspass::seismic::TimeSeries actual_output()
Definition TimeDomainGIDDecon.cc:533
double output_window_start() const
Definition TimeDomainGIDDecon.h:100
bool external_noise_spectrum_is_loaded() const
Definition TimeDomainGIDDecon.h:124
mspass::seismic::CoreTimeSeries inverse_wavelet()
Definition TimeDomainGIDDecon.cc:543
double wavelet_window_start() const
Definition TimeDomainGIDDecon.h:96
TimeDomainGIDDecon & operator=(const TimeDomainGIDDecon &parent)=delete
double deconvolution_window_start() const
Definition TimeDomainGIDDecon.h:92
mspass::seismic::PowerSpectrum loaded_external_noise_spectrum() const
Definition TimeDomainGIDDecon.h:140
mspass::utility::Metadata changed_leaf_parameters() const
Definition TimeDomainGIDDecon.h:114
mspass::seismic::TimeSeries ideal_output()
Definition TimeDomainGIDDecon.cc:529
~TimeDomainGIDDecon()
Definition TimeDomainGIDDecon.cc:345
void process()
Definition TimeDomainGIDDecon.cc:1031
bool leaf_parameters_have_changed() const
Definition TimeDomainGIDDecon.h:110
mspass::seismic::CoreSeismogram sparse_output()
Definition TimeDomainGIDDecon.cc:2357
TimeDomainGIDDecon(const TimeDomainGIDDecon &parent)=delete
mspass::seismic::TimeSeries loaded_external_wavelet() const
Definition TimeDomainGIDDecon.h:128
int loadwavelet(const mspass::seismic::TimeSeries &wavelet)
Definition TimeDomainGIDDecon.cc:695
void changeparameter(const mspass::utility::Metadata &md)
Definition TimeDomainGIDDecon.cc:488
double deconvolution_window_end() const
Definition TimeDomainGIDDecon.h:94
std::vector< double > lag_weight_vector() const
Definition TimeDomainGIDDecon.cc:2392
void clear_external_wavelet()
Definition TimeDomainGIDDecon.cc:833
double wavelet_window_end() const
Definition TimeDomainGIDDecon.h:98
Vector (three-component) seismogram data object.
Definition CoreSeismogram.h:39
Scalar time series data object.
Definition CoreTimeSeries.h:17
Definition PowerSpectrum.h:11
Implemntation of TimeSeries for MsPASS.
Definition TimeSeries.h:14
C++ object version of a parameter file.
Definition AntelopePf.h:61
Type-safe metadata container used throughout MsPASS.
Definition Metadata.h:101