[add] for global seismology CF pick windows will now be calculated
relative to estimated tt from TauPy, metadata and source location (in XML file) needed [TO DO]: automatic export of XML (esp. source loc) before autopicking
This commit is contained in:
parent
60ebaa6528
commit
17a93cf62f
@ -67,14 +67,13 @@ from pylot.core.pick.compare import Comparison
|
|||||||
from pylot.core.pick.utils import symmetrize_error
|
from pylot.core.pick.utils import symmetrize_error
|
||||||
from pylot.core.io.phases import picksdict_from_picks
|
from pylot.core.io.phases import picksdict_from_picks
|
||||||
import pylot.core.loc.nll as nll
|
import pylot.core.loc.nll as nll
|
||||||
from pylot.core.util.defaults import FILTERDEFAULTS, SetChannelComponents, \
|
from pylot.core.util.defaults import FILTERDEFAULTS, SetChannelComponents
|
||||||
readFilterInformation
|
|
||||||
from pylot.core.util.errors import FormatError, DatastructureError, \
|
from pylot.core.util.errors import FormatError, DatastructureError, \
|
||||||
OverwriteError
|
OverwriteError
|
||||||
from pylot.core.util.connection import checkurl
|
from pylot.core.util.connection import checkurl
|
||||||
from pylot.core.util.dataprocessing import read_metadata, restitute_data
|
from pylot.core.util.dataprocessing import read_metadata, restitute_data
|
||||||
from pylot.core.util.utils import fnConstructor, getLogin, \
|
from pylot.core.util.utils import fnConstructor, getLogin, \
|
||||||
full_range
|
full_range, readFilterInformation
|
||||||
from pylot.core.util.event import Event
|
from pylot.core.util.event import Event
|
||||||
from pylot.core.io.location import create_creation_info, create_event
|
from pylot.core.io.location import create_creation_info, create_event
|
||||||
from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \
|
from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \
|
||||||
@ -722,7 +721,7 @@ class MainWindow(QMainWindow):
|
|||||||
fext = '.xml'
|
fext = '.xml'
|
||||||
for event in events:
|
for event in events:
|
||||||
path = event.path
|
path = event.path
|
||||||
eventname = path.split('/')[-1]
|
eventname = path.split('/')[-1] #or event.pylot_id
|
||||||
filename = os.path.join(path, 'PyLoT_' + eventname + fext)
|
filename = os.path.join(path, 'PyLoT_' + eventname + fext)
|
||||||
if os.path.isfile(filename):
|
if os.path.isfile(filename):
|
||||||
self.load_data(filename, draw=False, event=event, overwrite=True)
|
self.load_data(filename, draw=False, event=event, overwrite=True)
|
||||||
|
52
autoPyLoT.py
52
autoPyLoT.py
@ -111,8 +111,6 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
print('Parameters set and input file given. Choose either of both.')
|
print('Parameters set and input file given. Choose either of both.')
|
||||||
return
|
return
|
||||||
|
|
||||||
data = Data()
|
|
||||||
|
|
||||||
evt = None
|
evt = None
|
||||||
|
|
||||||
# reading parameter file
|
# reading parameter file
|
||||||
@ -192,16 +190,24 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
return
|
return
|
||||||
|
|
||||||
# transform system path separator to '/'
|
# transform system path separator to '/'
|
||||||
for index, event in enumerate(events):
|
for index, eventpath in enumerate(events):
|
||||||
event = event.replace(SEPARATOR, '/')
|
eventpath = eventpath.replace(SEPARATOR, '/')
|
||||||
events[index] = event
|
events[index] = eventpath
|
||||||
|
|
||||||
for event in events:
|
for eventpath in events:
|
||||||
pylot_event = Event(event) # event should be path to event directory
|
evID = os.path.split(eventpath)[-1]
|
||||||
data.setEvtData(pylot_event)
|
fext = '.xml'
|
||||||
|
filename = os.path.join(eventpath, 'PyLoT_' + evID + fext)
|
||||||
|
try:
|
||||||
|
data = Data(evtdata=filename)
|
||||||
|
print('Reading event data from filename {}...'.format(filename))
|
||||||
|
except Exception as e:
|
||||||
|
print('Could not read event from file {}: {}'.format(filename, e))
|
||||||
|
data = Data()
|
||||||
|
pylot_event = Event(eventpath) # event should be path to event directory
|
||||||
|
data.setEvtData(pylot_event)
|
||||||
if fnames == 'None':
|
if fnames == 'None':
|
||||||
data.setWFData(glob.glob(os.path.join(datapath, event, '*')))
|
data.setWFData(glob.glob(os.path.join(datapath, eventpath, '*')))
|
||||||
evID = os.path.split(event)[-1]
|
|
||||||
# the following is necessary because within
|
# the following is necessary because within
|
||||||
# multiple event processing no event ID is provided
|
# multiple event processing no event ID is provided
|
||||||
# in autopylot.in
|
# in autopylot.in
|
||||||
@ -218,7 +224,7 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
else:
|
else:
|
||||||
data.setWFData(fnames)
|
data.setWFData(fnames)
|
||||||
|
|
||||||
event = events[0]
|
eventpath = events[0]
|
||||||
# now = datetime.datetime.now()
|
# now = datetime.datetime.now()
|
||||||
# evID = '%d%02d%02d%02d%02d' % (now.year,
|
# evID = '%d%02d%02d%02d%02d' % (now.year,
|
||||||
# now.month,
|
# now.month,
|
||||||
@ -238,16 +244,18 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
corr_dat = restitute_data(wfdat.copy(), *metadata, ncores=ncores)
|
corr_dat = restitute_data(wfdat.copy(), *metadata, ncores=ncores)
|
||||||
if not corr_dat and locflag:
|
if not corr_dat and locflag:
|
||||||
locflag = 2
|
locflag = 2
|
||||||
print('Working on event %s. Stations: %s' % (event, station))
|
print('Working on event %s. Stations: %s' % (eventpath, station))
|
||||||
print(wfdat)
|
print(wfdat)
|
||||||
##########################################################
|
##########################################################
|
||||||
# !automated picking starts here!
|
# !automated picking starts here!
|
||||||
if input_dict:
|
if input_dict:
|
||||||
if 'fig_dict' in input_dict:
|
if 'fig_dict' in input_dict:
|
||||||
fig_dict = input_dict['fig_dict']
|
fig_dict = input_dict['fig_dict']
|
||||||
picks = autopickevent(wfdat, parameter, iplot=iplot, fig_dict=fig_dict, ncores=ncores)
|
picks = autopickevent(wfdat, parameter, iplot=iplot, fig_dict=fig_dict,
|
||||||
|
ncores=ncores, metadata=metadata, origin=data.get_evt_data().origins)
|
||||||
else:
|
else:
|
||||||
picks = autopickevent(wfdat, parameter, iplot=iplot, ncores=ncores)
|
picks = autopickevent(wfdat, parameter, iplot=iplot,
|
||||||
|
ncores=ncores, metadata=metadata, origin=data.get_evt_data().origins)
|
||||||
##########################################################
|
##########################################################
|
||||||
# locating
|
# locating
|
||||||
if locflag > 0:
|
if locflag > 0:
|
||||||
@ -393,29 +401,29 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
# ObsPy event object
|
# ObsPy event object
|
||||||
data.applyEVTData(picks)
|
data.applyEVTData(picks)
|
||||||
if evt is not None:
|
if evt is not None:
|
||||||
event_id = event.split('/')[-1]
|
event_id = eventpath.split('/')[-1]
|
||||||
evt.resource_id = ResourceIdentifier('smi:local/' + event_id)
|
evt.resource_id = ResourceIdentifier('smi:local/' + event_id)
|
||||||
data.applyEVTData(evt, 'event')
|
data.applyEVTData(evt, 'event')
|
||||||
fnqml = '%s/PyLoT_%s' % (event, evID)
|
fnqml = '%s/PyLoT_%s' % (eventpath, evID)
|
||||||
data.exportEvent(fnqml, fnext='.xml', fcheck=['auto', 'magnitude', 'origin'])
|
data.exportEvent(fnqml, fnext='.xml', fcheck=['auto', 'magnitude', 'origin'])
|
||||||
if locflag == 1:
|
if locflag == 1:
|
||||||
# HYPO71
|
# HYPO71
|
||||||
hypo71file = '%s/PyLoT_%s_HYPO71_phases' % (event, evID)
|
hypo71file = '%s/PyLoT_%s_HYPO71_phases' % (eventpath, evID)
|
||||||
hypo71.export(picks, hypo71file, parameter)
|
hypo71.export(picks, hypo71file, parameter)
|
||||||
# HYPOSAT
|
# HYPOSAT
|
||||||
hyposatfile = '%s/PyLoT_%s_HYPOSAT_phases' % (event, evID)
|
hyposatfile = '%s/PyLoT_%s_HYPOSAT_phases' % (eventpath, evID)
|
||||||
hyposat.export(picks, hyposatfile, parameter)
|
hyposat.export(picks, hyposatfile, parameter)
|
||||||
# VELEST
|
# VELEST
|
||||||
velestfile = '%s/PyLoT_%s_VELEST_phases.cnv' % (event, evID)
|
velestfile = '%s/PyLoT_%s_VELEST_phases.cnv' % (eventpath, evID)
|
||||||
velest.export(picks, velestfile, parameter, evt)
|
velest.export(picks, velestfile, parameter, evt)
|
||||||
# hypoDD
|
# hypoDD
|
||||||
hypoddfile = '%s/PyLoT_%s_hypoDD_phases.pha' % (event, evID)
|
hypoddfile = '%s/PyLoT_%s_hypoDD_phases.pha' % (eventpath, evID)
|
||||||
hypodd.export(picks, hypoddfile, parameter, evt)
|
hypodd.export(picks, hypoddfile, parameter, evt)
|
||||||
# FOCMEC
|
# FOCMEC
|
||||||
focmecfile = '%s/PyLoT_%s_FOCMEC.in' % (event, evID)
|
focmecfile = '%s/PyLoT_%s_FOCMEC.in' % (eventpath, evID)
|
||||||
focmec.export(picks, focmecfile, parameter, evt)
|
focmec.export(picks, focmecfile, parameter, evt)
|
||||||
# HASH
|
# HASH
|
||||||
hashfile = '%s/PyLoT_%s_HASH' % (event, evID)
|
hashfile = '%s/PyLoT_%s_HASH' % (eventpath, evID)
|
||||||
hash.export(picks, hashfile, parameter, evt)
|
hash.export(picks, hashfile, parameter, evt)
|
||||||
|
|
||||||
endsplash = '''------------------------------------------\n'
|
endsplash = '''------------------------------------------\n'
|
||||||
|
@ -87,12 +87,14 @@ defaults = {'rootpath': {'type': str,
|
|||||||
'namestring': ('Quality factor', 'Qp1', 'Qp2')},
|
'namestring': ('Quality factor', 'Qp1', 'Qp2')},
|
||||||
|
|
||||||
'pstart': {'type': float,
|
'pstart': {'type': float,
|
||||||
'tooltip': 'start time [s] for calculating CF for P-picking',
|
'tooltip': 'start time [s] for calculating CF for P-picking (if TauPy:'
|
||||||
|
' seconds relative to estimated onset)',
|
||||||
'value': 15.0,
|
'value': 15.0,
|
||||||
'namestring': 'P start'},
|
'namestring': 'P start'},
|
||||||
|
|
||||||
'pstop': {'type': float,
|
'pstop': {'type': float,
|
||||||
'tooltip': 'end time [s] for calculating CF for P-picking',
|
'tooltip': 'end time [s] for calculating CF for P-picking (if TauPy:'
|
||||||
|
' seconds relative to estimated onset)',
|
||||||
'value': 60.0,
|
'value': 60.0,
|
||||||
'namestring': 'P stop'},
|
'namestring': 'P stop'},
|
||||||
|
|
||||||
@ -381,12 +383,12 @@ defaults = {'rootpath': {'type': str,
|
|||||||
'use_taup': {'type': bool,
|
'use_taup': {'type': bool,
|
||||||
'tooltip': 'use estimated traveltimes from TauPy for calculating windows for CF',
|
'tooltip': 'use estimated traveltimes from TauPy for calculating windows for CF',
|
||||||
'value': True,
|
'value': True,
|
||||||
'namestring': 'Use Taupy'},
|
'namestring': 'Use TauPy'},
|
||||||
|
|
||||||
'taup_model': {'type': str,
|
'taup_model': {'type': str,
|
||||||
'tooltip': 'define TauPy model for traveltime estimation',
|
'tooltip': 'define TauPy model for traveltime estimation',
|
||||||
'value': 'iasp91',
|
'value': 'iasp91',
|
||||||
'namestring': 'Taupy model'}
|
'namestring': 'TauPy model'}
|
||||||
}
|
}
|
||||||
|
|
||||||
settings_main = {
|
settings_main = {
|
||||||
|
@ -18,10 +18,13 @@ from pylot.core.pick.charfuns import HOScf, AICcf, ARZcf, ARHcf, AR3Ccf
|
|||||||
from pylot.core.pick.picker import AICPicker, PragPicker
|
from pylot.core.pick.picker import AICPicker, PragPicker
|
||||||
from pylot.core.pick.utils import checksignallength, checkZ4S, earllatepicker, \
|
from pylot.core.pick.utils import checksignallength, checkZ4S, earllatepicker, \
|
||||||
getSNR, fmpicker, checkPonsets, wadaticheck
|
getSNR, fmpicker, checkPonsets, wadaticheck
|
||||||
from pylot.core.util.utils import getPatternLine, gen_Pool
|
from pylot.core.util.utils import getPatternLine, gen_Pool, identifyPhase, loopIdentifyPhase, \
|
||||||
|
full_range
|
||||||
|
|
||||||
|
from obspy.taup import TauPyModel
|
||||||
|
|
||||||
|
|
||||||
def autopickevent(data, param, iplot=0, fig_dict=None, ncores=0):
|
def autopickevent(data, param, iplot=0, fig_dict=None, ncores=0, metadata=None, origin=None):
|
||||||
stations = []
|
stations = []
|
||||||
all_onsets = {}
|
all_onsets = {}
|
||||||
input_tuples = []
|
input_tuples = []
|
||||||
@ -42,9 +45,11 @@ def autopickevent(data, param, iplot=0, fig_dict=None, ncores=0):
|
|||||||
topick = data.select(station=station)
|
topick = data.select(station=station)
|
||||||
|
|
||||||
if not iplot:
|
if not iplot:
|
||||||
input_tuples.append((topick, param, apverbose))
|
input_tuples.append((topick, param, apverbose, metadata, origin))
|
||||||
if iplot > 0:
|
if iplot > 0:
|
||||||
all_onsets[station] = autopickstation(topick, param, verbose=apverbose, iplot=iplot, fig_dict=fig_dict)
|
all_onsets[station] = autopickstation(topick, param, verbose=apverbose,
|
||||||
|
iplot=iplot, fig_dict=fig_dict,
|
||||||
|
metadata=metadata, origin=origin)
|
||||||
|
|
||||||
if iplot > 0:
|
if iplot > 0:
|
||||||
print('iPlot Flag active: NO MULTIPROCESSING possible.')
|
print('iPlot Flag active: NO MULTIPROCESSING possible.')
|
||||||
@ -69,12 +74,13 @@ def autopickevent(data, param, iplot=0, fig_dict=None, ncores=0):
|
|||||||
|
|
||||||
|
|
||||||
def call_autopickstation(input_tuple):
|
def call_autopickstation(input_tuple):
|
||||||
wfstream, pickparam, verbose = input_tuple
|
wfstream, pickparam, verbose, metadata, origin = input_tuple
|
||||||
# multiprocessing not possible with interactive plotting
|
# multiprocessing not possible with interactive plotting
|
||||||
return autopickstation(wfstream, pickparam, verbose, iplot=0)
|
return autopickstation(wfstream, pickparam, verbose, iplot=0, metadata=metadata, origin=origin)
|
||||||
|
|
||||||
|
|
||||||
def autopickstation(wfstream, pickparam, verbose=False, iplot=0, fig_dict=None):
|
def autopickstation(wfstream, pickparam, verbose=False,
|
||||||
|
iplot=0, fig_dict=None, metadata=None, origin=None):
|
||||||
"""
|
"""
|
||||||
:param wfstream: `~obspy.core.stream.Stream` containing waveform
|
:param wfstream: `~obspy.core.stream.Stream` containing waveform
|
||||||
:type wfstream: obspy.core.stream.Stream
|
:type wfstream: obspy.core.stream.Stream
|
||||||
@ -117,6 +123,8 @@ def autopickstation(wfstream, pickparam, verbose=False, iplot=0, fig_dict=None):
|
|||||||
algoS = pickparam.get('algoS')
|
algoS = pickparam.get('algoS')
|
||||||
sstart = pickparam.get('sstart')
|
sstart = pickparam.get('sstart')
|
||||||
sstop = pickparam.get('sstop')
|
sstop = pickparam.get('sstop')
|
||||||
|
use_taup = pickparam.get('use_taup')
|
||||||
|
taup_model = pickparam.get('taup_model')
|
||||||
bph1 = pickparam.get('bph1')
|
bph1 = pickparam.get('bph1')
|
||||||
bph2 = pickparam.get('bph2')
|
bph2 = pickparam.get('bph2')
|
||||||
tsnrh = pickparam.get('tsnrh')
|
tsnrh = pickparam.get('tsnrh')
|
||||||
@ -182,6 +190,8 @@ def autopickstation(wfstream, pickparam, verbose=False, iplot=0, fig_dict=None):
|
|||||||
if len(ndat) == 0: # check for other components
|
if len(ndat) == 0: # check for other components
|
||||||
ndat = wfstream.select(component="1")
|
ndat = wfstream.select(component="1")
|
||||||
|
|
||||||
|
wfstart, wfend = full_range(wfstream)
|
||||||
|
|
||||||
if algoP == 'HOS' or algoP == 'ARZ' and zdat is not None:
|
if algoP == 'HOS' or algoP == 'ARZ' and zdat is not None:
|
||||||
msg = '##################################################\nautopickstation:' \
|
msg = '##################################################\nautopickstation:' \
|
||||||
' Working on P onset of station {station}\nFiltering vertical ' \
|
' Working on P onset of station {station}\nFiltering vertical ' \
|
||||||
@ -197,7 +207,47 @@ def autopickstation(wfstream, pickparam, verbose=False, iplot=0, fig_dict=None):
|
|||||||
z_copy[0].data = tr_filt.data
|
z_copy[0].data = tr_filt.data
|
||||||
##############################################################
|
##############################################################
|
||||||
# check length of waveform and compare with cut times
|
# check length of waveform and compare with cut times
|
||||||
Lc = pstop - pstart
|
|
||||||
|
# for global seismology: use tau-p method for estimating travel times (needs source and station coords.)
|
||||||
|
# if not given: sets Lc to infinity to use full stream
|
||||||
|
if use_taup:
|
||||||
|
Lc = np.inf
|
||||||
|
print('autopickstation: use_taup flag active.')
|
||||||
|
if not metadata[1]:
|
||||||
|
print('Warning: Could not use TauPy to estimate onsets as there are no metadata given.')
|
||||||
|
else:
|
||||||
|
if origin:
|
||||||
|
source_origin = origin[0]
|
||||||
|
station_id = wfstream[0].get_id()
|
||||||
|
parser = metadata[1]
|
||||||
|
station_coords = parser.get_coordinates(station_id)
|
||||||
|
model = TauPyModel(taup_model)
|
||||||
|
arrivals = model.get_travel_times_geo(
|
||||||
|
source_origin.depth,
|
||||||
|
source_origin.latitude,
|
||||||
|
source_origin.longitude,
|
||||||
|
station_coords['latitude'],
|
||||||
|
station_coords['longitude']
|
||||||
|
)
|
||||||
|
phases = {'P': [],
|
||||||
|
'S': []}
|
||||||
|
for arr in arrivals:
|
||||||
|
phases[identifyPhase(loopIdentifyPhase(arr.phase.name))].append(arr)
|
||||||
|
|
||||||
|
# get first P and S onsets from arrivals list
|
||||||
|
arrP, estFirstP = min([(arr, arr.time) for arr in phases['P']], key = lambda t: t[1])
|
||||||
|
arrS, estFirstS = min([(arr, arr.time) for arr in phases['S']], key = lambda t: t[1])
|
||||||
|
print('autopick: estimated first arrivals for P: {}, S:{} using TauPy'.format(estFirstP, estFirstS))
|
||||||
|
|
||||||
|
# modifiy pstart and pstop relative to estimated first P arrival (relative to station time axis)
|
||||||
|
pstart += (source_origin.time + estFirstP) - wfstart
|
||||||
|
pstop += (source_origin.time + estFirstP) - wfstart
|
||||||
|
Lc = pstop - pstart
|
||||||
|
else:
|
||||||
|
print('No source origins given!')
|
||||||
|
|
||||||
|
else:
|
||||||
|
Lc = pstop - pstart
|
||||||
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:
|
||||||
@ -238,6 +288,12 @@ def autopickstation(wfstream, pickparam, verbose=False, iplot=0, fig_dict=None):
|
|||||||
else:
|
else:
|
||||||
fig = None
|
fig = None
|
||||||
aicpick = AICPicker(aiccf, tsnrz, pickwinP, iplot, None, tsmoothP, fig=fig)
|
aicpick = AICPicker(aiccf, tsnrz, pickwinP, iplot, None, tsmoothP, fig=fig)
|
||||||
|
# add pstart and pstop to aic plot
|
||||||
|
if fig.axes:
|
||||||
|
for ax in fig.axes:
|
||||||
|
ax.vlines(pstart, ax.get_ylim()[0], ax.get_ylim()[1], color='c', linestyles='dashed', label='P start')
|
||||||
|
ax.vlines(pstop, ax.get_ylim()[0], ax.get_ylim()[1], color='c', linestyles='dashed', label='P stop')
|
||||||
|
ax.legend()
|
||||||
##############################################################
|
##############################################################
|
||||||
if aicpick.getpick() is not None:
|
if aicpick.getpick() is not None:
|
||||||
# check signal length to detect spuriously picked noise peaks
|
# check signal length to detect spuriously picked noise peaks
|
||||||
|
@ -9,7 +9,7 @@ Created on Wed Feb 26 12:31:25 2014
|
|||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
from pylot.core.io.inputs import PylotParameter
|
from pylot.core.util.utils import readDefaultFilterInformation
|
||||||
from pylot.core.loc import hypo71
|
from pylot.core.loc import hypo71
|
||||||
from pylot.core.loc import hypodd
|
from pylot.core.loc import hypodd
|
||||||
from pylot.core.loc import hyposat
|
from pylot.core.loc import hyposat
|
||||||
@ -17,23 +17,6 @@ from pylot.core.loc import nll
|
|||||||
from pylot.core.loc import velest
|
from pylot.core.loc import velest
|
||||||
|
|
||||||
|
|
||||||
def readDefaultFilterInformation(fname):
|
|
||||||
pparam = PylotParameter(fname)
|
|
||||||
return readFilterInformation(pparam)
|
|
||||||
|
|
||||||
|
|
||||||
def readFilterInformation(pylot_parameter):
|
|
||||||
p_filter = {'filtertype': pylot_parameter['filter_type'][0],
|
|
||||||
'freq': [pylot_parameter['minfreq'][0], pylot_parameter['maxfreq'][0]],
|
|
||||||
'order': int(pylot_parameter['filter_order'][0])}
|
|
||||||
s_filter = {'filtertype': pylot_parameter['filter_type'][1],
|
|
||||||
'freq': [pylot_parameter['minfreq'][1], pylot_parameter['maxfreq'][1]],
|
|
||||||
'order': int(pylot_parameter['filter_order'][1])}
|
|
||||||
filter_information = {'P': p_filter,
|
|
||||||
'S': s_filter}
|
|
||||||
return filter_information
|
|
||||||
|
|
||||||
|
|
||||||
# determine system dependent path separator
|
# determine system dependent path separator
|
||||||
system_name = platform.system()
|
system_name = platform.system()
|
||||||
if system_name in ["Linux", "Darwin"]:
|
if system_name in ["Linux", "Darwin"]:
|
||||||
|
@ -10,8 +10,8 @@ import subprocess
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from obspy import UTCDateTime, read
|
from obspy import UTCDateTime, read
|
||||||
from pylot.core.io.inputs import PylotParameter
|
from pylot.core.io.inputs import PylotParameter
|
||||||
from scipy.interpolate import splrep, splev
|
|
||||||
|
|
||||||
|
from scipy.interpolate import splrep, splev
|
||||||
|
|
||||||
def _pickle_method(m):
|
def _pickle_method(m):
|
||||||
if m.im_self is None:
|
if m.im_self is None:
|
||||||
@ -20,6 +20,23 @@ def _pickle_method(m):
|
|||||||
return getattr, (m.im_self, m.im_func.func_name)
|
return getattr, (m.im_self, m.im_func.func_name)
|
||||||
|
|
||||||
|
|
||||||
|
def readDefaultFilterInformation(fname):
|
||||||
|
pparam = PylotParameter(fname)
|
||||||
|
return readFilterInformation(pparam)
|
||||||
|
|
||||||
|
|
||||||
|
def readFilterInformation(pylot_parameter):
|
||||||
|
p_filter = {'filtertype': pylot_parameter['filter_type'][0],
|
||||||
|
'freq': [pylot_parameter['minfreq'][0], pylot_parameter['maxfreq'][0]],
|
||||||
|
'order': int(pylot_parameter['filter_order'][0])}
|
||||||
|
s_filter = {'filtertype': pylot_parameter['filter_type'][1],
|
||||||
|
'freq': [pylot_parameter['minfreq'][1], pylot_parameter['maxfreq'][1]],
|
||||||
|
'order': int(pylot_parameter['filter_order'][1])}
|
||||||
|
filter_information = {'P': p_filter,
|
||||||
|
'S': s_filter}
|
||||||
|
return filter_information
|
||||||
|
|
||||||
|
|
||||||
def fit_curve(x, y):
|
def fit_curve(x, y):
|
||||||
return splev, splrep(x, y)
|
return splev, splrep(x, y)
|
||||||
|
|
||||||
@ -551,6 +568,51 @@ def which(program, infile=None):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def loopIdentifyPhase(phase):
|
||||||
|
'''
|
||||||
|
Loop through phase string and try to recognize its type (P or S wave).
|
||||||
|
Global variable ALTSUFFIX gives alternative suffix for phases if they do not end with P, p or S, s.
|
||||||
|
If ALTSUFFIX is not given, the function will cut the last letter of the phase string until string ends
|
||||||
|
with P or S.
|
||||||
|
:param phase: phase name (str)
|
||||||
|
:return:
|
||||||
|
'''
|
||||||
|
from pylot.core.util.defaults import ALTSUFFIX
|
||||||
|
|
||||||
|
phase_copy = phase
|
||||||
|
while not identifyPhase(phase_copy):
|
||||||
|
identified = False
|
||||||
|
for alt_suf in ALTSUFFIX:
|
||||||
|
if phase_copy.endswith(alt_suf):
|
||||||
|
phase_copy = phase_copy.split(alt_suf)[0]
|
||||||
|
identified = True
|
||||||
|
if not identified:
|
||||||
|
phase_copy = phase_copy[:-1]
|
||||||
|
if len(phase_copy) < 1:
|
||||||
|
print('Warning: Could not identify phase {}!'.format(phase))
|
||||||
|
return
|
||||||
|
return phase_copy
|
||||||
|
|
||||||
|
|
||||||
|
def identifyPhase(phase):
|
||||||
|
'''
|
||||||
|
Returns capital P or S if phase string is identified by last letter. Else returns False.
|
||||||
|
:param phase: phase name (str)
|
||||||
|
:return: 'P', 'S' or False
|
||||||
|
'''
|
||||||
|
# common phase suffix for P and S
|
||||||
|
common_P = ['P', 'p']
|
||||||
|
common_S = ['S', 's']
|
||||||
|
if phase[-1] in common_P:
|
||||||
|
return 'P'
|
||||||
|
if phase[-1] in common_S:
|
||||||
|
return 'S'
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import doctest
|
import doctest
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ except:
|
|||||||
pg = None
|
pg = None
|
||||||
|
|
||||||
from matplotlib.figure import Figure
|
from matplotlib.figure import Figure
|
||||||
from pylot.core.util.utils import find_horizontals
|
from pylot.core.util.utils import find_horizontals, identifyPhase, loopIdentifyPhase
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from matplotlib.backends.backend_qt4agg import FigureCanvas
|
from matplotlib.backends.backend_qt4agg import FigureCanvas
|
||||||
@ -46,7 +46,7 @@ from pylot.core.io.inputs import FilterOptions, PylotParameter
|
|||||||
from pylot.core.pick.utils import getSNR, earllatepicker, getnoisewin, \
|
from pylot.core.pick.utils import getSNR, earllatepicker, getnoisewin, \
|
||||||
getResolutionWindow
|
getResolutionWindow
|
||||||
from pylot.core.pick.compare import Comparison
|
from pylot.core.pick.compare import Comparison
|
||||||
from pylot.core.util.defaults import OUTPUTFORMATS, FILTERDEFAULTS, ALTSUFFIX, \
|
from pylot.core.util.defaults import OUTPUTFORMATS, FILTERDEFAULTS, \
|
||||||
SetChannelComponents
|
SetChannelComponents
|
||||||
from pylot.core.util.utils import prepTimeAxis, full_range, scaleWFData, \
|
from pylot.core.util.utils import prepTimeAxis, full_range, scaleWFData, \
|
||||||
demeanTrace, isSorted, findComboBoxIndex, clims
|
demeanTrace, isSorted, findComboBoxIndex, clims
|
||||||
@ -118,34 +118,6 @@ def createAction(parent, text, slot=None, shortcut=None, icon=None,
|
|||||||
return action
|
return action
|
||||||
|
|
||||||
|
|
||||||
def loopIdentifyPhase(phase):
|
|
||||||
phase_copy = phase
|
|
||||||
while not identifyPhase(phase_copy):
|
|
||||||
identified = False
|
|
||||||
for alt_suf in ALTSUFFIX:
|
|
||||||
if phase_copy.endswith(alt_suf):
|
|
||||||
phase_copy = phase_copy.split(alt_suf)[0]
|
|
||||||
identified = True
|
|
||||||
if not identified:
|
|
||||||
phase_copy = phase_copy[:-1]
|
|
||||||
if len(phase_copy) < 1:
|
|
||||||
print('Warning: Could not identify phase {}!'.format(phase))
|
|
||||||
return
|
|
||||||
return phase_copy
|
|
||||||
|
|
||||||
|
|
||||||
def identifyPhase(phase):
|
|
||||||
# common phase suffix for P and S
|
|
||||||
common_P = ['P', 'p']
|
|
||||||
common_S = ['S', 's']
|
|
||||||
if phase[-1] in common_P:
|
|
||||||
return 'P'
|
|
||||||
if phase[-1] in common_S:
|
|
||||||
return 'S'
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
class ComparisonDialog(QDialog):
|
class ComparisonDialog(QDialog):
|
||||||
def __init__(self, c, parent=None):
|
def __init__(self, c, parent=None):
|
||||||
self._data = c
|
self._data = c
|
||||||
|
Loading…
Reference in New Issue
Block a user