forked from IPKM/nmreval
		
	BUGFIX: VFT;
change to src layout
This commit is contained in:
		
							
								
								
									
										0
									
								
								src/gui_qt/nmr/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/gui_qt/nmr/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										69
									
								
								src/gui_qt/nmr/coupling_calc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/gui_qt/nmr/coupling_calc.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
from nmreval.nmr.coupling import *
 | 
			
		||||
from nmreval.utils.text import convert
 | 
			
		||||
 | 
			
		||||
from ..Qt import QtWidgets, QtCore
 | 
			
		||||
from .._py.coupling_calculator import Ui_coupling_calc_dialog
 | 
			
		||||
from ..lib.forms import SelectionWidget, FormWidget
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class QCoupCalcDialog(QtWidgets.QDialog, Ui_coupling_calc_dialog):
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
        self.setupUi(self)
 | 
			
		||||
 | 
			
		||||
        self.cp = [Quadrupolar, Czjzek, HeteroDipolar, HomoDipolar]
 | 
			
		||||
        for cp in self.cp:
 | 
			
		||||
            self.comboBox.addItem(cp.name)
 | 
			
		||||
 | 
			
		||||
        self._coupling_parameter = []
 | 
			
		||||
 | 
			
		||||
        self.change_coupling(0)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_comboBox_currentIndexChanged')
 | 
			
		||||
    def change_coupling(self, idx):
 | 
			
		||||
        self.label_2.setText(convert(self.cp[idx].equation))
 | 
			
		||||
        coup = self.cp[idx]
 | 
			
		||||
        self._coupling_parameter = []
 | 
			
		||||
 | 
			
		||||
        while self.verticalLayout_2.count():
 | 
			
		||||
            item = self.verticalLayout_2.takeAt(0)
 | 
			
		||||
            try:
 | 
			
		||||
                item.widget().deleteLater()
 | 
			
		||||
            except AttributeError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        max_size = 0
 | 
			
		||||
        if coup.parameter is not None:
 | 
			
		||||
            for p, u in zip(coup.parameter, coup.unit):
 | 
			
		||||
                if u:
 | 
			
		||||
                    _temp = FormWidget(parent=self, name=convert(p+' / '+u))
 | 
			
		||||
                else:
 | 
			
		||||
                    _temp = FormWidget(parent=self, name=convert(p))
 | 
			
		||||
                _temp.valueChanged.connect(lambda v: self.calc_coupling())
 | 
			
		||||
                size = _temp.label.sizeHint()
 | 
			
		||||
                max_size = max(max_size, size.width())
 | 
			
		||||
                self.verticalLayout_2.addWidget(_temp)
 | 
			
		||||
                self._coupling_parameter.append(_temp)
 | 
			
		||||
 | 
			
		||||
            for item in self._coupling_parameter:
 | 
			
		||||
                item.label.setFixedWidth(max_size)
 | 
			
		||||
 | 
			
		||||
        if coup.choice is not None:
 | 
			
		||||
            for c in self.cp[idx].choice:
 | 
			
		||||
                _temp = SelectionWidget(*c, parent=self)
 | 
			
		||||
                _temp.selectionChanged.connect(lambda name, value: self.calc_coupling())
 | 
			
		||||
                self.verticalLayout_2.addWidget(_temp)
 | 
			
		||||
                self._coupling_parameter.append(_temp)
 | 
			
		||||
 | 
			
		||||
        self.calc_coupling()
 | 
			
		||||
 | 
			
		||||
    def calc_coupling(self):
 | 
			
		||||
        p = []
 | 
			
		||||
        kw = {}
 | 
			
		||||
        for pp in self._coupling_parameter:
 | 
			
		||||
            if isinstance(pp, FormWidget):
 | 
			
		||||
                p.append(pp.value)
 | 
			
		||||
            else:
 | 
			
		||||
                kw.update(pp.value)
 | 
			
		||||
 | 
			
		||||
        self.label.setText('Coupling constant: %.8g' % self.cp[self.comboBox.currentIndex()].relax(*p))
 | 
			
		||||
							
								
								
									
										201
									
								
								src/gui_qt/nmr/t1_from_tau.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								src/gui_qt/nmr/t1_from_tau.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,201 @@
 | 
			
		||||
from __future__ import annotations
 | 
			
		||||
 | 
			
		||||
from nmreval.nmr.coupling import *
 | 
			
		||||
from nmreval.distributions import ColeCole, ColeDavidson, HavriliakNegami, KWW, LogGaussian
 | 
			
		||||
from nmreval.utils import pi
 | 
			
		||||
from nmreval.utils.text import convert
 | 
			
		||||
 | 
			
		||||
