diff --git a/autoPyLoT.py b/autoPyLoT.py index f9079aac..e24500fe 100755 --- a/autoPyLoT.py +++ b/autoPyLoT.py @@ -7,6 +7,7 @@ import argparse import datetime import glob import os +import traceback import pylot.core.loc.focmec as focmec import pylot.core.loc.hash as hash @@ -283,7 +284,11 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even corr_dat = None if metadata: # rotate stations to ZNE - wfdat = check4rotated(wfdat, metadata) + try: + wfdat = check4rotated(wfdat, metadata) + except Exception as e: + print('Could not rotate station {} to ZNE:\n{}'.format(wfdat[0].stats.station, + traceback.format_exc())) if locflag: print("Restitute data ...") corr_dat = restitute_data(wfdat.copy(), metadata, ncores=ncores) diff --git a/pylot/core/pick/autopick.py b/pylot/core/pick/autopick.py index e843b7a8..b25b38bf 100644 --- a/pylot/core/pick/autopick.py +++ b/pylot/core/pick/autopick.py @@ -137,8 +137,8 @@ def call_autopickstation(input_tuple): return autopickstation(wfstream, pickparam, verbose, fig_dict=fig_dict, iplot=iplot, metadata=metadata, origin=origin) except Exception as e: - traceback.print_exc() - return traceback.format_exc(), wfstream[0].stats.station + tbe = traceback.format_exc() + return tbe, wfstream[0].stats.station def autopickstation(wfstream, pickparam, verbose=False, @@ -254,19 +254,22 @@ def autopickstation(wfstream, pickparam, verbose=False, # split components zdat = wfstream.select(component="Z") if len(zdat) == 0: # check for other components + print('HIT: 3') zdat = wfstream.select(component="3") edat = wfstream.select(component="E") if len(edat) == 0: # check for other components edat = wfstream.select(component="2") + print('HIT: 2') ndat = wfstream.select(component="N") if len(ndat) == 0: # check for other components ndat = wfstream.select(component="1") + print('HIT: 1') picks = {} - station = zdat[0].stats.station + station = wfstream[0].stats.station if not zdat: - print('No z-component found for station {}. STOP'.format(wfstream[0].stats.station)) + print('No z-component found for station {}. STOP'.format(station)) return picks, station if algoP == 'HOS' or algoP == 'ARZ' and zdat is not None: diff --git a/pylot/core/pick/picker.py b/pylot/core/pick/picker.py index bb6d5efa..f13e0d65 100644 --- a/pylot/core/pick/picker.py +++ b/pylot/core/pick/picker.py @@ -279,7 +279,7 @@ class AICPicker(AutoPicker): try: imaxs, = argrelmax(dataslope) imax = imaxs[0] - except ValueError as e: + except (ValueError, IndexError) as e: print(e, 'picker: argrelmax not working!') imax = np.argmax(dataslope) iislope = islope[0][0:imax + 1] diff --git a/pylot/core/pick/utils.py b/pylot/core/pick/utils.py index e3e311c6..744cd358 100644 --- a/pylot/core/pick/utils.py +++ b/pylot/core/pick/utils.py @@ -606,14 +606,18 @@ def wadaticheck(pickdic, dttolerance, iplot=0, fig_dict=None): ibad = 0 for key in list(pickdic.keys()): - if pickdic[key]['P']['weight'] < 4 and pickdic[key]['S']['weight'] < 4: + ppick = pickdic[key].get('P') + spick = pickdic[key].get('S') + if not ppick or not spick: + continue + if ppick['weight'] < 4 and spick['weight'] < 4: # calculate S-P time - spt = pickdic[key]['S']['mpp'] - pickdic[key]['P']['mpp'] + spt = spick['mpp'] - ppick['mpp'] # add S-P time to dictionary pickdic[key]['SPt'] = spt # add P onsets and corresponding S-P times to list - UTCPpick = UTCDateTime(pickdic[key]['P']['mpp']) - UTCSpick = UTCDateTime(pickdic[key]['S']['mpp']) + UTCPpick = UTCDateTime(ppick['mpp']) + UTCSpick = UTCDateTime(spick['mpp']) Ppicks.append(UTCPpick.timestamp) Spicks.append(UTCSpick.timestamp) SPtimes.append(spt) @@ -870,9 +874,12 @@ def checkPonsets(pickdic, dttolerance, jackfactor=5, iplot=0, fig_dict=None): Ppicks = [] stations = [] for station in pickdic: - if pickdic[station]['P']['weight'] < 4: + pick = pickdic[station].get('P') + if not pick: + continue + if pick['weight'] < 4: # add P onsets to list - UTCPpick = UTCDateTime(pickdic[station]['P']['mpp']) + UTCPpick = UTCDateTime(pick['mpp']) Ppicks.append(UTCPpick.timestamp) stations.append(station) diff --git a/pylot/core/util/utils.py b/pylot/core/util/utils.py index b751690c..abf10921 100644 --- a/pylot/core/util/utils.py +++ b/pylot/core/util/utils.py @@ -975,6 +975,9 @@ def check4rotated(data, metadata=None, verbosity=1): except (KeyError, TypeError) as e: print('Failed to rotate trace {}, no azimuth or dip available in metadata'.format(trace_id)) return wfstream + if len(wfstream) < 3: + print('Failed to rotate Stream {}, not enough components available.'.format(wfstream)) + return wfstream # to rotate all traces must have same length, so trim them wfstream = trim_station_components(wfstream, trim_start=True, trim_end=True) z, n, e = rotate2zne(wfstream[0], azimuts[0], dips[0],