* moved math functions (fit, hn, etc.) to mathlib.py

* fitresults are stored in a better format
* started gracedriver to sva data in grace file
This commit is contained in:
Markus Rosenstihl 2014-09-17 09:46:14 +02:00
parent 784393a21a
commit 9ce80f13b5
14 changed files with 873 additions and 1226 deletions

View File

@ -4,14 +4,12 @@ __author__ = 'markusro'
from PyQt4.QtGui import QColor
from PyQt4.QtCore import QObject, pyqtSignal, QThread, pyqtSlot
import numpy as np
from scipy import optimize as opt, odr
import libyaff
def id_to_color( id ):
colors = [
QColor(54, 22, 115),
@ -26,7 +24,6 @@ def id_to_color(id):
return colors[id%len(colors)]
class FitFunctionCreator(QObject):
new_data = pyqtSignal(np.ndarray, np.ndarray)
@ -83,6 +80,7 @@ class FitRoutine(QObject):
self._fitter = self.fit_odr_cmplx
self._odr_fit = None
self._start_parameter = None
@property
def start_parameter( self ):
return self._start_parameter
@ -90,6 +88,7 @@ class FitRoutine(QObject):
@start_parameter.setter
def start_paramter( self, p0 ):
self._start_parameter = p0
@property
def fitter( self ):
return self._fitter
@ -123,7 +122,6 @@ class FitRoutine(QObject):
@pyqtSlot()
def fit( self ):
#print "TID in FitRoutine", QThread.thread()
try:
self._odr_fit.run()
except RuntimeError:
@ -162,7 +160,6 @@ class FunctionRegister:
return self.registry
# ############# deprecated #####################
def fit_odr_cmplx( x, y, p0, fixed, fcns ):
f = FitFunctionCreator()
@ -182,6 +179,7 @@ def fit_odr_cmplx(x, y, p0, fixed, fcns):
#print fit.output.pprint()
return fit.output
### define funcs here
class Functions(QObject):
def __init__( self ):
@ -311,7 +309,6 @@ def hn(p, nu):
return e_loss # 2* oder nicht?
def mini_func( p, x, y ):
res = y-multi_hn(p, x)
# apply weights

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'ConductivityGroupBox.ui'
#
# Created: Mon Jun 2 19:55:32 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:48 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_ConductivityGroupBox(object):
def setupUi( self, ConductivityGroupBox ):
ConductivityGroupBox.setObjectName(_fromUtf8("ConductivityGroupBox"))
@ -139,14 +141,21 @@ class Ui_ConductivityGroupBox(object):
ConductivityGroupBox.setWindowTitle(_translate("ConductivityGroupBox", "GroupBox", None))
ConductivityGroupBox.setTitle(_translate("ConductivityGroupBox", "Conductivity", None))
self.pwrSigma_sd.setText(_translate("ConductivityGroupBox", "TextLabel", None))
self.label_2.setText(_translate("ConductivityGroupBox", "<html><head/><body><p>σ\'<span style=\" vertical-align:sub;\">(DC)</span></p></body></html>", None))
self.label_2.setText(_translate("ConductivityGroupBox",
"<html><head/><body><p>σ\'<span style=\" vertical-align:sub;\">(DC)</span></p></body></html>",
None))
self.label.setText(_translate("ConductivityGroupBox", "Fix", None))
self.removeButton.setText(_translate("ConductivityGroupBox", "Remove", None))
self.label_4.setText(_translate("ConductivityGroupBox", "α", None))
self.rSigma_sd.setText(_translate("ConductivityGroupBox", "TextLabel", None))
self.rSigma.setToolTip(_translate("ConductivityGroupBox", "<html><head/><body><p>DC conductivity, should only be seen in the imaginary permitivity. If there is a Jonscher type of U<span style=\" font-style:italic;\">niversal Dielectric Response, </span>the ratio of σ&quot;/σ\'<span style=\" vertical-align:sub;\">(DC)</span> is a constant</p></body></html>", None))
self.rSigma.setToolTip(_translate("ConductivityGroupBox",
"<html><head/><body><p>DC conductivity, should only be seen in the imaginary permitivity. If there is a Jonscher type of U<span style=\" font-style:italic;\">niversal Dielectric Response, </span>the ratio of σ&quot;/σ\'<span style=\" vertical-align:sub;\">(DC)</span> is a constant</p></body></html>",
None))
self.subtractConductivityButton.setText(_translate("ConductivityGroupBox", "Hide", None))
self.label_3.setText(_translate("ConductivityGroupBox", "<html><head/><body><p>σ&quot;</p></body></html>", None))
self.iSigma.setToolTip(_translate("ConductivityGroupBox", "<html><head/><body><p>If there is a Jonscher type of U<span style=\" font-style:italic;\">niversal Dielectric Response, </span>the ratio of σ&quot;/σ\'<span style=\" vertical-align:sub;\">(DC)</span> is a constant</p></body></html>", None))
self.label_3.setText(
_translate("ConductivityGroupBox", "<html><head/><body><p>σ&quot;</p></body></html>", None))
self.iSigma.setToolTip(_translate("ConductivityGroupBox",
"<html><head/><body><p>If there is a Jonscher type of U<span style=\" font-style:italic;\">niversal Dielectric Response, </span>the ratio of σ&quot;/σ\'<span style=\" vertical-align:sub;\">(DC)</span> is a constant</p></body></html>",
None))
self.iSigma_sd.setText(_translate("ConductivityGroupBox", "TextLabel", None))

View File

@ -6,7 +6,7 @@ import numpy as np
import pyqtgraph as pg
import ContainerWidgets
import libyaff
from Mathlib import Functions, id_to_color
from BDSMathlib import Functions, id_to_color
__author__ = 'markusro'

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'PeakGroupBox.ui'
#
# Created: Mon Jun 2 19:55:32 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:47 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_PeakGroupBox(object):
def setupUi( self, PeakGroupBox ):
PeakGroupBox.setObjectName(_fromUtf8("PeakGroupBox"))
@ -169,9 +171,13 @@ class Ui_PeakGroupBox(object):
self.label_6.setText(_translate("PeakGroupBox", "TextLabel", None))
self.removeButton.setText(_translate("PeakGroupBox", "Remove", None))
self.label_1.setText(_translate("PeakGroupBox", "Δε", None))
self.label_3.setText(_translate("PeakGroupBox", "<html><head/><body><p>γ<span style=\" vertical-align:sub;\">CC</span></p></body></html>", None))
self.label_3.setText(_translate("PeakGroupBox",
"<html><head/><body><p>γ<span style=\" vertical-align:sub;\">CC</span></p></body></html>",
None))
self.label_8.setText(_translate("PeakGroupBox", "TextLabel", None))
self.label_4.setText(_translate("PeakGroupBox", "<html><head/><body><p>β<span style=\" vertical-align:sub;\">CD</span></p></body></html>", None))
self.label_4.setText(_translate("PeakGroupBox",
"<html><head/><body><p>β<span style=\" vertical-align:sub;\">CD</span></p></body></html>",
None))
self.label_2.setText(_translate("PeakGroupBox", "τ", None))
self.comboBox.setItemText(0, _translate("PeakGroupBox", "H-N", None))
self.comboBox.setItemText(1, _translate("PeakGroupBox", "C-C", None))

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'PowerLawGroupBox.ui'
#
# Created: Mon Jun 2 19:55:33 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:48 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_PowerLawGroupBox(object):
def setupUi( self, PowerLawGroupBox ):
PowerLawGroupBox.setObjectName(_fromUtf8("PowerLawGroupBox"))

55
QDS.py
View File

@ -19,20 +19,18 @@ import pyqtgraph as pg
from Container import Conductivity, PowerComplex, Static, Peak, YAFF
from ContainerWidgets import ParameterWidget
from Mathlib import FunctionRegister, FitRoutine
from BDSMathlib import FunctionRegister, FitRoutine
from Data import Data
import QDSMain
import ExtraDifferentialWidget
class AppWindow(QMainWindow):
def __init__(self, files=[], parent=None):
super(AppWindow, self).__init__(parent)
self.ui = QDSMain.Ui_MainWindow()
self.ui.setupUi(self)
self._file_paths = QStringList(files)
self._file_paths = self._sortInputFiles(files)
self._last_written_header = None
actions = {
@ -69,8 +67,8 @@ class AppWindow(QMainWindow):
self.ui.pgPlotWidget_imag.addItem(self.fit_boundary_imag)
self.ui.pgPlotWidget_real.addItem(self.fit_boundary_real)
self.fit_boundary_imag.sigRegionChanged.connect(self._update_fit_boundary_real)
self.fit_boundary_real.sigRegionChanged.connect(self._update_fit_boundary_imag)
self.fit_boundary_imag.sigRegionChanged.connect(self._update_fit_boundary)
self.fit_boundary_real.sigRegionChanged.connect(self._update_fit_boundary)
for pltwidgt in (self.ui.pgPlotWidget_real, self.ui.pgPlotWidget_imag):
pltwidgt.setLogMode(x=True, y=True)
@ -89,10 +87,6 @@ class AppWindow(QMainWindow):
sc_imag.sigMouseClicked.connect(self.mousePress)
sc_imag.sigMouseMoved.connect(self.updateCrosshair)
# process cmd line args
if files != []:
self.openFile(files[0])
self._current_file_index = 0
self._fit_thread = QThread()
self._fit_method = FitRoutine()
@ -101,6 +95,12 @@ class AppWindow(QMainWindow):
self._fit_method.data_ready.connect(self.updateIntermediatePlot)
self._fit_thread.started.connect(self._fit_method.fit)
# finally process cmd line args
if files != []:
self.openFile(unicode(self._file_paths[0]))
self._current_file_index = 0
def _init_menu(self):
fileMenu = self.menuBar().addMenu("File")
@ -242,12 +242,15 @@ class AppWindow(QMainWindow):
# prepare header
header="# T "
header = "{n1:13}{n2:13}".format(n1="# 0T", n2="1invT")
pars = []
bname = os.path.splitext(self.filepath)[0]
# print "Registered Functions (saveFitResult): ",self.function_registry.get_registered_functions()
varnum = 2 # T, invT are the first two columns
for i_fcn, fcn in enumerate(self.function_registry.get_registered_functions()):
for name in fcn.widget.names: # get variable names
header += "{n:11}{n_sd:11}".format(n=name, n_sd=name+"_sd")
for i, name in enumerate(fcn.widget.names): # get variable names
header += "{n:13}{n_sd:13}".format(n="%i%s"%(varnum, name), n_sd="%i%s_sd"%(varnum+1, name))
varnum += 2
# write for each function extra file
name_fcn = "%s_%i.fit"%(bname, i_fcn)
f_fcn = open(name_fcn, 'w')
@ -264,7 +267,8 @@ class AppWindow(QMainWindow):
pars.extend([par])
pars.extend([fcn._sd_beta[i]])
header += "%-11s%-11s\n"%("fit_xlow","fit_xhigh")
# append fit limits header
header += "%-13s%-13s\n"%("fit_xlow", "fit_xhigh")
# write new header if fit model changed
if self._last_written_header != header:
@ -275,10 +279,11 @@ class AppWindow(QMainWindow):
pass
pars.insert(0, self.data.meta["T"])
pars.insert(1, 1e3/self.data.meta["T"])
pars.append(self.data.fit_limits[0])
pars.append(self.data.fit_limits[1])
pars = np.array([pars])
np.savetxt(f, pars, fmt = '%-10.3e', delimiter=" ")
np.savetxt(f, pars, fmt='%-12.3e', delimiter=" ")
f.close()
def _saveFitFigure(self):
@ -308,7 +313,7 @@ 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()
del (fig)
def _saveFitFigureGrace(self):
#agrtemplate = open('template.agr').read()
@ -316,6 +321,8 @@ class AppWindow(QMainWindow):
"""
#TODO: need interface/method for adding function blocks, this is too repetitive
def addYaff(self, pos):
_yaff = YAFF(plt_real=self.ui.pgPlotWidget_real,
plt_imag=self.ui.pgPlotWidget_imag,
@ -343,7 +350,7 @@ class AppWindow(QMainWindow):
cond_par = [0.0, 10**(pos.y() + pos.x())*2*np.pi , 1.0]
_conductivity.setParameter(beta=cond_par)
self.parameterWidget.add(_conductivity.widget)
self.function_registry.register_function(_conductivity) ##todo
self.function_registry.register_function(_conductivity)
self.updatePlot()
_conductivity.blockSignals(False)
@ -479,6 +486,10 @@ class AppWindow(QMainWindow):
self.openFile(path)
self.fit_boundary_imag.setRegion(lim)
def _sortInputFiles( self, files ):
return QStringList(sorted(files, key=lambda x: re.findall("\d+\.\d+K", x)))
def openFile(self,path):
print "opening: %s"%path
self.filepath=path
@ -534,7 +545,6 @@ 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
@ -543,9 +553,9 @@ 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
#print "updatePlot: ",self.data.frequency_fit, self.data.epsilon_fit
if len(funcs) > 0:
print "funcs > 0:",self.data.frequency_fit, self.data.epsilon_fit
#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:
@ -557,12 +567,11 @@ class AppWindow(QMainWindow):
self.data.fitted_curve_real.setData(freq, intermediate_data[0])
self.data.fitted_curve_imag.setData(freq, intermediate_data[1])
def _update_fit_boundary_real(self):
def _update_fit_boundary( self ):
self.fit_boundary_real.setRegion(self.fit_boundary_imag.getRegion())
def _update_fit_boundary_imag(self):
self.fit_boundary_imag.setRegion(self.fit_boundary_real.getRegion())
def sigint_handler(*args):
"""
Handler for the SIGINT signal (CTRL + C).

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'QDSMain.ui'
#
# Created: Mon Jun 2 19:55:32 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:47 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi( self, MainWindow ):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
@ -157,5 +159,6 @@ class Ui_MainWindow(object):
self.actionActionAbortFit.setShortcut(_translate("MainWindow", "Ctrl+C", None))
self.actionShow_Derivative.setText(_translate("MainWindow", "Show Derivative", None))
from pyqtgraph import PlotWidget
import images_rc

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'StaticGroupBox.ui'
#
# Created: Mon Jun 2 19:55:33 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:48 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_StaticGroupBox(object):
def setupUi( self, StaticGroupBox ):
StaticGroupBox.setObjectName(_fromUtf8("StaticGroupBox"))
@ -96,5 +98,7 @@ class Ui_StaticGroupBox(object):
self.label.setText(_translate("StaticGroupBox", "Fix", None))
self.removeButton.setText(_translate("StaticGroupBox", "Remove", None))
self.label_4.setText(_translate("StaticGroupBox", "TextLabel", None))
self.label_1.setText(_translate("StaticGroupBox", "<html><head/><body><p>ε<span style=\" vertical-align:sub;\">infty</span></p></body></html>", None))
self.label_1.setText(_translate("StaticGroupBox",
"<html><head/><body><p>ε<span style=\" vertical-align:sub;\">infty</span></p></body></html>",
None))

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'YAFFConfig.ui'
#
# Created: Mon Jun 2 19:55:33 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:48 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Dialog(object):
def setupUi( self, Dialog ):
Dialog.setObjectName(_fromUtf8("Dialog"))
@ -97,11 +99,19 @@ class Ui_Dialog(object):
def retranslateUi( self, Dialog ):
Dialog.setWindowTitle(_translate("Dialog", "YAFF Configuration", None))
self.groupBox_time.setTitle(_translate("Dialog", "Time values (log10[t])", None))
self.label.setText(_translate("Dialog", "<html><head/><body><p>t<span style=\" vertical-align:sub;\">min</span></p></body></html>", None))
self.label_2.setText(_translate("Dialog", "<html><head/><body><p>t<span style=\" vertical-align:sub;\">max</span></p></body></html>", None))
self.label.setText(_translate("Dialog",
"<html><head/><body><p>t<span style=\" vertical-align:sub;\">min</span></p></body></html>",
None))
self.label_2.setText(_translate("Dialog",
"<html><head/><body><p>t<span style=\" vertical-align:sub;\">max</span></p></body></html>",
None))
self.label_3.setText(_translate("Dialog", "N", None))
self.groupBox_tau.setTitle(_translate("Dialog", "τ-Distribution (log10[τ])", None))
self.label_7.setText(_translate("Dialog", "<html><head/><body><p>t<span style=\" vertical-align:sub;\">min</span></p></body></html>", None))
self.label_8.setText(_translate("Dialog", "<html><head/><body><p>t<span style=\" vertical-align:sub;\">max</span></p></body></html>", None))
self.label_7.setText(_translate("Dialog",
"<html><head/><body><p>t<span style=\" vertical-align:sub;\">min</span></p></body></html>",
None))
self.label_8.setText(_translate("Dialog",
"<html><head/><body><p>t<span style=\" vertical-align:sub;\">max</span></p></body></html>",
None))
self.label_9.setText(_translate("Dialog", "N", None))

View File

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'YAFFparameters.ui'
#
# Created: Mon Jun 2 19:55:33 2014
# by: PyQt4 UI code generator 4.10.4
# Created: Tue Jul 29 08:56:48 2014
# by: PyQt4 UI code generator 4.11.1
#
# WARNING! All changes made in this file will be lost!
@ -17,12 +17,14 @@ except AttributeError:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate( context, text, disambig ):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
def setupUi( self, Form ):
Form.setObjectName(_fromUtf8("Form"))
@ -281,13 +283,17 @@ class Ui_Form(object):
self.label_huh.setText(_translate("Form", "TextLabel", None))
self.label_2.setText(_translate("Form", "TextLabel", None))
self.label_102.setText(_translate("Form", "g", None))
self.label_222.setText(_translate("Form", "<html><head/><body><p>τ<span style=\" vertical-align:sub;\">α</span></p></body></html>", None))
self.label_222.setText(
_translate("Form", "<html><head/><body><p>τ<span style=\" vertical-align:sub;\">α</span></p></body></html>",
None))
self.label_322.setText(_translate("Form", "α", None))
self.label_8.setText(_translate("Form", "TextLabel", None))
self.label_1.setText(_translate("Form", "TextLabel", None))
self.label_3.setText(_translate("Form", "TextLabel", None))
self.label_82.setText(_translate("Form", "b", None))
self.label_622.setText(_translate("Form", "<html><head/><body><p>τ<span style=\" vertical-align:sub;\">β</span></p></body></html>", None))
self.label_622.setText(
_translate("Form", "<html><head/><body><p>τ<span style=\" vertical-align:sub;\">β</span></p></body></html>",
None))
self.label_7.setText(_translate("Form", "TextLabel", None))
self.label_72.setText(_translate("Form", "a", None))
self.label_23.setText(_translate("Form", "Fix", None))

View File

@ -3,9 +3,7 @@ from PyQt4.QtGui import QColor
import numpy as np
import pyqtgraph as pg
from Mathlib import FitFunctionCreator
from BDSMathlib import FitFunctionCreator
class Data:
def __init__(self, frequency=np.zeros(1), die_real=np.zeros(1), die_imag=np.zeros(1)):

19
gracedriver.py Normal file
View File

@ -0,0 +1,19 @@
__author__ = 'markusro'
import numpy as np
def plot( x, y, **kwds ):
pass
def xlabel( label ):
pass
def ylabel( label ):
pass
def legend( ):
pass

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

File diff suppressed because it is too large Load Diff