Exemplo n.º 1
0
    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")
Exemplo n.º 2
0
    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")
Exemplo n.º 3
0
    def on_click_polarization(self):
        time1 = convert_qdatetime_utcdatetime(self.dateTimeEdit_4)
        time2 = convert_qdatetime_utcdatetime(self.dateTimeEdit_5)
        sd = PolarizationAnalyis(self.vertical_component_file,
                                 self.north_component_file,
                                 self.east_component_file)
        try:
            var = sd.polarize(time1, time2, self.doubleSpinBox_winlen.value(),
                              self.freq_minDB.value(), self.freq_maxDB.value())

            artist = self.canvas_pol.plot(
                var['time'],
                var[self.comboBox_yaxis.currentText()],
                0,
                clear_plot=True,
                linewidth=0.5)
            self.canvas_pol.set_xlabel(0, "Time [s]")
            self.canvas_pol.set_ylabel(0, self.comboBox_yaxis.currentText())
            self.canvas_pol.set_yaxis_color(self.canvas_pol.get_axe(0),
                                            artist.get_color(),
                                            is_left=True)
            self.canvas_pol.plot(var['time'],
                                 var[self.comboBox_polarity.currentText()],
                                 0,
                                 is_twinx=True,
                                 color="red",
                                 linewidth=0.5)
            self.canvas_pol.set_ylabel_twinx(
                0, self.comboBox_polarity.currentText())
        except InvalidFile:
            self.info_message(
                "Invalid mseed files. Please, make sure to select all the three components (Z, N, E) "
                "for polarization.")
        except ValueError as error:
            self.info_message(str(error))
Exemplo n.º 4
0
    def on_click_rotate(self, canvas):
        time1 = convert_qdatetime_utcdatetime(self.dateTimeEdit_4)
        time2 = convert_qdatetime_utcdatetime(self.dateTimeEdit_5)

        try:
            sd = SeismogramData(self.vertical_component_file)
            z = sd.get_waveform()
            sd = SeismogramData(self.north_component_file)
            n = sd.get_waveform()
            sd = SeismogramData(self.east_component_file)
            e = sd.get_waveform()
            seismograms = [z, n, e]
            time = z.times("matplotlib")
            self._st = Stream(traces=seismograms)
            for index, data in enumerate(seismograms):
                self.canvas.plot(time, data, index, color="black", linewidth=0.5)
                info = "{}.{}.{}".format(self._st[index].stats.network, self._st[index].stats.station,
                                         self._st[index].stats.channel)
                ax = self.canvas.get_axe(0)
                ax.set_xlim(time1.matplotlib_date, time2.matplotlib_date)
                formatter = mdt.DateFormatter('%Y/%m/%d/%H:%M:%S')
                ax.xaxis.set_major_formatter(formatter)
                self.canvas.set_plot_label(index, info)

            self.canvas.set_xlabel(2, "Time (s)")

            if 'sourcedoublecouple' in self.params:
                self.focmec_canvas.drawSynthFocMec(0, first_polarity = self.params['sourcedoublecouple'], mti = [])
            if 'sourcemomenttensor' in self.params:
                self.focmec_canvas.drawSynthFocMec(0, first_polarity= [], mti=self.params['sourcemomenttensor'])

        except InvalidFile:
            self.info_message("Invalid mseed files. Please, make sure you have generated correctly the synthetics")

        self.__map_coords()
Exemplo n.º 5
0
    def on_click_rotate(self, canvas):

        time1 = convert_qdatetime_utcdatetime(self.dateTimeEdit_4)
        time2 = convert_qdatetime_utcdatetime(self.dateTimeEdit_5)
        angle = self.degreeSB.value()
        incidence_angle = self.incidenceSB.value()
        method = self.methodCB.currentText()
        parameters = self.parameters.getParameters()

        try:
            sd = PolarizationAnalyis(self.vertical_component_file,
                                     self.north_component_file,
                                     self.east_component_file)

            time, z, r, t, st = sd.rotate(self.inventory,
                                          time1,
                                          time2,
                                          angle,
                                          incidence_angle,
                                          method=method,
                                          parameters=parameters,
                                          trim=True)
            self._z = z
            self._r = r
            self._t = t
            self._st = st
            rotated_seismograms = [z, r, t]
            for index, data in enumerate(rotated_seismograms):
                self.canvas.plot(time,
                                 data,
                                 index,
                                 color="black",
                                 linewidth=0.5)
                info = "{}.{}.{}".format(self._st[index].stats.network,
                                         self._st[index].stats.station,
                                         self._st[index].stats.channel)
                ax = self.canvas.get_axe(0)
                ax.set_xlim(sd.t1.matplotlib_date, sd.t2.matplotlib_date)
                formatter = mdt.DateFormatter('%Y/%m/%d/%H:%M:%S')
                ax.xaxis.set_major_formatter(formatter)
                self.canvas.set_plot_label(index, info)

            canvas.set_xlabel(2, "Time (s)")

        except InvalidFile:
            self.info_message(
                "Invalid mseed files. Please, make sure to select all the three components (Z, N, E) "
                "for rotate.")
        except ValueError as error:
            self.info_message(str(error))
