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