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.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=(255,127,127)) 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, *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 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, pgPlotWidget=None, limits=None): QObject.__init__(self) super(Conductivity, self) self.widget = CustomWidgets.ConductivityWidget() self.widget.changedTable.connect(self.updateData) self.f=Functions() myPen = pg.mkPen( style=Qt.DashLine, width=1) self.color=QColor("black") self.data_curve_imag = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen) self.pgPlotWidget = pgPlotWidget self.pgPlotWidget.addItem(self.data_curve_imag) 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), 1024) sigma, sigma_N = self.getParameter() y = self.f.cond_cmplx([sigma, sigma_N], self.frequency) self.conductivity = y[1] # imaginary part self.data_curve_imag.setData(x=self.frequency, y=self.conductivity, 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.pg_plot_widget.removeItem(self.data_curve_imag) self.removeObj.emit(self) self.changedData.emit() class PowerComplex(QObject): changedData = pyqtSignal() removeObj = pyqtSignal(QObject) def __init__(self, pgPlotWidget=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=1.5) self.color=QColor("black") self.data_curve_real = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen) self.pg_plot_widget = pgPlotWidget self.pg_plot_widget.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.pg_plot_widget.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.powerlaw = self.f.power_cmplx(p, self.frequency) [1] # imaginary part self.data_curve_real.setData(x=self.frequency, y=self.powerlaw, 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, pgPlotWidget=None, limits=None): QObject.__init__(self) super(Static, self) self.widget = CustomWidgets.StaticWidget() self.widget.changedTable.connect(self.updateData) self.widget.removeMe.connect(self.removeMe) myPen = pg.mkPen( style=Qt.DashLine, width=1.5) self.color=QColor("black") self.data_curve_real = pg.PlotDataItem(x=N.array([N.nan]), y=N.array([N.nan]), pen=myPen) self.pg_plot_widget = pgPlotWidget self.pg_plot_widget.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.pg_plot_widget.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=None, mpl=None, limits=None): QObject.__init__(self) super(Peak, self).__init__() self.widget = CustomWidgets.PeakWidget() self.widget.setId(id) self.color = id_to_color(id) self.widget.setColor(self.color) self.widget.changedTable.connect(self.updatePeak) self.widget.removeMe.connect(self.removeMe) self.pg_plot_widget = mpl self.limits = limits myPen = pg.mkPen( style=Qt.DashLine, width=2, color=self.color) self.data_curve_imag = pg.PlotDataItem(x=N.array([N.nan]),y=N.array([N.nan]), pen=myPen) self.pg_plot_widget.addItem(self.data_curve_imag) self.frequency = None self.epsilon = None 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): # get current axis limits # x_min, x_max = self.mpl.canvas.axes.get_xlim() # y_min, y_max = self.mpl.canvas.axes.get_ylim() x_min,x_max, y_min, y_max = self.limits nu = N.logspace(N.log10(x_min), N.log10(x_max), 1024) y = hn(self.getParameter(), nu) # clip data to axes limits #mask = (y < y_max) & (y > y_min) #y = y[mask] #nu = nu[mask] self.frequency = nu[:] self.epsilon = y[:] self.data_curve_imag.setData(x=nu, y=y) self.changedData.emit() def get_color(self): return self.color def get_data(self): return self.frequency,self.epsilon def removeMe(self): self.pg_plot_widget.removeItem(self.data_curve_imag) self.removeObj.emit(self) self.changedData.emit()