qdsfit/data.py

348 lines
11 KiB
Python

from PyQt4.QtCore import QObject, pyqtSignal, Qt
from PyQt4.QtGui import QColor
import numpy as N
import CustomWidgets
import pyqtgraph as pg
from PyQt4.QtCore import *
from mathlib import id_to_color, hn, FitFunctionCreator, Functions
class Data:
def __init__(self, frequency=N.zeros(1), die_real=N.zeros(1), die_imag=N.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
myPen_imag = pg.mkPen(width=3, color=(255,255,127))
myPen_real = pg.mkPen(width=3, color=(51,255,127))
#33FF00
self.data_curve_imag = pg.PlotDataItem(x=[N.nan], y=[N.nan],pen=QColor(0,0,0,0), symbol='o',
symbolBrush=(255,127,0,127))
self.data_curve_real = pg.PlotDataItem(x=[N.nan], y=[N.nan],pen=QColor(0,0,0,0), symbol='s',
symbolBrush=(119,202,92,127))
self.fitted_curve_imag = pg.PlotDataItem(N.array([N.nan]), N.array([N.nan]), pen=myPen_imag)
self.fitted_curve_real = pg.PlotDataItem(N.array([N.nan]), N.array([N.nan]), pen=myPen_real)
self.length = len(frequency)
self.meta = dict()
self.fit_limits = [frequency.min(), frequency.max(), die_imag.min(), die_imag.max()]
self.fit_param = None
self.fit_funcs = None
def set_fit(self, param, funcs):
self.fit_funcs = funcs
self.fit_param = param
fit_real, fit_imag = FitFunctionCreator().fitfcn(param, self.frequency_fit, *funcs)
self.epsilon_fit = fit_real + 1j*fit_imag
def __del__(self):
#self.remove_curves()
pass
#def set_fit_limits(self, limits=(None,None,None,None)):
def set_data(self,f,e_real,e_imag):
self.frequency = 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()]
self.data_curve_imag.setData(f,e_imag)
self.data_curve_real.setData(f,e_real)
def set_fit_xlimits(self, xmin, xmax):
self.fit_limits[0] = xmin
self.fit_limits[1] = xmax
self.frequency_fit = self.frequency[(self.frequency <= xmax) & (self.frequency >= xmin)]
def set_fit_ylimits(self, ymin, ymax):
self.fit_limits[2] = ymin
self.fit_limits[3] = ymax
def get_data(self):
"""
"""
mask = N.ones(len(self.frequency), dtype='bool')
mask = (self.frequency > self.fit_limits[0]) & (self.frequency < self.fit_limits[1])
#mask &= (self.epsilon.imag > self.fit_limits[2]) & (self.epsilon.imag < self.fit_limits[3])
#mask &= (self.epsilon.real > self.fit_limits[2]) & (self.epsilon.real < self.fit_limits[3])
return self.frequency[mask], self.epsilon[mask]
def remove_curves(self):
print "remove data_curve"
#if self.data_curve is not None: self.data_curve.remove()
print "remove fitted_curve"
#if self.fitted_curve is not None: self.fitted_curve.remove()
class Conductivity(QObject):
changedData = pyqtSignal()
removeObj = pyqtSignal(QObject)
def __init__( self, plt_imag=None, plt_real=None, limits=None ):
QObject.__init__(self)
super(Conductivity, self)
self.widget = CustomWidgets.ConductivityWidget()
self.widget.changedTable.connect(self.updateData)
self.widget.removeMe.connect(self.removeMe)
self.f=Functions()
myPen = pg.mkPen( style=Qt.DashLine, width=2.5)
self.color=QColor("black")
self.plt_imag = plt_imag
self.plt_real = plt_real
self.data_curve_real = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen)
self.data_curve_imag = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen)
self.plt_imag.addItem(self.data_curve_imag)
self.plt_real.addItem(self.data_curve_real)
self.limits = limits
self.frequency = None
self.conductivity = None
self.epsilon_static = None
self.id_string = "conductivity"
def getParameter(self):
p = self.widget.getTable()
return p
def getFixed(self):
p = self.widget.fixedParameter()
return p
def setParameter(self, beta, sd_beta=None):
self.widget.updateTable(beta, sd_beta)
self.updateData()
def updateData(self):
# get current axis limits
x_min, x_max, y_min, y_max = self.limits
self.frequency = N.logspace(N.log10(x_min), N.log10(x_max), 254)
p = self.getParameter()
y = self.f.cond_cmplx(p, self.frequency)
self.conductivity = y # imaginary part
self.data_curve_real.setData(x=self.frequency, y=self.conductivity[0], label="Cond.")
self.data_curve_imag.setData(x=self.frequency, y=self.conductivity[1], label="Cond.")
self.changedData.emit()
def get_color(self):
return self.color
def get_data(self):
return self.frequency, self.conductivity
def get_epsilon_static(self):
return self.frequency, self.epsilon_static
def removeMe(self):
self.plt_imag.removeItem(self.data_curve_imag)
self.plt_real.removeItem(self.data_curve_real)
self.removeObj.emit(self)
self.changedData.emit()
class PowerComplex(QObject):
changedData = pyqtSignal()
removeObj = pyqtSignal(QObject)
def __init__( self, plt_real=None, plt_imag=None, limits=None ):
QObject.__init__(self)
super(PowerComplex, self)
self.widget = CustomWidgets.PowerLawWidget()
self.widget.changedTable.connect(self.updateData)
self.widget.removeMe.connect(self.removeMe)
myPen = pg.mkPen( style=Qt.DashLine, width=2.5)
self.color=QColor("black")
self.data_curve_real = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen)
self.data_curve_imag = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen)
self.plt_imag = plt_imag
self.plt_real = plt_real
self.plt_imag.addItem(self.data_curve_imag)
self.plt_real.addItem(self.data_curve_real)
self.limits = limits
self.frequency = None
self.powerlaw = None
self.f = Functions()
self.id_string = 'power'
def removeMe(self):
self.plt_real.removeItem(self.data_curve_real)
self.plt_imag.removeItem(self.data_curve_imag)
self.removeObj.emit(self)
self.changedData.emit()
def getParameter(self):
p = self.widget.getTable()
return p
def getFixed(self):
p = self.widget.fixedParameter()
return p
def setParameter(self, beta, sd_beta=None):
self.widget.updateTable(beta, sd_beta)
self.updateData()
def updateData(self):
# get current axis limits
x_min, x_max, y_min, y_max = self.limits
p = self.getParameter()
self.frequency = N.logspace(N.log10(x_min), N.log10(x_max), 1024)
self.powerlaw = self.f.power_cmplx(p, self.frequency) # imaginary part
self.data_curve_real.setData(x=self.frequency, y=self.powerlaw[0], label="Power Law")
self.data_curve_imag.setData(x=self.frequency, y=self.powerlaw[1], label="Power Law")
self.changedData.emit()
def get_color(self):
return self.color
def get_data(self):
return self.frequency, self.powerlaw
class Static(QObject):
changedData = pyqtSignal()
removeObj = pyqtSignal(QObject)
def __init__( self, plt_real=None, plt_imag=None, limits=None ):
QObject.__init__(self)
super(Static, self)
self.plt_real = plt_real
self.plt_imag = plt_imag
self.widget = CustomWidgets.StaticWidget()
self.widget.changedTable.connect(self.updateData)
self.widget.removeMe.connect(self.removeMe)
myPen = pg.mkPen( style=Qt.DashLine, width=2.5)
self.color=QColor("black")
self.data_curve_real = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen)
self.plt_real.addItem(self.data_curve_real)
self.limits = limits
self.frequency = None
self.static = None
self.f = Functions()
self.id_string = 'static'
def removeMe(self):
self.plt_real.removeItem(self.data_curve_real)
self.removeObj.emit(self)
self.changedData.emit()
def getParameter(self):
p = self.widget.getTable()
return p
def getFixed(self):
p = self.widget.fixedParameter()
return p
def setParameter(self, beta, sd_beta=None):
self.widget.updateTable(beta, sd_beta)
self.updateData()
def updateData(self):
# get current axis limits
x_min, x_max, y_min, y_max = self.limits
p = self.getParameter()
self.frequency = N.logspace(N.log10(x_min), N.log10(x_max), 1024)
self.static = self.f.static_cmplx(p, self.frequency) [0] # real part
self.data_curve_real.setData(x=self.frequency, y=self.static, label="Power Law")
self.changedData.emit()
def get_color(self):
return self.color
def get_data(self):
return self.frequency, self.static
#def conductivity(p, nu):
# c = p[0] / (2 * N.pi * nu) ** p[1]
# return c
class Peak(QObject):
changedData = pyqtSignal()
removeObj = pyqtSignal(QObject)
def __init__( self, id_num=None, plt_real=None, plt_imag=None, limits=None ):
QObject.__init__(self)
super(Peak, self).__init__()
self.widget = CustomWidgets.PeakWidget()
self.widget.setId(id_num)
self.color = id_to_color(id_num)
self.id_num = id_num
self.widget.setColor(self.color)
self.widget.changedTable.connect(self.updatePeak)
self.widget.removeMe.connect(self.removeMe)
self.plt_real = plt_real
self.plt_imag = plt_imag
self.limits = limits
myPen = pg.mkPen( style=Qt.DashLine, width=3, color=self.color)
self.data_curve_imag = pg.PlotDataItem(x=N.array([N.nan]),y=N.array([N.nan]), pen=myPen)
self.data_curve_real = pg.PlotDataItem(x=N.array([N.nan]),y=N.array([N.nan]), pen=myPen)
self.plt_imag.addItem(self.data_curve_imag)
self.plt_real.addItem(self.data_curve_real)
self.frequency = None
self.epsilon = None
self.f = Functions()
self.id_string = "hn"
def getParameter(self):
p = self.widget.getTable()
return p
def getFixed(self):
p = self.widget.fixedParameter()
return p
def setParameter(self, beta, sd_beta=None):
# delta_eps=None, tau=None, a=None, b=None
self.widget.updateTable(beta=beta, sd_beta=sd_beta)
self.updatePeak()
def updatePeak(self):
x_min,x_max, y_min, y_max = self.limits
self.frequency = N.logspace(N.log10(x_min), N.log10(x_max), 1024)
self.epsilon = self.f.hn_cmplx(self.getParameter(), self.frequency)
self.data_curve_imag.setData(x=self.frequency, y=self.epsilon[1])
self.data_curve_real.setData(x=self.frequency, y=self.epsilon[0])
self.changedData.emit()
def get_color(self):
return self.color
def get_data(self):
return self.frequency,self.epsilon
def removeMe(self):
self.plt_imag.removeItem(self.data_curve_imag)
self.plt_real.removeItem(self.data_curve_real)
self.removeObj.emit(self)
self.changedData.emit()