Source code for crikit.ui.widget_KK
"""
Widget for PlotEffect that adjusts the parameters appropriate for
the Kramers-Kronig relation
Created on Thu Dec 22 11:43:42 2016
@author: chc
"""
import numpy as _np
from crikit.ui.dialog_AbstractPlotEffect import (AbstractPlotEffectPlugin
as _AbstractPlotEffectPlugin)
from crikit.ui.qt_PlotEffect_KK import Ui_Form as _Ui_Form
from crikit.cri.kk import KramersKronig as _KramersKronig
[docs]class widgetKK(_AbstractPlotEffectPlugin):
"""
Widget for PlotEffect that adjusts the parameters appropriate for
the Kramers-Kronig (KK) relation phase retrieval.
Attributes
----------
cars_amp_offset : float, optional (default=0.0)
DC offset applied to CARS spectrum(a) prior to KK relation.
nrb_amp_offset : float, optional (default=0.0)
DC offset applied to NRB spectrum(a) prior to KK relation.
phase_offset : float or ndarray, optional (default=0.0)
Phase constant or ndarray applied to retrieved phase prior to
separating the real and imaginary components.
norm_to_nrb : bool, optional (default=True)
Normalize the amplitude by sqrt(NRB). This effectively removes several \
system reponse functions.
pad_factor : int, optional (default=1)
Multiple size of spectral-length to pad the ends of each spectra with. \
Padded with a constant value corresponding to the value at that end of \
the spectrum.
Methods
---------
fcn : Performs the KK
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' : 'KK',
'long_name' : 'Kramers-Kronig Relation'}
# 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' : 'Raman-Like Int (au)',
'title' : 'KK-Raman'
}
def __init__(self, cars_amp_offset=0.0, nrb_amp_offset=0.0,
conjugate=False, phase_offset=0.0, norm_to_nrb=True, pad_factor=1,
n_edge=30, parent=None):
super(widgetKK, self).__init__(parent)
self.ui = _Ui_Form()
self.ui.setupUi(self)
self.lock_cars_nrb_bias = True
self.show_real = False
# Update parameter dict
self.parameters['cars_amp_offset'] = cars_amp_offset
self.parameters['nrb_amp_offset'] = nrb_amp_offset
self.parameters['phase_offset'] = phase_offset
self.parameters['norm_to_nrb'] = norm_to_nrb
self.parameters['pad_factor'] = pad_factor
self.parameters['n_edge'] = n_edge
self.parameters['conjugate'] = conjugate
self.setupKK()
[docs] def setupKK(self):
self.ui.checkBoxNRBNorm.setChecked(self.parameters['norm_to_nrb'])
self.ui.checkBoxConjugate.setChecked(self.parameters['conjugate'])
self.ui.checkBoxLockBias.setChecked(self.lock_cars_nrb_bias)
self.ui.checkBoxShowReal.setChecked(self.show_real)
self.ui.spinBoxCARSBias.setValue(self.parameters['cars_amp_offset'])
self.ui.spinBoxNRBBias.setValue(self.parameters['nrb_amp_offset'])
self.ui.spinBoxPhaseLin.setValue(self.parameters['phase_offset'])
self.ui.spinBoxPadFactor.setValue(self.parameters['pad_factor'])
self.ui.spinBoxEdge.setValue(self.parameters['n_edge'])
# SIGNALS & SLOTS
self.ui.spinBoxCARSBias.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxNRBBias.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxPhaseLin.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxPadFactor.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxEdge.editingFinished.connect(self.spinBoxChanged)
self.ui.checkBoxNRBNorm.clicked.connect(self.changeCheckBoxNRBNorm)
self.ui.checkBoxConjugate.clicked.connect(self.changeCheckBoxConjugate)
self.ui.checkBoxShowReal.clicked.connect(self.changeShowReal)
self.ui.checkBoxLockBias.clicked.connect(self.changeCheckBoxLockBias)
self.ui.spinBoxNRBBias.setEnabled(not self.lock_cars_nrb_bias)
[docs] def fcn(self, data_in):
"""
If return list, [0] goes to original, [1] goes to affected
"""
assert isinstance(data_in, list), 'KK plot effect fcn requires the \
data input be a list with length 2: NRB, CARS'
assert len(data_in), 'KK plot effect fcn requires the \
data input be a list with length 2: NRB, CARS'
nrb = data_in[0]
cars = data_in[1]
data_out = _np.zeros(cars.shape, dtype=complex)
cars_amp_offset = self.parameters['cars_amp_offset']
nrb_amp_offset = self.parameters['nrb_amp_offset']
conjugate = self.parameters['conjugate']
phase_offset = self.parameters['phase_offset']
norm_to_nrb = self.parameters['norm_to_nrb']
pad_factor = self.parameters['pad_factor']
n_edge = self.parameters['n_edge']
_kk = _KramersKronig(cars_amp_offset=cars_amp_offset,
nrb_amp_offset=nrb_amp_offset,
conjugate=conjugate,
phase_offset=phase_offset,
norm_to_nrb=norm_to_nrb,
pad_factor=pad_factor,
n_edge=n_edge)
data_out = _kk.calculate(cars, nrb)
if self.show_real:
return data_out.real
else:
return data_out.imag
[docs] def spinBoxChanged(self):
"""
Controller for all spinBoxes
"""
sdr = self.sender()
if sdr == self.ui.spinBoxCARSBias:
self.parameters['cars_amp_offset'] = self.ui.spinBoxCARSBias.value()
if self.lock_cars_nrb_bias:
self.parameters['nrb_amp_offset'] = \
self.ui.spinBoxCARSBias.value()
self.ui.spinBoxNRBBias.setValue(self.parameters['nrb_amp_offset'])
elif sdr == self.ui.spinBoxNRBBias:
self.parameters['nrb_amp_offset'] = self.ui.spinBoxNRBBias.value()
elif sdr == self.ui.spinBoxPhaseLin:
self.parameters['phase_offset'] = self.ui.spinBoxPhaseLin.value()
elif sdr == self.ui.spinBoxPadFactor:
self.parameters['pad_factor'] = self.ui.spinBoxPadFactor.value()
elif sdr == self.ui.spinBoxEdge:
self.parameters['n_edge'] = self.ui.spinBoxEdge.value()
self.changed.emit()
[docs] def changeCheckBoxLockBias(self):
if self.ui.checkBoxLockBias.isChecked():
self.ui.spinBoxNRBBias.setEnabled(False)
self.lock_cars_nrb_bias = True
else:
self.ui.spinBoxNRBBias.setEnabled(True)
self.lock_cars_nrb_bias = False
self.changed.emit()
[docs] def changeCheckBoxNRBNorm(self):
if self.ui.checkBoxNRBNorm.isChecked():
self.parameters['norm_to_nrb'] = True
else:
self.parameters['norm_to_nrb'] = False
self.changed.emit()
[docs] def changeCheckBoxConjugate(self):
if self.ui.checkBoxConjugate.isChecked():
self.parameters['conjugate'] = True
else:
self.parameters['conjugate'] = False
self.changed.emit()
[docs] def changeShowReal(self):
if self.show_real:
self.show_real = False
else:
self.show_real = True
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 = widgetKK()
win.show()
app.exec_()
_sys.exit()