def plot_readout(self, draw_coi = False, num=None): """ wraps the readout plotting """ if not self._has_ridge: print("Need to extract a ridge first!") return pl.plot_readout(self.ridge_data, time_unit=self.time_unit_label, draw_coi = draw_coi)
def plot_readout(self, draw_coi=False, num=None): """ Wraps the readout plot from `pyboat.plotting.plot_readout`. Set *num* explicit to control the figure instance created. Uses default plotting styles. """ if self.ridge_data is None: logger.warning("Need to extract a ridge first!") return pl.plot_readout( self.ridge_data, time_unit=self.time_unit_label, draw_coi = draw_coi )
def initUI(self, position): self.setWindowTitle("Wavelet Results - " + str(self.signal_id)) self.setGeometry(700 + position, 260 + position, 750, 500) # embed the plotting canvas self.rCanvas = mkReadoutCanvas() main_frame = QWidget() self.rCanvas.setParent(main_frame) ntb = NavigationToolbar(self.rCanvas, main_frame) # --- plot the wavelet results --------- pl.plot_readout( self.ridge_data, self.time_unit, fig=self.rCanvas.fig, draw_coi=self.draw_coi, ) self.rCanvas.fig.subplots_adjust(wspace=0.3, left=0.1, top=0.98, right=0.95, bottom=0.15) # messes things up here :/ # self.rCanvas.fig.tight_layout() main_layout = QGridLayout() main_layout.addWidget(self.rCanvas, 0, 0, 9, 1) main_layout.addWidget(ntb, 10, 0, 1, 1) # add the save Button SaveButton = QPushButton("Save Results", self) SaveButton.clicked.connect(self.save_out) button_layout_h = QHBoxLayout() button_layout_h.addStretch(1) button_layout_h.addWidget(SaveButton) button_layout_h.addStretch(1) main_layout.addLayout(button_layout_h, 11, 0, 1, 1) self.setLayout(main_layout) self.show()
# pl.draw_detrended(ax, tvec, signal) pl.draw_trend(ax, tvec, trend) ppl.legend(ncol=2) ppl.tight_layout() # --- compute spectrum on the original signal --- modulus, wlet = pyboat.compute_spectrum(signal, dt, periods) # plot spectrum and ridge ax_sig, ax_spec = pl.mk_signal_modulus_ax(time_unit) pl.plot_signal_modulus((ax_sig, ax_spec), tvec, signal, modulus, periods) # --- compute spectrum on the detrended signal --- modulus, wlet = pyboat.compute_spectrum(detr_signal, dt, periods) # get maximum ridge ridge_ys = pyboat.get_maxRidge_ys(modulus) # evaluate along the ridge ridge_results = pyboat.eval_ridge(ridge_ys, wlet, signal, periods, tvec) # plot spectrum and ridge ax_sig2, ax_spec2 = pl.mk_signal_modulus_ax(time_unit) pl.plot_signal_modulus((ax_sig2, ax_spec2), tvec, signal, modulus, periods) pl.draw_Wavelet_ridge(ax_spec2, ridge_results) ppl.tight_layout() # plot readout pl.plot_readout(ridge_results)
def do_the_loop(self): ''' Uses the explicitly parsed self.wlet_pars to control signal analysis settings. Takes general analysis Parameters self.parentDV.dt self.parentDV.time_unit and the DataFrame self.parentDV.df from the parent DataViewer. Reads additional settings from this Batch Process Window. ''' if self.export_options.isChecked(): OutPath = self.get_OutPath() if OutPath is None: return periods = np.linspace(self.wlet_pars['T_min'], self.wlet_pars['T_max'], self.wlet_pars['step_num']) # retrieve batch settings power_thresh = self.get_thresh() rsmooth = self.get_ridge_smooth() ridge_results = {} for i, signal_id in enumerate(self.parentDV.df): # log to terminal print(f"processing {signal_id}..") # sets parentDV.raw_signal and parentDV.tvec succ = self.parentDV.vector_prep(signal_id) # ui silently passes over.. if not succ: print(f"Can't process signal {signal_id}..") continue # detrend?! if self.parentDV.cb_use_detrended.isChecked(): trend = self.parentDV.calc_trend() signal = self.parentDV.raw_signal - trend else: signal = self.parentDV.raw_signal # amplitude normalization? if self.parentDV.cb_use_envelope.isChecked(): if self.debug: print('Calculating envelope with L=', self.wlet_pars['L']) signal = pyboat.normalize_with_envelope( signal, self.wlet_pars['L'], self.parentDV.dt) # compute the spectrum modulus, wlet = pyboat.compute_spectrum(signal, self.parentDV.dt, periods) # get maximum ridge ridge = pyboat.get_maxRidge_ys(modulus) # generate time vector tvec = np.arange(len(signal)) * self.parentDV.dt # evaluate along the ridge ridge_data = pyboat.eval_ridge(ridge, wlet, signal, periods, tvec, power_thresh, smoothing_wsize=rsmooth) ridge_results[signal_id] = (ridge_data) # -- Save out individual results -- if self.cb_specs.isChecked(): # plot spectrum and ridge ax_sig, ax_spec = pl.mk_signal_modulus_ax( self.parentDV.time_unit) pl.plot_signal_modulus((ax_sig, ax_spec), tvec, signal, modulus, periods, p_max=self.wlet_pars['p_max']) pl.draw_Wavelet_ridge(ax_spec, ridge_data) plt.tight_layout() fname = f'{OutPath}/{signal_id}_wspec.png' if self.debug: print(f'Plotting and saving {signal_id} to {fname}') plt.savefig(fname) plt.close() if self.cb_readout_plots.isChecked(): pl.plot_readout(ridge_data) fname = f'{OutPath}/{signal_id}_readout.png' if self.debug: print(f'Plotting and saving {signal_id} to {fname}') plt.savefig(fname) plt.close() if self.cb_readout.isChecked(): fname = f'{OutPath}/{signal_id}_readout.csv' if self.debug: print(f'Saving ridge reatout to {fname}') ridge_data.to_csv(fname, sep=',', float_format='%.3f', index=False) self.progress.setValue(i) return ridge_results
def do_the_loop(self): ''' Uses the explicitly parsed self.wlet_pars to control signal analysis settings. Takes general analysis Parameters self.parentDV.dt self.parentDV.time_unit and the DataFrame self.parentDV.df from the parent DataViewer. Reads additional settings from this Batch Process Window. ''' EmptyRidge = 0 if self.export_options.isChecked(): OutPath = self.get_OutPath() if OutPath is None: return periods = np.linspace(self.wlet_pars['T_min'], self.wlet_pars['T_max'], self.wlet_pars['step_num']) # retrieve batch settings power_thresh = self.get_thresh() rsmooth = self.get_ridge_smooth() # results get stored here ridge_results = {} df_fouriers = pd.DataFrame(index=periods) df_fouriers.index.name = 'period' for i, signal_id in enumerate(self.parentDV.df): # log to terminal print(f"processing {signal_id}..") # sets parentDV.raw_signal and parentDV.tvec succ = self.parentDV.vector_prep(signal_id) # ui silently passes over.. if not succ: print(f"Can't process signal {signal_id}..") continue # detrend?! if self.parentDV.cb_use_detrended.isChecked(): trend = self.parentDV.calc_trend() signal = self.parentDV.raw_signal - trend else: signal = self.parentDV.raw_signal # amplitude normalization? if self.parentDV.cb_use_envelope.isChecked(): if self.debug: print('Calculating envelope with L=', self.wlet_pars['L']) signal = pyboat.normalize_with_envelope( signal, self.wlet_pars['L'], self.parentDV.dt) # compute the spectrum modulus, wlet = pyboat.compute_spectrum(signal, self.parentDV.dt, periods) # get maximum ridge ridge = pyboat.get_maxRidge_ys(modulus) # generate time vector tvec = np.arange(len(signal)) * self.parentDV.dt # evaluate along the ridge ridge_data = pyboat.eval_ridge(ridge, wlet, signal, periods, tvec, power_thresh, smoothing_wsize=rsmooth) # from ridge thresholding.. if ridge_data.empty: EmptyRidge += 1 else: ridge_results[signal_id] = ridge_data # time average the spectrum, all have shape len(periods)! averaged_Wspec = np.mean(modulus, axis=1) df_fouriers[signal_id] = averaged_Wspec # -- Save out individual results -- if self.cb_specs.isChecked(): # plot spectrum and ridge ax_sig, ax_spec = pl.mk_signal_modulus_ax( self.parentDV.time_unit) pl.plot_signal_modulus((ax_sig, ax_spec), tvec, signal, modulus, periods, p_max=self.wlet_pars['p_max']) pl.draw_Wavelet_ridge(ax_spec, ridge_data) plt.tight_layout() fname = os.path.join(OutPath, f'{signal_id}_wspec.png') if self.debug: print( f'Plotting and saving spectrum {signal_id} to {fname}') plt.savefig(fname, dpi=DPI) plt.close() if self.cb_specs_noridge.isChecked(): # plot spectrum without ridge ax_sig, ax_spec = pl.mk_signal_modulus_ax( self.parentDV.time_unit) pl.plot_signal_modulus((ax_sig, ax_spec), tvec, signal, modulus, periods, p_max=self.wlet_pars['p_max']) plt.tight_layout() fname = os.path.join(OutPath, f'{signal_id}_wspecNR.png') if self.debug: print( f'Plotting and saving spectrum {signal_id} to {fname}') plt.savefig(fname, dpi=DPI) plt.close() if self.cb_readout_plots.isChecked() and not ridge_data.empty: pl.plot_readout(ridge_data) fname = os.path.join(OutPath, f'{signal_id}_readout.png') if self.debug: print(f'Plotting and saving {signal_id} to {fname}') plt.savefig(fname, dpi=DPI) plt.close() if self.cb_readout.isChecked() and not ridge_data.empty: fname = os.path.join(OutPath, f'{signal_id}_readout.csv') if self.debug: print(f'Saving ridge reatout to {fname}') ridge_data.to_csv(fname, sep=',', float_format='%.3f', index=False) self.progress.setValue(i) if EmptyRidge > 0: self.NoRidges = MessageWindow( f'{EmptyRidge} ridge readouts entirely below threshold..', 'Discarded ridges') return ridge_results, df_fouriers
def do_the_loop(self): """ Uses the explicitly parsed self.wlet_pars to control signal analysis settings. Takes general analysis Parameters self.parentDV.dt self.parentDV.time_unit and the DataFrame self.parentDV.df from the parent DataViewer. Reads additional settings from this Batch Process Window. """ EmptyRidge = 0 if self.export_options.isChecked(): OutPath = self.get_OutPath() if OutPath is None: return periods = np.linspace(self.wlet_pars["Tmin"], self.wlet_pars["Tmax"], self.wlet_pars["step_num"]) # retrieve batch settings power_thresh = self.get_thresh() rsmooth = self.get_ridge_smooth() # results get stored here ridge_results = {} df_fouriers = pd.DataFrame(index=periods) df_fouriers.index.name = "period" for i, signal_id in enumerate(self.parentDV.df): # log to terminal print(f"processing {signal_id}..") # sets parentDV.raw_signal and parentDV.tvec succ = self.parentDV.vector_prep(signal_id) # ui silently passes over.. if not succ: print(f"Warning, can't process signal {signal_id}..") continue # detrend?! if self.parentDV.cb_use_detrended.isChecked(): trend = self.parentDV.calc_trend() signal = self.parentDV.raw_signal - trend else: signal = self.parentDV.raw_signal # amplitude normalization? if self.parentDV.cb_use_envelope.isChecked(): if self.debug: print("Calculating envelope with L=", self.wlet_pars["window_size"]) signal = pyboat.normalize_with_envelope( signal, self.wlet_pars["window_size"], self.parentDV.dt) # compute the spectrum modulus, wlet = pyboat.compute_spectrum(signal, self.parentDV.dt, periods) # get maximum ridge ridge = pyboat.get_maxRidge_ys(modulus) # generate time vector tvec = np.arange(len(signal)) * self.parentDV.dt # evaluate along the ridge ridge_data = pyboat.eval_ridge( ridge, wlet, signal, periods, tvec, power_thresh, smoothing_wsize=rsmooth, ) # from ridge thresholding.. if ridge_data.empty: EmptyRidge += 1 else: ridge_results[signal_id] = ridge_data # time average the spectrum, all have shape len(periods)! averaged_Wspec = np.mean(modulus, axis=1) df_fouriers[signal_id] = averaged_Wspec # -- Save out individual results -- settings = QSettings() float_format = settings.value('float_format', '%.3f') graphics_format = settings.value('graphics_format', 'png') exbox_checked = self.export_options.isChecked() if exbox_checked and self.cb_filtered_sigs.isChecked(): signal_df = pd.DataFrame() signal_df['signal'] = signal signal_df.index = tvec signal_df.index.name = 'time' fname = os.path.join(OutPath, f"{signal_id}_filtered.csv") if self.debug: print(f"Saving filtered signal to {fname}") signal_df.to_csv(fname, sep=",", float_format=float_format, index=True, header=True) if exbox_checked and self.cb_specs.isChecked(): # plot spectrum and ridge ax_sig, ax_spec = pl.mk_signal_modulus_ax( self.parentDV.time_unit) pl.plot_signal_modulus( (ax_sig, ax_spec), tvec, signal, modulus, periods, p_max=self.wlet_pars["pow_max"], ) pl.draw_Wavelet_ridge(ax_spec, ridge_data) plt.tight_layout() fname = os.path.join(OutPath, f"{signal_id}_wspec.{graphics_format}") if self.debug: print( f"Plotting and saving spectrum {signal_id} to {fname}") plt.savefig(fname, dpi=DPI) plt.close() if exbox_checked and self.cb_specs_noridge.isChecked(): # plot spectrum without ridge ax_sig, ax_spec = pl.mk_signal_modulus_ax( self.parentDV.time_unit) pl.plot_signal_modulus( (ax_sig, ax_spec), tvec, signal, modulus, periods, p_max=self.wlet_pars["pow_max"], ) plt.tight_layout() fname = os.path.join(OutPath, f"{signal_id}_wspecNR.{graphics_format}") if self.debug: print( f"Plotting and saving spectrum {signal_id} to {fname}") plt.savefig(fname, dpi=DPI) plt.close() if exbox_checked and self.cb_readout_plots.isChecked( ) and not ridge_data.empty: pl.plot_readout(ridge_data) fname = os.path.join(OutPath, f"{signal_id}_readout.{graphics_format}") if self.debug: print(f"Plotting and saving {signal_id} to {fname}") plt.savefig(fname, dpi=DPI) plt.close() if exbox_checked and self.cb_readout.isChecked( ) and not ridge_data.empty: fname = os.path.join(OutPath, f"{signal_id}_readout.csv") if self.debug: print(f"Saving ridge readout to {fname}") ridge_data.to_csv(fname, sep=",", float_format=float_format, index=False) self.progress.setValue(i) if EmptyRidge > 0: msg = f"{EmptyRidge} ridge readouts entirely below threshold.." msgBox = QMessageBox() msgBox.setWindowTitle("Discarded Ridges") msgBox.setText(msg) msgBox.exec() return ridge_results, df_fouriers