Merge branch 'develop' of ariadne.geophysik.rub.de:/data/git/pylot into develop

This commit is contained in:
Ludger Küperkoch 2017-08-16 15:33:16 +02:00
commit db628a5228
7 changed files with 77 additions and 15 deletions

View File

@ -74,7 +74,7 @@ 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, readFilterInformation, trim_station_components, check4gaps, make_pen, pick_color_plt, \ full_range, readFilterInformation, trim_station_components, check4gaps, make_pen, pick_color_plt, \
pick_linestyle_plt, identifyPhase, loopIdentifyPhase, remove_underscores pick_linestyle_plt, identifyPhase, loopIdentifyPhase, remove_underscores, check4doubled
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, \
@ -1377,7 +1377,9 @@ class MainWindow(QMainWindow):
wfdat = self.data.getWFData() # all available streams wfdat = self.data.getWFData() # all available streams
# remove possible underscores in station names # remove possible underscores in station names
wfdat = remove_underscores(wfdat) wfdat = remove_underscores(wfdat)
# check for gaps and doubled channels
check4gaps(wfdat) check4gaps(wfdat)
check4doubled(wfdat)
# trim station components to same start value # trim station components to same start value
trim_station_components(wfdat, trim_start=True, trim_end=False) trim_station_components(wfdat, trim_start=True, trim_end=False)
self._stime = full_range(self.get_data().getWFData())[0] self._stime = full_range(self.get_data().getWFData())[0]

View File

@ -26,7 +26,7 @@ from pylot.core.util.dataprocessing import restitute_data, read_metadata
from pylot.core.util.defaults import SEPARATOR from pylot.core.util.defaults import SEPARATOR
from pylot.core.util.event import Event from pylot.core.util.event import Event
from pylot.core.util.structure import DATASTRUCTURE from pylot.core.util.structure import DATASTRUCTURE
from pylot.core.util.utils import real_None, remove_underscores, trim_station_components, check4gaps from pylot.core.util.utils import real_None, remove_underscores, trim_station_components, check4gaps, check4doubled
from pylot.core.util.version import get_git_version as _getVersionString from pylot.core.util.version import get_git_version as _getVersionString
__version__ = _getVersionString() __version__ = _getVersionString()
@ -242,6 +242,7 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
wfdat = remove_underscores(wfdat) wfdat = remove_underscores(wfdat)
# trim components for each station to avoid problems with different trace starttimes for one station # trim components for each station to avoid problems with different trace starttimes for one station
wfdat = check4gaps(wfdat) wfdat = check4gaps(wfdat)
wfdat = check4doubled(wfdat)
wfdat = trim_station_components(wfdat, trim_start=True, trim_end=False) wfdat = trim_station_components(wfdat, trim_start=True, trim_end=False)
metadata = read_metadata(parameter.get('invdir')) metadata = read_metadata(parameter.get('invdir'))
corr_dat = None corr_dat = None

View File

