Source code for crikit.ui.widget_SG

"""
Widget for PlotEffect that adjusts the parameters appropriate for
Savitky-Golay filtering

Created on Thu Dec 22 11:18:36 2016

@author: chc
"""

from scipy.signal import savgol_filter as _sg

from crikit.ui.dialog_AbstractPlotEffect import (AbstractPlotEffectPlugin
                                                 as _AbstractPlotEffectPlugin)

from crikit.ui.qt_PlotEffect_SG import Ui_Form as _Ui_Form

[docs]class widgetSG(_AbstractPlotEffectPlugin): """ Widget for PlotEffect that adjusts the parameters appropriate for Savitky-Golay filtering Parameters ---------- window_length : int Window length polyorder : int Polynomial order parent : QObject Parent Methods --------- fcn : Performs the Savitky-Golay Signals: changed : a value in the UI has changed """ # Parameter dict that will be returned from PlotEffect # Will be updated later in program to contain all parameters # to pass to underlying algorithm parameters = {'name' : 'SG', 'long_name' : 'Savitky-Golay filtering'} # Labeling options for original data plot labels_orig = { 'x_label' : 'Wavenumber (cm$^{-1}$)', 'y_label' : 'Input Int (au)', 'title' : 'Original' } # Labeling options for affected data plot labels_affected = { 'x_label' : labels_orig['x_label'], 'y_label' : 'Difference (au)', 'title' : 'Difference' } def __init__(self, window_length=601, polyorder=2, parent = None): super(widgetSG, self).__init__(parent) self.ui = _Ui_Form() ### EDIT ### self.ui.setupUi(self) ### EDIT ### # Update parameter dict self.parameters['window_length'] = window_length self.parameters['polyorder'] = polyorder # Window size must be > polyorder if self.parameters['window_length'] <= self.parameters['polyorder']: self.parameters['window_length'] = self.parameters['polyorder'] + 1 # Window size must be odd if self.parameters['window_length'] % 2 == 1: pass else: self.parameters['window_length'] += 1 self.ui.spinBoxWinSize.setValue(self.parameters['window_length']) self.ui.spinBoxOrder.setValue(self.parameters['polyorder']) # SIGNALS & SLOTS self.ui.spinBoxWinSize.editingFinished.connect(self.changeWinSize) self.ui.spinBoxOrder.editingFinished.connect(self.changeOrder)
[docs] def fcn(self, data_in): """ If return list, [0] goes to original, [1] goes to affected """ baseline = _sg(data_in, window_length=self.parameters['window_length'], polyorder=self.parameters['polyorder'], axis=-1) data_out = data_in - baseline return [baseline, data_out]
[docs] def changeWinSize(self): temp_win_size = self.ui.spinBoxWinSize.value() if temp_win_size % 2 == 1: self.parameters['window_length'] = temp_win_size else: self.ui.spinBoxWinSize.setValue(temp_win_size + 1) self.parameters['window_length'] = temp_win_size + 1 self.changed.emit()
[docs] def changeOrder(self): self.parameters['polyorder'] = self.ui.spinBoxOrder.value() self.changed.emit()
if __name__ == '__main__': import sys as _sys from PyQt5.QtWidgets import (QApplication as _QApplication) app = _QApplication(_sys.argv) app.setStyle('Cleanlooks') win = widgetSG() win.show() app.exec_() print(win.parameters) _sys.exit()