class SpectrogramWindow(QWidget): """ This is the class for the spectrogram window """ def __init__(self, station_list): super(QWidget, self).__init__() self.layout = QGridLayout(self) self.station_list = station_list self.hidden = False self.spectrogram_1 = PlotWidget(self) self.spectrogram_1.setFixedWidth(400) self.spectrogram_1.setFixedHeight(550) self.spectrogram_2 = PlotWidget(self) self.spectrogram_2.setFixedWidth(400) self.station_box_1 = QComboBox(self) self.station_box_2 = QComboBox(self) self.waiting_traces = [None, None] self.waiting_p_picks = [None, None] self.filter_stats = FilterStats(True) self.spectrogram_threads = [None, None] self.spectrogram_threads[0] = SpectrogramCalculatorThread( self.filter_stats, 0) self.spectrogram_threads[0].signal.connect(self.plotSpectrogram) self.spectrogram_threads[1] = SpectrogramCalculatorThread( self.filter_stats, 1) self.spectrogram_threads[1].signal.connect(self.plotSpectrogram) self.filter_widget = FilterWidget(self, self.filter_stats) self.layout.addWidget(self.spectrogram_1, 0, 0, 1, 2) self.layout.addWidget(self.spectrogram_2, 0, 2, 1, 2) self.layout.addWidget(self.station_box_1, 1, 0) self.layout.addWidget(self.station_box_2, 1, 2) self.layout.addWidget(self.filter_widget, 2, 0) self.station_box_1.activated.connect(self.replotSpectrogram1) self.station_box_2.activated.connect(self.replotSpectrogram2) self.setStationsFromNewEvent() def closeEvent(self, event): """ This function will be called when the spectrogramWindow Closes """ self.hidden = True def replotSpectrogram1(self): """ This function is to be used only by station_box_1 """ self.getTraceForSpectrogramThread(0) def replotSpectrogram2(self): """ This function is to be used only by station_box_2 """ self.getTraceForSpectrogramThread(1) def getTraceForSpectrogramThread(self, spectrogram_id): """ Fetch correct trace for the spectrogram_thread. Choose this from the value from station_box_1 or station_box_2 """ station_name = None if spectrogram_id == 0: station_name = self.station_box_1.currentText() elif spectrogram_id == 1: station_name = self.station_box_2.currentText() trace, p_pick = self.station_list.getCurrentTraceAndPPickForStation( station_name) if trace is None: return self.calculateSpectrogram(trace, p_pick, spectrogram_id) def setStationsFromNewEvent(self): """ Set the focused event to spectrogram window """ stations = [x[0] for x in self.station_list.getOrderedStationList()] if len(stations) < 2: return self.station_box_1.clear() self.station_box_2.clear() for stat in stations: self.station_box_1.addItem(stat) self.station_box_2.addItem(stat) self.station_box_1.setCurrentIndex(0) self.station_box_2.setCurrentIndex(1) self.getTraceForSpectrogramThread(0) self.getTraceForSpectrogramThread(1) def filterChange(self): """ Function that is called when the filters have been changed """ self.getTraceForSpectrogramThread(0) self.getTraceForSpectrogramThread(1) def calculateSpectrogram(self, waveform_trace, p_pick, spectrogram_id): """ Function for calculating a spectrogram """ if self.spectrogram_threads[spectrogram_id].running: self.waiting_traces[spectrogram_id] = waveform_trace self.waiting_p_picks[spectrogram_id] = p_pick self.spectrogram_threads[spectrogram_id].interrupt = True else: self.spectrogram_threads[ spectrogram_id].waveform_trace = waveform_trace self.spectrogram_threads[spectrogram_id].p_pick = p_pick self.spectrogram_threads[spectrogram_id].running = True self.spectrogram_threads[spectrogram_id].start() def plotSpectrogram(self, return_values): """ Function for plotting a spectrogram """ spectrogram_id, spectrogram, sample_frequencies, sample_times = return_values print("Window {0} done".format(spectrogram_id)) self.spectrogram_threads[spectrogram_id].running = False self.spectrogram_threads[spectrogram_id].interrupt = False if self.waiting_traces[spectrogram_id] is not None: self.calculateSpectrogram(self.waiting_traces[spectrogram_id], self.waiting_p_picks[spectrogram_id], spectrogram_id) self.waiting_traces[spectrogram_id] = None self.waiting_p_picks[spectrogram_id] = None if spectrogram is None: return if spectrogram_id == 0: self.spectrogram_1.clear() self.spectrogram_1.addItem(spectrogram) elif spectrogram_id == 1: self.spectrogram_2.clear() self.spectrogram_2.addItem(spectrogram)