#!/usr/bin/env python # -*- coding: utf-8 -*- from ui import ConductivityGroupBox, PeakGroupBox, StaticGroupBox, PowerLawGroupBox, YAFFparameters, YAFFConfig __author__ = 'Markus Rosenstihl ' from PyQt4.QtGui import * from PyQt4.QtCore import QRegExp, pyqtSignal, pyqtSlot class ParameterWidget(QWidget): def __init__(self, parent=None): super(ParameterWidget, self).__init__(parent) self.vlayout = QVBoxLayout(self) self.vlayout.addSpacerItem(QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.blockSignals(True) def add(self, wdgt): self.vlayout.insertWidget(self.vlayout.count() - 1, wdgt) self.vlayout.update() class LogFSpinBox(QDoubleSpinBox): scientificNotationValidator = QRegExpValidator(QRegExp("[+-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?")) def __init__(self, parent=None): super(LogFSpinBox, self).__init__(parent) self.setRange(0.0, 1e18) self.setMinimum(0) self.setDecimals(17) self.setValue(1.0) def stepBy(self, up_down): if self.value() != 0.0: self.setValue(self.value() * 10 ** (up_down / 9.0)) # 19 steps per decade def textFromValue(self, value): return "%.3e" % value def valueFromText(self, str_value): return str_value.toDouble()[0] def validate(self, str_value, p_int): return self.scientificNotationValidator.validate(str_value, p_int) class BaseWidget(QGroupBox): changedTable = pyqtSignal() removeMe = pyqtSignal() subtract = pyqtSignal(bool) def __init__(self, parent=None): super(BaseWidget, self).__init__(parent) self.fixedCheckBoxes = [] self.inputs = [] self.errors = [] self.names = [] self._subtracted = False self.selector_mask = None # TODO: clean up self.func_type = "None" def remove(self): self.removeMe.emit() def subtract(self): self.subtract.emit(self._subtracted) self._subtracted = not self._subtracted # Toggle state def change_values(self, num): self.changedTable.emit() def fixedParameter(self): return [0 if cb.isChecked() else 1 for cb in self.fixedCheckBoxes] def setColor(self, color): r, g, b = color palette = self.palette() palette.setColor(QPalette.Foreground, QColor(r, g, b)) self.setPalette(palette) def getTable(self): tmp = [i.value() # selects the number, ignores the status for i in self.inputs] # print "getTable:", tmp return tmp def update(self): self.changedTable.emit() def update_table(self, beta, sd_beta=None): self.blockSignals(True) for i, arg in enumerate(beta): self.inputs[i].setValue(arg) sd_style = "" if isinstance(self.inputs[i], LogFSpinBox) and sd_beta is not None: # if i in (0,) and sd_beta is not None: sd = "+/- %.3e" % (sd_beta[i]) elif isinstance(self.inputs[i], QDoubleSpinBox) and sd_beta is not None: # elif i in (1,) and sd_beta is not None: sd = "+/- %.2f" % (sd_beta[i]) if sd_beta is not None: if 0.0 < sd_beta[i] / arg < 0.2: sd_style = "background-color: rgba(0, 255, 0, 64);" if 0.2 < sd_beta[i] / arg < 1.0: sd_style = "background-color: rgba(255,255, 0, 64);" elif sd_beta[i] / arg > 1.0: sd_style = "background-color: rgba(255, 0, 0, 64);" else: sd = "( --- )" self.errors[i].setStyleSheet(sd_style) self.errors[i].setText(sd) self.blockSignals(False) def replaceDoubleSpinBox(self, layout, widget): ndx = layout.indexOf(widget) row, column, cols, rows = layout.getItemPosition(ndx) widget.setParent(None) widget = LogFSpinBox(self) layout.addWidget(widget, row, column) class PeakWidget(BaseWidget, QGroupBox): def __init__(self, parent=None): QGroupBox.__init__(self) BaseWidget.__init__(self) super(PeakWidget, self).__init__(parent) self.ui = PeakGroupBox.Ui_PeakGroupBox() self.ui.setupUi(self) # replace eps and tau with LogFSpinBox self.ui.doubleSpinBox_1.setParent(None) self.ui.doubleSpinBox_1 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_1, 1, 1) self.ui.doubleSpinBox_2.setParent(None) self.ui.doubleSpinBox_2 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2, 2, 1) self.ui.removeButton.clicked.connect(self.remove) self.names = [ "Deps", "tau", "alpha", "beta" ] self.func_type = "HN" self.inputs = [ self.ui.doubleSpinBox_1, self.ui.doubleSpinBox_2, self.ui.doubleSpinBox_3, self.ui.doubleSpinBox_4 ] self.errors = [ self.ui.label_5, self.ui.label_6, self.ui.label_7, self.ui.label_8, ] for dsb in self.inputs: dsb.valueChanged.connect(self.change_values) self.fixedCheckBoxes = [self.ui.checkBox_1, self.ui.checkBox_2, self.ui.checkBox_3, self.ui.checkBox_4] self.ui.comboBox.currentIndexChanged.connect(self._distrib_select) def _distrib_select(self, dist): self._distrib_hn(1) if dist == 0: # hav-neg: self._distrib_hn(1) if dist == 1: # Cole-Cole: self._distrib_cc(1) if dist == 2: # Cole-Davidson self._distrib_cd(1) if dist == 3: # Cole-Davidson self._distrib_debye(1) def _distrib_hn(self, state): self.ui.checkBox_3.setChecked(False) self.ui.checkBox_3.setDisabled(False) self.ui.checkBox_4.setChecked(False) self.ui.checkBox_4.setDisabled(False) self.ui.doubleSpinBox_3.setDisabled(False) self.ui.doubleSpinBox_4.setDisabled(False) def _distrib_cd(self, state): if state: self.ui.doubleSpinBox_3.setValue(1.0) self.ui.doubleSpinBox_3.setDisabled(True) self.ui.doubleSpinBox_4.setDisabled(False) self.ui.checkBox_3.setChecked(True) self.ui.checkBox_3.setDisabled(True) self.ui.checkBox_4.setChecked(False) self.func_type = "CD" else: self.ui.doubleSpinBox_3.setDisabled(False) self.func_type = "HN" def _distrib_debye(self, state): if state: self.ui.doubleSpinBox_3.setValue(1.0) self.ui.doubleSpinBox_3.setDisabled(True) self.ui.doubleSpinBox_4.setValue(1.0) self.ui.doubleSpinBox_4.setDisabled(True) self.ui.checkBox_3.setChecked(True) self.ui.checkBox_3.setDisabled(True) self.ui.checkBox_4.setChecked(True) self.ui.checkBox_4.setDisabled(True) self.func_type = "Debye" else: self.ui.doubleSpinBox_3.setDisabled(False) self.ui.doubleSpinBox_4.setDisabled(False) self.func_type = "HN" def _distrib_cc(self, state): if state: self.ui.doubleSpinBox_4.setValue(1.0) self.ui.doubleSpinBox_4.setDisabled(True) self.ui.doubleSpinBox_3.setDisabled(False) self.ui.checkBox_3.setChecked(False) self.ui.checkBox_4.setChecked(True) self.ui.checkBox_4.setDisabled(True) self.func_type = "CC" else: self.ui.doubleSpinBox_4.setDisabled(False) self.func_type = "HN" def setId(self, id): self.id = id self.setTitle("Peak %i" % id) def setColor(self, color): palette = self.palette() palette.setColor(QPalette.Foreground, color) self.setPalette(palette) # # def updateTable(self, beta=None, sd_beta = None): # # # for i, arg in enumerate(beta): # self.inputs[i].setValue(arg) # sd_style="" # if i in (0,1) and sd_beta is not None: # sd = "+/- %.3e"%(sd_beta[i]) # elif i in (2,3) and sd_beta is not None: # sd = "+/- %.2f"%(sd_beta[i]) # if sd_beta is not None: # if 0.0 < sd_beta[i]/arg < 0.2: # sd_style="background-color: rgba(0, 255, 0, 64);" # if 0.2 < sd_beta[i]/arg < 1.0: # sd_style="background-color: rgba(255,255, 0, 64);" # elif sd_beta[i]/arg > 1.0: # sd_style="background-color: rgba(255, 0, 0, 64);" # # else: # sd = "( --- )" # self.errors[i].setStyleSheet(sd_style) # self.errors[i].setText(sd) class StaticWidget(BaseWidget, QGroupBox): def __init__(self, parent=None): QGroupBox.__init__(self) BaseWidget.__init__(self) super(StaticWidget, self).__init__(parent) self.ui = StaticGroupBox.Ui_StaticGroupBox() self.ui.setupUi(self) # self.ui.doubleSpinBox_2.setParent(None) # self.ui.doubleSpinBox_2 = LogFSpinBox(self) # self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2,1,1) self.names = ["e_infty"] self.errors = [self.ui.label_4] self.inputs = [self.ui.doubleSpinBox_1] self.fixedCheckBoxes = [self.ui.checkBox_1] for dsb in self.inputs: dsb.valueChanged.connect(self.change_values) self.ui.removeButton.clicked.connect(self.remove) self.func_type = r"$\epsilon_\infty$" class ConductivityWidget(BaseWidget, QGroupBox): def __init__(self, parent=None): QGroupBox.__init__(self) BaseWidget.__init__(self) super(ConductivityWidget, self).__init__(parent) self.ui = ConductivityGroupBox.Ui_ConductivityGroupBox() self.ui.setupUi(self) self.ui.iSigma.setParent(None) self.ui.iSigma = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.iSigma, 1, 1) self.ui.rSigma.setParent(None) self.ui.rSigma = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.rSigma, 2, 1) self.ui.removeButton.clicked.connect(self.remove) self.ui.pushButton_hide.clicked.connect(self.subtract) self.func_type = "Cond." self.names = [ "iSig", "rSig", "pwrSig", ] self.errors = [self.ui.iSigma_sd, self.ui.rSigma_sd, self.ui.pwrSigma_sd] self.inputs = [self.ui.iSigma, self.ui.rSigma, self.ui.pwrSigma] self.fixedCheckBoxes = [self.ui.checkBox_1, self.ui.checkBox_2, self.ui.checkBox_3] for dsb in self.inputs: dsb.valueChanged.connect(self.change_values) class PowerLawWidget(BaseWidget): def __init__(self, parent=None): # QGroupBox.__init__(self) BaseWidget.__init__(self) super(PowerLawWidget, self).__init__(parent) self.ui = PowerLawGroupBox.Ui_PowerLawGroupBox() self.ui.setupUi(self) self.ui.doubleSpinBox_2.setParent(None) self.ui.doubleSpinBox_2 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2, 1, 1) self.ui.removeButton.clicked.connect(self.remove) self.ui.pushButton_hide.toggled.connect(self.subtract) self.func_type = "Power Law" self.names = ["Amp", "pwrAmp"] self.errors = [self.ui.label_5, self.ui.label_6] self.inputs = [self.ui.doubleSpinBox_2, self.ui.doubleSpinBox_3] self.fixedCheckBoxes = [self.ui.checkBox_2, self.ui.checkBox_3] for dsb in self.inputs: dsb.valueChanged.connect(self.change_values) class YaffWidget(BaseWidget): on_model_changed = pyqtSignal() configuration_changed = pyqtSignal(list, list) def __init__(self, parent=None): # QGroupBox.__init__(self) BaseWidget.__init__(self) super(YaffWidget, self).__init__(parent) self.func_type = "YAFF" # Todo wie bei peak für gg gb gge etc. self.ui = YAFFparameters.Ui_Form() self.ui.setupUi(self) self.ui.doubleSpinBox_1.setParent(None) self.ui.doubleSpinBox_1 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_1, 2, 1) self.ui.doubleSpinBox_2.setParent(None) self.ui.doubleSpinBox_2 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_2, 3, 1) self.ui.doubleSpinBox_6.setParent(None) self.ui.doubleSpinBox_6 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_6, 9, 1) self.ui.doubleSpinBox_9.setParent(None) self.ui.doubleSpinBox_9 = LogFSpinBox(self) self.ui.gridLayout.addWidget(self.ui.doubleSpinBox_9, 12, 1) self.ui.removeButton.clicked.connect(self.remove) self.ui.configButton.clicked.connect(self.configure) self.ui.comboBox.currentIndexChanged.connect(self.change_model) self._names = [ "Deps", "tau_a", "alpha", "beta", "lambda", "tau_b", "a", "b", "scale", "g" ] self.labels = [ self.ui.label_111, self.ui.label_222, self.ui.label_322, self.ui.label_422, self.ui.label_522, self.ui.label_622, self.ui.label_72, self.ui.label_82, self.ui.label_112, self.ui.label_102 ] self.errors = [self.ui.label_1, self.ui.label_2, self.ui.label_3, self.ui.label_4, self.ui.label_5, self.ui.label_6, self.ui.label_7, self.ui.label_8, self.ui.label_9, self.ui.label_10, ] self.inputs = [self.ui.doubleSpinBox_1, self.ui.doubleSpinBox_2, self.ui.doubleSpinBox_3, self.ui.doubleSpinBox_4, self.ui.doubleSpinBox_5, self.ui.doubleSpinBox_6, self.ui.doubleSpinBox_7, self.ui.doubleSpinBox_8, self.ui.doubleSpinBox_9, self.ui.doubleSpinBox_10, ] self.fixedCheckBoxes = [self.ui.checkBox_1, self.ui.checkBox_2, self.ui.checkBox_3, self.ui.checkBox_4, self.ui.checkBox_5, self.ui.checkBox_6, self.ui.checkBox_7, self.ui.checkBox_8, self.ui.checkBox_9, self.ui.checkBox_10, ] for dsb in self.inputs: dsb.valueChanged.connect(self.change_values) self.change_model(0) self._t_list, self._tau_list = None, None def configure(self): qd = YaffConfigWidget(t_list=self._t_list, tau_list=self._tau_list) qd.configuration_changed.connect(self._store_config) qd.exec_() # qd.show() def _store_config(self, t_list, tau_list): self._t_list = t_list self._tau_list = tau_list self.configuration_changed.emit(t_list, tau_list) def getYaffType(self): return self.ui.comboBox.currentIndex() @pyqtSlot(int) def change_model(self, ndx): # ndx = self.ui.comboBox.currentIndex() mask = [ # 0 show, 1 hide (0, 0, 0, 0, 1, 1, 1, 1, 1, 1), # GG (0, 0, 0, 0, 1, 1, 1, 1, 0, 0), # GGe (0, 1, 1, 1, 1, 0, 0, 0, 1, 1), # Gb (0, 0, 0, 0, 0, 0, 0, 0, 1, 1), # GG + Gb (0, 0, 0, 0, 0, 0, 0, 0, 0, 0), # GGe + Gb ] self.names = [] for i, inp in enumerate(self.inputs): self.inputs[i].setDisabled(mask[ndx][i]) self.inputs[i].setHidden(mask[ndx][i]) self.errors[i].setDisabled(mask[ndx][i]) self.errors[i].setHidden(mask[ndx][i]) self.errors[i].setText("(---)") self.fixedCheckBoxes[i].setChecked(mask[ndx][i]) self.fixedCheckBoxes[i].setDisabled(mask[ndx][i]) self.fixedCheckBoxes[i].setHidden(mask[ndx][i]) self.labels[i].setHidden(mask[ndx][i]) if mask[ndx][i] == 0: self.names.append(self._names[i]) self.selector_mask = [not i for i in mask[ndx]] self.on_model_changed.emit() class YaffConfigWidget(QDialog): configuration_changed = pyqtSignal(list, list) def __init__(self, parent=None, t_list=None, tau_list=None): super(YaffConfigWidget, self).__init__(parent) self.ui = YAFFConfig.Ui_Dialog() self.ui.setupUi(self) # not working; cannot set values # self.replaceDoubleSpinBox(self.ui.gridLayout_time, self.ui.doubleSpinBox_tmin) # self.replaceDoubleSpinBox(self.ui.gridLayout_time, self.ui.doubleSpinBox_tmax) # 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) row, column, cols, rows = self.ui.gridLayout_time.getItemPosition(ndx) self.ui.doubleSpinBox_tmax.setParent(None) self.ui.doubleSpinBox_tmax = LogFSpinBox(self) self.ui.gridLayout_time.addWidget(self.ui.doubleSpinBox_tmax, row, column) ndx = self.ui.gridLayout_tau.indexOf(self.ui.doubleSpinBox_taumin) row, column, cols, rows = self.ui.gridLayout_tau.getItemPosition(ndx) self.ui.doubleSpinBox_taumin.setParent(None) self.ui.doubleSpinBox_taumin = LogFSpinBox(self) self.ui.gridLayout_tau.addWidget(self.ui.doubleSpinBox_taumin, row, column) ndx = self.ui.gridLayout_tau.indexOf(self.ui.doubleSpinBox_taumax) row, column, cols, rows = self.ui.gridLayout_tau.getItemPosition(ndx) self.ui.doubleSpinBox_taumax.setParent(None) self.ui.doubleSpinBox_taumax = LogFSpinBox(self) self.ui.gridLayout_tau.addWidget(self.ui.doubleSpinBox_taumax, row, column) if t_list is not None: self.ui.doubleSpinBox_tmin.setValue(t_list[0]) self.ui.doubleSpinBox_tmax.setValue(t_list[1]) else: self.ui.doubleSpinBox_tmin.setValue(1e-10) self.ui.doubleSpinBox_tmax.setValue(1e5) if tau_list is not None: self.ui.doubleSpinBox_taumin.setValue(tau_list[0]) self.ui.doubleSpinBox_taumax.setValue(tau_list[1]) else: self.ui.doubleSpinBox_taumin.setValue(1e-10) self.ui.doubleSpinBox_taumax.setValue(1e5) values = [self.ui.doubleSpinBox_tmin, self.ui.doubleSpinBox_tmax, self.ui.spinBox_tn, self.ui.doubleSpinBox_taumin, self.ui.doubleSpinBox_taumax, self.ui.spinBox_taun] for val in values: val.valueChanged.connect(self.changedConfiguration) def changedConfiguration(self): t_list = [self.ui.doubleSpinBox_tmin.value(), self.ui.doubleSpinBox_tmax.value(), self.ui.spinBox_tn.value()] tau_list = [self.ui.doubleSpinBox_taumin.value(), self.ui.doubleSpinBox_taumax.value(), self.ui.spinBox_taun.value()] self.configuration_changed.emit(t_list, tau_list)