* added "Show Derivative" to approximate imaginary eps without conductivity term
* closing matplotlib figure after saving
This commit is contained in:
parent
a36f8932f8
commit
784393a21a
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'ConductivityGroupBox.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:54 2014
|
||||
# Created: Mon Jun 2 19:55:32 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
@ -114,6 +114,7 @@ class BaseWidget(QGroupBox):
|
||||
sd = "( --- )"
|
||||
self.errors[i].setStyleSheet(sd_style)
|
||||
self.errors[i].setText(sd)
|
||||
#self.update()
|
||||
|
||||
def replaceDoubleSpinBox(self, layout, widget):
|
||||
ndx = layout.indexOf(widget)
|
||||
@ -512,10 +513,14 @@ class YaffConfigWidget(QDialog):
|
||||
#self.replaceDoubleSpinBox(self.ui.gridLayout_tau, self.ui.doubleSpinBox_taumin)
|
||||
#self.replaceDoubleSpinBox(self.ui.gridLayout_tau, self.ui.doubleSpinBox_taumax)
|
||||
|
||||
|
||||
ndx = self.ui.gridLayout_time.indexOf(self.ui.doubleSpinBox_tmin)
|
||||
row, column, cols, rows = self.ui.gridLayout_time.getItemPosition(ndx)
|
||||
self.ui.doubleSpinBox_tmin.setParent(None)
|
||||
self.ui.doubleSpinBox_tmin = LogFSpinBox(self)
|
||||
|
||||
|
||||
|
||||
self.ui.gridLayout_time.addWidget(self.ui.doubleSpinBox_tmin, row,column)
|
||||
|
||||
ndx = self.ui.gridLayout_time.indexOf(self.ui.doubleSpinBox_tmax)
|
||||
|
30
ExtraDifferentialWidget.py
Normal file
30
ExtraDifferentialWidget.py
Normal file
@ -0,0 +1,30 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
__author__ = 'markusro'
|
||||
|
||||
from PyQt4.QtGui import QColor
|
||||
import ExtraDifferential
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
class DifferentialWidget(ExtraDifferential.PlotWidget):
|
||||
def __init__(self, parent=None):
|
||||
super(DifferentialWidget, self).__init__(parent)
|
||||
self.setLogMode(x=True, y=False)
|
||||
self.showGrid(x=True, y=True)
|
||||
self.addLegend()
|
||||
self.disableAutoRange()
|
||||
self.setLabel("bottom", "Frequency", units="Hz")
|
||||
|
||||
self.setLabel("left", u"Dielectric loss ε<sub>der</sub>''= ∂ε'/∂log10(v)" , units="Debye")
|
||||
self.curve_imag = pg.PlotDataItem(x=[np.nan], y=[np.nan],pen=QColor(0,0,0,0), symbol='o',
|
||||
symbolBrush=(255,127,0,127), name=u"Imaginary ε")
|
||||
self.curve_real = pg.PlotDataItem(x=[np.nan], y=[np.nan],pen=QColor(0,0,0,0), symbol='s',
|
||||
symbolBrush=(119,202,92,127), name=u"Real ε")
|
||||
self.addItem(self.curve_imag)
|
||||
self.addItem(self.curve_real)
|
||||
|
||||
def plot(self, x,real_y,imag_y):
|
||||
self.enableAutoRange()
|
||||
self.curve_real.setData(x, real_y)
|
||||
self.curve_imag.setData(x, imag_y)
|
||||
|
1
Makefile
1
Makefile
@ -7,5 +7,6 @@ all:
|
||||
pyuic4 StaticGroupBox.ui -o StaticGroupBox.py
|
||||
pyuic4 YAFFparameters.ui -o YAFFparameters.py
|
||||
pyuic4 YAFFConfig.ui -o YAFFConfig.py
|
||||
pyuic4 ExtraDifferential.ui -o ExtraDifferential.py
|
||||
stats:
|
||||
wc -l QDS.py ContainerWidgets.py Container.py libyaff.py Mathlib.py Data.py
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'PeakGroupBox.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:54 2014
|
||||
# Created: Mon Jun 2 19:55:32 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'PowerLawGroupBox.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:54 2014
|
||||
# Created: Mon Jun 2 19:55:33 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
57
QDS.py
57
QDS.py
@ -23,6 +23,7 @@ from Mathlib import FunctionRegister, FitRoutine
|
||||
from Data import Data
|
||||
|
||||
import QDSMain
|
||||
import ExtraDifferentialWidget
|
||||
|
||||
class AppWindow(QMainWindow):
|
||||
|
||||
@ -145,6 +146,23 @@ class AppWindow(QMainWindow):
|
||||
fit_action.triggered.connect(self.signalMapper.map)
|
||||
self.signalMapper.mapped.connect(self.fitData_start)
|
||||
|
||||
self.ui.actionShow_Derivative.triggered.connect(self.show_derivative)
|
||||
|
||||
|
||||
|
||||
def show_derivative(self):
|
||||
self.xtra_wdgt = ExtraDifferentialWidget.DifferentialWidget()
|
||||
#self.xtra_wdgt.set
|
||||
deriv_r = np.diff(np.log10(self.data.epsilon.real))
|
||||
deriv_i = np.diff(np.log10(self.data.epsilon.imag))*0
|
||||
deriv_i = -np.pi/2 * np.diff(np.log10(self.data.epsilon.real))/np.diff(np.log10(self.data.frequency))
|
||||
self.xtra_wdgt.plot(self.data.frequency[:-1], deriv_r, deriv_i)
|
||||
# self.xtra_wdgt.plot([0,1], [0,1], [0,1])
|
||||
self.xtra_wdgt.setGeometry(self.ui.pgPlotWidget_real.geometry())
|
||||
self.xtra_wdgt.show()
|
||||
#self.xtra_wdgt.showCenterd()
|
||||
self.xtra_wdgt.raise_()
|
||||
|
||||
|
||||
def updateCrosshair(self,evt):
|
||||
|
||||
@ -215,7 +233,7 @@ class AppWindow(QMainWindow):
|
||||
Saving fit parameters to fitresults.log
|
||||
including temperature
|
||||
"""
|
||||
self.saveFitFigure()
|
||||
self._saveFitFigure()
|
||||
if not os.path.exists("fitresults.log"):
|
||||
f = open("fitresults.log", "w")
|
||||
else:
|
||||
@ -263,7 +281,7 @@ class AppWindow(QMainWindow):
|
||||
np.savetxt(f, pars, fmt = '%-10.3e', delimiter=" ")
|
||||
f.close()
|
||||
|
||||
def saveFitFigure(self):
|
||||
def _saveFitFigure(self):
|
||||
fig = pyplot.figure(figsize=(3.54*1.4, 2.75*1.4))
|
||||
|
||||
font = {'family' : 'sans serif',
|
||||
@ -290,7 +308,13 @@ class AppWindow(QMainWindow):
|
||||
#pyplot.savefig(os.path.splitext(self.filepath)[0]+".png")
|
||||
pyplot.savefig(os.path.splitext(self.filepath)[0]+".pdf")
|
||||
fig.clear()
|
||||
fig.close()
|
||||
|
||||
def _saveFitFigureGrace(self):
|
||||
#agrtemplate = open('template.agr').read()
|
||||
agrtemplate = """
|
||||
|
||||
"""
|
||||
|
||||
def addYaff(self, pos):
|
||||
_yaff = YAFF(plt_real=self.ui.pgPlotWidget_real,
|
||||
@ -363,11 +387,12 @@ class AppWindow(QMainWindow):
|
||||
plt_real=self.ui.pgPlotWidget_real,
|
||||
plt_imag=self.ui.pgPlotWidget_imag,
|
||||
limits=self.data.fit_limits)
|
||||
self.function_registry.register_function(_peak)
|
||||
|
||||
_peak.changedData.connect(self.updatePlot)
|
||||
_peak.removeObj.connect(self.delParamterObject)
|
||||
new_peak = [2*10**pos.y(), 1 / (2*np.pi*10**pos.x()), 1, 1]
|
||||
_peak.setParameter(beta = new_peak)
|
||||
self.function_registry.register_function(_peak)
|
||||
new_peak_beta0 = [2*10**pos.y(), 1 / (2*np.pi*10**pos.x()), 1, 1]
|
||||
_peak.setParameter(beta = new_peak_beta0)
|
||||
self.parameterWidget.add(_peak.widget)
|
||||
self.updatePlot()
|
||||
|
||||
@ -435,27 +460,30 @@ class AppWindow(QMainWindow):
|
||||
self.openFile(path)
|
||||
|
||||
def nextFile(self):
|
||||
lim = self.fit_boundary_imag.getRegion() # store limits
|
||||
if len(self._file_paths) > self._current_file_index+1: # wrap around
|
||||
self._current_file_index += 1
|
||||
else:
|
||||
self._current_file_index = 0
|
||||
path = unicode(self._file_paths[self._current_file_index])
|
||||
self.openFile(path)
|
||||
self.fit_boundary_imag.setRegion(lim)
|
||||
|
||||
def previousFile(self):
|
||||
lim = self.fit_boundary_imag.getRegion() # store limits
|
||||
if self._current_file_index == 0: # wrap around
|
||||
self._current_file_index = len(self._file_paths) - 1
|
||||
else:
|
||||
self._current_file_index -= 1
|
||||
path = unicode(self._file_paths[self._current_file_index])
|
||||
self.openFile(path)
|
||||
self.fit_boundary_imag.setRegion(lim)
|
||||
|
||||
def openFile(self,path):
|
||||
print "opening: %s"%path
|
||||
self.filepath=path
|
||||
# TODO analyze file (LF,MF, HF) and act accordingly
|
||||
data = np.loadtxt(path, skiprows=4)
|
||||
self.setWindowTitle(os.path.basename(path))
|
||||
numpat = re.compile('\d+\.\d+')
|
||||
try:
|
||||
Temp = None
|
||||
@ -466,10 +494,15 @@ class AppWindow(QMainWindow):
|
||||
Temp = float(re.search(numpat, line).group())
|
||||
print "Temperature found in file:", Temp
|
||||
break
|
||||
search_temp_in_filename = re.search('\d+\.\d+K', path)
|
||||
if search_temp_in_filename:
|
||||
Temp = float(search_temp_in_filename.group()[:-1])
|
||||
if Temp == None: raise ValueError
|
||||
except:
|
||||
Temp = QInputDialog.getDouble(self, "No temperature found in data set", "Temperature/K:", value=0.00)[0]
|
||||
# mask the data to values > 0 (loglog plot)
|
||||
self.setWindowTitle("%s - %.2f K"%(os.path.basename(path), Temp))
|
||||
|
||||
mask = (data[:, 1] > 0) & (data[:, 2] > 0) #& (data[:,2]>1e-3) & (data[:,0] > 1e-2)
|
||||
_freq = data[mask, 0]
|
||||
_die_stor = data[mask, 1]
|
||||
@ -501,6 +534,7 @@ class AppWindow(QMainWindow):
|
||||
|
||||
p0,funcs = [],[]
|
||||
for fcn in self.function_registry.get_registered_functions():
|
||||
print fcn
|
||||
p0.extend(fcn.getParameter())
|
||||
funcs.append(fcn)
|
||||
# calculate parametrized curve
|
||||
@ -509,13 +543,14 @@ class AppWindow(QMainWindow):
|
||||
# replot data and fit, TODO: replot only if measurement data changed
|
||||
self.data.data_curve_real.setData(self.data.frequency, self.data.epsilon.real)
|
||||
self.data.data_curve_imag.setData(self.data.frequency, self.data.epsilon.imag)
|
||||
|
||||
print "updatePlot: ",self.data.frequency_fit, self.data.epsilon_fit
|
||||
if len(funcs) > 0:
|
||||
self.data.fitted_curve_real.setData(self.data.frequency_fit, self.data.epsilon_fit.real)
|
||||
self.data.fitted_curve_imag.setData(self.data.frequency_fit, self.data.epsilon_fit.imag)
|
||||
print "funcs > 0:",self.data.frequency_fit, self.data.epsilon_fit
|
||||
self.data.fitted_curve_real.setData(x=self.data.frequency_fit, y=self.data.epsilon_fit.real)
|
||||
self.data.fitted_curve_imag.setData(x=self.data.frequency_fit, y=self.data.epsilon_fit.imag)
|
||||
else:
|
||||
self.data.fitted_curve_real.setData([np.nan],[np.nan])
|
||||
self.data.fitted_curve_imag.setData([np.nan],[np.nan])
|
||||
self.data.fitted_curve_real.setData(x=np.array([np.nan]),y=np.array([np.nan]))
|
||||
self.data.fitted_curve_imag.setData(x=np.array([np.nan]),y=np.array([np.nan]))
|
||||
|
||||
|
||||
def updateIntermediatePlot(self, freq, intermediate_data):
|
||||
|
10
QDSMain.py
10
QDSMain.py
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'QDSMain.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:54 2014
|
||||
# Created: Mon Jun 2 19:55:32 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
@ -65,6 +65,8 @@ class Ui_MainWindow(object):
|
||||
self.menubar = QtGui.QMenuBar(MainWindow)
|
||||
self.menubar.setGeometry(QtCore.QRect(0, 0, 956, 22))
|
||||
self.menubar.setObjectName(_fromUtf8("menubar"))
|
||||
self.menuExtras = QtGui.QMenu(self.menubar)
|
||||
self.menuExtras.setObjectName(_fromUtf8("menuExtras"))
|
||||
MainWindow.setMenuBar(self.menubar)
|
||||
self.statusbar = QtGui.QStatusBar(MainWindow)
|
||||
self.statusbar.setObjectName(_fromUtf8("statusbar"))
|
||||
@ -119,6 +121,10 @@ class Ui_MainWindow(object):
|
||||
icon5.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/qds_fit_abort.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
self.actionActionAbortFit.setIcon(icon5)
|
||||
self.actionActionAbortFit.setObjectName(_fromUtf8("actionActionAbortFit"))
|
||||
self.actionShow_Derivative = QtGui.QAction(MainWindow)
|
||||
self.actionShow_Derivative.setObjectName(_fromUtf8("actionShow_Derivative"))
|
||||
self.menuExtras.addAction(self.actionShow_Derivative)
|
||||
self.menubar.addAction(self.menuExtras.menuAction())
|
||||
self.toolBar.addAction(self.actionAdd_Peak)
|
||||
self.toolBar.addAction(self.actionAdd_Cond)
|
||||
self.toolBar.addAction(self.actionAdd_PowerLaw)
|
||||
@ -134,6 +140,7 @@ class Ui_MainWindow(object):
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
|
||||
self.menuExtras.setTitle(_translate("MainWindow", "Extras", None))
|
||||
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None))
|
||||
self.actionAdd_Peak.setText(_translate("MainWindow", "Add Peak", None))
|
||||
self.actionAdd_Cond.setText(_translate("MainWindow", "Add Cond.", None))
|
||||
@ -148,6 +155,7 @@ class Ui_MainWindow(object):
|
||||
self.actionYAFF.setToolTip(_translate("MainWindow", "Fit with YAFF", None))
|
||||
self.actionActionAbortFit.setText(_translate("MainWindow", "Abort Fit", None))
|
||||
self.actionActionAbortFit.setShortcut(_translate("MainWindow", "Ctrl+C", None))
|
||||
self.actionShow_Derivative.setText(_translate("MainWindow", "Show Derivative", None))
|
||||
|
||||
from pyqtgraph import PlotWidget
|
||||
import images_rc
|
||||
|
12
QDSMain.ui
12
QDSMain.ui
@ -67,6 +67,13 @@
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuExtras">
|
||||
<property name="title">
|
||||
<string>Extras</string>
|
||||
</property>
|
||||
<addaction name="actionShow_Derivative"/>
|
||||
</widget>
|
||||
<addaction name="menuExtras"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
@ -203,6 +210,11 @@
|
||||
<string>Ctrl+C</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_Derivative">
|
||||
<property name="text">
|
||||
<string>Show Derivative</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'StaticGroupBox.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:54 2014
|
||||
# Created: Mon Jun 2 19:55:33 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'YAFFConfig.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:55 2014
|
||||
# Created: Mon Jun 2 19:55:33 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'YAFFparameters.ui'
|
||||
#
|
||||
# Created: Wed Apr 16 14:28:55 2014
|
||||
# Created: Mon Jun 2 19:55:33 2014
|
||||
# by: PyQt4 UI code generator 4.10.4
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
9
data.py
9
data.py
@ -11,8 +11,8 @@ class Data:
|
||||
def __init__(self, frequency=np.zeros(1), die_real=np.zeros(1), die_imag=np.zeros(1)):
|
||||
self.frequency = frequency
|
||||
self.epsilon = die_real + 1j * die_imag
|
||||
self.frequency_fit = frequency
|
||||
self.epsilon_fit = die_real*0 + 1j * die_imag*0
|
||||
self.frequency_fit = frequency[:]
|
||||
self.epsilon_fit = die_real[:]*0 + 1j * die_imag[:]*0
|
||||
myPen_imag = pg.mkPen(width=3, color=(255,255,127))
|
||||
myPen_real = pg.mkPen(width=3, color=(51,255,127))
|
||||
|
||||
@ -20,8 +20,8 @@ class Data:
|
||||
symbolBrush=(255,127,0,127))
|
||||
self.data_curve_real = pg.PlotDataItem(x=[np.nan], y=[np.nan],pen=QColor(0,0,0,0), symbol='s',
|
||||
symbolBrush=(119,202,92,127))
|
||||
self.fitted_curve_imag = pg.PlotDataItem(np.array([np.nan]), np.array([np.nan]), pen=myPen_imag)
|
||||
self.fitted_curve_real = pg.PlotDataItem(np.array([np.nan]), np.array([np.nan]), pen=myPen_real)
|
||||
self.fitted_curve_imag = pg.PlotDataItem(x=[np.nan], y=[np.nan], pen=myPen_imag)
|
||||
self.fitted_curve_real = pg.PlotDataItem(x=[np.nan], y=[np.nan], pen=myPen_real)
|
||||
self.length = len(frequency)
|
||||
self.meta = dict()
|
||||
self.fit_limits = [frequency.min(), frequency.max(), die_imag.min(), die_imag.max()]
|
||||
@ -39,6 +39,7 @@ class Data:
|
||||
|
||||
def set_data(self,f,e_real,e_imag):
|
||||
self.frequency = f
|
||||
self.frequency_fit = f[:]
|
||||
self.epsilon = e_real + 1j*e_imag
|
||||
self.epsilon_fit = 0*e_real + 1j*e_imag*0
|
||||
self.fit_limits = [f.min(), f.max(), e_imag.min(), e_imag.max()]
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Resource object code
|
||||
#
|
||||
# Created: Mi. Apr. 16 14:28:54 2014
|
||||
# Created: Mo. Juni 2 19:55:32 2014
|
||||
# by: The Resource Compiler for PyQt (Qt v4.8.5)
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
Loading…
Reference in New Issue
Block a user