[new] introduced verbose flag to suppress to much output during auto picking (slows down especially to GUI triggered auto picking process)

This commit is contained in:
Sebastian Wehling-Benatelli 2015-12-02 19:17:04 +01:00
parent ed7a323c50
commit f3ba22b235

View File

@ -46,7 +46,7 @@ def autopickevent(data, param):
# check S-P times (Wadati) # check S-P times (Wadati)
return wadaticheck(jk_checked_onsets, wdttolerance, iplot) return wadaticheck(jk_checked_onsets, wdttolerance, iplot)
def autopickstation(wfstream, pickparam): def autopickstation(wfstream, pickparam, verbose=False):
""" """
:param: wfstream :param: wfstream
:type: `~obspy.core.stream.Stream` :type: `~obspy.core.stream.Stream`
@ -153,11 +153,11 @@ def autopickstation(wfstream, pickparam):
ndat = wfstream.select(component="1") ndat = wfstream.select(component="1")
if algoP == 'HOS' or algoP == 'ARZ' and zdat is not None: if algoP == 'HOS' or algoP == 'ARZ' and zdat is not None:
print '##########################################' msg = '##########################################\nautopickstation:' \
print 'autopickstation: Working on P onset of station %s' % zdat[ ' Working on P onset of station {station}\nFiltering vertical ' \
0].stats.station 'trace ...\n{data}'.format(station=zdat[0].stats.station,
print 'Filtering vertical trace ...' data=str(zdat))
print zdat if verbose: print(msg)
z_copy = zdat.copy() z_copy = zdat.copy()
# filter and taper data # filter and taper data
tr_filt = zdat[0].copy() tr_filt = zdat[0].copy()
@ -171,9 +171,9 @@ def autopickstation(wfstream, pickparam):
Lwf = zdat[0].stats.endtime - zdat[0].stats.starttime Lwf = zdat[0].stats.endtime - zdat[0].stats.starttime
Ldiff = Lwf - Lc Ldiff = Lwf - Lc
if Ldiff < 0: if Ldiff < 0:
print 'autopickstation: Cutting times are too large for actual ' \ msg = 'autopickstation: Cutting times are too large for actual ' \
'waveform!' 'waveform!\nUsing entire waveform instead!'
print 'Using entire waveform instead!' if verbose: print(msg)
pstart = 0 pstart = 0
pstop = len(zdat[0].data) * zdat[0].stats.delta pstop = len(zdat[0].data) * zdat[0].stats.delta
cuttimes = [pstart, pstop] cuttimes = [pstart, pstop]
@ -206,10 +206,11 @@ def autopickstation(wfstream, pickparam):
z_copy[0].data = tr_filt.data z_copy[0].data = tr_filt.data
zne = z_copy zne = z_copy
if len(ndat) == 0 or len(edat) == 0: if len(ndat) == 0 or len(edat) == 0:
print ("One or more horizontal components missing!") msg = 'One or more horizontal components missing!\nSignal ' \
print ("Signal length only checked on vertical component!") 'length only checked on vertical component!\n' \
print ("Decreasing minsiglengh from %f to %f" 'Decreasing minsiglengh from {0} to ' \
% (minsiglength, minsiglength / 2)) '{1}'.format(minsiglength, minsiglength / 2)
if verbose: print(msg)
Pflag = checksignallength(zne, aicpick.getpick(), tsnrz, Pflag = checksignallength(zne, aicpick.getpick(), tsnrz,
minsiglength / 2, minsiglength / 2,
nfacsl, minpercent, iplot) nfacsl, minpercent, iplot)
@ -235,8 +236,9 @@ def autopickstation(wfstream, pickparam):
# check for spuriously picked S onset # check for spuriously picked S onset
# both horizontal traces needed # both horizontal traces needed
if len(ndat) == 0 or len(edat) == 0: if len(ndat) == 0 or len(edat) == 0:
print 'One or more horizontal components missing!' msg = 'One or more horizontal components missing!\n' \
print 'Skipping control function checkZ4S.' 'Skipping control function checkZ4S.'
if verbose: print(msg)
else: else:
Pflag = checkZ4S(zne, aicpick.getpick(), zfac, Pflag = checkZ4S(zne, aicpick.getpick(), zfac,
tsnrz[3], iplot) tsnrz[3], iplot)
@ -252,11 +254,12 @@ def autopickstation(wfstream, pickparam):
aicpick.getSNR() >= minAICPSNR and aicpick.getSNR() >= minAICPSNR and
Pflag == 1): Pflag == 1):
aicPflag = 1 aicPflag = 1
print 'AIC P-pick passes quality control: Slope: %f counts/s, SNR: %f' % \ msg = 'AIC P-pick passes quality control: Slope: {0} counts/s, ' \
(aicpick.getSlope(), aicpick.getSNR()) 'SNR: {1}\nGo on with refined picking ...\n' \
print 'Go on with refined picking ...' 'autopickstation: re-filtering vertical trace ' \
'...'.format(aicpick.getSlope(), aicpick.getSNR())
if verbose: print(msg)
# re-filter waveform with larger bandpass # re-filter waveform with larger bandpass
print 'autopickstation: re-filtering vertical trace ...'
z_copy = zdat.copy() z_copy = zdat.copy()
tr_filt = zdat[0].copy() tr_filt = zdat[0].copy()
tr_filt.filter('bandpass', freqmin=bpz2[0], freqmax=bpz2[1], tr_filt.filter('bandpass', freqmin=bpz2[0], freqmax=bpz2[1],
@ -334,9 +337,10 @@ def autopickstation(wfstream, pickparam):
# waveform after P onset! # waveform after P onset!
zc = crossings_nonzero_all(wfzc) zc = crossings_nonzero_all(wfzc)
if np.size(zc) == 0 or len(zc) <= 3: if np.size(zc) == 0 or len(zc) <= 3:
print ("Something is wrong with the waveform, " msg = "Something is wrong with the waveform, " \
"no zero crossings derived!") "no zero crossings derived!\nCannot " \
print ("Cannot calculate source spectrum!") "calculate source spectrum!"
if verbose: print(msg)
else: else:
index = min([3, len(zc) - 1]) index = min([3, len(zc) - 1])
calcwin = (zc[index] - zc[0]) * z_copy[0].stats.delta calcwin = (zc[index] - zc[0]) * z_copy[0].stats.delta
@ -345,33 +349,42 @@ def autopickstation(wfstream, pickparam):
w0 = specpara.getw0() w0 = specpara.getw0()
fc = specpara.getfc() fc = specpara.getfc()
print ("autopickstation: P-weight: %d, SNR: %f, SNR[dB]: %f, " msg = "autopickstation: P-weight: {0}, " \
"Polarity: %s" % (Pweight, SNRP, SNRPdB, FM)) "SNR: {1}, SNR[dB]: {2}, Polarity: {3}".format(Pweight,
SNRP,
SNRPdB,
FM)
print(msg)
Sflag = 1 Sflag = 1
else: else:
print ("Bad initial (AIC) P-pick, skipping this onset!") msg = 'Bad initial (AIC) P-pick, skipping this onset!\n' \
print 'AIC-SNR=', aicpick.getSNR(), 'AIC-Slope=', aicpick.getSlope(), 'counts/s' 'AIC-SNR={0}, AIC-Slope={1}counts/s\n' \
print '(min. AIC-SNR=', minAICPSNR, ', min. AIC-Slope=', minAICPslope, 'counts/s)' '(min. AIC-SNR={2}, ' \
'min. AIC-Slope={3}counts/s)'.format(aicpick.getSNR(),
aicpick.getSlope(),
minAICPSNR,
minAICPslope)
if verbose: print(msg)
Sflag = 0 Sflag = 0
else: else:
print ("autopickstation: No vertical component data available!, " print("autopickstation: No vertical component data available!, "
"Skipping station!") "Skipping station!")
if edat is not None and ndat is not None and len(edat) > 0 and len( if edat is not None and ndat is not None and len(edat) > 0 and len(
ndat) > 0 and Pweight < 4: ndat) > 0 and Pweight < 4:
print ("Go on picking S onset ...") msg = "Go on picking S onset ...\n" \
print ("##################################################") "##################################################\n" \
print ("Working on S onset of station %s" % edat[0].stats.station) "Working on S onset of station {0}\nFiltering horizontal " \
print ("Filtering horizontal traces ...") "traces ...".format(edat[0].stats.station)
if verbose: print(msg)
# determine time window for calculating CF after P onset # determine time window for calculating CF after P onset
cuttimesh = [round(max([mpickP + sstart, 0])), cuttimesh = [round(max([mpickP + sstart, 0])),
round(min([mpickP + sstop, Lwf]))] round(min([mpickP + sstop, Lwf]))]
if algoS == 'ARH': if algoS == 'ARH':
print edat, ndat if verbose: print(edat, ndat)
# re-create stream object including both horizontal components # re-create stream object including both horizontal components
hdat = edat.copy() hdat = edat.copy()
hdat += ndat hdat += ndat
@ -388,7 +401,7 @@ def autopickstation(wfstream, pickparam):
h_copy[0].data = trH1_filt.data h_copy[0].data = trH1_filt.data
h_copy[1].data = trH2_filt.data h_copy[1].data = trH2_filt.data
elif algoS == 'AR3': elif algoS == 'AR3':
print zdat, edat, ndat if verbose: print(zdat, edat, ndat)
# re-create stream object including all components # re-create stream object including all components
hdat = zdat.copy() hdat = zdat.copy()
hdat += edat hdat += edat
@ -441,15 +454,15 @@ def autopickstation(wfstream, pickparam):
aicarhpick.getSNR() >= minAICSSNR and aicarhpick.getSNR() >= minAICSSNR and
aicarhpick.getpick() is not None): aicarhpick.getpick() is not None):
aicSflag = 1 aicSflag = 1
print 'AIC S-pick passes quality control: Slope: %f counts/s, SNR: %f' \ msg = 'AIC S-pick passes quality control: Slope: {0} counts/s, ' \
% (aicarhpick.getSlope(), aicarhpick.getSNR()) 'SNR: {1}\nGo on with refined picking ...\n' \
print 'Go on with refined picking ...' 'autopickstation: re-filtering horizontal traces ' \
'...'.format(aicarhpick.getSlope(), aicarhpick.getSNR())
# re-calculate CF from re-filtered trace in vicinity of initial # re-calculate CF from re-filtered trace in vicinity of initial
# onset # onset
cuttimesh2 = [round(aicarhpick.getpick() - Srecalcwin), cuttimesh2 = [round(aicarhpick.getpick() - Srecalcwin),
round(aicarhpick.getpick() + Srecalcwin)] round(aicarhpick.getpick() + Srecalcwin)]
# re-filter waveform with larger bandpass # re-filter waveform with larger bandpass
print 'autopickstation: re-filtering horizontal traces...'
h_copy = hdat.copy() h_copy = hdat.copy()
# filter and taper data # filter and taper data
if algoS == 'ARH': if algoS == 'ARH':
@ -554,11 +567,12 @@ def autopickstation(wfstream, pickparam):
elif Serror > timeerrorsS[3]: elif Serror > timeerrorsS[3]:
Sweight = 4 Sweight = 4
print 'autopickstation: S-weight: %d, SNR: %f, SNR[dB]: %f' % ( print('autopickstation: S-weight: {0}, SNR: {1}, '
Sweight, SNRS, SNRSdB) 'SNR[dB]: {2}\n'
'################################################'
''.format(Sweight, SNRS, SNRSdB))
################################################################## ##################################################################
# get Wood-Anderson peak-to-peak amplitude # get Wood-Anderson peak-to-peak amplitude
print "################################################"
# initialize Data object # initialize Data object
data = Data() data = Data()
# re-create stream object including both horizontal components # re-create stream object including both horizontal components
@ -580,15 +594,19 @@ def autopickstation(wfstream, pickparam):
Ao = wapp.getwapp() Ao = wapp.getwapp()
else: else:
print 'Bad initial (AIC) S-pick, skipping this onset!' msg = 'Bad initial (AIC) S-pick, skipping this onset!\n' \
print 'AIC-SNR=', aicarhpick.getSNR(), \ 'AIC-SNR={0}, AIC-Slope={1}counts/s\n' \
'AIC-Slope=', aicarhpick.getSlope(), 'counts/s' '(min. AIC-SNR={2}, ' \
print '(min. AIC-SNR=', minAICSSNR, ', min. AIC-Slope=', \ 'min. AIC-Slope={3}counts/s)\n' \
minAICSslope, 'counts/s)' '################################################' \
''.format(aicarhpick.getSNR(),
aicarhpick.getSlope(),
minAICSSNR,
minAICSslope)
if verbose: print(msg)
############################################################ ############################################################
# get Wood-Anderson peak-to-peak amplitude # get Wood-Anderson peak-to-peak amplitude
print "################################################"
# initialize Data object # initialize Data object
data = Data() data = Data()
# re-create stream object including both horizontal components # re-create stream object including both horizontal components
@ -604,8 +622,8 @@ def autopickstation(wfstream, pickparam):
Ao = wapp.getwapp() Ao = wapp.getwapp()
else: else:
print 'autopickstation: No horizontal component data available or ' \ print('autopickstation: No horizontal component data available or ' \
'bad P onset, skipping S picking!' 'bad P onset, skipping S picking!')
############################################################## ##############################################################
if iplot > 0: if iplot > 0:
@ -819,12 +837,13 @@ def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
:param badpicks: picks to be repicked :param badpicks: picks to be repicked
:param pickparameter: picking parameters from autoPyLoT-input file :param pickparameter: picking parameters from autoPyLoT-input file
''' '''
print("#######################################################") msg = '#######################################################\n' \
print("autoPyLoT: Found %d bad onsets at station(s) %s, starting re-picking them ...") \ 'autoPyLoT: Found {0} bad onsets at station(s) {1}, ' \
% (len(badpicks), badpicks) 'starting re-picking them ...'.format(len(badpicks), badpicks)
print(msg)
newpicks = {} newpicks = {}
for i in range(0, len(badpicks)): for i in range(0, len(badpicks)):
@ -867,13 +886,13 @@ def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
print("Precalcwin: %fs => %fs" % (Precalcwin_old, pickparameter.getParam('Precalcwin'))) print("Precalcwin: %fs => %fs" % (Precalcwin_old, pickparameter.getParam('Precalcwin')))
print("noisefactor: %f => %f" % (noisefactor_old, pickparameter.getParam('noisefactor'))) print("noisefactor: %f => %f" % (noisefactor_old, pickparameter.getParam('noisefactor')))
print("zfac: %f => %f" % (zfac_old, pickparameter.getParam('zfac'))) print("zfac: %f => %f" % (zfac_old, pickparameter.getParam('zfac')))
# repick station # repick station
newpicks = autopickstation(wf2pick, pickparameter) newpicks = autopickstation(wf2pick, pickparameter)
# replace old dictionary with new one # replace old dictionary with new one
picks[badpicks[i][0]] = newpicks picks[badpicks[i][0]] = newpicks
# reset temporary change of picking parameters # reset temporary change of picking parameters
print("iteratepicker: Resetting picking parameters ...") print("iteratepicker: Resetting picking parameters ...")
pickparameter.setParam(pstart=pstart_old) pickparameter.setParam(pstart=pstart_old)