class MapRealTime(BaseFrame, UiMapRealTime): def __init__(self, metadata): super(MapRealTime, self).__init__() self.setupUi(self) self.metadata = metadata # Map self.cartopy_canvas = CartopyCanvas(self.map) self.cartopy_canvas.global_map(0) self.cartopy_canvas.figure.subplots_adjust(left=0.00, bottom=0.055, right=0.97, top=0.920, wspace=0.0, hspace=0.0) self.retrivetool = retrieve() coordinates = self.retrivetool.get_inventory_coordinates(self.metadata) self.cartopy_canvas.global_map(0, plot_earthquakes=False, show_colorbar=False, show_stations=True, show_station_names=False, clear_plot=False, update=True, coordinates=coordinates, size=14, color="red") def plot_set_stations(self, stations_list): self.cartopy_canvas.global_map(0, plot_earthquakes=False, show_colorbar=False, show_stations=True, show_station_names=False, clear_plot=False, update=False, coordinates=stations_list, size=18, color="green") def plot_unset_stations(self, stations_list): self.cartopy_canvas.global_map(0, plot_earthquakes=False, show_colorbar=False, show_stations=True, show_station_names=False, clear_plot=False, update=False, coordinates=stations_list, size=18, color="black")
class DataDownloadFrame(BaseFrame, UiDataDownloadFrame): def __init__(self): super(BaseFrame, self).__init__() self.setupUi(self) self.inventory = {} self.network_list = [] self.stations_list = [] self.catalogBtn.clicked.connect(self.get_catalog) self.event_dataBtn.clicked.connect(self.download_events) self.plotstationsBtn.clicked.connect(self.stations) self.TimeBtn.clicked.connect(self.download_time_series) self.MetadataBtn.clicked.connect(self.download_stations_xml) self.LoadBtn.clicked.connect(self.load_inventory) # Map self.cartopy_canvas = CartopyCanvas(self.map) self.cartopy_canvas.global_map(0) self.cartopy_canvas.figure.subplots_adjust(left=0.00, bottom=0.055, right=0.97, top=0.920, wspace=0.0, hspace=0.0) self.activated_colorbar = True self.cartopy_canvas.on_double_click(self.on_click_matplotlib) self.cartopy_canvas.mpl_connect('key_press_event', self.key_pressed) self.cartopy_canvas.mpl_connect('button_press_event', self.press_right) self.actionOpen_Help.triggered.connect(lambda: self.open_help()) # signal doubleclick self.tableWidget.cellDoubleClicked.connect(self.get_coordinates) # help Documentation self.help = HelpDoc() # self.latitudes = [] self.longitudes = [] self.depths = [] self.magnitudes = [] def get_coordinates(self, row, column): lat = self.tableWidget.item(row, 1).data(0) lon = self.tableWidget.item(row, 2).data(0) lat30, lon30, lat90, lon90 = retrieve.get_circle(lat, lon) self.cartopy_canvas.global_map(0, clear_plot=False, show_distance_circles=True, lon30=lon30, lat30=lat30, lon90=lon90, lat90=lat90) #ax = self.cartopy_canvas.get_axe(0) #self.line1 = ax.scatter(lon30, lat30, s=8, c="white") #self.line2 = ax.scatter(lon90, lat90, s=8, c="white") def get_catalog(self): latitudes = [] longitudes = [] depths = [] magnitudes = [] starttime = convert_qdatetime_utcdatetime(self.start_dateTimeEdit) endtime = convert_qdatetime_utcdatetime(self.end_dateTimeEdit) minmagnitude = self.min_magnitudeCB.value() maxmagnitude = self.max_magnitudeCB.value() mindepth = self.depth_minCB.value() maxdepth = self.depth_maxCB.value() try: md = MessageDialog(self) md.hide() catalog = self.client.get_events(starttime=starttime, endtime=endtime, mindepth=mindepth, maxdepth=maxdepth, minmagnitude=minmagnitude, maxmagnitude=maxmagnitude) for event in catalog: otime = event.origins[0].time lat = event.origins[0].latitude lon = event.origins[0].longitude depth = event.origins[0].depth magnitude = event.magnitudes[0].mag magnitude_type = event.magnitudes[0].magnitude_type # append results latitudes.append(lat) longitudes.append(lon) depths.append(depth) magnitudes.append(magnitude) self.tableWidget.insertRow(self.tableWidget.rowCount()) self.tableWidget.setItem( self.tableWidget.rowCount() - 1, 0, QtWidgets.QTableWidgetItem(str(otime))) self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 1, QtWidgets.QTableWidgetItem(str(lat))) self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 2, QtWidgets.QTableWidgetItem(str(lon))) try: self.tableWidget.setItem( self.tableWidget.rowCount() - 1, 3, QtWidgets.QTableWidgetItem(str(depth / 1000))) except TypeError: self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 3, QtWidgets.QTableWidgetItem("N/A")) self.tableWidget.setItem( self.tableWidget.rowCount() - 1, 4, QtWidgets.QTableWidgetItem(str(magnitude))) self.tableWidget.setItem( self.tableWidget.rowCount() - 1, 5, QtWidgets.QTableWidgetItem(str(magnitude_type))) selection_range = QtWidgets.QTableWidgetSelectionRange( 0, 0, self.tableWidget.rowCount() - 1, self.tableWidget.columnCount() - 1) #print(selection_range.bottomRow()) self.longitudes = longitudes self.latitudes = latitudes self.depths = depths self.magnitudes = magnitudes self.tableWidget.setRangeSelected(selection_range, True) #print(selection_range) self.catalog_out = [latitudes, longitudes, depths, magnitudes] # plot earthquakes self.cartopy_canvas.global_map( 0, plot_earthquakes=True, show_colorbar=self.activated_colorbar, lat=latitudes, lon=longitudes, depth=depths, magnitude=magnitudes, resolution=self.typeCB.currentText()) self.activated_colorbar = False self.event_dataBtn.setEnabled(True) md.set_info_message("Catalog generated succesfully!!!") md.show() except: md.set_error_message( "Something wet wrong, Please check that you have: 1- Loaded Inventory, " "2- Search Parameters have sense") md.show() #obspy.clients.fdsn.client.Client def download_events(self): root_path = os.path.dirname(os.path.abspath(__file__)) if "darwin" == platform: dir_path = pw.QFileDialog.getExistingDirectory( self, 'Select Directory', root_path) else: dir_path = pw.QFileDialog.getExistingDirectory( self, 'Select Directory', root_path, pw.QFileDialog.DontUseNativeDialog) if not dir_path: return starttime = convert_qdatetime_utcdatetime(self.start_dateTimeEdit) endtime = convert_qdatetime_utcdatetime(self.end_dateTimeEdit) selected_items = self.tableWidget.selectedItems() event_dict = {} errors = False row = 0 column = 0 for i, item in enumerate(selected_items): event_dict.setdefault(row, {}) header = self.tableWidget.horizontalHeaderItem(column).text() event_dict[row][header] = item.text() column += 1 if i % 5 == 0 and i > 0: row += 1 column = 0 # Get stations networks = self.networksLE.text() stations = self.stationsLE.text() channels = self.channelsLE.text() if self.Earthworm_CB.isChecked(): ip_address = self.IP_LE.text() port = self.portLE.text() client_earthworm = obspy.clients.earthworm.Client( ip_address, int(port)) inventory = client_earthworm.get_stations(network=networks, station=stations, starttime=starttime, endtime=endtime) else: inventory = self.client.get_stations(network=networks, station=stations, starttime=starttime, endtime=endtime) model = obspy.taup.TauPyModel(model="iasp91") for event in event_dict.keys(): otime = obspy.UTCDateTime(event_dict[event]['otime']) evla = float(event_dict[event]['lat']) evlo = float(event_dict[event]['lon']) evdp = float(event_dict[event]['depth']) for ntwk in inventory: ntwknm = ntwk.code for stn in ntwk: stnm = stn.code stla = stn.latitude stlo = stn.longitude #stev = stn.elevation # Distance, azimuth and back_azimuth for event: m_dist, az, back_az = obspy.geodetics.base.gps2dist_azimuth( evla, evlo, stla, stlo) deg_dist = obspy.geodetics.base.kilometers2degrees(m_dist / 1000) atime = model.get_travel_times(source_depth_in_km=evdp, distance_in_degree=deg_dist, receiver_depth_in_km=0.0) p_onset = otime + atime[0].time start = p_onset - self.timebeforeCB.value() end = p_onset + self.timeafterCB.value() try: st = self.client.get_waveforms(ntwknm, stnm, "*", channels, start, end) print(st) self.write(st, dir_path) except: errors = True md = MessageDialog(self) md.set_error_message(ntwknm + "." + stnm + "." + channels + " " + "Couldn't download data") if errors: md = MessageDialog(self) md.set_info_message("Download completed with some errors") else: md = MessageDialog(self) md.set_info_message("Download completed") def download_stations_xml(self): fname = QtWidgets.QFileDialog.getSaveFileName()[0] starttime = convert_qdatetime_utcdatetime(self.start_dateTimeEdit) endtime = convert_qdatetime_utcdatetime(self.end_dateTimeEdit) networks = self.networksLE.text() stations = self.stationsLE.text() channels = self.channelsLE.text() inventory = self.client.get_stations(network=networks, station=stations, starttime=starttime, endtime=endtime, level="response") try: print("Getting metadata from ", networks, stations, channels, starttime, endtime) inventory.write(fname, format="STATIONXML") md = MessageDialog(self) md.set_info_message("Download completed") except: md = MessageDialog(self) md.set_error_message("Metadata coudn't be downloaded") def download_time_series(self): starttime = convert_qdatetime_utcdatetime(self.start_dateTimeEdit) endtime = convert_qdatetime_utcdatetime(self.end_dateTimeEdit) networks = self.networksLE.text() stations = self.stationsLE.text() channels = self.channelsLE.text() try: print("Getting data from ", networks, stations, channels, starttime, endtime) st = self.client.get_waveforms(networks, stations, "*", channels, starttime, endtime) if len(st) > 0: root_path = os.path.dirname(os.path.abspath(__file__)) if "darwin" == platform: dir_path = pw.QFileDialog.getExistingDirectory( self, 'Select Directory', root_path) else: dir_path = pw.QFileDialog.getExistingDirectory( self, 'Select Directory', root_path, pw.QFileDialog.DontUseNativeDialog) self.write(st, dir_path) except: md = MessageDialog(self) md.set_info_message("Couldn't download time series") def write(self, st, dir_path): if dir_path: n = len(st) try: for j in range(n): tr = st[j] t1 = tr.stats.starttime id = tr.id + "." + "D" + "." + str(t1.year) + "." + str( t1.julday) print(tr.id, "Writing data processed") path_output = os.path.join(dir_path, id) tr.write(path_output, format="MSEED") except: md = MessageDialog(self) md.set_info_message("Nothing to write") def load_inventory(self): #self.networksLE.setText("") self.stationsLE.setText("") self.channelsLE.setText("") starttime = convert_qdatetime_utcdatetime(self.start_dateTimeEdit) endtime = convert_qdatetime_utcdatetime(self.end_dateTimeEdit) self.retrivetool = retrieve() try: self.inventory, self.client = self.retrivetool.get_inventory( self.URL_CB.currentText(), starttime, endtime, self.networksLE.text(), self.stationsLE.text(), use_networks=self.netsCB.isChecked(), FDSN=self.FDSN_CB.isChecked(), ip_address=self.IP_LE.text(), port=self.portLE.text()) if self.inventory and self.client is not None: md = MessageDialog(self) md.set_info_message("Loaded Inventory from Address") self.plotstationsBtn.setEnabled(True) self.catalogBtn.setEnabled(True) else: md = MessageDialog(self) md.set_info_message( "The current client does not have a station service. " "Please check that you do not have selected -just specific nets- and the net " "field provide a net name that is not expected in this service" ) except: md = MessageDialog(self) md.set_info_message( "The current client does not have a station service") def stations(self): coordinates = self.retrivetool.get_inventory_coordinates( self.inventory) self.cartopy_canvas.global_map( 0, plot_earthquakes=False, show_colorbar=False, show_stations=True, show_station_names=self.namesCB.isChecked(), clear_plot=True, coordinates=coordinates, resolution=self.typeCB.currentText()) if len(self.latitudes) > 0 and len(self.longitudes) and len( self.depths) and len(self.magnitudes) > 0: self.cartopy_canvas.global_map( 0, plot_earthquakes=True, show_colorbar=self.activated_colorbar, clear_plot=False, lat=self.latitudes, lon=self.longitudes, depth=self.depths, magnitude=self.magnitudes, resolution=self.typeCB.currentText()) def on_click_matplotlib(self, event, canvas): self.retrivetool = retrieve() if isinstance(canvas, CartopyCanvas): x1, y1 = event.xdata, event.ydata data = self.retrivetool.get_station_id(x1, y1, self.inventory) if len(data[0]) > 0 and len(data[1]) > 0: if data[0] not in self.network_list: self.network_list.append(data[0]) self.networksLE.setText(",".join(self.network_list)) if data[1] not in self.stations_list: self.stations_list.append(data[1]) self.stationsLE.setText(",".join(self.stations_list)) def key_pressed(self, event): self.network_list = [] self.stations_list = [] if event.key == 'c': self.networksLE.setText(",".join(self.network_list)) self.stationsLE.setText(",".join(self.stations_list)) def press_right(self, event): self.retrivetool = retrieve() if event.dblclick: if event.button == 3: x1, y1 = event.xdata, event.ydata data = self.retrivetool.get_station_id(x1, y1, self.inventory) if len(data[0]) > 0 and len(data[1]) > 0: if data[0] in self.network_list: self.network_list.remove(data[0]) self.networksLE.setText(",".join(self.network_list)) if data[1] in self.stations_list: self.stations_list.remove(data[1]) self.stationsLE.setText(",".join(self.stations_list)) def open_help(self): self.help.show()