feature/port-to-py3 #11
3
PyLoT.py
3
PyLoT.py
@ -3902,9 +3902,10 @@ class Project(object):
|
|||||||
try:
|
try:
|
||||||
import cPickle
|
import cPickle
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import _pickle as cPickle
|
import pickle as cPickle
|
||||||
infile = open(filename, 'rb')
|
infile = open(filename, 'rb')
|
||||||
project = cPickle.load(infile)
|
project = cPickle.load(infile)
|
||||||
|
infile.close()
|
||||||
project.location = filename
|
project.location = filename
|
||||||
print('Loaded %s' % filename)
|
print('Loaded %s' % filename)
|
||||||
return project
|
return project
|
||||||
|
@ -18,7 +18,6 @@ from cartopy.feature import ShapelyFeature
|
|||||||
from cartopy.io.shapereader import Reader
|
from cartopy.io.shapereader import Reader
|
||||||
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
|
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
|
||||||
|
|
||||||
|
|
||||||
from pylot.core.util.widgets import PickDlg, PylotCanvas
|
from pylot.core.util.widgets import PickDlg, PylotCanvas
|
||||||
from pylot.core.pick.utils import get_quality_class
|
from pylot.core.pick.utils import get_quality_class
|
||||||
|
|
||||||
@ -56,10 +55,10 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
self.highlighted_stations = []
|
self.highlighted_stations = []
|
||||||
self.init_graphics()
|
self.init_graphics()
|
||||||
self.init_stations()
|
self.init_stations()
|
||||||
self.init_basemap(resolution='l')
|
self.init_basemap()
|
||||||
self.init_map()
|
self.init_map()
|
||||||
self._style = None if not hasattr(parent, '_style') else parent._style
|
self._style = None if not hasattr(parent, '_style') else parent._style
|
||||||
# self.show()
|
self.show()
|
||||||
|
|
||||||
def update_hybrids_dict(self):
|
def update_hybrids_dict(self):
|
||||||
self.hybrids_dict = self.picks_dict.copy()
|
self.hybrids_dict = self.picks_dict.copy()
|
||||||
@ -77,7 +76,7 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
def init_colormap(self):
|
def init_colormap(self):
|
||||||
self.init_lat_lon_dimensions()
|
self.init_lat_lon_dimensions()
|
||||||
self.init_lat_lon_grid()
|
self.init_lat_lon_grid()
|
||||||
self.init_x_y_dimensions()
|
# self.init_x_y_dimensions()
|
||||||
|
|
||||||
def onpick(self, event):
|
def onpick(self, event):
|
||||||
ind = event.ind
|
ind = event.ind
|
||||||
@ -129,8 +128,8 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
lat = stat_dict['latitude']
|
lat = stat_dict['latitude']
|
||||||
lon = stat_dict['longitude']
|
lon = stat_dict['longitude']
|
||||||
self.highlighted_stations.append(self.basemap.scatter(lon, lat, s=self.pointsize, edgecolors=color,
|
self.highlighted_stations.append(self.basemap.scatter(lon, lat, s=self.pointsize, edgecolors=color,
|
||||||
facecolors='none', latlon=True,
|
facecolors='none', zorder=12, label='deleted'))
|
||||||
zorder=12, label='deleted'))
|
|
||||||
self.canvas.draw()
|
self.canvas.draw()
|
||||||
|
|
||||||
def pickInfo(self, ind):
|
def pickInfo(self, ind):
|
||||||
@ -332,59 +331,31 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
self.londim = self.lonmax - self.lonmin
|
self.londim = self.lonmax - self.lonmin
|
||||||
self.latdim = self.latmax - self.latmin
|
self.latdim = self.latmax - self.latmin
|
||||||
|
|
||||||
def init_x_y_dimensions(self):
|
|
||||||
# transformation of lat/lon to ax coordinate system
|
|
||||||
for st_id, coords in self.stations_dict.items():
|
|
||||||
lat, lon = coords['latitude'], coords['longitude']
|
|
||||||
coords['x'], coords['y'] = self.basemap(lon, lat)
|
|
||||||
|
|
||||||
self.xdim = self.get_max_from_stations('x') - self.get_min_from_stations('x')
|
|
||||||
self.ydim = self.get_max_from_stations('y') - self.get_min_from_stations('y')
|
|
||||||
|
|
||||||
def init_basemap(self):
|
def init_basemap(self):
|
||||||
# initialize cartopy coordinate reference system
|
# initialize cartopy coordinate reference system
|
||||||
proj = ccrs.PlateCarree(central_longitude=(self.lonmin + self.lonmax) / 2.)
|
proj = ccrs.Mercator() # PlateCarree(central_longitude=self.lonmin + abs(self.lonmax - self.lonmin) / 2.)
|
||||||
crtpy_map = plt.axes(projection=proj)
|
# crtpy_map = self.figure.axes
|
||||||
|
self.main_ax = plt.axes(projection=proj)
|
||||||
mapxtent = [self.lonmin, self.lonmax, self.latmin, self.latmax] # add conditional buffer
|
mapxtent = [self.lonmin, self.lonmax, self.latmin, self.latmax] # add conditional buffer
|
||||||
crtpy_map.set_extent(mapxtent) # find way to directly open zoomed map on area
|
self.main_ax.set_extent(mapxtent) # find way to directly open zoomed map on area
|
||||||
|
# self.main_ax.set_global()
|
||||||
|
|
||||||
# add features (option for plate boundaries)
|
# add features (option for plate boundaries)
|
||||||
crtpy_map.add_feature(cf.LAND) # replace with background map
|
self.main_ax.add_feature(cf.LAND, edgecolor='face', facecolor=cf.COLORS['land']) # replace with background map
|
||||||
crtpy_map.add_feature(cf.OCEAN)
|
self.main_ax.add_feature(cf.OCEAN, edgecolor='face', facecolor=cf.COLORS['water'])
|
||||||
crtpy_map.add_feature(cf.BORDERS, linestyle=':') # include province borders
|
self.main_ax.add_feature(cf.BORDERS, linestyle=':', edgecolor='k') # include province borders
|
||||||
crtpy_map.add_feature(cf.COASTLINE)
|
self.main_ax.add_feature(cf.COASTLINE, color='gray', linewidth=1)
|
||||||
# fname = 'PB2002_plates.shp'
|
# fname = 'PB2002_plates.shp'
|
||||||
# plateBoundaries = ShapelyFeature(Reader(fname).geometries(), ccrs.PlateCarree(), facecolor='none', edgecolor='r')
|
# plateBoundaries = ShapelyFeature(Reader(fname).geometries(), ccrs.PlateCarree(), facecolor='none', edgecolor='r')
|
||||||
# crtpy_map.add_feature(plateBoundaries)
|
# crtpy_map.add_feature(plateBoundaries)
|
||||||
|
|
||||||
# parallels and meridians
|
# parallels and meridians
|
||||||
gridlines = crtpy_map.gridlines(draw_labels=True, alpha=0.5, zorder=7)
|
gridlines = self.main_ax.gridlines(draw_labels=True, alpha=0.5, zorder=7)
|
||||||
gridlines.xformatter = LONGITUDE_FORMATTER
|
gridlines.xformatter = LONGITUDE_FORMATTER
|
||||||
gridlines.yformatter = LATITUDE_FORMATTER
|
gridlines.yformatter = LATITUDE_FORMATTER
|
||||||
|
|
||||||
self.basemap = crtpy_map
|
self.basemap = self.main_ax
|
||||||
self.figure._tight = True
|
# plt.show()
|
||||||
self.figure.tight_layout()
|
|
||||||
|
|
||||||
# basemap = Basemap(projection=projection, resolution = resolution, ax=self.main_ax)
|
|
||||||
# basemap = Basemap(projection='lcc', resolution=resolution, ax=self.main_ax, width=self.width, height=self.height, lat_0=(self.latmin + self.latmax) / 2., lon_0=(self.lonmin + self.lonmax) / 2.)
|
|
||||||
#
|
|
||||||
# basemap.fillcontinents(color=None, lake_color='aqua',zorder=1)
|
|
||||||
# basemap.drawmapboundary(zorder=2) # fill_color='darkblue')
|
|
||||||
# basemap.shadedrelief(zorder=3)
|
|
||||||
# basemap.drawcountries(zorder=4)
|
|
||||||
# basemap.drawstates(zorder=5)
|
|
||||||
# basemap.drawcoastlines(zorder=6)
|
|
||||||
# labels = [left,right,top,bottom]
|
|
||||||
# parallels = np.arange(-90, 90, 5.)
|
|
||||||
# parallels_small = np.arange(-90, 90, 2.5)
|
|
||||||
# basemap.drawparallels(parallels_small, linewidth=0.5, zorder=7)
|
|
||||||
# basemap.drawparallels(parallels, zorder=7)#, labels=[1, 1, 0, 0])
|
|
||||||
# meridians = np.arange(-180, 180, 5.)
|
|
||||||
# meridians_small = np.arange(-180, 180, 2.5)
|
|
||||||
# basemap.drawmeridians(meridians_small, linewidth=0.5, zorder=7)
|
|
||||||
# basemap.drawmeridians(meridians, zorder=7)#, labels=[0, 0, 1, 1])
|
|
||||||
# self.basemap = basemap
|
|
||||||
# self.figure._tight = True
|
# self.figure._tight = True
|
||||||
# self.figure.tight_layout()
|
# self.figure.tight_layout()
|
||||||
|
|
||||||
@ -397,8 +368,7 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
def init_picksgrid(self):
|
def init_picksgrid(self):
|
||||||
picks, uncertainties, lats, lons = self.get_picks_lat_lon()
|
picks, uncertainties, lats, lons = self.get_picks_lat_lon()
|
||||||
try:
|
try:
|
||||||
self.picksgrid_active = griddata((lats, lons), picks, (self.latgrid, self.longrid),
|
self.picksgrid_active = griddata((lats, lons), picks, (self.latgrid, self.longrid), method='linear')
|
||||||
method='linear')
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._warn('Could not init picksgrid: {}'.format(e))
|
self._warn('Could not init picksgrid: {}'.format(e))
|
||||||
|
|
||||||
@ -412,16 +382,6 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
longitudes.append(coords['longitude'])
|
longitudes.append(coords['longitude'])
|
||||||
return stations, latitudes, longitudes
|
return stations, latitudes, longitudes
|
||||||
|
|
||||||
def get_st_x_y_for_plot(self):
|
|
||||||
stations = []
|
|
||||||
xs = []
|
|
||||||
ys = []
|
|
||||||
for st_id, coords in self.stations_dict.items():
|
|
||||||
stations.append(st_id)
|
|
||||||
xs.append(coords['x'])
|
|
||||||
ys.append(coords['y'])
|
|
||||||
return stations, xs, ys
|
|
||||||
|
|
||||||
def get_picks_lat_lon(self):
|
def get_picks_lat_lon(self):
|
||||||
picks = []
|
picks = []
|
||||||
uncertainties = []
|
uncertainties = []
|
||||||
@ -434,72 +394,34 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
longitudes.append(self.stations_dict[st_id]['longitude'])
|
longitudes.append(self.stations_dict[st_id]['longitude'])
|
||||||
return picks, uncertainties, latitudes, longitudes
|
return picks, uncertainties, latitudes, longitudes
|
||||||
|
|
||||||
def draw_contour_filled(self, nlevel='100'):
|
def draw_contour_filled(self, nlevel=100):
|
||||||
# self.test_gradient()
|
# self.test_gradient()
|
||||||
|
|
||||||
levels = np.linspace(self.get_min_from_picks(), self.get_max_from_picks(), nlevel)
|
levels = np.linspace(self.get_min_from_picks(), self.get_max_from_picks(), nlevel)
|
||||||
# self.contourf = self.basemap.contour(self.longrid, self.latgrid, self.picksgrid_active, levels,
|
|
||||||
# linewidths=self.linewidth, latlon=True, zorder=8, alpha=0.7,
|
|
||||||
# cmap=self.get_colormap())
|
|
||||||
|
|
||||||
plt.contourf(self.longrid, self.latgrid, self.picksgrid_active, levels, linewidths=self.linewidth,
|
self.contourf = self.basemap.contourf(self.longrid, self.latgrid, self.picksgrid_active, levels,
|
||||||
transform=ccrs.PlateCarree(), alpha=0.7, zorder=8)
|
linewidths=self.linewidth, transform=ccrs.PlateCarree(),
|
||||||
|
alpha=0.7, zorder=8, cmap=self.get_colormap())
|
||||||
|
|
||||||
def get_colormap(self):
|
def get_colormap(self):
|
||||||
return plt.get_cmap(self.cmaps_box.currentText())
|
return plt.get_cmap(self.cmaps_box.currentText())
|
||||||
|
|
||||||
def test_gradient(self):
|
|
||||||
st_ids = self.picks_rel.keys()
|
|
||||||
x, y = np.gradient(self.picksgrid_active)
|
|
||||||
gradient_modulus = np.sqrt(x ** 2 + y ** 2)
|
|
||||||
global_mean_gradient = np.nanmean(gradient_modulus)
|
|
||||||
delta_gradient = []
|
|
||||||
for st_id in st_ids:
|
|
||||||
pick_item = self.picks_rel.pop(st_id)
|
|
||||||
self.init_picksgrid()
|
|
||||||
x, y = np.gradient(self.picksgrid_active)
|
|
||||||
gradient_modulus = np.sqrt(x ** 2 + y ** 2)
|
|
||||||
mean_gradient = np.nanmean(gradient_modulus)
|
|
||||||
dgradient = global_mean_gradient - mean_gradient
|
|
||||||
# print('station: {}, mean gradient: {}'.format(st_id, dgradient))
|
|
||||||
delta_gradient.append(dgradient)
|
|
||||||
self.picks_rel[st_id] = pick_item
|
|
||||||
global_std_gradient = np.nanstd(delta_gradient)
|
|
||||||
marked_stations = []
|
|
||||||
for st_id, dg in zip(st_ids, delta_gradient):
|
|
||||||
if abs(dg) > global_std_gradient:
|
|
||||||
marked_stations.append(st_id)
|
|
||||||
self.marked_stations = marked_stations
|
|
||||||
self.init_picksgrid()
|
|
||||||
|
|
||||||
# fig = plt.figure()
|
|
||||||
# x = list(range(len(st_ids)))
|
|
||||||
# gradients = zip(x, delta_gradient)
|
|
||||||
# gradients.sort(key=lambda a: a[1])
|
|
||||||
# plt.plot(gradients[0], gradients[1])
|
|
||||||
|
|
||||||
# global_var_gradient = np.nanvar(delta_gradient)
|
|
||||||
# plt.plot(x, delta_gradient)
|
|
||||||
# plt.axhline(global_std_gradient, color='green')
|
|
||||||
# plt.axhline(2 * global_std_gradient, color='blue')
|
|
||||||
# plt.axhline(global_var_gradient, color='red')
|
|
||||||
# plt.xticks(x, st_ids)
|
|
||||||
# plt.show()
|
|
||||||
|
|
||||||
def scatter_all_stations(self):
|
def scatter_all_stations(self):
|
||||||
stations, lats, lons = self.get_st_lat_lon_for_plot()
|
stations, lats, lons = self.get_st_lat_lon_for_plot()
|
||||||
#self.sc = self.basemap.scatter(lons, lats, s=self.pointsize, facecolor='none', latlon=True, marker='.',
|
#self.sc = self.basemap.scatter(lons, lats, s=self.pointsize, facecolor='none', latlon=True, marker='.',
|
||||||
# zorder=10, picker=True, edgecolor='0.5', label='Not Picked')
|
# zorder=10, picker=True, edgecolor='0.5', label='Not Picked')
|
||||||
|
|
||||||
self.sc = self.basemap.scatter(lons, lats, s=self.pointsize, facecolor='none', latlon=True, marker='.',
|
self.sc = self.basemap.scatter(lons, lats, s=self.pointsize, facecolor='none', marker='.',
|
||||||
zorder=10, picker=True, edgecolor='0.5', label='Not Picked', transform=ccrs.PlateCarree())
|
zorder=10, picker=True, edgecolor='0.5', label='Not Picked',
|
||||||
|
transform=ccrs.PlateCarree())
|
||||||
|
|
||||||
self.cid = self.canvas.mpl_connect('pick_event', self.onpick)
|
self.cid = self.canvas.mpl_connect('pick_event', self.onpick)
|
||||||
self._station_onpick_ids = stations
|
self._station_onpick_ids = stations
|
||||||
if self.eventLoc:
|
if self.eventLoc:
|
||||||
lats, lons = self.eventLoc
|
lats, lons = self.eventLoc
|
||||||
self.sc_event = self.basemap.scatter(lons, lats, s=2*self.pointsize, facecolor='red',
|
self.sc_event = self.basemap.scatter(lons, lats, s=2*self.pointsize, facecolor='red', zorder=11,
|
||||||
latlon=True, zorder=11, label='Event (might be outside map region)', transform=ccrs.PlateCarree())
|
label='Event (might be outside map region)',
|
||||||
|
transform=ccrs.PlateCarree())
|
||||||
|
|
||||||
def scatter_picked_stations(self):
|
def scatter_picked_stations(self):
|
||||||
picks, uncertainties, lats, lons = self.get_picks_lat_lon()
|
picks, uncertainties, lats, lons = self.get_picks_lat_lon()
|
||||||
@ -508,24 +430,26 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
|
|
||||||
phase = self.comboBox_phase.currentText()
|
phase = self.comboBox_phase.currentText()
|
||||||
timeerrors = self.parameter['timeerrors{}'.format(phase)]
|
timeerrors = self.parameter['timeerrors{}'.format(phase)]
|
||||||
sizes = np.array([self.pointsize * ((5. - get_quality_class(uncertainty, timeerrors)))
|
sizes = np.array([self.pointsize * (5. - get_quality_class(uncertainty, timeerrors))
|
||||||
for uncertainty in uncertainties])
|
for uncertainty in uncertainties])
|
||||||
|
|
||||||
cmap = self.get_colormap()
|
cmap = self.get_colormap()
|
||||||
# workaround because of an issue with latlon transformation of arrays with len <3
|
|
||||||
if len(lons) <= 2 and len(lats) <= 2:
|
|
||||||
self.sc_picked = self.basemap.scatter(lons[0], lats[0], s=sizes, edgecolors='white', cmap=cmap,
|
|
||||||
c=picks[0], latlon=True, zorder=11, transform=ccrs.PlateCarree())
|
|
||||||
if len(lons) == 2 and len(lats) == 2:
|
|
||||||
self.sc_picked = self.basemap.scatter(lons[1], lats[1], s=sizes, edgecolors='white', cmap=cmap,
|
|
||||||
c=picks[1], latlon=True, zorder=11, transform=ccrs.PlateCarree())
|
|
||||||
if len(lons) > 2 and len(lats) > 2:
|
|
||||||
self.sc_picked = self.basemap.scatter(lons, lats, s=sizes, edgecolors='white', cmap=cmap,
|
self.sc_picked = self.basemap.scatter(lons, lats, s=sizes, edgecolors='white', cmap=cmap,
|
||||||
c=picks, latlon=True, zorder=11, label='Picked', transform=ccrs.PlateCarree())
|
c=picks, zorder=11, label='Picked', transform=ccrs.PlateCarree())
|
||||||
|
# workaround because of an issue with latlon transformation of arrays with len <3
|
||||||
|
# if len(lons) <= 2 and len(lats) <= 2:
|
||||||
|
# self.sc_picked = self.basemap.scatter(lons[0], lats[0], s=sizes, edgecolors='white', cmap=cmap,
|
||||||
|
# c=picks[0], zorder=11, transform=ccrs.PlateCarree())
|
||||||
|
# if len(lons) == 2 and len(lats) == 2:
|
||||||
|
# self.sc_picked = self.basemap.scatter(lons[1], lats[1], s=sizes, edgecolors='white', cmap=cmap,
|
||||||
|
# c=picks[1], zorder=11, transform=ccrs.PlateCarree())
|
||||||
|
# if len(lons) > 2 and len(lats) > 2:
|
||||||
|
# self.sc_picked = self.basemap.scatter(lons, lats, s=sizes, edgecolors='white', cmap=cmap,
|
||||||
|
# c=picks, zorder=11, label='Picked', transform=ccrs.PlateCarree())
|
||||||
|
|
||||||
def annotate_ax(self):
|
def annotate_ax(self):
|
||||||
self.annotations = []
|
self.annotations = []
|
||||||
stations, xs, ys = self.get_st_x_y_for_plot()
|
stations, xs, ys = self.get_st_lat_lon_for_plot()
|
||||||
# MP MP testing station highlighting if they have high impact on mean gradient of color map
|
# MP MP testing station highlighting if they have high impact on mean gradient of color map
|
||||||
# if self.picks_rel:
|
# if self.picks_rel:
|
||||||
# self.test_gradient()
|
# self.test_gradient()
|
||||||
@ -538,9 +462,8 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
color = 'lightgrey'
|
color = 'lightgrey'
|
||||||
if st in self.marked_stations:
|
if st in self.marked_stations:
|
||||||
color = 'red'
|
color = 'red'
|
||||||
self.annotations.append(self.main_ax.annotate(' %s' % st, xy=(x, y),
|
self.annotations.append(self.main_ax.annotate(' %s' % st, xy=(x, y), fontsize=self.pointsize/4.,
|
||||||
fontsize=self.pointsize/4., fontweight='semibold',
|
fontweight='semibold', color=color, zorder=14))
|
||||||
color=color, zorder=14))
|
|
||||||
self.legend = self.main_ax.legend(loc=1)
|
self.legend = self.main_ax.legend(loc=1)
|
||||||
self.legend.get_frame().set_facecolor((1, 1, 1, 0.75))
|
self.legend.get_frame().set_facecolor((1, 1, 1, 0.75))
|
||||||
|
|
||||||
@ -558,6 +481,7 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
self.cbax_bg.patch.set_facecolor((1, 1, 1, 0.75))
|
self.cbax_bg.patch.set_facecolor((1, 1, 1, 0.75))
|
||||||
return cbar
|
return cbar
|
||||||
|
|
||||||
|
|
||||||
def refresh_drawings(self, picks=None, autopicks=None):
|
def refresh_drawings(self, picks=None, autopicks=None):
|
||||||
self.picks_dict = picks
|
self.picks_dict = picks
|
||||||
self.autopicks_dict = autopicks
|
self.autopicks_dict = autopicks
|
||||||
@ -673,3 +597,8 @@ class Array_map(QtWidgets.QWidget):
|
|||||||
self.qmb = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning,
|
self.qmb = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning,
|
||||||
'Warning', message)
|
'Warning', message)
|
||||||
self.qmb.show()
|
self.qmb.show()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user