2013-06-14 06:44:34 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- encoding: utf-8 -*-
|
2013-07-10 16:36:07 +00:00
|
|
|
import os
|
|
|
|
import sys
|
2013-06-14 06:44:34 +00:00
|
|
|
import re
|
|
|
|
import signal
|
|
|
|
|
|
|
|
from PyQt4.QtCore import *
|
|
|
|
from PyQt4.QtGui import *
|
|
|
|
|
2013-07-17 11:00:24 +00:00
|
|
|
from mathlib import fit_anneal, fit_lbfgsb, fit_odr, hn, id_to_color
|
|
|
|
from matplotlibWidget import PlotWidget
|
2013-07-12 14:11:29 +00:00
|
|
|
|
2013-07-17 11:00:24 +00:00
|
|
|
#matplotlib.rc_file("default.mplrc")
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
import numpy as N
|
|
|
|
|
|
|
|
import QDSMain
|
|
|
|
import PeakWidget
|
2013-07-10 16:36:07 +00:00
|
|
|
from data import Data, Conductivity, conductivity
|
2013-06-14 06:44:34 +00:00
|
|
|
#import yaff
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def sigint_handler(*args):
|
2013-07-10 16:36:07 +00:00
|
|
|
"""Handler for the SIGINT signal (CTRL + C).
|
|
|
|
"""
|
2013-06-14 06:44:34 +00:00
|
|
|
sys.stderr.write('\r')
|
|
|
|
if QMessageBox.question(None, '', "Are you sure you want to quit?",
|
|
|
|
QMessageBox.Yes | QMessageBox.No,
|
|
|
|
QMessageBox.No) == QMessageBox.Yes:
|
|
|
|
QApplication.quit()
|
|
|
|
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
def tau_peak(f, a, b):
|
|
|
|
tau = (N.sin(N.pi * a / 2. / (b + 1)) / N.sin(N.pi * a * b / 2. / (b + 1))) ** (1 / a)
|
|
|
|
tau /= 2 * N.pi * f
|
2013-06-14 06:44:34 +00:00
|
|
|
return tau
|
|
|
|
|
|
|
|
|
2013-07-17 11:00:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Peak(QObject):
|
|
|
|
changedData = pyqtSignal()
|
2013-07-10 16:36:07 +00:00
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
def __init__(self, id=None, mpl=None):
|
|
|
|
QObject.__init__(self)
|
|
|
|
super(Peak, self).__init__()
|
|
|
|
|
|
|
|
self.color = id_to_color(id)
|
|
|
|
self.widget = PeakWidget.PeakWidget()
|
|
|
|
self.widget.setId(id)
|
2013-07-10 16:36:07 +00:00
|
|
|
self.widget.setColor(map(int, [255 * i for i in self.color]))
|
2013-06-14 06:44:34 +00:00
|
|
|
self.widget.changedTable.connect(self.updatePeak)
|
|
|
|
self.mpl = mpl
|
|
|
|
self.mpl_line = None
|
|
|
|
|
|
|
|
|
|
|
|
def getParameter(self):
|
2013-07-10 16:36:07 +00:00
|
|
|
p = self.widget.peakParameter()
|
2013-06-14 06:44:34 +00:00
|
|
|
return p
|
|
|
|
|
|
|
|
def getFixed(self):
|
2013-07-10 16:36:07 +00:00
|
|
|
p = self.widget.fixedParameter()
|
2013-06-14 06:44:34 +00:00
|
|
|
return p
|
|
|
|
|
|
|
|
def setParameter(self, delta_eps=None, tau=None, a=None, b=None):
|
|
|
|
self.widget.updateTable(delta_eps, tau, a, b)
|
|
|
|
self.updatePeak()
|
|
|
|
|
|
|
|
def updatePeak(self):
|
|
|
|
# get current axis limits
|
|
|
|
x_min, x_max = self.mpl.canvas.axes.get_xlim()
|
|
|
|
y_min, y_max = self.mpl.canvas.axes.get_ylim()
|
|
|
|
|
|
|
|
nu = N.logspace(N.log10(x_min), N.log10(x_max), 2048)
|
2013-07-10 16:36:07 +00:00
|
|
|
y = hn(self.getParameter(), nu)
|
2013-06-14 06:44:34 +00:00
|
|
|
# clip data to axes limits
|
|
|
|
mask = (y < y_max) & (y > y_min)
|
|
|
|
y = y[mask]
|
|
|
|
nu = nu[mask]
|
|
|
|
if self.mpl_line == None:
|
2013-07-10 16:36:07 +00:00
|
|
|
self.mpl_line, = self.mpl.canvas.axes.loglog(nu, y, '--', label="Peak %i" % (self.widget.id),
|
|
|
|
animated=True) # peak
|
2013-06-14 06:44:34 +00:00
|
|
|
self.mpl_line.set_color(self.color)
|
|
|
|
else:
|
|
|
|
self.mpl_line.set_xdata(nu)
|
|
|
|
self.mpl_line.set_ydata(y)
|
|
|
|
self.changedData.emit()
|
|
|
|
|
|
|
|
|
|
|
|
class AppWindow(QMainWindow):
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
super(AppWindow, self).__init__(parent)
|
|
|
|
self.ui = QDSMain.Ui_MainWindow()
|
|
|
|
self.ui.setupUi(self)
|
|
|
|
self.picked_artist = None
|
|
|
|
self.data = None
|
|
|
|
|
|
|
|
self.Conductivity = None
|
|
|
|
|
|
|
|
self._lines = dict()
|
|
|
|
|
|
|
|
self.peakId = 0
|
|
|
|
self.peakBoxes = {}
|
2013-07-10 16:36:07 +00:00
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
## menubar
|
|
|
|
fileMenu = self.menuBar().addMenu("File")
|
2013-07-10 16:36:07 +00:00
|
|
|
openFile = QAction("&Open", self)
|
2013-06-14 06:44:34 +00:00
|
|
|
openFile.setShortcut(QKeySequence.Open)
|
|
|
|
openFile.triggered.connect(self.openFile)
|
|
|
|
fileMenu.addAction(openFile)
|
|
|
|
# fitting methods
|
2013-07-10 16:36:07 +00:00
|
|
|
fitMenu = self.menuBar().addMenu("Standard Fits")
|
2013-06-14 06:44:34 +00:00
|
|
|
# lm
|
2013-07-10 16:36:07 +00:00
|
|
|
fit_lmAction = QAction("&Levenberg-Marquardt", self)
|
|
|
|
fit_lmAction.setShortcut(QKeySequence("Ctrl+F"))
|
2013-06-14 06:44:34 +00:00
|
|
|
fitMenu.addAction(fit_lmAction)
|
|
|
|
# lbfgsb
|
2013-07-10 16:36:07 +00:00
|
|
|
fit_lbfgsbAction = QAction("&L-BFGS-B", self)
|
2013-06-14 06:44:34 +00:00
|
|
|
fitMenu.addAction(fit_lbfgsbAction)
|
|
|
|
# Simulated Annealing
|
2013-07-10 16:36:07 +00:00
|
|
|
fit_annealAction = QAction("&Simulated Annealing", self)
|
2013-06-14 06:44:34 +00:00
|
|
|
fitMenu.addAction(fit_annealAction)
|
2013-07-10 16:36:07 +00:00
|
|
|
# YAFF
|
|
|
|
yaffMenu = self.menuBar().addMenu("YAFF")
|
|
|
|
start_yaff = QAction("&Startparam.", self)
|
|
|
|
yaffMenu.addAction(start_yaff)
|
|
|
|
fit_yaff = QAction("&Fit", self)
|
|
|
|
yaffMenu.addAction(fit_yaff)
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
self.signalMapper = QSignalMapper(self)
|
|
|
|
for i, fit_action in enumerate([fit_lmAction, fit_lbfgsbAction, fit_annealAction
|
2013-07-10 16:36:07 +00:00
|
|
|
]):
|
|
|
|
self.signalMapper.setMapping(fit_action, i)
|
2013-06-14 06:44:34 +00:00
|
|
|
fit_action.triggered.connect(self.signalMapper.map)
|
|
|
|
self.signalMapper.mapped.connect(self.fitData)
|
|
|
|
|
|
|
|
# save fitted values
|
2013-07-17 11:00:24 +00:00
|
|
|
self.ui.actionSave_FitResult.triggered.connect(self.saveFitResult)
|
2013-07-10 16:36:07 +00:00
|
|
|
# the plot area, a matplotlib widget
|
2013-06-14 06:44:34 +00:00
|
|
|
self.mplWidget = PlotWidget(self.ui.mplWidget)
|
|
|
|
self.mplWidget.canvas.draw()
|
|
|
|
self.mplWidget.updateGeometry()
|
2013-07-10 16:36:07 +00:00
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
# what to do with CIDs?
|
|
|
|
self.cid = []
|
2013-07-10 16:36:07 +00:00
|
|
|
self.cid.append(self.mplWidget.canvas.mpl_connect("button_press_event", self.mpl_button_press))
|
|
|
|
self.cid.append(self.mplWidget.canvas.mpl_connect("pick_event", self.mpl_button_pick))
|
|
|
|
self.cid.append(self.mplWidget.canvas.mpl_connect("button_release_event", self.mpl_button_release))
|
|
|
|
#self.cid.append(self.mplWidget.canvas.mpl_connect("resize_event", self.myresizeEvent))
|
2013-06-14 06:44:34 +00:00
|
|
|
self.mplWidget.toolbar.spanSelectedTrigger.connect(self.set_fit_xlimits)
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
def resizeEvent(self, evt):
|
|
|
|
"""resizing the main window executes this method
|
|
|
|
TODO: FIX RESIZEING keeping mainwindow maximised for now
|
|
|
|
:param evt:
|
|
|
|
"""
|
2013-06-14 06:44:34 +00:00
|
|
|
self.mplWidget.canvas.draw()
|
2013-07-10 16:36:07 +00:00
|
|
|
self.mplWidget._bg_cache = self.mplWidget.canvas.copy_from_bbox(self.mplWidget.canvas.axes.bbox)
|
2013-06-14 06:44:34 +00:00
|
|
|
for line in self.mplWidget.canvas.axes.get_lines():
|
|
|
|
line.set_animated(False)
|
|
|
|
self.mplWidget.canvas.draw()
|
|
|
|
for line in self.mplWidget.canvas.axes.get_lines():
|
|
|
|
line.set_animated(True)
|
|
|
|
|
|
|
|
|
2013-07-17 11:00:24 +00:00
|
|
|
def saveFitResult(self):
|
2013-07-10 16:36:07 +00:00
|
|
|
"""
|
|
|
|
Saving fit parameters to fitresults.log
|
|
|
|
including temperature
|
|
|
|
"""
|
2013-06-14 06:44:34 +00:00
|
|
|
if not os.path.exists("fitresults.log"):
|
2013-07-10 16:36:07 +00:00
|
|
|
f = open("fitresults.log", "w")
|
2013-06-14 06:44:34 +00:00
|
|
|
else:
|
2013-07-10 16:36:07 +00:00
|
|
|
f = open("fitresults.log", "a")
|
2013-07-17 11:00:24 +00:00
|
|
|
# write header
|
|
|
|
f.write('# T ')
|
|
|
|
parfmt = "%.2f" # T formatting
|
|
|
|
# if self.Conductivity != None: pass# always true
|
|
|
|
f.write("%8s %8s %8s " % ("e_s", "sig", "pow_sig"))
|
|
|
|
parfmt += " %.3g %.3g %.2f " # conductivity formatting
|
|
|
|
for i, pb in enumerate(self.peakBoxes):
|
|
|
|
enum_peak = ("e_inf_%i" % i, "tau_%i" % i, "alpha_%i" % i, "beta_%i" % i)
|
|
|
|
f.write("%8s %8s %8s %8s " % enum_peak)
|
|
|
|
parfmt += " %.3g %.3g %.2f %.2f" # peak formatting
|
|
|
|
f.write("high_lim lower_lim") # TODO: store limits
|
|
|
|
f.write('\n')
|
|
|
|
f.flush()
|
|
|
|
#f.write("%3.2f "%(self.data.meta["T"]))
|
2013-06-14 06:44:34 +00:00
|
|
|
pars = list(self.fitresult)
|
2013-07-10 16:36:07 +00:00
|
|
|
pars.insert(0, self.data.meta["T"])
|
2013-07-17 11:00:24 +00:00
|
|
|
N.savetxt(f, N.array([pars, ]), fmt=parfmt, delimiter=" ")
|
2013-06-14 06:44:34 +00:00
|
|
|
f.close()
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
def set_fit_xlimits(self, xmin, xmax):
|
|
|
|
self.data.fit_limits = (xmin, xmax, None, None)
|
|
|
|
self.updatePlot()
|
2013-06-14 06:44:34 +00:00
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
def mpl_button_release(self, event):
|
|
|
|
ax = self.mplWidget.canvas.axes
|
|
|
|
if self.picked_artist:
|
2013-06-14 06:44:34 +00:00
|
|
|
if not event.inaxes: # moved outside the plot, add back to original position
|
2013-07-10 16:36:07 +00:00
|
|
|
ax.add_artist(self.picked_artist)
|
2013-06-14 06:44:34 +00:00
|
|
|
else: # we move one of the three points determinig the peak
|
|
|
|
self.picked_artist.set_xdata(event.xdata)
|
|
|
|
self.picked_artist.set_ydata(event.ydata)
|
2013-07-10 16:36:07 +00:00
|
|
|
ax.add_artist(self.picked_artist)
|
2013-06-14 06:44:34 +00:00
|
|
|
for peak in self.peakBoxes.keys():
|
|
|
|
peak.updatePeak()
|
|
|
|
self.picked_artist = None
|
|
|
|
self.mplWidget.canvas.draw_idle()
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
def mpl_button_pick(self, event):
|
2013-06-14 06:44:34 +00:00
|
|
|
self.picked_artist = event.artist
|
|
|
|
event.artist.remove()
|
|
|
|
self.mplWidget.canvas.draw_idle()
|
2013-07-10 16:36:07 +00:00
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
def addCond(self, pos):
|
|
|
|
if self.Conductivity != None:
|
|
|
|
return
|
|
|
|
self.statusBar().showMessage("Click on graph")
|
|
|
|
self.Conductivity = Conductivity(mpl=self.mplWidget)
|
|
|
|
self.Conductivity.changedData.connect(self.updatePlot)
|
2013-07-10 16:36:07 +00:00
|
|
|
self.Conductivity.setParameter(0, 1 / (pos[0] / pos[1] / 2 / N.pi), 1.0)
|
2013-06-14 06:44:34 +00:00
|
|
|
self.ui.scrollAreaWidgetContents.layout().addWidget(self.Conductivity.widget)
|
|
|
|
self.Conductivity.widget.ui.removeButton.clicked.connect(self.delCond)
|
|
|
|
|
|
|
|
def delCond(self):
|
|
|
|
self.cond_param = None
|
|
|
|
self.cond = None
|
|
|
|
self.Conductivity.mpl_line.remove()
|
|
|
|
self.Conductivity.mpl_line_static.remove()
|
|
|
|
del self.Conductivity
|
|
|
|
self.Conductivity = None
|
|
|
|
self.updatePlot()
|
|
|
|
|
|
|
|
|
|
|
|
def addPeak(self, pos):
|
|
|
|
self.peakId += 1
|
|
|
|
self.statusBar().showMessage("Select Peak Position")
|
|
|
|
|
|
|
|
peak = Peak(id=self.peakId, mpl=self.mplWidget)
|
|
|
|
# connect to delPeak
|
|
|
|
peak.widget.ui.removeButton.clicked.connect(self.delPeak)
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
peak.setParameter(delta_eps=pos[1], tau=1 / (2. * N.pi * pos[0]), a=1, b=1)
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
peak.changedData.connect(self.updatePlot)
|
|
|
|
|
2013-07-10 16:36:07 +00:00
|
|
|
self.peakBoxes[peak] = None
|
2013-06-14 06:44:34 +00:00
|
|
|
for pb in self.peakBoxes.keys():
|
|
|
|
self.ui.scrollAreaWidgetContents.layout().addWidget(pb.widget)
|
|
|
|
self.updatePlot()
|
2013-07-10 16:36:07 +00:00
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
def delPeak(self):
|
|
|
|
deletePeaks = []
|
|
|
|
for i in xrange(self.ui.scrollAreaWidgetContents.layout().count()):
|
|
|
|
print i
|
2013-07-10 16:36:07 +00:00
|
|
|
|
|
|
|
for i, peak in enumerate(self.peakBoxes.keys()):
|
2013-06-14 06:44:34 +00:00
|
|
|
if peak.widget.isHidden():
|
|
|
|
peak.mpl_line.remove()
|
|
|
|
deletePeaks.append(peak)
|
|
|
|
for peak in deletePeaks:
|
|
|
|
self.peakBoxes.pop(peak)
|
|
|
|
self.updatePlot()
|
|
|
|
|
|
|
|
def fitData(self, method):
|
|
|
|
if self.Conductivity != None:
|
|
|
|
start_parameter = list(self.Conductivity.getParameter())
|
2013-07-10 16:36:07 +00:00
|
|
|
fixed_params = [i for i in self.Conductivity.getFixed()]
|
2013-06-14 06:44:34 +00:00
|
|
|
else:
|
2013-07-10 16:36:07 +00:00
|
|
|
start_parameter = [0, 0, 1]
|
|
|
|
fixed_params = [0, 0, 0]
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
for pb in self.peakBoxes.keys():
|
2013-07-10 16:36:07 +00:00
|
|
|
[start_parameter.append(i) for i in pb.getParameter()]
|
|
|
|
[fixed_params.append(i) for i in pb.getFixed()]
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
fit_methods = [fit_odr, fit_lbfgsb, fit_anneal]
|
2013-07-10 16:36:07 +00:00
|
|
|
print "StartParameter", start_parameter
|
|
|
|
print "FixedParameter", fixed_params
|
2013-06-14 06:44:34 +00:00
|
|
|
print "Limits (xmin, xmax, ymin, ymax)", self.data.fit_limits
|
|
|
|
_freq, _fit = self.data.get_data()
|
|
|
|
result = fit_methods[method](_freq, _fit.imag, start_parameter, fixed_params)
|
|
|
|
self.fitresult = result
|
2013-07-10 16:36:07 +00:00
|
|
|
for i, pb in enumerate(self.peakBoxes.keys()):
|
|
|
|
delta_eps, tau, a, b = result[3 + i * 4:3 + (i + 1) * 4]
|
|
|
|
pb.setParameter(delta_eps, tau, a, b)
|
|
|
|
e_static, sigma, sigma_N = result[:3]
|
2013-06-14 06:44:34 +00:00
|
|
|
if self.Conductivity != None:
|
2013-07-10 16:36:07 +00:00
|
|
|
self.Conductivity.setParameter(e_static, sigma, sigma_N)
|
|
|
|
#print "*** FIT RESULTS ***"
|
|
|
|
#print u"\u03c3"
|
|
|
|
#print u"\u0394\u03b5"
|
2013-06-14 06:44:34 +00:00
|
|
|
self.updatePlot()
|
2013-07-10 16:36:07 +00:00
|
|
|
|
|
|
|
def mpl_button_press(self, event):
|
2013-06-14 06:44:34 +00:00
|
|
|
"""
|
|
|
|
Handles the clicks on the matplotlib figure canvas
|
|
|
|
"""
|
2013-07-10 16:36:07 +00:00
|
|
|
if self.ui.actionAdd_Peak.isChecked() and event.inaxes:
|
|
|
|
x, y = event.xdata, event.ydata
|
|
|
|
self.addPeak((x, y))
|
2013-06-14 06:44:34 +00:00
|
|
|
self.ui.actionAdd_Peak.setChecked(False)
|
|
|
|
self.statusBar().clear()
|
2013-07-10 16:36:07 +00:00
|
|
|
if self.ui.actionAdd_Cond.isChecked() and event.inaxes:
|
|
|
|
x, y = event.xdata, event.ydata
|
|
|
|
self.addCond((x, y))
|
2013-06-14 06:44:34 +00:00
|
|
|
self.ui.actionAdd_Cond.setChecked(False)
|
|
|
|
self.statusBar().clear()
|
|
|
|
|
|
|
|
def openFile(self):
|
2013-07-10 16:36:07 +00:00
|
|
|
ax = self.mplWidget.canvas.axes
|
2013-07-12 14:11:29 +00:00
|
|
|
ax.clear()
|
2013-06-14 06:44:34 +00:00
|
|
|
path = unicode(QFileDialog.getOpenFileName(self, "Open file"))
|
|
|
|
# TODO anaylize file (LF,MF, HF) and act accordingly
|
|
|
|
data = N.loadtxt(path, skiprows=4)
|
|
|
|
numpat = re.compile('\d+\.\d+')
|
|
|
|
try:
|
2013-07-10 16:36:07 +00:00
|
|
|
Temp = None
|
2013-06-14 06:44:34 +00:00
|
|
|
for line in open(path).readlines():
|
|
|
|
if re.search("Fixed", line) or re.search("Temp", line):
|
2013-07-10 16:36:07 +00:00
|
|
|
print "Found line with Fixed or Temp"
|
2013-06-14 06:44:34 +00:00
|
|
|
Temp = float(re.search(numpat, line).group())
|
2013-07-10 16:36:07 +00:00
|
|
|
print "Temperature found in file:", Temp
|
2013-06-14 06:44:34 +00:00
|
|
|
break
|
2013-07-10 16:36:07 +00:00
|
|
|
if Temp == None: raise ValueError
|
2013-06-14 06:44:34 +00:00
|
|
|
except:
|
2013-07-10 16:36:07 +00:00
|
|
|
Temp = QInputDialog.getDouble(self, "No temperature found in data set", "Temperature/K:", value=0.00)[0]
|
|
|
|
# mask the data to values > 0 (loglog plot)
|
|
|
|
mask = (data[:, 1] > 0) & (data[:, 2] > 0) #& (data[:,2]>1e-3) & (data[:,0] > 1e-2)
|
|
|
|
_freq = data[mask, 0]
|
|
|
|
_die_stor = data[mask, 1]
|
|
|
|
_die_loss = data[mask, 2]
|
2013-06-14 06:44:34 +00:00
|
|
|
# clear the figure
|
2013-07-10 16:36:07 +00:00
|
|
|
ax.clear()
|
2013-06-14 06:44:34 +00:00
|
|
|
#if self.data != None:
|
|
|
|
# self.data.remove_curves()
|
|
|
|
self.data = Data(_freq, _die_stor, _die_loss)
|
2013-07-10 16:36:07 +00:00
|
|
|
self.data.meta["T"] = Temp
|
|
|
|
self.data.data_curve, = ax.loglog(self.data.frequency,
|
|
|
|
self.data.epsilon.imag,
|
|
|
|
'b.',
|
|
|
|
markersize=4,
|
|
|
|
label="Data",
|
|
|
|
animated=True)
|
|
|
|
ax.set_xlabel("Frequency/Hz", fontsize=16)
|
|
|
|
#ax.set_ylabel(u'\u03B5"', fontsize=16)
|
|
|
|
ax.set_ylabel(u'e"', fontsize=16)
|
|
|
|
|
|
|
|
ax.autoscale(True)
|
|
|
|
ax.set_xlim(_freq.min()/3, _freq.max()*3)
|
|
|
|
|
|
|
|
self.legend = ax.legend(title="T=%.2f" % Temp)
|
|
|
|
for line in ax.get_lines():
|
2013-06-14 06:44:34 +00:00
|
|
|
line.set_animated(False)
|
2013-07-10 16:36:07 +00:00
|
|
|
ax.grid()
|
2013-06-14 06:44:34 +00:00
|
|
|
self.mplWidget.canvas.draw()
|
2013-07-10 16:36:07 +00:00
|
|
|
# weird behaviour need to draw all first, then set_animated the redraw
|
|
|
|
for line in ax.get_lines():
|
2013-06-14 06:44:34 +00:00
|
|
|
line.set_animated(True)
|
|
|
|
self.legend.set_animated(True)
|
2013-07-10 16:36:07 +00:00
|
|
|
ax.autoscale(False)
|
|
|
|
self.mplWidget._bg_cache = self.mplWidget.canvas.copy_from_bbox(ax.bbox)
|
2013-06-14 06:44:34 +00:00
|
|
|
self.updatePlot()
|
|
|
|
|
|
|
|
def updatePlot(self):
|
2013-07-10 16:36:07 +00:00
|
|
|
ax = self.mplWidget.canvas.axes
|
2013-06-14 06:44:34 +00:00
|
|
|
nu = self.data.frequency
|
|
|
|
fit = N.zeros(len(nu))
|
|
|
|
for peak in self.peakBoxes.keys():
|
|
|
|
params = peak.getParameter()
|
2013-07-10 16:36:07 +00:00
|
|
|
fit += hn(params, nu)
|
2013-06-14 06:44:34 +00:00
|
|
|
if self.Conductivity != None:
|
|
|
|
print "Cond. given"
|
|
|
|
params = self.Conductivity.getParameter()[1:]
|
|
|
|
fit += conductivity(params, nu)
|
|
|
|
fit += self.Conductivity.getParameter()[0] # eps static
|
2013-07-10 16:36:07 +00:00
|
|
|
# clip data to axes limits
|
|
|
|
y_min, y_max = ax.get_ylim()
|
2013-06-14 06:44:34 +00:00
|
|
|
mask = (fit < y_max) & (fit > y_min)
|
|
|
|
#mask = N.ones(len(fit), dtype="bool")
|
|
|
|
if self.data.fitted_curve == None:
|
2013-07-10 16:36:07 +00:00
|
|
|
self.data.fitted_curve, = ax.loglog(nu[mask], fit[mask],
|
|
|
|
'k-',
|
|
|
|
alpha=0.5,
|
|
|
|
label="Sum",
|
|
|
|
animated=True)
|
2013-06-14 06:44:34 +00:00
|
|
|
else:
|
|
|
|
self.data.fitted_curve.set_xdata(nu[mask])
|
|
|
|
self.data.fitted_curve.set_ydata(fit[mask])
|
2013-07-12 14:11:29 +00:00
|
|
|
# handling of fit limit bars
|
|
|
|
# if self.mplWidget._axvlims != []:
|
|
|
|
# [axv.remove() for axv in self.mplWidget._axvlims]
|
|
|
|
# self.mplWidget._axvlims = []
|
|
|
|
# if self.mplWidget._axvname != []:
|
|
|
|
# [axvname.remove() for axvname in self.mplWidget._axvname]
|
|
|
|
# self.mplWidget._axvname = []
|
|
|
|
#print self.mplWidget._axvlims
|
|
|
|
if self.mplWidget._axvlims == []:
|
|
|
|
for i,xlim in enumerate(self.data.fit_limits[:2]):
|
|
|
|
|
|
|
|
self.mplWidget._axvlims.append(ax.axvline(xlim, color="k", ls="--", alpha=0.5, animated=True))
|
|
|
|
self.mplWidget._axvname.append(ax.text(xlim, y_min*3. , "%.3g"%xlim,
|
2013-07-10 16:36:07 +00:00
|
|
|
horizontalalignment='center',
|
|
|
|
verticalalignment='center',
|
|
|
|
animated=True) )
|
2013-07-12 14:11:29 +00:00
|
|
|
else:
|
|
|
|
for i,xlim in enumerate(self.data.fit_limits[:2]):
|
|
|
|
self.mplWidget._axvlims[i].set_xdata(xlim)
|
|
|
|
self.mplWidget._axvname[i].set_x(xlim)
|
|
|
|
self.mplWidget._axvname[i].set_text("%.3g"%xlim)
|
|
|
|
|
2013-06-14 06:44:34 +00:00
|
|
|
self.mplWidget.canvas.restore_region(self.mplWidget._bg_cache)
|
2013-07-10 16:36:07 +00:00
|
|
|
self.legend = ax.legend(title="T=%.2f" % (self.data.meta["T"]))
|
2013-06-14 06:44:34 +00:00
|
|
|
self.legend.set_animated(True)
|
2013-07-10 16:36:07 +00:00
|
|
|
for animated_artist in ax.findobj(match=lambda x: x.get_animated()):
|
2013-06-14 06:44:34 +00:00
|
|
|
#print "updatePlot: animated artist:",animated_artist
|
2013-07-10 16:36:07 +00:00
|
|
|
ax.draw_artist(animated_artist)
|
|
|
|
self.mplWidget.canvas.blit(ax.bbox)
|
2013-06-14 06:44:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
signal.signal(signal.SIGINT, sigint_handler)
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
timer = QTimer()
|
|
|
|
timer.start(1000) # Check every second for Strg-c on Cmd line
|
|
|
|
timer.timeout.connect(lambda: None)
|
|
|
|
main = AppWindow()
|
|
|
|
main.showMaximized()
|
|
|
|
main.raise_()
|
|
|
|
sys.exit(app.exec_())
|