Exemplo n.º 6
0
 def FK_plot(self):
     self.canvas_stack.set_new_subplot(nrows=1, ncols=1)
     starttime = convert_qdatetime_utcdatetime(self.starttime_date)
     endtime = convert_qdatetime_utcdatetime(self.endtime_date)
     selection = self.inventory.select(station=self.stationLE.text(),
                                       channel=self.channelLE.text())
     if self.trimCB.isChecked():
         wavenumber = array_analysis.array()
         relpower, abspower, AZ, Slowness, T = wavenumber.FK(
             self.st, selection, starttime, endtime, self.fminFK_bind.value,
             self.fmaxFK_bind.value, self.smaxFK_bind.value,
             self.slow_grid_bind.value, self.timewindow_bind.value,
             self.overlap_bind.value)
         self.canvas_fk.scatter3d(T,
                                  relpower,
                                  relpower,
                                  axes_index=0,
                                  clabel="Power [dB]")
         self.canvas_fk.scatter3d(T,
                                  abspower,
                                  relpower,
                                  axes_index=1,
                                  clabel="Power [dB]")
         self.canvas_fk.scatter3d(T,
                                  AZ,
                                  relpower,
                                  axes_index=2,
                                  clabel="Power [dB]")
         self.canvas_fk.scatter3d(T,
                                  Slowness,
                                  relpower,
                                  axes_index=3,
                                  clabel="Power [dB]")
         self.canvas_fk.set_ylabel(0, " Rel Power ")
         self.canvas_fk.set_ylabel(1, " Absolute Power ")
         self.canvas_fk.set_ylabel(2, " Back Azimuth ")
         self.canvas_fk.set_ylabel(3, " Slowness [s/km] ")
         self.canvas_fk.set_xlabel(3, " Time [s] ")
         ax = self.canvas_fk.get_axe(3)
         formatter = mdt.DateFormatter('%H:%M:%S')
         ax.xaxis.set_major_formatter(formatter)
         ax.xaxis.set_tick_params(rotation=30)
     else:
         md = MessageDialog(self)
         md.set_info_message("Please select dates and then check Trim box")
Exemplo n.º 7
0
    def plot_seismograms(self):
        parameters = self.get_inversion_parameters()
        lat = float(parameters['latitude'])
        lon = float(parameters['longitude'])
        starttime = convert_qdatetime_utcdatetime(self.starttime_date)
        endtime = convert_qdatetime_utcdatetime(self.endtime_date)
        diff = endtime - starttime

        parameters = self.parameters.getParameters()
        all_traces = []
        obsfiles = MseedUtil.get_mseed_files(self.root_path_bind.value)
        obsfiles.sort()

        for file in obsfiles:
            sd = SeismogramDataAdvanced(file)
            if self.trimCB.isChecked() and diff >= 0:
                tr = sd.get_waveform_advanced(
                    parameters,
                    self.inventory,
                    filter_error_callback=self.filter_error_message,
                    start_time=starttime,
                    end_time=endtime)
            else:
                tr = sd.get_waveform_advanced(
                    parameters,
                    self.inventory,
                    filter_error_callback=self.filter_error_message)

            all_traces.append(tr)

        self.st = Stream(traces=all_traces)
        self.stream_frame = MatplotlibFrame(self.st, type='normal')
        self.stream_frame.show()

        if self.st:
            min_dist = self.min_distCB.value()
            max_dist = self.max_distCB.value()
            mt = MTIManager(self.st, self.inventory, lat, lon, min_dist,
                            max_dist)
            [self.stream, self.deltas,
             self.stations_isola_path] = mt.get_stations_index()