@ -19,7 +19,7 @@ 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, identifyPhase, loopIdentifyPhase, \ from pylot.core.util.utils import getPatternLine, gen_Pool, identifyPhase, loopIdentifyPhase, \
full_range real_Bool
from obspy.taup import TauPyModel from obspy.taup import TauPyModel
@ -140,7 +140,7 @@ def autopickstation(wfstream, pickparam, verbose=False,
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') use_taup = real_Bool(pickparam.get('use_taup'))
taup_model = pickparam.get('taup_model') taup_model = pickparam.get('taup_model')
bph1 = pickparam.get('bph1') bph1 = pickparam.get('bph1')
bph2 = pickparam.get('bph2') bph2 = pickparam.get('bph2')
@ -229,7 +229,7 @@ def autopickstation(wfstream, pickparam, verbose=False,
# for global seismology: use tau-p method for estimating travel times (needs source and station coords.) # 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 not given: sets Lc to infinity to use full stream
if use_taup == True or use_taup == 'True': if use_taup == True:
Lc = np.inf Lc = np.inf
print('autopickstation: use_taup flag active.') print('autopickstation: use_taup flag active.')
if not metadata[1]: if not metadata[1]:
@ -262,14 +262,23 @@ def autopickstation(wfstream, pickparam, verbose=False,
# modifiy pstart and pstop relative to estimated first P arrival (relative to station time axis) # modifiy pstart and pstop relative to estimated first P arrival (relative to station time axis)
pstart += (source_origin.time + estFirstP) - zdat[0].stats.starttime pstart += (source_origin.time + estFirstP) - zdat[0].stats.starttime
pstop += (source_origin.time + estFirstP) - zdat[0].stats.starttime pstop += (source_origin.time + estFirstP) - zdat[0].stats.starttime
Lc = pstop - pstart
print('autopick: CF calculation times respectively:' print('autopick: CF calculation times respectively:'
' pstart: {} s, pstop: {} s'.format(pstart, pstop)) ' pstart: {} s, pstop: {} s'.format(pstart, pstop))
elif not origin: elif not origin:
print('No source origins given!') print('No source origins given!')
else:
# make sure pstart and pstop are inside zdat[0]
pstart = max(pstart, 0)
pstop = min(pstop, len(zdat[0])*zdat[0].stats.delta)
if not use_taup == True or origin:
Lc = pstop - pstart Lc = pstop - pstart
Lwf = zdat[0].stats.endtime - zdat[0].stats.starttime Lwf = zdat[0].stats.endtime - zdat[0].stats.starttime
if not Lwf > 0:
print('autopickstation: empty trace! Return!')
return
Ldiff = Lwf - Lc Ldiff = Lwf - Lc
if Ldiff < 0: if Ldiff < 0:
msg = 'autopickstation: Cutting times are too large for actual ' \ msg = 'autopickstation: Cutting times are too large for actual ' \
@ -517,16 +526,31 @@ def autopickstation(wfstream, pickparam, verbose=False,
else: else:
ndat = edat ndat = edat
if edat is not None and ndat is not None and len(edat) > 0 and len( pickSonset = (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)
if pickSonset:
# determine time window for calculating CF after P onset
cuttimesh = [
round(max([mpickP + sstart, 0])), # MP MP relative time axis
round(min([
mpickP + sstop,
edat[0].stats.endtime-edat[0].stats.starttime,
ndat[0].stats.endtime-ndat[0].stats.starttime
]))
]
if not cuttimesh[1] >= cuttimesh[0]:
print('Cut window for horizontal phases too small! Will not pick S onsets.')
pickSonset = False
if pickSonset:
msg = 'Go on picking S onset ...\n' \ msg = 'Go on picking S onset ...\n' \
'##################################################\n' \ '##################################################\n' \
'Working on S onset of station {0}\nFiltering horizontal ' \ 'Working on S onset of station {0}\nFiltering horizontal ' \
'traces ...'.format(edat[0].stats.station) 'traces ...'.format(edat[0].stats.station)
if verbose: print(msg) if verbose: print(msg)
# determine time window for calculating CF after P onset
cuttimesh = [round(max([mpickP + sstart, 0])),
round(min([mpickP + sstop, Lwf]))]
if algoS == 'ARH': if algoS == 'ARH':
# re-create stream object including both horizontal components # re-create stream object including both horizontal components

View File

@ -8,6 +8,7 @@ import os
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
from obspy import read_events from obspy import read_events
from obspy.core import AttribDict
from pylot.core.io.phases import picksdict_from_picks from pylot.core.io.phases import picksdict_from_picks
from pylot.core.util.pdf import ProbabilityDensityFunction from pylot.core.util.pdf import ProbabilityDensityFunction
from pylot.core.util.utils import find_in_list from pylot.core.util.utils import find_in_list
@ -31,7 +32,7 @@ class Comparison(object):
for name, fn in kwargs.items(): for name, fn in kwargs.items():
if isinstance(fn, PDFDictionary): if isinstance(fn, PDFDictionary):
self._pdfs[name] = fn self._pdfs[name] = fn
elif isinstance(fn, dict): elif isinstance(fn, dict) or isinstance(fn, AttribDict):
self._pdfs[name] = PDFDictionary(fn) self._pdfs[name] = PDFDictionary(fn)
else: else:
self._pdfs[name] = PDFDictionary.from_quakeml(fn) self._pdfs[name] = PDFDictionary.from_quakeml(fn)

View File

@ -248,7 +248,7 @@ class ProbabilityDensityFunction(object):
self._x = np.array(x) self._x = np.array(x)
@classmethod @classmethod
def from_pick(self, lbound, barycentre, rbound, incr=0.001, decfact=0.01, def from_pick(self, lbound, barycentre, rbound, incr=0.1, decfact=0.01,
type='exp'): type='exp'):
''' '''
Initialize a new ProbabilityDensityFunction object. Initialize a new ProbabilityDensityFunction object.

View File

@ -221,6 +221,15 @@ def real_None(value):
return value return value
def real_Bool(value):
if value == 'True':
return True
elif value == 'False':
return False
else:
return value
def four_digits(year): def four_digits(year):
""" """
takes a two digit year integer and returns the correct four digit equivalent takes a two digit year integer and returns the correct four digit equivalent
@ -621,6 +630,31 @@ def check4gaps(data):
return data return data
def check4doubled(data):
'''
check for doubled stations for same channel in Stream and take only the first one
:param data: stream of seismic data
:return: data stream
'''
stations = get_stations(data)
for station in stations:
wf_station = data.select(station=station)
# create list of all possible channels
channels = []
for trace in wf_station:
channel = trace.stats.channel
if not channel in channels:
channels.append(channel)
else:
print('check4doubled: removed the following trace for station {}, as there is'
' already a trace with the same channel given:\n{}'.format(
station, trace
))
data.remove(trace)
return data
def get_stations(data): def get_stations(data):
stations = [] stations = []
for tr in data: for tr in data:

View File

@ -127,7 +127,7 @@ class ComparisonDialog(QDialog):
phasesComboBox=None, phasesComboBox=None,
histCheckBox=None) histCheckBox=None)
self._phases = 'PS' self._phases = 'PS'
self._plotprops = dict(station=self.stations[0], phase=self.phases[0]) self._plotprops = dict(station=list(self.stations)[0], phase=list(self.phases)[0])
super(ComparisonDialog, self).__init__(parent) super(ComparisonDialog, self).__init__(parent)
self.setupUI() self.setupUI()
self.plotcomparison() self.plotcomparison()