Source code for crikit.ui.widget_Calibrate
"""
Widget for PlotEffect that adjusts the parameters appropriate for
calibration
Created on Thu Dec 22 14:27:46 2016
@author: chc
"""
import copy as _copy
import numpy as _np
from crikit.ui.dialog_AbstractPlotEffect import (AbstractPlotEffectPlugin
as _AbstractPlotEffectPlugin)
from scipy.interpolate import UnivariateSpline as _UnivariateSpline
from crikit.data.frequency import (calib_pix_wn as _calib_pix_wn)
#from crikit.utils.general import find_nearest as _find_nearest
from crikit.ui.qt_PlotEffect_Calibrate import Ui_Form as _Ui_Form
[docs]class widgetCalibrate(_AbstractPlotEffectPlugin):
"""
Widget for PlotEffect that adjusts the parameters appropriate for
calibration
Parameters
----------
calib_dict : dict
Calibration dictionary
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' : 'Calibrate',
'long_name' : 'Spectral Calibration'}
# Labeling options for original data plot
labels_orig = {
'x_label' : 'Wavenumber (cm$^{-1}$)',
'y_label' : 'Input Int (au)',
'title' : 'Uncalibrated'
}
# Labeling options for affected data plot
labels_affected = {
'x_label' : labels_orig['x_label'],
'y_label' : 'Output Int (au)',
'title' : 'Calibrated'
}
def __init__(self, calib_dict, parent=None):
super(widgetCalibrate, self).__init__(parent) ### EDIT ###
self.ui = _Ui_Form()
self.ui.setupUi(self)
self.parameters['orig_calib_dict'] = calib_dict
if isinstance(self.parameters['orig_calib_dict']['a_vec'], tuple):
self.parameters['orig_calib_dict']['a_vec'] = \
list(self.parameters['orig_calib_dict']['a_vec'])
self.parameters['new_calib_dict'] = \
_copy.deepcopy(self.parameters['orig_calib_dict'])
self.setup_calib()
# self.orig_wn = _calib_pix_wn(self.parameters['orig_calib_dict'])
# self.new_wn = _calib_pix_wn(self.parameters['new_calib_dict'])
self.ui.spinBoxMeas.setValue(1004.0)
self.ui.spinBoxCorrect.setValue(1004.0)
# SIGNALS & SLOTS
# New
self.ui.spinBoxNPix_2.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxCenterWL_2.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxProbeWL_2.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxIntercept_2.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxSlope_2.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxCalibWL_2.editingFinished.connect(self.spinBoxChanged)
self.ui.spinBoxCorrect.editingFinished.connect(self.meas_vs_ideal)
self.ui.spinBoxMeas.editingFinished.connect(self.meas_vs_ideal)
[docs] def spinBoxChanged(self):
"""
Controller for all spinBoxes
"""
sdr = self.sender()
# Original
if sdr == self.ui.spinBoxNPix_2:
self.parameters['new_calib_dict']['n_pix'] = \
self.ui.spinBoxNPix_2.value()
elif sdr == self.ui.spinBoxCenterWL_2:
self.parameters['new_calib_dict']['ctr_wl'] = \
self.ui.spinBoxCenterWL_2.value()
elif sdr == self.ui.spinBoxCalibWL_2:
self.parameters['new_calib_dict']['ctr_wl0'] = \
self.ui.spinBoxCalibWL_2.value()
elif sdr == self.ui.spinBoxSlope_2:
self.parameters['new_calib_dict']['a_vec'][0] = \
self.ui.spinBoxSlope_2.value()
elif sdr == self.ui.spinBoxIntercept_2:
self.parameters['new_calib_dict']['a_vec'][1] = \
self.ui.spinBoxIntercept_2.value()
elif sdr == self.ui.spinBoxProbeWL_2:
self.parameters['new_calib_dict']['probe'] = \
self.ui.spinBoxProbeWL_2.value()
self.changed.emit()
[docs] def meas_vs_ideal(self):
meas = self.ui.spinBoxMeas.value()
ideal = self.ui.spinBoxCorrect.value()
delta_lambda = (1 / ((ideal / 1e7) +
(1 / self.parameters['orig_calib_dict']['probe']))
- 1 / ((meas/1e7) +
(1 / self.parameters['orig_calib_dict']['probe'])))
self.parameters['new_calib_dict']['a_vec'][1] = \
self.parameters['orig_calib_dict']['a_vec'][1] + delta_lambda
self.setup_calib()
self.changed.emit()
[docs] def fcn(self, data_in):
"""
Returns a shifted version of the input spectrum to mimic the effect
of calibration. (Real calibration doesn't shift the spectrum, but
rather the independent variable)
"""
orig_wn = _calib_pix_wn(self.parameters['orig_calib_dict'])[0]
new_wn = _calib_pix_wn(self.parameters['new_calib_dict'])[0]
if data_in.ndim == 1:
spl = _UnivariateSpline(new_wn, data_in, s=0, ext=0)
output = spl(orig_wn)
elif data_in.ndim == 2:
output = _np.zeros(data_in.shape)
for num, spect in enumerate(data_in):
spl = _UnivariateSpline(new_wn, spect, s=0, ext=0)
output[num,:] = spl(orig_wn)
return output
[docs] def setup_calib(self):
# Original
self.ui.spinBoxNPix.setValue(self.parameters['orig_calib_dict']['n_pix'])
self.ui.spinBoxCenterWL.setValue(self.parameters['orig_calib_dict']['ctr_wl'])
self.ui.spinBoxCalibWL.setValue(self.parameters['orig_calib_dict']['ctr_wl0'])
self.ui.spinBoxSlope.setValue(self.parameters['orig_calib_dict']['a_vec'][0])
self.ui.spinBoxIntercept.setValue(self.parameters['orig_calib_dict']['a_vec'][1])
self.ui.spinBoxProbeWL.setValue(self.parameters['orig_calib_dict']['probe'])
# New
self.ui.spinBoxNPix_2.setValue(self.parameters['new_calib_dict']['n_pix'])
self.ui.spinBoxCenterWL_2.setValue(self.parameters['new_calib_dict']['ctr_wl'])
self.ui.spinBoxProbeWL_2.setValue(self.parameters['new_calib_dict']['probe'])
self.ui.spinBoxIntercept_2.setValue(self.parameters['new_calib_dict']['a_vec'][1])
self.ui.spinBoxSlope_2.setValue(self.parameters['new_calib_dict']['a_vec'][0])
self.ui.spinBoxCalibWL_2.setValue(self.parameters['new_calib_dict']['ctr_wl0'])
if __name__ == '__main__':
import sys as _sys
from PyQt5.QtWidgets import (QApplication as _QApplication)
app = _QApplication(_sys.argv)
app.setStyle('Cleanlooks')
calib_dict = {'n_pix' : 1600,
'ctr_wl' : 730,
'ctr_wl0' : 730,
'a_vec' : [-0.167740721307557, 863.8736708961577],
'probe': 771.461}
pix = _np.arange(calib_dict['n_pix'])
wl = calib_dict['a_vec'][0]*pix + calib_dict['a_vec'][1]
WN = .01/(wl*1e-9) - .01/(calib_dict['probe']*1e-9)
CARS = _np.abs(1/(1000-WN-1j*20) + 1/(3000-WN-1j*20) + .055)
NRB = 0*WN + .055
CARS = _np.dot(_np.ones((5,1)),CARS[None,:])
winCalib = widgetCalibrate(calib_dict)
winCalib.show()
app.exec_()
_sys.exit()