Exemplo n.º 8
0
    def get_data(self):
        file = self.file_selector.file_path
        starttime = convert_qdatetime_utcdatetime(self.starttime_date)
        endtime = convert_qdatetime_utcdatetime(self.endtime_date)
        diff = endtime - starttime
        parameters = self.parameters.getParameters()
        sd = SeismogramDataAdvanced(file)

        if self.trimCB.isChecked() and diff >= 0:
            tr = sd.get_waveform_advanced(
                parameters,
                self.inventory,
                filter_error_callback=self.filter_error_message,
                start_time=starttime,
                end_time=endtime)
        else:
            tr = sd.get_waveform_advanced(
                parameters,
                self.inventory,
                filter_error_callback=self.filter_error_message)

        t = tr.times()
        return tr, t
Exemplo n.º 9
0
    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")
Exemplo n.º 10
0
 def get_inversion_parameters(self):
     parameters = {
         'latitude': self.latDB.value(),
         'longitude': self.lonDB.value(),
         'depth': self.depthDB.value(),
         'origin_time': convert_qdatetime_utcdatetime(self.origin_time),
         'location_unc': self.location_uncDB.value(),
         'time_unc': self.timeDB.value(),
         'magnitude': self.magnitudeDB.value(),
         'depth_unc': self.depth_uncDB.value(),
         'freq_min': self.freq_min_DB.value(),
         'freq_max': self.freq_max_DB.value(),
         'deviatoric': self.deviatoricCB.isChecked(),
         'circle_shape': self.circle_shapeCB.isChecked(),
         'GFs': self.gfCB.isChecked(),
         'covariance': self.covarianceCB.isChecked()
     }
     return parameters
Exemplo n.º 11
0
    def get_time_window(self):

        t1 = convert_qdatetime_utcdatetime(self.starttime_date)
        t2 = convert_qdatetime_utcdatetime(self.endtime_date)

        return t1, t2
Exemplo n.º 12
0
    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()
Exemplo n.º 13
0
 def end_time(self):
     return convert_qdatetime_utcdatetime(self.endDateTimeEdit)
Exemplo n.º 14
0
 def start_time(self):
     return convert_qdatetime_utcdatetime(self.startDateTimeEdit)
Exemplo n.º 15
0
 def event_time(self):
     return convert_qdatetime_utcdatetime(self.originDateTimeEdit)
Exemplo n.º 16
0
    def plot_seismograms(self, FK=True):

        if FK:
            starttime = convert_qdatetime_utcdatetime(self.starttime_date)
            endtime = convert_qdatetime_utcdatetime(self.endtime_date)
        else:
            starttime = convert_qdatetime_utcdatetime(self.starttime_date_BP)
            endtime = convert_qdatetime_utcdatetime(self.endtime_date_BP)

        diff = endtime - starttime

        if FK:
            file_path = self.root_pathFK_bind.value
        else:
            file_path = self.root_pathBP_bind.value

        obsfiles = []

        for dirpath, _, filenames in os.walk(file_path):
            for f in filenames:
                if f != ".DS_Store":
                    obsfiles.append(os.path.abspath(os.path.join(dirpath, f)))

        obsfiles.sort()
        parameters = self.__parameters.getParameters()
        all_traces = []
        trace_number = 0

        for file in obsfiles:
            sd = SeismogramDataAdvanced(file)

            if FK:
                if self.trimCB.isChecked() and diff >= 0:
                    tr = sd.get_waveform_advanced(
                        parameters,
                        self.inventory,
                        filter_error_callback=self.filter_error_message,
                        start_time=starttime,
                        end_time=endtime,
                        trace_number=trace_number)
                else:
                    tr = sd.get_waveform_advanced(
                        parameters,
                        self.inventory,
                        filter_error_callback=self.filter_error_message,
                        trace_number=trace_number)
            else:
                if self.trimCB_BP.isChecked() and diff >= 0:
                    tr = sd.get_waveform_advanced(
                        parameters,
                        self.inventory,
                        filter_error_callback=self.filter_error_message,
                        start_time=starttime,
                        end_time=endtime,
                        trace_number=trace_number)
                else:
                    tr = sd.get_waveform_advanced(
                        parameters,
                        self.inventory,
                        filter_error_callback=self.filter_error_message,
                        trace_number=trace_number)

            all_traces.append(tr)
            trace_number = trace_number + 1

        self.st = Stream(traces=all_traces)

        if FK:
            if self.selectCB.isChecked():
                self.st = self.st.select(station=self.stationLE.text(),
                                         channel=self.channelLE.text())

        else:
            if self.selectCB_BP.isChecked():
                self.st = self.st.select(network=self.stationLE_BP.text(),
                                         station=self.stationLE_BP.text(),
                                         channel=self.channelLE_BP.text())

        self.stream_frame = MatplotlibFrame(self.st, type='normal')
        self.stream_frame.show()
Exemplo n.º 17
0
    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")