from ..Qt import QtGui, QtCore, QtWidgets
 | 
			
		||||
from ..lib.forms import SelectionWidget, Widget
 | 
			
		||||
from .._py.t1_calc_dialog import Ui_Dialog
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class QRelaxCalc(QtWidgets.QDialog, Ui_Dialog):
 | 
			
		||||
    newData = QtCore.pyqtSignal(dict)
 | 
			
		||||
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent=parent)
 | 
			
		||||
        self.setupUi(self)
 | 
			
		||||
 | 
			
		||||
        self.graphs = {}
 | 
			
		||||
 | 
			
		||||
        self.specdens = [ColeCole, ColeDavidson, HavriliakNegami, KWW]
 | 
			
		||||
        self.coupling = [Quadrupolar, HomoDipolar, Czjzek]
 | 
			
		||||
        self.tau_parameter = []
 | 
			
		||||
 | 
			
		||||
        for line_edit in [self.ea_lineEdit, self.tau0_lineEdit, self.start_lineEdit, self.stop_lineEdit,
 | 
			
		||||
                          self.tau0_vft_lineEdit, self.b_vft_lineEdit, self.t0_vft_lineEdit]:
 | 
			
		||||
            line_edit.setValidator(QtGui.QDoubleValidator())
 | 
			
		||||
 | 
			
		||||
        for s in self.specdens:
 | 
			
		||||
            self.specdens_combobox.addItem(s.name)
 | 
			
		||||
 | 
			
		||||
        for c in self.coupling:
 | 
			
		||||
            self.coupling_combobox.addItem(c.name)
 | 
			
		||||
 | 
			
		||||
        self.specdens_combobox.currentIndexChanged.connect(self.update_specdens_model)
 | 
			
		||||
        self.coupling_combobox.currentIndexChanged.connect(self.update_coupling_model)
 | 
			
		||||
        self.buttonGroup.buttonClicked.connect(self.change_axis)
 | 
			
		||||
 | 
			
		||||
        self.update_specdens_model(0)
 | 
			
		||||
        self.update_coupling_model(0)
 | 
			
		||||
        self.temp_combo_change(0)
 | 
			
		||||
        self.tau_combo_changed(0)
 | 
			
		||||
        self.change_axis(self.radioButton)
 | 
			
		||||
 | 
			
		||||
    def set_graphs(self, graphs: dict):
 | 
			
		||||
        self.graph_combobox.clear()
 | 
			
		||||
        self.tau_graph_combobox.clear()
 | 
			
		||||
 | 
			
		||||
        self.tau_graph_combobox.blockSignals(True)
 | 
			
		||||
        for key, (name, _) in graphs.items():
 | 
			
		||||
            self.graph_combobox.addItem(name, userData=key)
 | 
			
		||||
            self.tau_graph_combobox.addItem(name, userData=key)
 | 
			
		||||
        self.tau_graph_combobox.blockSignals(False)
 | 
			
		||||
 | 
			
		||||
        self.graphs = graphs
 | 
			
		||||
 | 
			
		||||
        self.update_specdens_model(self.specdens_combobox.currentIndex())
 | 
			
		||||
        self.update_coupling_model(self.coupling_combobox.currentIndex())
 | 
			
		||||
        self.tau_graph_changed(self.tau_graph_combobox.currentIndex())
 | 
			
		||||
 | 
			
		||||
    def update_graphs(self, graphs: list[tuple[str, str]]):
 | 
			
		||||
        current_id = self.graph_combobox.currentData()
 | 
			
		||||
        self.graph_combobox.clear()
 | 
			
		||||
        for (gid, name) in graphs:
 | 
			
		||||
            self.graph_combobox.addItem(name, userData=gid)
 | 
			
		||||
 | 
			
		||||
        self.graph_combobox.setCurrentIndex(self.graph_combobox.findData(current_id, QtCore.Qt.UserRole))
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_graph_checkbox_stateChanged')
 | 
			
		||||
    def changed_state(self, checked):
 | 
			
		||||
        self.graph_combobox.setEnabled(checked != QtCore.Qt.Checked)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_tau_graph_combobox_currentIndexChanged')
 | 
			
		||||
    def tau_graph_changed(self, idx: int):
 | 
			
		||||
        key = self.tau_graph_combobox.itemData(idx)
 | 
			
		||||
        self.tau_set_combobox.clear()
 | 
			
		||||
        if self.graphs:
 | 
			
		||||
            for (set_key, set_name) in self.graphs[key][1]:
 | 
			
		||||
                self.tau_set_combobox.addItem(set_name, userData=set_key)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(QtWidgets.QAbstractButton)
 | 
			
		||||
    def change_axis(self, bttn: QtWidgets.QRadioButton):
 | 
			
		||||
        self.temp_widget.setVisible(bttn in [self.radioButton_3, self.radioButton_4])
 | 
			
		||||
        if bttn == self.radioButton_2:
 | 
			
		||||
            self.label_7.setText('\u03c4 / s')
 | 
			
		||||
        else:
 | 
			
		||||
            self.label_7.setText('\u03c9 / Hz')
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_temp_combobox_curr#entIndexChanged')
 | 
			
		||||
    def temp_combo_change(self, idx: int):
 | 
			
		||||
        self.arr_widget.setVisible(idx == 0)
 | 
			
		||||
        self.vft_widget.setVisible(idx == 1)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_x_input_combobox_currentIndexChanged')
 | 
			
		||||
    def tau_combo_changed(self, idx: int):
 | 
			
		||||
        self.range_widget.setVisible(idx == 0)
 | 
			
		||||
        self.data_widget.setVisible(idx == 1)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int)
 | 
			
		||||
    def update_coupling_model(self, idx: int):
 | 
			
		||||
        while self.verticalLayout_4.count():
 | 
			
		||||
            item = self.verticalLayout_4.takeAt(0)
 | 
			
		||||
            try:
 | 
			
		||||
                item.widget().deleteLater()
 | 
			
		||||
            except AttributeError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        if self.coupling[idx].parameter is not None:
 | 
			
		||||
            for p in self.coupling[idx].parameter:
 | 
			
		||||
                _temp = Widget(convert(p), tree=self.graphs, collapsing=True, parent=self)
 | 
			
		||||
                self.verticalLayout_4.addWidget(_temp)
 | 
			
		||||
 | 
			
		||||
        if self.coupling[idx].choice is not None:
 | 
			
		||||
            for c in self.coupling[idx].choice:
 | 
			
		||||
                _temp = SelectionWidget(*c, parent=self)
 | 
			
		||||
                self.verticalLayout_4.addWidget(_temp)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int)
 | 
			
		||||
    def update_specdens_model(self, idx):
 | 
			
		||||
        while self.verticalLayout_3.count():
 | 
			
		||||
            item = self.verticalLayout_3.takeAt(0)
 | 
			
		||||
            try:
 | 
			
		||||
                item.widget().deleteLater()
 | 
			
		||||
            except AttributeError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        if self.specdens[idx].parameter is not None:
 | 
			
		||||
            for param in self.specdens[idx].parameter:
 | 
			
		||||
                _temp = Widget(convert(param), tree=self.graphs, collapsing=True, parent=self)
 | 
			
		||||
                self.verticalLayout_3.addWidget(_temp)
 | 
			
		||||
 | 
			
		||||
    def get_taus(self, dic: dict):
 | 
			
		||||
        dic['tau_type'] = {0: 'raw', 1: 'mean', 2: 'peak', 3: 'logmean'}[self.xtype_combobox.currentIndex()]
 | 
			
		||||
        dic['axis1'] = {self.radioButton: 'tau', self.radioButton_2: 'omega',
 | 
			
		||||
                        self.radioButton_3: 't', self.radioButton_4: 'invt1000'}[self.buttonGroup.checkedButton()]
 | 
			
		||||
 | 
			
		||||
        dic['val2'] = float(self.second_x_lineEdit.text())
 | 
			
		||||
        if dic['axis1'] != 'omega':
 | 
			
		||||
            dic['val2'] *= 2*pi
 | 
			
		||||
 | 
			
		||||
        idx = self.x_input_combobox.currentIndex()
 | 
			
		||||
        if idx == 0:
 | 
			
		||||
            dic['pts'] = (float(self.start_lineEdit.text()), float(self.stop_lineEdit.text()),
 | 
			
		||||
                          self.spinBox.value(), self.checkBox.isChecked())
 | 
			
		||||
            if self.buttonGroup.checkedButton() in [self.radioButton_3, self.radioButton_4]:
 | 
			
		||||
                if self.temp_combobox.currentIndex() == 0:
 | 
			
		||||
                    dic['t_param'] = (float(self.tau0_lineEdit.text()), float(self.ea_lineEdit.text()))
 | 
			
		||||
                else:
 | 
			
		||||
                    dic['t_param'] = (float(self.tau0_vft_lineEdit.text()), float(self.b_vft_lineEdit.text()),
 | 
			
		||||
                                      float(self.t0_vft_lineEdit.text()))
 | 
			
		||||
        else:
 | 
			
		||||
            dic['pts'] = (self.tau_set_combobox.currentData(), self.y_radioButton.isChecked())
 | 
			
		||||
 | 
			
		||||
    def get_coupling(self, dic):
 | 
			
		||||
        dic['coup'] = self.coupling[self.coupling_combobox.currentIndex()]
 | 
			
		||||
 | 
			
		||||
        parameter = []
 | 
			
		||||
        kwargs = {}
 | 
			
		||||
        for i in range(self.verticalLayout_4.count()):
 | 
			
		||||
            p = self.verticalLayout_4.itemAt(i).widget()
 | 
			
		||||
            if isinstance(p, Widget):
 | 
			
		||||
                parameter.append(p.value)
 | 
			
		||||
            elif isinstance(p, SelectionWidget):
 | 
			
		||||
                kwargs.update(p.value)
 | 
			
		||||
            else:
 | 
			
		||||
                raise TypeError('WTF: Unknown widget', p)
 | 
			
		||||
 | 
			
		||||
        dic['cp_param'] = (parameter, kwargs)
 | 
			
		||||
 | 
			
		||||
    def get_specdens(self, dic):
 | 
			
		||||
        dic['spec_dens'] = self.specdens[self.specdens_combobox.currentIndex()]
 | 
			
		||||
 | 
			
		||||
        parameter = []
 | 
			
		||||
        kwargs = {}
 | 
			
		||||
        for i in range(self.verticalLayout_3.count()):
 | 
			
		||||
            p = self.verticalLayout_3.itemAt(i).widget()
 | 
			
		||||
            if isinstance(p, Widget):
 | 
			
		||||
                parameter.append(p.value)
 | 
			
		||||
            elif isinstance(p, SelectionWidget):
 | 
			
		||||
                kwargs[p.argname] = p.value
 | 
			
		||||
            else:
 | 
			
		||||
                raise TypeError('WTF?: Unknown widget', p)
 | 
			
		||||
 | 
			
		||||
        dic['sd_param'] = (parameter, kwargs)
 | 
			
		||||
 | 
			
		||||
    def calc_relaxation(self):
 | 
			
		||||
        opts = {}
 | 
			
		||||
 | 
			
		||||
        self.get_taus(opts)
 | 
			
		||||
        self.get_coupling(opts)
 | 
			
		||||
        self.get_specdens(opts)
 | 
			
		||||
 | 
			
		||||
        opts['out'] = {0: 't1', 1: 't2'}[self.relax_combox.currentIndex()]
 | 
			
		||||
        opts['graph'] = '' if self.graph_checkbox.isChecked() else self.graph_combobox.currentData()
 | 
			
		||||
 | 
			
		||||
        self.newData.emit(opts)
 | 
			
		||||
 | 
			
		||||
    def accept(self):
 | 
			
		||||
        self.calc_relaxation()
 | 
			
		||||
        super().accept()
 | 
			
		||||
							
								
								
									
										333
									
								
								src/gui_qt/nmr/t1widget.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										333
									
								
								src/gui_qt/nmr/t1widget.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,333 @@
 | 
			
		||||
