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')
|