2022-10-20 15:23:15 +00:00
|
|
|
from __future__ import annotations
|
2022-03-08 09:27:40 +00:00
|
|
|
|
2022-10-20 15:23:15 +00:00
|
|
|
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
|
2022-03-08 09:27:40 +00:00
|
|
|
|
|
|
|
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 = {}
|
|
|
|
|
2022-03-23 14:32:56 +00:00
|
|
|
self.specdens = [ColeCole, ColeDavidson, HavriliakNegami, KWW]
|
2022-03-24 19:24:28 +00:00
|
|
|
self.coupling = [Quadrupolar, HomoDipolar, Czjzek]
|
2022-03-08 09:27:40 +00:00
|
|
|
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())
|
|
|
|
|
2022-10-20 15:23:15 +00:00
|
|
|
def update_graphs(self, graphs: list[tuple[str, str]]):
|
2022-03-08 09:27:40 +00:00
|
|
|
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')
|
|
|
|
|
2022-11-29 19:58:27 +00:00
|
|
|
@QtCore.pyqtSlot(int, name='on_temp_combobox_currentIndexChanged')
|
2022-03-08 09:27:40 +00:00
|
|
|
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):
|
2022-03-23 14:32:56 +00:00
|
|
|
kwargs.update(p.value)
|
2022-03-08 09:27:40 +00:00
|
|
|
else:
|
2022-03-23 14:32:56 +00:00
|
|
|
raise TypeError('WTF: Unknown widget', p)
|
2022-03-08 09:27:40 +00:00
|
|
|
|
|
|
|
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()
|