import numpy as np
 | 
			
		||||
from pyqtgraph import mkBrush, mkPen
 | 
			
		||||
 | 
			
		||||
from nmreval.data.points import Points
 | 
			
		||||
from nmreval.nmr.relaxation import RelaxationEvaluation
 | 
			
		||||
from nmreval.nmr.coupling import *
 | 
			
		||||
from nmreval.distributions import *
 | 
			
		||||
 | 
			
		||||
from ..lib.pg_objects import PlotItem
 | 
			
		||||
from ..Qt import QtCore, QtWidgets, QtGui
 | 
			
		||||
from .._py.t1dialog import Ui_t1dialog
 | 
			
		||||
from ..lib.forms import FormWidget, SelectionWidget
 | 
			
		||||
from ..lib.utils import busy_cursor
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class QT1Widget(QtWidgets.QDialog, Ui_t1dialog):
 | 
			
		||||
    magnitude = {0: 1e6, 1: 1e3, 2: 1}
 | 
			
		||||
    temp_conversion = {0: lambda xx: 1000 / xx, 1: lambda xx: xx, 2: lambda xx: 1 / xx}
 | 
			
		||||
    time_conversion = {0: lambda yy: yy, 1: lambda yy: 1/yy}
 | 
			
		||||
 | 
			
		||||
    newData = QtCore.pyqtSignal(list, str)
 | 
			
		||||
 | 
			
		||||
    def __init__(self, parent=None):
 | 
			
		||||
        super().__init__(parent=parent)
 | 
			
		||||
 | 
			
		||||
        self.setupUi(self)
 | 
			
		||||
 | 
			
		||||
        self.connected_figure = ''
 | 
			
		||||
        self.name = ''
 | 
			
		||||
 | 
			
		||||
        self.t1calculator = RelaxationEvaluation()
 | 
			
		||||
 | 
			
		||||
        self.sd_parameter = []
 | 
			
		||||
        self.sdmodels = [Debye, ColeCole, ColeDavidson, KWW, HavriliakNegami, LogGaussian]
 | 
			
		||||
        for i in self.sdmodels:
 | 
			
		||||
            self.specdens_combobox.addItem(i.name)
 | 
			
		||||
        self.specdens_combobox.currentIndexChanged.connect(self.update_specdens)
 | 
			
		||||
 | 
			
		||||
        self.cp_parameter = []
 | 
			
		||||
        self.coupling = [Quadrupolar, Czjzek, HomoDipolar, Constant]
 | 
			
		||||
        for i in self.coupling:
 | 
			
		||||
            self.coupling_combobox.addItem(i.name)
 | 
			
		||||
        self.coupling_combobox.currentIndexChanged.connect(self.update_coupling)
 | 
			
		||||
 | 
			
		||||
        self.temp_combobox.currentIndexChanged.connect(self.update_dimensions)
 | 
			
		||||
        self.t1_combobox.currentIndexChanged.connect(self.update_dimensions)
 | 
			
		||||
        self.lineEdit_2.textChanged.connect(lambda: self.determine_minimum(self.interpol_combobox.currentIndex()))
 | 
			
		||||
        self.lineEdit_3.textChanged.connect(lambda: self.determine_minimum(self.interpol_combobox.currentIndex()))
 | 
			
		||||
 | 
			
		||||
        self.conv_x = QT1Widget.temp_conversion[self.temp_combobox.currentIndex()]
 | 
			
		||||
        self.conv_y = QT1Widget.time_conversion[self.t1_combobox.currentIndex()]
 | 
			
		||||
 | 
			
		||||
        self.minimum = (1, np.inf)
 | 
			
		||||
        self.min_pos = PlotItem(x=np.array([]), y=np.array([]),
 | 
			
		||||
                                symbol='+', symbolBrush=mkBrush(color='r'), symbolPen=mkPen(color='r'), symbolSize=14)
 | 
			
		||||
        self.parabola = PlotItem(x=np.array([]), y=np.array([]))
 | 
			
		||||
 | 
			
		||||
        self.lineEdit_2.setValidator(QtGui.QDoubleValidator())
 | 
			
		||||
        self.lineEdit_3.setValidator(QtGui.QDoubleValidator())
 | 
			
		||||
 | 
			
		||||
        self.freq_combox.currentIndexChanged.connect(lambda x: self.update_model())
 | 
			
		||||
        self.freq_spinbox.valueChanged.connect(lambda x: self.update_model())
 | 
			
		||||
 | 
			
		||||
        self.update_specdens(0)
 | 
			
		||||
        self.update_coupling(0)
 | 
			
		||||
 | 
			
		||||
    def set_graphs(self, graphs: list):
 | 
			
		||||
        self.graph_combobox.clear()
 | 
			
		||||
        for g in graphs:
 | 
			
		||||
            self.graph_combobox.addItem(g[1], userData=g[0])
 | 
			
		||||
 | 
			
		||||
    def set_data(self, x, y, name=''):
 | 
			
		||||
        x = self.conv_x(x)
 | 
			
		||||
        y = self.conv_y(y)
 | 
			
		||||
 | 
			
		||||
        sortidx = np.argsort(x)
 | 
			
		||||
        x = x[sortidx]
 | 
			
		||||
        y = y[sortidx]
 | 
			
		||||
 | 
			
		||||
        left_b = max(np.argmin(y)-2, 0)
 | 
			
		||||
        right_b = min(np.argmin(y)+3, len(x)-1)
 | 
			
		||||
 | 
			
		||||
        self.lineEdit_2.blockSignals(True)
 | 
			
		||||
        self.lineEdit_2.setText('{:.2f}'.format(x[left_b]))
 | 
			
		||||
        self.lineEdit_2.blockSignals(False)
 | 
			
		||||
        self.lineEdit_3.blockSignals(True)
 | 
			
		||||
        self.lineEdit_3.setText('{:.2f}'.format(x[right_b]))
 | 
			
		||||
        self.lineEdit_3.blockSignals(False)
 | 
			
		||||
 | 
			
		||||
        self.t1calculator.set_data(x, y)
 | 
			
		||||
 | 
			
		||||
        self.determine_minimum(self.interpol_combobox.currentIndex())
 | 
			
		||||
        self.name = name
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def frequency(self):
 | 
			
		||||
        return self.freq_spinbox.value() * QT1Widget.magnitude[self.freq_combox.currentIndex()]
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int)
 | 
			
		||||
    def update_specdens(self, idx: int):
 | 
			
		||||
        self.sd_parameter = []
 | 
			
		||||
        while self.verticalLayout_3.count():
 | 
			
		||||
            item = self.verticalLayout_3.takeAt(0)
 | 
			
		||||
            try:
 | 
			
		||||
                item.widget().deleteLater()
 | 
			
		||||
            except AttributeError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        if self.sdmodels[idx].parameter is not None:
 | 
			
		||||
            for name in self.sdmodels[idx].parameter:
 | 
			
		||||
                _temp = FormWidget(parent=self, name=name, fixable=True)
 | 
			
		||||
                _temp.value = 1
 | 
			
		||||
                _temp.setChecked(True)
 | 
			
		||||
                _temp.valueChanged.connect(self.update_specdens_parameter)
 | 
			
		||||
                _temp.stateChanged.connect(self.update_specdens_parameter)
 | 
			
		||||
                self.verticalLayout_3.addWidget(_temp)
 | 
			
		||||
                self.sd_parameter.append(_temp)
 | 
			
		||||
 | 
			
		||||
        self.t1calculator.set_distribution(self.sdmodels[idx])
 | 
			
		||||
        self.update_model()
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot()
 | 
			
		||||
    def update_specdens_parameter(self):
 | 
			
		||||
        new_p = []
 | 
			
		||||
        for p in self.sd_parameter:
 | 
			
		||||
            new_p.append(p.value)
 | 
			
		||||
 | 
			
		||||
        self.update_model()
 | 
			
		||||
 | 
			
		||||
    def update_sddisplay(self, values):
 | 
			
		||||
        try:
 | 
			
		||||
            for i, v, in enumerate(values):
 | 
			
		||||
                self.sd_parameter[i].blockSignals(True)
 | 
			
		||||
                self.sd_parameter[i].value = '{:.3g}'.format(round(v, 3))
 | 
			
		||||
                self.sd_parameter[i].blockSignals(False)
 | 
			
		||||
        except IndexError:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int)
 | 
			
		||||
    def update_coupling(self, idx: int):
 | 
			
		||||
        self.cp_parameter = []
 | 
			
		||||
        while self.verticalLayout_4.count():
 | 
			
		||||
            item = self.verticalLayout_4.takeAt(0)
 | 
			
		||||
            try:
 | 
			
		||||
                item.widget().deleteLater()
 | 
			
		||||
            except AttributeError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        curr_coupling = self.coupling[idx]
 | 
			
		||||
        if curr_coupling.parameter is not None:
 | 
			
		||||
            for i, name in enumerate(curr_coupling.parameter):
 | 
			
		||||
                if curr_coupling.unit is not None:
 | 
			
		||||
                    u = curr_coupling.unit[i]
 | 
			
		||||
                    name = name+'/'+u if u else name
 | 
			
		||||
                _temp = FormWidget(parent=self, name=name, fixable=True)
 | 
			
		||||
                self.verticalLayout_4.addWidget(_temp)
 | 
			
		||||
                _temp.value = 1
 | 
			
		||||
                _temp.setChecked(True)
 | 
			
		||||
                _temp.valueChanged.connect(self.update_coupling_parameter)
 | 
			
		||||
                _temp.stateChanged.connect(self.update_coupling_parameter)
 | 
			
		||||
                self.cp_parameter.append(_temp)
 | 
			
		||||
 | 
			
		||||
        if self.coupling[idx].choice is not None:
 | 
			
		||||
            for (name, kw_name, opts) in self.coupling[idx].choice:
 | 
			
		||||
                widgt = SelectionWidget(name, kw_name, opts)
 | 
			
		||||
                widgt.comboBox.currentIndexChanged.connect(self.update_coupling_parameter)
 | 
			
		||||
                self.verticalLayout_4.addWidget(widgt)
 | 
			
		||||
                self.cp_parameter.append(widgt)
 | 
			
		||||
 | 
			
		||||
        self.update_coupling_parameter()
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot()
 | 
			
		||||
    def update_coupling_parameter(self):
 | 
			
		||||
        new_p = []
 | 
			
		||||
        new_kw = {}
 | 
			
		||||
        for pp in self.cp_parameter:
 | 
			
		||||
            if isinstance(pp, FormWidget):
 | 
			
		||||
                new_p.append(pp.value)
 | 
			
		||||
            else:
 | 
			
		||||
                new_kw.update(pp.value)
 | 
			
		||||
        new_coupling = self.coupling[self.coupling_combobox.currentIndex()]
 | 
			
		||||
        self.t1calculator.set_coupling(new_coupling, parameter=new_p, keywords=new_kw)
 | 
			
		||||
 | 
			
		||||
        self.update_model()
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_temp_combobox_currentIndexChanged')
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_t1_combobox_currentIndexChanged')
 | 
			
		||||
    def update_dimensions(self, idx: int):
 | 
			
		||||
        _x = self.t1calculator.x
 | 
			
		||||
        _y = self.t1calculator.y
 | 
			
		||||
 | 
			
		||||
        if self.sender() == self.temp_combobox:
 | 
			
		||||
            _x = self.conv_x(self.t1calculator.x)
 | 
			
		||||
            self.conv_x = self.temp_conversion[idx]
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            _y = self.conv_y(self.t1calculator.y)
 | 
			
		||||
            self.conv_y = self.time_conversion[idx]
 | 
			
		||||
 | 
			
		||||
        self.set_data(_x, _y, name=self.name)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(tuple)
 | 
			
		||||
    def t1min_picked(self, pos: tuple):
 | 
			
		||||
        self.min_pos.setData(x=[pos[0]], y=[pos[1]])
 | 
			
		||||
        self.update_min(self.conv_x(pos[0]), pos[1])
 | 
			
		||||
 | 
			
		||||
    def update_min(self, x, y):
 | 
			
		||||
        self.label_13.setText(f'{x:.4g} K')
 | 
			
		||||
        self.label_12.setText(f' {y:.3e} s')
 | 
			
		||||
        if y > np.min(self.t1calculator.y):
 | 
			
		||||
            self.label_12.setStyleSheet('QLabel {color: red; font-weight: bold}')
 | 
			
		||||
        else:
 | 
			
		||||
            self.label_12.setStyleSheet('QLabel {}')
 | 
			
		||||
        self.min_pos.setData(x=[self.conv_x(x)], y=[self.conv_y(y)])
 | 
			
		||||
 | 
			
		||||
        self.minimum = x, y
 | 
			
		||||
        self.update_model()
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_interpol_combobox_currentIndexChanged')
 | 
			
		||||
    def determine_minimum(self, idx):
 | 
			
		||||
        if idx == 0:
 | 
			
		||||
            self.checkBox_interpol.setChecked(False)
 | 
			
		||||
            self.checkBox_interpol.hide()
 | 
			
		||||
            self.frame.hide()
 | 
			
		||||
            m, i_func = self.t1calculator.calculate_t1_min(interpolate=None)
 | 
			
		||||
        else:
 | 
			
		||||
            self.checkBox_interpol.show()
 | 
			
		||||
            self.frame.show()
 | 
			
		||||
            try:
 | 
			
		||||
                m, i_func = self.t1calculator.calculate_t1_min(interpolate=idx,
 | 
			
		||||
                                                               trange=(float(self.lineEdit_2.text()),
 | 
			
		||||
                                                                       float(self.lineEdit_3.text())))
 | 
			
		||||
            except ValueError:
 | 
			
		||||
                m, i_func = self.t1calculator.calculate_t1_min(interpolate=None)
 | 
			
		||||
 | 
			
		||||
        self.update_min(*m)
 | 
			
		||||
 | 
			
		||||
        if i_func is not None:
 | 
			
		||||
            self.parabola.setData(x=self.conv_x(i_func[0]), y=self.conv_y(i_func[1]))
 | 
			
		||||
        else:
 | 
			
		||||
            self.parabola.setData(x=np.array([]), y=np.array([]))
 | 
			
		||||
 | 
			
		||||
        return m
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(name='on_t1min_toolButton_clicked')
 | 
			
		||||
    def set_min(self):
 | 
			
		||||
        m = self.determine_minimum(self.interpol_combobox.currentIndex())
 | 
			
		||||
        self.update_min(x=m[0], y=m[1])
 | 
			
		||||
 | 
			
		||||
    def update_model(self):
 | 
			
		||||
        sd_args, sd_fix = self.get_sd_values()
 | 
			
		||||
        cp_args, cp_kwargs, cp_fix = self.get_cp_values()
 | 
			
		||||
 | 
			
		||||
        if (len(sd_fix)-sum(sd_fix)) + (len(cp_fix)-sum(cp_fix)) > 1:
 | 
			
		||||
            QtWidgets.QMessageBox.information(self, 'Too many free variables',
 | 
			
		||||
                                              'More than one parameter is variable.\n'
 | 
			
		||||
                                              'Only one can be determined from a minimum.')
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        notfix = None
 | 
			
		||||
        var_idx = 0
 | 
			
		||||
        if not all(sd_fix):
 | 
			
		||||
            notfix = 'distribution'
 | 
			
		||||
            var_idx = sd_fix.index(False)
 | 
			
		||||
 | 
			
		||||
        if not all(cp_fix):
 | 
			
		||||
            notfix = 'coupling'
 | 
			
		||||
            var_idx = cp_fix.index(False)
 | 
			
		||||
 | 
			
		||||
        if not np.isfinite(self.t1calculator.t1min[1]):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        with busy_cursor():
 | 
			
		||||
            calc_stretching, mini = self.t1calculator.get_increase(height=self.minimum[1],
 | 
			
		||||
                                                                   idx=var_idx, mode=notfix,
 | 
			
		||||
                                                                   omega=2*np.pi*self.frequency,
 | 
			
		||||
                                                                   dist_parameter=sd_args, prefactor=cp_args,
 | 
			
		||||
                                                                   coupling_kwargs=cp_kwargs)
 | 
			
		||||
 | 
			
		||||
        self.label_t1min.setText(f'{mini:.4g} s')
 | 
			
		||||
 | 
			
		||||
        if notfix:
 | 
			
		||||
            forms = self.sd_parameter if notfix == 'distribution' else self.cp_parameter
 | 
			
		||||
            forms[var_idx].blockSignals(True)
 | 
			
		||||
            forms[var_idx].value = f'{calc_stretching:.4g}'
 | 
			
		||||
            forms[var_idx].blockSignals(False)
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(name='on_calc_pushButton_clicked')
 | 
			
		||||
    def calculate_correlations(self):
 | 
			
		||||
        sd_args, _ = self.get_sd_values()
 | 
			
		||||
        cp_args, cp_kwargs, _ = self.get_cp_values()
 | 
			
		||||
        tau_mode = ['fit', 'peak', 'mean', 'logmean'][self.tau_combox.currentIndex()]
 | 
			
		||||
        corr, opts = self.t1calculator.correlation_from_t1(omega=2*np.pi*self.frequency, dist_parameter=sd_args,
 | 
			
		||||
                                                           coupling_param=cp_args, coupling_kwargs=cp_kwargs,
 | 
			
		||||
                                                           mode=tau_mode, interpolate=self.checkBox_interpol.isChecked())
 | 
			
		||||
 | 
			
		||||
        name = self.name + '-' + str(self.t1calculator) + '('
 | 
			
		||||
        name += ','.join([f'{a:.3g}' for a in sd_args])
 | 
			
		||||
        name += ')-' + tau_mode + ' tau'
 | 
			
		||||
        new_data = Points(x=self.conv_x(corr[:, 0]), y= corr[:, 1], name=name)
 | 
			
		||||
        new_data.update(opts)
 | 
			
		||||
        if self.graph_checkbox.isChecked():
 | 
			
		||||
            gid = ''
 | 
			
		||||
        else:
 | 
			
		||||
            gid = self.graph_combobox.currentData()
 | 
			
		||||
        self.newData.emit([new_data], gid)
 | 
			
		||||
 | 
			
		||||
    def get_sd_values(self):
 | 
			
		||||
        sd_args = []
 | 
			
		||||
        sd_fix = []
 | 
			
		||||
        for i, p in enumerate(self.sd_parameter):
 | 
			
		||||
            sd_args.append(p.value)
 | 
			
		||||
            sd_fix.append(p.isChecked())
 | 
			
		||||
 | 
			
		||||
        return sd_args, sd_fix
 | 
			
		||||
 | 
			
		||||
    def get_cp_values(self):
 | 
			
		||||
        cp_args = []
 | 
			
		||||
        cp_kwargs = {}
 | 
			
		||||
        cp_fix = []
 | 
			
		||||
        for i, p in enumerate(self.cp_parameter):
 | 
			
		||||
            try:
 | 
			
		||||
                cp_fix.append(p.isChecked())
 | 
			
		||||
                cp_args.append(p.value)
 | 
			
		||||
            except AttributeError:
 | 
			
		||||
                # SelectionWidget has no isChecked()
 | 
			
		||||
                cp_kwargs.update(p.value)
 | 
			
		||||
 | 
			
		||||
        return cp_args, cp_kwargs, cp_fix
 | 
			
		||||
 | 
			
		||||
    @QtCore.pyqtSlot(int, name='on_graph_checkbox_stateChanged')
 | 
			
		||||
    def changed_state(self, checked):
 | 
			
		||||
        self.graph_combobox.setEnabled(checked != QtCore.Qt.Checked)
 | 
			
		||||
		Reference in New Issue
	
	Block a user