Refactor quality control of initial pick into own function
This commit is contained in:
parent
d4e279aeba
commit
68b2917e7f
@ -504,6 +504,65 @@ class AutopickStation(object):
|
|||||||
self.s_results.picker='auto'
|
self.s_results.picker='auto'
|
||||||
self.s_results.Ao = None
|
self.s_results.Ao = None
|
||||||
|
|
||||||
|
def pick_p_qc1(self, aicpick, z_copy, tr_filt):
|
||||||
|
"""
|
||||||
|
Quality control of first pick using minseglength and checkZ4S.
|
||||||
|
:param aicpick: Instance of AICPicker to run quality control on
|
||||||
|
:type aicpick: AICPicker
|
||||||
|
:param z_copy: Stream if vertical trace, data replaced with values from from initial CF (HOScf or ARHcf)
|
||||||
|
:type z_copy: obspy.core.stream.Stream
|
||||||
|
:param tr_filt: Filtered and tapered trace of vertical component
|
||||||
|
:type tr_filt: obspy.core.trace.trace
|
||||||
|
:return: Flag if P onset passed quality control, 1 if passed, 0 if failed.
|
||||||
|
:rtype: int
|
||||||
|
"""
|
||||||
|
|
||||||
|
fig, linecolor = get_fig_from_figdict(self.fig_dict, 'slength')
|
||||||
|
if aicpick.getpick() is None:
|
||||||
|
msg = "Bad initial (AIC) P-pick, skipping this onset!\nAIC-SNR={0}, AIC-Slope={1}counts/s\n " \
|
||||||
|
"(min. AIC-SNR={2}, min. AIC-Slope={3}counts/s)"
|
||||||
|
msg = msg.format(aicpick.getSNR(), aicpick.getSlope(), self.p_params.minAICPSNR, self.p_params.minAICPslope)
|
||||||
|
self.vprint(msg)
|
||||||
|
return 0
|
||||||
|
# Quality check initial pick with minimum signal length
|
||||||
|
z_copy[0].data = tr_filt.data # save filtered, tapered trace in z_copy stream object
|
||||||
|
zne = z_copy
|
||||||
|
if len(self.nstream) == 0 or len(self.estream) == 0:
|
||||||
|
msg = 'One or more horizontal component(s) missing!\n' \
|
||||||
|
'Signal length only checked on vertical component!\n' \
|
||||||
|
'Decreasing minsiglengh from {0} to {1}'\
|
||||||
|
.format(self.signal_length_params.minsiglength, self.signal_length_params.minsiglength / 2)
|
||||||
|
self.vprint(msg)
|
||||||
|
minsiglength = self.signal_length_params.minsiglength / 2
|
||||||
|
else:
|
||||||
|
# filter, taper other traces as well since signal length is compared on all traces
|
||||||
|
trH1_filt, _ = self.prepare_wfstream(self.estream, freqmin=self.s_params.bph1[0], freqmax=self.s_params.bph1[1])
|
||||||
|
trH2_filt, _ = self.prepare_wfstream(self.nstream, freqmin=self.s_params.bph1[0], freqmax=self.s_params.bph1[1])
|
||||||
|
zne += trH1_filt
|
||||||
|
zne += trH2_filt
|
||||||
|
minsiglength = self.signal_length_params.minsiglength
|
||||||
|
Pflag = checksignallength(zne, aicpick.getpick(), self.p_params.tsnrz, minsiglength,
|
||||||
|
self.signal_length_params.noisefactor, self.signal_length_params.minpercent,
|
||||||
|
self.iplot, fig, linecolor)
|
||||||
|
if Pflag == 0:
|
||||||
|
self.p_results.Pmarker = 'shortsignallength'
|
||||||
|
self.p_results.Pweight = 9
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if self.nstream == self.estream:
|
||||||
|
# todo: old implementation skipped this test if one component was misisng, why not use one component?
|
||||||
|
msg = 'One or more horizontal components missing!\n Skipping control function checkZ4S.'
|
||||||
|
self.vprint(msg)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
if self.iplot > 1: fig, linecolor = get_fig_from_figdict(self.fig_dict, 'checkZ4s')
|
||||||
|
Pflag = checkZ4S(zne, aicpick.getpick(), self.s_params.zfac, self.p_params.tsnrz[2], self.iplot, fig, linecolor)
|
||||||
|
if Pflag == 0:
|
||||||
|
self.p_results.Pmarker = 'SinsteadP'
|
||||||
|
self.p_results.Pweight = 9
|
||||||
|
return 0
|
||||||
|
return 1
|
||||||
|
|
||||||
def pick_p_phase(self):
|
def pick_p_phase(self):
|
||||||
"""
|
"""
|
||||||
Pick p phase, return results
|
Pick p phase, return results
|
||||||
@ -561,42 +620,7 @@ class AutopickStation(object):
|
|||||||
ax.vlines(self.p_params.pstop, ax.get_ylim()[0], ax.get_ylim()[1], color='c', linestyles='dashed', label='P stop')
|
ax.vlines(self.p_params.pstop, ax.get_ylim()[0], ax.get_ylim()[1], color='c', linestyles='dashed', label='P stop')
|
||||||
ax.legend(loc=1)
|
ax.legend(loc=1)
|
||||||
|
|
||||||
fig, linecolor = get_fig_from_figdict(self.fig_dict, 'slength')
|
Pflag = self.pick_p_qc1(aicpick, z_copy, tr_filt)
|
||||||
if aicpick.getpick() is not None:
|
|
||||||
z_copy[0].data = tr_filt.data
|
|
||||||
zne = z_copy
|
|
||||||
if len(self.nstream) == 0 or len(self.estream) == 0:
|
|
||||||
msg = 'One or more horizontal component(s) missing!\n' \
|
|
||||||
'Signal length only checked on vertical component!\n' \
|
|
||||||
'Decreasing minsiglengh from {0} to {1}' \
|
|
||||||
.format(self.signal_length_params.minsiglength, self.signal_length_params.minsiglength/2)
|
|
||||||
self.vprint(msg)
|
|
||||||
minsiglength = self.signal_length_params.minsiglength/2
|
|
||||||
else:
|
|
||||||
trH1_filt, _ = self.prepare_wfstream(self.estream, freqmin=self.s_params.bph1[0], freqmax=self.s_params.bph1[1])
|
|
||||||
trH2_filt, _ = self.prepare_wfstream(self.nstream, freqmin=self.s_params.bph1[0], freqmax=self.s_params.bph1[1])
|
|
||||||
zne += trH1_filt
|
|
||||||
zne += trH2_filt
|
|
||||||
minsiglength = self.signal_length_params.minsiglength
|
|
||||||
Pflag = checksignallength(zne, aicpick.getpick(), self.p_params.tsnrz,
|
|
||||||
minsiglength,
|
|
||||||
self.signal_length_params.noisefactor,
|
|
||||||
self.signal_length_params.minpercent, self.iplot, fig, linecolor)
|
|
||||||
if Pflag == 1:
|
|
||||||
if self.nstream == self.estream:
|
|
||||||
msg = 'One or more horizontal components missing!\n' \
|
|
||||||
'Skipping control function checkZ4S.'
|
|
||||||
self.vprint(msg)
|
|
||||||
else:
|
|
||||||
if self.iplot > 1:
|
|
||||||
fig, linecolor = get_fig_from_figdict(self.fig_dict, 'checkZ4s')
|
|
||||||
Pflag = checkZ4S(zne, aicpick.getpick(), self.s_params.zfac, self.p_params.tsnrz[2], self.iplot, fig, linecolor)
|
|
||||||
if Pflag == 0:
|
|
||||||
self.p_results.Pmarker = 'SinsteadP'
|
|
||||||
self.p_results.Pweight = 9
|
|
||||||
else:
|
|
||||||
self.p_results.Pmarker = 'shortsignallength'
|
|
||||||
self.p_results.Pweight = 9
|
|
||||||
# go on with processing if AIC onset passes quality control
|
# go on with processing if AIC onset passes quality control
|
||||||
slope = aicpick.getSlope()
|
slope = aicpick.getSlope()
|
||||||
if not slope: slope = 0
|
if not slope: slope = 0
|
||||||
|
Loading…
Reference in New Issue
Block a user