bugfixes-01012024 (#197)
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 1m31s
All checks were successful
Build AppImage / Explore-Gitea-Actions (push) Successful in 1m31s
Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de> Reviewed-on: #197
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
from math import isnan
|
||||
|
||||
from pyqtgraph import mkBrush, mkPen
|
||||
from numpy import abs as np_abs, isfinite as np_isfinite
|
||||
|
||||
from nmreval.utils.text import convert
|
||||
from ..lib.graph_items import logTickValues
|
||||
@ -69,12 +70,16 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
|
||||
self.cmap = RdBuCMap(vmin=-1, vmax=1)
|
||||
|
||||
self.graph_checkBox.stateChanged.connect(lambda x: self.graph_comboBox.setEnabled(x == QtCore.Qt.Unchecked))
|
||||
self.graph_checkBox.stateChanged.connect(
|
||||
lambda x: self.graph_comboBox.setEnabled(x == QtCore.Qt.CheckState.Unchecked)
|
||||
)
|
||||
|
||||
self.logy_box.stateChanged.connect(lambda x: self.fit_plot.setLogMode(y=bool(x)))
|
||||
self.logx_box.stateChanged.connect(lambda x: self.fit_plot.setLogMode(x=bool(x)))
|
||||
self.resid_plot.setXLink(self.fit_plot)
|
||||
|
||||
self.buttonGroup.buttonToggled.connect(self._plot_residuals)
|
||||
|
||||
self.set_results(results)
|
||||
|
||||
def __call__(self, results: list):
|
||||
@ -112,7 +117,7 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
|
||||
@QtCore.pyqtSlot(int, name='on_sets_comboBox_currentIndexChanged')
|
||||
def set_parameter(self, idx: int):
|
||||
set_id = self.sets_comboBox.itemData(idx, QtCore.Qt.UserRole)
|
||||
set_id = self.sets_comboBox.itemData(idx, QtCore.Qt.ItemDataRole.UserRole)
|
||||
|
||||
res = self._results[set_id]
|
||||
self.param_tableWidget.setRowCount(len(res.parameter))
|
||||
@ -138,11 +143,11 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
def change_opts(self, _):
|
||||
idx = self.sets_comboBox.currentIndex()
|
||||
|
||||
self._opts[idx] = (self.reject_fit_checkBox.checkState() == QtCore.Qt.Checked,
|
||||
self.del_prev_checkBox.checkState() == QtCore.Qt.Checked)
|
||||
self._opts[idx] = (self.reject_fit_checkBox.checkState() == QtCore.Qt.CheckState.Checked,
|
||||
self.del_prev_checkBox.checkState() == QtCore.Qt.CheckState.Checked)
|
||||
|
||||
def show_results(self, idx):
|
||||
set_id = self.sets_comboBox.itemData(idx, QtCore.Qt.UserRole)
|
||||
set_id = self.sets_comboBox.itemData(idx, QtCore.Qt.ItemDataRole.UserRole)
|
||||
self.set_plot(set_id)
|
||||
self.set_correlation(set_id)
|
||||
self.set_statistics(set_id)
|
||||
@ -184,8 +189,6 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
self.data_graph_imag.setData(x=res.x_data, y=res.y_data.imag)
|
||||
self.fit_graph.setData(x=res.x, y=res.y.real)
|
||||
self.fit_graph_imag.setData(x=res.x, y=res.y.imag)
|
||||
self.resid_graph.setData(x=res.x_data, y=res.residual.real)
|
||||
self.resid_graph_imag.setData(x=res.x_data, y=res.residual.imag)
|
||||
|
||||
for i, f in enumerate(sub_funcs):
|
||||
item = PlotItem(x=f.x, y=f.y.real, pen=mkPen({'color': i, 'style': 2}))
|
||||
@ -194,8 +197,6 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
self.fit_plot.addItem(item)
|
||||
|
||||
else:
|
||||
self.resid_graph.setData(x=res.x_data, y=res.residual)
|
||||
self.resid_graph_imag.setData(x=[], y=[])
|
||||
self.data_graph.setData(x=res.x_data, y=res.y_data)
|
||||
self.data_graph_imag.setData(x=[], y=[])
|
||||
self.fit_graph.setData(x=res.x, y=res.y)
|
||||
@ -205,6 +206,8 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
item = PlotItem(x=f.x, y=f.y, pen=mkPen({'color': i, 'style': 2}))
|
||||
self.fit_plot.addItem(item)
|
||||
|
||||
self._plot_residuals(idx)
|
||||
|
||||
self.logx_box.blockSignals(True)
|
||||
self.logx_box.setChecked(res.islog)
|
||||
self.logx_box.blockSignals(False)
|
||||
@ -225,6 +228,31 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
else:
|
||||
self.fit_plot.enableAutoRange()
|
||||
|
||||
def _plot_residuals(self, idx: str = None):
|
||||
print(idx)
|
||||
if idx is None or isinstance(idx, QtWidgets.QAbstractButton):
|
||||
idx = self.sets_comboBox.currentData(QtCore.Qt.ItemDataRole.UserRole)
|
||||
|
||||
res = self._results[idx]
|
||||
if res.iscomplex:
|
||||
if self.rel_dev_button.isChecked():
|
||||
print('rel')
|
||||
self.resid_graph.setData(x=res.x_data, y=res.residual.real/np_abs(res.y_data.real))
|
||||
print(res.y_data.imag)
|
||||
if all(np_isfinite(res.y_data.imag)):
|
||||
self.resid_graph_imag.setData(x=res.x_data, y=res.residual.imag/np_abs(res.y_data.imag))
|
||||
else:
|
||||
print('abs')
|
||||
self.resid_graph.setData(x=res.x_data, y=res.residual.real)
|
||||
self.resid_graph_imag.setData(x=res.x_data, y=res.residual.imag)
|
||||
|
||||
else:
|
||||
if self.rel_dev_button.isChecked():
|
||||
self.resid_graph.setData(x=res.x_data, y=res.residual / np_abs(res.y_data))
|
||||
else:
|
||||
self.resid_graph.setData(x=res.x_data, y=res.residual)
|
||||
self.resid_graph_imag.setData(x=[], y=[])
|
||||
|
||||
def set_correlation(self, idx: str):
|
||||
while self.corr_tableWidget.rowCount():
|
||||
self.corr_tableWidget.removeRow(0)
|
||||
@ -258,20 +286,20 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
self.stats_tableWidget.setRowCount(len(res.statistics)+3)
|
||||
|
||||
it = QtWidgets.QTableWidgetItem(f'{res.dof}')
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemIsEditable)
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
|
||||
self.stats_tableWidget.setVerticalHeaderItem(0, QtWidgets.QTableWidgetItem('DoF'))
|
||||
self.stats_tableWidget.setItem(0, 0, it)
|
||||
|
||||
for col, (name, _, dof) in enumerate(self._previous_fits[idx], start=1):
|
||||
self.stats_tableWidget.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem(name))
|
||||
it = QtWidgets.QTableWidgetItem(f'{dof}')
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemIsEditable)
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
|
||||
self.stats_tableWidget.setItem(0, col, it)
|
||||
|
||||
for row, (k, v) in enumerate(res.statistics.items(), start=1):
|
||||
self.stats_tableWidget.setVerticalHeaderItem(row, QtWidgets.QTableWidgetItem(k))
|
||||
it = QtWidgets.QTableWidgetItem(f'{v:.4f}')
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemIsEditable)
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
|
||||
self.stats_tableWidget.setItem(row, 0, it)
|
||||
|
||||
best_idx = -1
|
||||
@ -282,7 +310,7 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
else:
|
||||
best_idx = col if best_val > stats[k] else max(0, best_idx)
|
||||
it = QtWidgets.QTableWidgetItem(f'{stats[k]:.4f}')
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemIsEditable)
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
|
||||
self.stats_tableWidget.setItem(row, col, it)
|
||||
|
||||
if best_idx > -1:
|
||||
@ -299,11 +327,11 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
for col, (_, stats, dof) in enumerate(self._previous_fits[idx], start=1):
|
||||
f_value, prob_f = res.f_test(stats['chi^2'], dof)
|
||||
it = QtWidgets.QTableWidgetItem(f'{f_value:.4g}')
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemIsEditable)
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
|
||||
self.corr_tableWidget.setItem(row, col, it)
|
||||
|
||||
it = QtWidgets.QTableWidgetItem(f'{prob_f:.4g}')
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemIsEditable)
|
||||
it.setFlags(it.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)
|
||||
if prob_f < 0.05:
|
||||
it.setBackground(QtGui.QColor('green'))
|
||||
it.setForeground(QtGui.QColor('white'))
|
||||
@ -319,14 +347,14 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||
elif button_type == self.buttonBox.Ok:
|
||||
graph = '-1'
|
||||
if self.parameter_checkbox.isChecked():
|
||||
if self.graph_checkBox.checkState() == QtCore.Qt.Checked:
|
||||
if self.graph_checkBox.checkState() == QtCore.Qt.CheckState.Checked:
|
||||
graph = ''
|
||||
else:
|
||||
graph = self.graph_comboBox.currentData()
|
||||
|
||||
plot_fits = self.curve_checkbox.isChecked()
|
||||
|
||||
parts = self.partial_checkBox.checkState() == QtCore.Qt.Checked
|
||||
parts = self.partial_checkBox.checkState() == QtCore.Qt.CheckState.Checked
|
||||
|
||||
extrapolate = [None, None, None]
|
||||
error = []
|
||||
@ -382,7 +410,7 @@ class FitExtension(QtWidgets.QDialog):
|
||||
gridLayout.addWidget(self.num_pts, 2, 1, 1, 1)
|
||||
|
||||
self.buttonBox = QtWidgets.QDialogButtonBox()
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
|
||||
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok)
|
||||
gridLayout.addWidget(self.buttonBox, 3, 0, 1, 2)
|
||||
|
||||
|
Reference in New Issue
Block a user