nmreval/src/gui_qt/math/mean_dialog.py

114 lines
4.0 KiB
Python
Raw Normal View History

2022-10-20 15:23:15 +00:00
from nmreval.distributions import ColeDavidson, HavriliakNegami, KWW, LogGaussian
2022-03-08 09:27:40 +00:00
from ..Qt import QtWidgets, QtCore
from .._py.meandialog import Ui_calc_means_dialog
from ..lib.forms import Widget
class QMeanTimes(QtWidgets.QDialog, Ui_calc_means_dialog):
newValues = QtCore.pyqtSignal(tuple, dict, str)
def __init__(self, tree: dict, parent=None):
super().__init__(parent=parent)
self.setupUi(self)
self._tree = tree
self.distributions = [ColeDavidson, HavriliakNegami, KWW, LogGaussian]
for s in self.distributions:
self.dist_combobox.addItem(s.name)
self.update_graphs(self._tree)
self.change_distribution(0)
self.dist_combobox.currentIndexChanged.connect(self.change_distribution)
self.from_combobox.currentIndexChanged.connect(lambda idx: self.calculate_means())
self.to_combobox.currentIndexChanged.connect(lambda idx: self.calculate_means())
def update_graphs(self, graph: dict):
graph_id = self.graph_combobox.currentData(QtCore.Qt.UserRole)
self.graph_combobox.clear()
for key, (name, _) in graph.items():
self.graph_combobox.addItem(name, userData=key)
if graph_id is not None:
self.graph_combobox.setCurrentIndex(self.graph_combobox.findData(graph_id, QtCore.Qt.UserRole))
else:
self.graph_combobox.setCurrentIndex(0)
@QtCore.pyqtSlot(int)
def change_distribution(self, idx):
dist = self.distributions[idx]
while self.verticalLayout.count():
item = self.verticalLayout.takeAt(0)
item.widget().deleteLater()
for i, p in enumerate([r'\tau'] + dist.parameter):
w = Widget(p, self._tree, collapsing=True, parent=self)
w.valueChanged.connect(lambda: self.calculate_means())
self.verticalLayout.addWidget(w)
self.calculate_means()
def calculate_means(self):
parameter = []
for i in range(self.verticalLayout.count()):
w = self.verticalLayout.itemAt(i).widget()
try:
parameter.append(float(w.lineEdit.text()))
except ValueError:
parameter = None
break
if parameter is not None:
dist, direction = self.get_conversions()
self.label.setText(f'{self.to_combobox.currentText()}: '
f'{dist.convert(*parameter, **direction):.8g}')
@QtCore.pyqtSlot()
def get_parameter(self):
parameter = []
for i in range(self.verticalLayout.count()):
w = self.verticalLayout.itemAt(i).widget()
p = w.value
if p is not None:
parameter.append(p)
else:
QtWidgets.QMessageBox.warning(self, 'Invalid input',
f'Invalid input for parameter {w.label.text()}')
return
dist, direction = self.get_conversions()
graph_destination = ''
if not self.checkBox.isChecked():
graph_destination = self.graph_combobox.currentData()
self.newValues.emit((dist, parameter), direction, graph_destination)
def get_conversions(self):
mode = ['raw', 'peak', 'mean', 'logmean']
mode_to = mode[self.to_combobox.currentIndex()]
mode_from = mode[self.from_combobox.currentIndex()]
dist = self.distributions[self.dist_combobox.currentIndex()]
return dist, {'from_': mode_from, 'to_': mode_to}
@QtCore.pyqtSlot(QtWidgets.QAbstractButton, name='on_buttonBox_clicked')
def button_clicked(self, bttn: QtWidgets.QAbstractButton):
role = self.buttonBox.buttonRole(bttn)
if role == QtWidgets.QDialogButtonBox.RejectRole:
self.close()
elif role == QtWidgets.QDialogButtonBox.AcceptRole:
self.get_parameter()
self.close()
elif role == QtWidgets.QDialogButtonBox.ApplyRole:
self.get_parameter()
else:
print('Unknown role')