Source code for crikit.ui.widget_ArPLS
"""
Widget for PlotEffect that adjusts the parameters appropriate for
asymmetrically reweights penalized least squares (arPLS)
Created on Thu Dec 22 01:16:01 2016
@author: chc
"""
import numpy as _np
from crikit.ui.dialog_AbstractPlotEffect import (AbstractPlotEffectPlugin
as
_AbstractPlotEffectPlugin)
from crikit.ui.qt_PlotEffect_ArPLS import Ui_Form as _Ui_Form
from crikit.ui.widget_scientificspin import (ScientificDoubleSpinBox as
_SciSpin)
from crikit.preprocess.algorithms.arpls import ArPlsCvxopt as _Arpls
[docs]class widgetArPLS(_AbstractPlotEffectPlugin):
"""
Widget for PlotEffect that adjusts the parameters appropriate for
asymmetrically reweights penalized least squares (arPLS)
Parameters
----------
smoothness_param : float, optional (default, 1e3)
Smoothness parameter
redux : int, optional (default, 1)
Reduction parameter to sub-sample input signal
order : int, optional (default, 2)
Derivative regularization term. Order=2 for Whittaker-smoother
fix_end_points : bool, optional (default, False)
Weight the baseline endpoints to approach equally the end-points
of the data.
max_iter : int, optional (default, 100)
Maximum number of least-squares iterations to perform
min_diff : float, optional (default, 1e-5)
Break iterative calculations if difference is less than min_diff
parent: QObject
Parent
Methods
-------
fcn : Perform arPLS detrending
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' : 'arPLS',
'long_name' : 'Asymmetrically reweighted penalized least \
squares'}
# 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' : 'Output Int (au)',
'title' : 'Detrended'
}
def __init__(self, smoothness_param=1, redux=1, fix_end_points=True,
max_iter=100, min_diff=1e-6, parent = None):
super(widgetArPLS, self).__init__(parent) ### EDIT ###
self.ui = _Ui_Form()
self.ui.setupUi(self)##
# Update parameter dict
self.parameters['smoothness_param'] = smoothness_param
self.parameters['redux'] = redux
self.parameters['fix_end_points'] = fix_end_points
self.parameters['max_iter'] = max_iter
self.parameters['min_diff'] = min_diff
# Lambda/smoothness parameter rlated
self.ui.label_2.setText('{} (Smoothness)'.format(u'\u03BB'))
self.ui.spinBoxLambda = _SciSpin()
self.ui.verticalLayout_2.insertWidget(1, self.ui.spinBoxLambda)
self.ui.spinBoxLambda.setValue(self.parameters['smoothness_param'])
# Redux factor
self.ui.spinBoxRedux.setValue(self.parameters['redux'])
# Fixed ends
self.ui.checkBox.setChecked(self.parameters['fix_end_points'])
# Max iterations
self.ui.spinBoxMaxIter.setValue(self.parameters['max_iter'])
# Min Difference
self.ui.spinBoxMinDiff = _SciSpin()
self.ui.verticalLayout_9.insertWidget(4, self.ui.spinBoxMinDiff)
self.ui.spinBoxMinDiff.setValue(self.parameters['min_diff'])
# SIGNALS & SLOTS
self.ui.spinBoxLambda.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxRedux.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxMaxIter.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxMinDiff.editingFinished.connect(self.spinBoxChanged)
self.ui.checkBox.clicked.connect(self.selectFixedEnds)
[docs] def fcn(self, data_in):
"""
If return list, [0] goes to original, [1] goes to affected
"""
data_out = _np.zeros(data_in.shape)
baseline = _np.zeros(data_in.shape)
smoothness_param = self.parameters['smoothness_param']
redux = self.parameters['redux']
fep = self.parameters['fix_end_points']
max_iter = self.parameters['max_iter']
min_diff = self.parameters['min_diff']
_arpls = _Arpls(smoothness_param=smoothness_param,
redux=redux, fix_end_points=fep,
max_iter=max_iter,
min_diff=min_diff, verbose=False)
if data_in.ndim == 1:
baseline = _arpls.calculate(data_in)
data_out = data_in - baseline
else:
for num, spectrum in enumerate(data_in):
baseline[num,:] = _arpls.calculate(spectrum)
data_out[num,:] = spectrum - baseline[num,:]
return [baseline, data_out]
[docs] def spinBoxChanged(self):
"""
Controller for all spinBoxes
"""
sdr = self.sender()
if sdr == self.ui.spinBoxLambda:
self.parameters['smoothness_param'] = self.ui.spinBoxLambda.value()
elif sdr == self.ui.spinBoxRedux:
self.parameters['redux'] = self.ui.spinBoxRedux.value()
elif sdr == self.ui.spinBoxMaxIter:
self.parameters['max_iter'] = self.ui.spinBoxMaxIter.value()
elif sdr == self.ui.spinBoxMinDiff:
self.parameters['min_diff'] = self.ui.spinBoxMinDiff.value()
self.changed.emit()
[docs] def selectFixedEnds(self):
"""
Check selection of fixed end-points
"""
self.parameters['fix_end_points'] =self.ui.checkBox.isChecked()
self.changed.emit()
if __name__ == '__main__':
import sys as _sys
from PyQt5.QtWidgets import (QApplication as _QApplication)
app = _QApplication(_sys.argv)
app.setStyle('Cleanlooks')
winArPLS = widgetArPLS()
winArPLS.show()
app.exec_()
print(winArPLS.parameters)
_sys.exit()