bugfixes-01012024 #197
@@ -1,6 +1,6 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'src/resources/_ui/fitresult.ui'
 | 
			
		||||
# Form implementation generated from reading ui file 'resources/_ui/fitresult.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created by: PyQt5 UI code generator 5.15.10
 | 
			
		||||
#
 | 
			
		||||
@@ -27,25 +27,48 @@ class Ui_Dialog(object):
 | 
			
		||||
        self.stackPage1 = QtWidgets.QWidget()
 | 
			
		||||
        self.stackPage1.setObjectName("stackPage1")
 | 
			
		||||
        self.gridLayout_3 = QtWidgets.QGridLayout(self.stackPage1)
 | 
			
		||||
        self.gridLayout_3.setContentsMargins(3, 3, 3, 3)
 | 
			
		||||
        self.gridLayout_3.setContentsMargins(6, 3, 6, 3)
 | 
			
		||||
        self.gridLayout_3.setSpacing(3)
 | 
			
		||||
        self.gridLayout_3.setObjectName("gridLayout_3")
 | 
			
		||||
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
 | 
			
		||||
        self.gridLayout_3.addItem(spacerItem, 2, 3, 1, 1)
 | 
			
		||||
        self.autoscale_box = QtWidgets.QToolButton(self.stackPage1)
 | 
			
		||||
        self.autoscale_box.setObjectName("autoscale_box")
 | 
			
		||||
        self.gridLayout_3.addWidget(self.autoscale_box, 2, 0, 1, 1)
 | 
			
		||||
        self.logy_box = QtWidgets.QCheckBox(self.stackPage1)
 | 
			
		||||
        self.logy_box.setLayoutDirection(QtCore.Qt.LeftToRight)
 | 
			
		||||
        self.logy_box.setObjectName("logy_box")
 | 
			
		||||
        self.gridLayout_3.addWidget(self.logy_box, 2, 3, 1, 1)
 | 
			
		||||
        self.graphicsView = GraphicsLayoutWidget(self.stackPage1)
 | 
			
		||||
        self.graphicsView.setObjectName("graphicsView")
 | 
			
		||||
        self.gridLayout_3.addWidget(self.graphicsView, 0, 0, 1, 4)
 | 
			
		||||
        self.logx_box = QtWidgets.QCheckBox(self.stackPage1)
 | 
			
		||||
        self.gridLayout_3.addWidget(self.autoscale_box, 2, 4, 1, 1)
 | 
			
		||||
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
 | 
			
		||||
        self.gridLayout_3.addItem(spacerItem1, 2, 1, 1, 1)
 | 
			
		||||
        self.verticalGroupBox_2 = QtWidgets.QGroupBox(self.stackPage1)
 | 
			
		||||
        self.verticalGroupBox_2.setObjectName("verticalGroupBox_2")
 | 
			
		||||
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.verticalGroupBox_2)
 | 
			
		||||
        self.verticalLayout_4.setObjectName("verticalLayout_4")
 | 
			
		||||
        self.logx_box = QtWidgets.QCheckBox(self.verticalGroupBox_2)
 | 
			
		||||
        self.logx_box.setLayoutDirection(QtCore.Qt.LeftToRight)
 | 
			
		||||
        self.logx_box.setObjectName("logx_box")
 | 
			
		||||
        self.gridLayout_3.addWidget(self.logx_box, 2, 2, 1, 1)
 | 
			
		||||
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
 | 
			
		||||
        self.gridLayout_3.addItem(spacerItem, 2, 1, 1, 1)
 | 
			
		||||
        self.verticalLayout_4.addWidget(self.logx_box)
 | 
			
		||||
        self.logy_box = QtWidgets.QCheckBox(self.verticalGroupBox_2)
 | 
			
		||||
        self.logy_box.setLayoutDirection(QtCore.Qt.LeftToRight)
 | 
			
		||||
        self.logy_box.setObjectName("logy_box")
 | 
			
		||||
        self.verticalLayout_4.addWidget(self.logy_box)
 | 
			
		||||
        self.gridLayout_3.addWidget(self.verticalGroupBox_2, 2, 2, 1, 1)
 | 
			
		||||
        self.verticalGroupBox = QtWidgets.QGroupBox(self.stackPage1)
 | 
			
		||||
        self.verticalGroupBox.setObjectName("verticalGroupBox")
 | 
			
		||||
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalGroupBox)
 | 
			
		||||
        self.verticalLayout.setObjectName("verticalLayout")
 | 
			
		||||
        self.rel_dev_button = QtWidgets.QRadioButton(self.verticalGroupBox)
 | 
			
		||||
        self.rel_dev_button.setObjectName("rel_dev_button")
 | 
			
		||||
        self.buttonGroup = QtWidgets.QButtonGroup(Dialog)
 | 
			
		||||
        self.buttonGroup.setObjectName("buttonGroup")
 | 
			
		||||
        self.buttonGroup.addButton(self.rel_dev_button)
 | 
			
		||||
        self.verticalLayout.addWidget(self.rel_dev_button)
 | 
			
		||||
        self.abs_dev_button = QtWidgets.QRadioButton(self.verticalGroupBox)
 | 
			
		||||
        self.abs_dev_button.setChecked(True)
 | 
			
		||||
        self.abs_dev_button.setObjectName("abs_dev_button")
 | 
			
		||||
        self.buttonGroup.addButton(self.abs_dev_button)
 | 
			
		||||
        self.verticalLayout.addWidget(self.abs_dev_button)
 | 
			
		||||
        self.gridLayout_3.addWidget(self.verticalGroupBox, 2, 0, 1, 1)
 | 
			
		||||
        self.graphicsView = GraphicsLayoutWidget(self.stackPage1)
 | 
			
		||||
        self.graphicsView.setObjectName("graphicsView")
 | 
			
		||||
        self.gridLayout_3.addWidget(self.graphicsView, 0, 0, 1, 5)
 | 
			
		||||
        self.stack.addTab(self.stackPage1, "")
 | 
			
		||||
        self.stackPage2 = QtWidgets.QWidget()
 | 
			
		||||
        self.stackPage2.setObjectName("stackPage2")
 | 
			
		||||
@@ -89,10 +112,6 @@ class Ui_Dialog(object):
 | 
			
		||||
        self.verticalLayout_3.addWidget(self.corr_tableWidget)
 | 
			
		||||
        self.stack.addTab(self.stackPage3, "")
 | 
			
		||||
        self.gridLayout.addWidget(self.stack, 0, 1, 5, 1)
 | 
			
		||||
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
 | 
			
		||||
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Retry)
 | 
			
		||||
        self.buttonBox.setObjectName("buttonBox")
 | 
			
		||||
        self.gridLayout.addWidget(self.buttonBox, 8, 0, 1, 2)
 | 
			
		||||
        self.param_tableWidget = QtWidgets.QTableWidget(Dialog)
 | 
			
		||||
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
@@ -118,6 +137,20 @@ class Ui_Dialog(object):
 | 
			
		||||
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
 | 
			
		||||
        self.line.setObjectName("line")
 | 
			
		||||
        self.gridLayout.addWidget(self.line, 5, 0, 1, 2)
 | 
			
		||||
        self.sets_comboBox = ElideComboBox(Dialog)
 | 
			
		||||
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
        sizePolicy.setVerticalStretch(0)
 | 
			
		||||
        sizePolicy.setHeightForWidth(self.sets_comboBox.sizePolicy().hasHeightForWidth())
 | 
			
		||||
        self.sets_comboBox.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.sets_comboBox.setMaximumSize(QtCore.QSize(400, 16777215))
 | 
			
		||||
        self.sets_comboBox.setBaseSize(QtCore.QSize(200, 0))
 | 
			
		||||
        self.sets_comboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength)
 | 
			
		||||
        self.sets_comboBox.setObjectName("sets_comboBox")
 | 
			
		||||
        self.gridLayout.addWidget(self.sets_comboBox, 0, 0, 1, 1)
 | 
			
		||||
        self.reject_fit_checkBox = QtWidgets.QCheckBox(Dialog)
 | 
			
		||||
        self.reject_fit_checkBox.setObjectName("reject_fit_checkBox")
 | 
			
		||||
        self.gridLayout.addWidget(self.reject_fit_checkBox, 2, 0, 1, 1)
 | 
			
		||||
        self.groupBox = QtWidgets.QGroupBox(Dialog)
 | 
			
		||||
        self.groupBox.setObjectName("groupBox")
 | 
			
		||||
        self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox)
 | 
			
		||||
@@ -186,20 +219,10 @@ class Ui_Dialog(object):
 | 
			
		||||
        self.horizontalLayout.addWidget(self.partial_checkBox)
 | 
			
		||||
        self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 4)
 | 
			
		||||
        self.gridLayout.addWidget(self.groupBox, 7, 0, 1, 2)
 | 
			
		||||
        self.sets_comboBox = ElideComboBox(Dialog)
 | 
			
		||||
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
        sizePolicy.setVerticalStretch(0)
 | 
			
		||||
        sizePolicy.setHeightForWidth(self.sets_comboBox.sizePolicy().hasHeightForWidth())
 | 
			
		||||
        self.sets_comboBox.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.sets_comboBox.setMaximumSize(QtCore.QSize(400, 16777215))
 | 
			
		||||
        self.sets_comboBox.setBaseSize(QtCore.QSize(200, 0))
 | 
			
		||||
        self.sets_comboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength)
 | 
			
		||||
        self.sets_comboBox.setObjectName("sets_comboBox")
 | 
			
		||||
        self.gridLayout.addWidget(self.sets_comboBox, 0, 0, 1, 1)
 | 
			
		||||
        self.reject_fit_checkBox = QtWidgets.QCheckBox(Dialog)
 | 
			
		||||
        self.reject_fit_checkBox.setObjectName("reject_fit_checkBox")
 | 
			
		||||
        self.gridLayout.addWidget(self.reject_fit_checkBox, 2, 0, 1, 1)
 | 
			
		||||
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
 | 
			
		||||
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Retry)
 | 
			
		||||
        self.buttonBox.setObjectName("buttonBox")
 | 
			
		||||
        self.gridLayout.addWidget(self.buttonBox, 8, 0, 1, 2)
 | 
			
		||||
 | 
			
		||||
        self.retranslateUi(Dialog)
 | 
			
		||||
        self.stack.setCurrentIndex(0)
 | 
			
		||||
@@ -210,8 +233,12 @@ class Ui_Dialog(object):
 | 
			
		||||
        Dialog.setWindowTitle(_translate("Dialog", "Fit results"))
 | 
			
		||||
        self.autoscale_box.setToolTip(_translate("Dialog", "Auto-scale graph for all sets"))
 | 
			
		||||
        self.autoscale_box.setText(_translate("Dialog", "Autoscale all sets"))
 | 
			
		||||
        self.logy_box.setText(_translate("Dialog", "logarithmic y axis"))
 | 
			
		||||
        self.logx_box.setText(_translate("Dialog", "logarithmic x axis"))
 | 
			
		||||
        self.verticalGroupBox_2.setTitle(_translate("Dialog", "Logarithmic axes"))
 | 
			
		||||
        self.logx_box.setText(_translate("Dialog", "x axis"))
 | 
			
		||||
        self.logy_box.setText(_translate("Dialog", "y axis"))
 | 
			
		||||
        self.verticalGroupBox.setTitle(_translate("Dialog", "Residuals"))
 | 
			
		||||
        self.rel_dev_button.setText(_translate("Dialog", "relative deviation"))
 | 
			
		||||
        self.abs_dev_button.setText(_translate("Dialog", "absolute deviation"))
 | 
			
		||||
        self.stack.setTabText(self.stack.indexOf(self.stackPage1), _translate("Dialog", "Plot"))
 | 
			
		||||
        self.stack.setTabText(self.stack.indexOf(self.stackPage2), _translate("Dialog", "Statistics"))
 | 
			
		||||
        item = self.corr_tableWidget.horizontalHeaderItem(0)
 | 
			
		||||
@@ -224,6 +251,7 @@ class Ui_Dialog(object):
 | 
			
		||||
        item.setText(_translate("Dialog", "Partial Corr."))
 | 
			
		||||
        self.stack.setTabText(self.stack.indexOf(self.stackPage3), _translate("Dialog", "Correlations"))
 | 
			
		||||
        self.del_prev_checkBox.setText(_translate("Dialog", "Delete previous fits of this set"))
 | 
			
		||||
        self.reject_fit_checkBox.setText(_translate("Dialog", "Reject this fit"))
 | 
			
		||||
        self.groupBox.setTitle(_translate("Dialog", "Output"))
 | 
			
		||||
        self.extrapolate_box.setToolTip(_translate("Dialog", "Extrapolates only main function"))
 | 
			
		||||
        self.extrapolate_box.setText(_translate("Dialog", "Extrapolate curves"))
 | 
			
		||||
@@ -236,6 +264,5 @@ class Ui_Dialog(object):
 | 
			
		||||
        self.numx_line.setPlaceholderText(_translate("Dialog", "# pts"))
 | 
			
		||||
        self.curve_checkbox.setText(_translate("Dialog", "Plot fit curve"))
 | 
			
		||||
        self.partial_checkBox.setText(_translate("Dialog", "Plot partial functions"))
 | 
			
		||||
        self.reject_fit_checkBox.setText(_translate("Dialog", "Reject this fit"))
 | 
			
		||||
from ..lib.forms import ElideComboBox
 | 
			
		||||
from pyqtgraph import GraphicsLayoutWidget
 | 
			
		||||
 
 | 
			
		||||
@@ -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,17 @@ 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.abs_dev_button.clicked.connect(self._plot_residuals)
 | 
			
		||||
        self.abs_dev_button.clicked.connect(self._plot_residuals)
 | 
			
		||||
 | 
			
		||||
        self.set_results(results)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, results: list):
 | 
			
		||||
@@ -112,7 +118,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 +144,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 +190,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 +198,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 +207,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 +229,30 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
 | 
			
		||||
        else:
 | 
			
		||||
            self.fit_plot.enableAutoRange()
 | 
			
		||||
 | 
			
		||||
    def _plot_residuals(self, idx: str = None):
 | 
			
		||||
        print(idx)
 | 
			
		||||
        if idx is None:
 | 
			
		||||
            idx = self.sets_comboBox.currentData(QtCore.Qt.ItemDataRole.UserRole)
 | 
			
		||||
 | 
			
		||||
        print(idx, self._results.keys())
 | 
			
		||||
 | 
			
		||||
        res = self._results[idx]
 | 
			
		||||
        if res.iscomplex:
 | 
			
		||||
            if self.rel_dev_button.isChecked():
 | 
			
		||||
                self.resid_graph.setData(x=res.x_data, y=res.residual.real/np_abs(res.y_data.real))
 | 
			
		||||
                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:
 | 
			
		||||
                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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,13 +31,13 @@
 | 
			
		||||
      </attribute>
 | 
			
		||||
      <layout class="QGridLayout" name="gridLayout_3">
 | 
			
		||||
       <property name="leftMargin">
 | 
			
		||||
        <number>3</number>
 | 
			
		||||
        <number>6</number>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="topMargin">
 | 
			
		||||
        <number>3</number>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="rightMargin">
 | 
			
		||||
        <number>3</number>
 | 
			
		||||
        <number>6</number>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="bottomMargin">
 | 
			
		||||
        <number>3</number>
 | 
			
		||||
@@ -45,7 +45,20 @@
 | 
			
		||||
       <property name="spacing">
 | 
			
		||||
        <number>3</number>
 | 
			
		||||
       </property>
 | 
			
		||||
       <item row="2" column="0">
 | 
			
		||||
       <item row="2" column="3">
 | 
			
		||||
        <spacer name="horizontalSpacer_2">
 | 
			
		||||
         <property name="orientation">
 | 
			
		||||
          <enum>Qt::Horizontal</enum>
 | 
			
		||||
         </property>
 | 
			
		||||
         <property name="sizeHint" stdset="0">
 | 
			
		||||
          <size>
 | 
			
		||||
           <width>40</width>
 | 
			
		||||
           <height>20</height>
 | 
			
		||||
          </size>
 | 
			
		||||
         </property>
 | 
			
		||||
        </spacer>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="2" column="4">
 | 
			
		||||
        <widget class="QToolButton" name="autoscale_box">
 | 
			
		||||
         <property name="toolTip">
 | 
			
		||||
          <string>Auto-scale graph for all sets</string>
 | 
			
		||||
@@ -55,29 +68,6 @@
 | 
			
		||||
         </property>
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="2" column="3">
 | 
			
		||||
        <widget class="QCheckBox" name="logy_box">
 | 
			
		||||
         <property name="layoutDirection">
 | 
			
		||||
          <enum>Qt::LeftToRight</enum>
 | 
			
		||||
         </property>
 | 
			
		||||
         <property name="text">
 | 
			
		||||
          <string>logarithmic y axis</string>
 | 
			
		||||
         </property>
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="0" column="0" colspan="4">
 | 
			
		||||
        <widget class="GraphicsLayoutWidget" name="graphicsView"/>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="2" column="2">
 | 
			
		||||
        <widget class="QCheckBox" name="logx_box">
 | 
			
		||||
         <property name="layoutDirection">
 | 
			
		||||
          <enum>Qt::LeftToRight</enum>
 | 
			
		||||
         </property>
 | 
			
		||||
         <property name="text">
 | 
			
		||||
          <string>logarithmic x axis</string>
 | 
			
		||||
         </property>
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="2" column="1">
 | 
			
		||||
        <spacer name="horizontalSpacer">
 | 
			
		||||
         <property name="orientation">
 | 
			
		||||
@@ -91,6 +81,70 @@
 | 
			
		||||
         </property>
 | 
			
		||||
        </spacer>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="2" column="2">
 | 
			
		||||
        <widget class="QGroupBox" name="verticalGroupBox_2">
 | 
			
		||||
         <property name="title">
 | 
			
		||||
          <string>Logarithmic axes</string>
 | 
			
		||||
         </property>
 | 
			
		||||
         <layout class="QVBoxLayout" name="verticalLayout_4">
 | 
			
		||||
          <item>
 | 
			
		||||
           <widget class="QCheckBox" name="logx_box">
 | 
			
		||||
            <property name="layoutDirection">
 | 
			
		||||
             <enum>Qt::LeftToRight</enum>
 | 
			
		||||
            </property>
 | 
			
		||||
            <property name="text">
 | 
			
		||||
             <string>x axis</string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item>
 | 
			
		||||
           <widget class="QCheckBox" name="logy_box">
 | 
			
		||||
            <property name="layoutDirection">
 | 
			
		||||
             <enum>Qt::LeftToRight</enum>
 | 
			
		||||
            </property>
 | 
			
		||||
            <property name="text">
 | 
			
		||||
             <string>y axis</string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
         </layout>
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="2" column="0">
 | 
			
		||||
        <widget class="QGroupBox" name="verticalGroupBox">
 | 
			
		||||
         <property name="title">
 | 
			
		||||
          <string>Residuals</string>
 | 
			
		||||
         </property>
 | 
			
		||||
         <layout class="QVBoxLayout" name="verticalLayout">
 | 
			
		||||
          <item>
 | 
			
		||||
           <widget class="QRadioButton" name="rel_dev_button">
 | 
			
		||||
            <property name="text">
 | 
			
		||||
             <string>relative deviation</string>
 | 
			
		||||
            </property>
 | 
			
		||||
            <attribute name="buttonGroup">
 | 
			
		||||
             <string notr="true">buttonGroup</string>
 | 
			
		||||
            </attribute>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item>
 | 
			
		||||
           <widget class="QRadioButton" name="abs_dev_button">
 | 
			
		||||
            <property name="text">
 | 
			
		||||
             <string>absolute deviation</string>
 | 
			
		||||
            </property>
 | 
			
		||||
            <property name="checked">
 | 
			
		||||
             <bool>true</bool>
 | 
			
		||||
            </property>
 | 
			
		||||
            <attribute name="buttonGroup">
 | 
			
		||||
             <string notr="true">buttonGroup</string>
 | 
			
		||||
            </attribute>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
         </layout>
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item row="0" column="0" colspan="5">
 | 
			
		||||
        <widget class="GraphicsLayoutWidget" name="graphicsView"/>
 | 
			
		||||
       </item>
 | 
			
		||||
      </layout>
 | 
			
		||||
     </widget>
 | 
			
		||||
     <widget class="QWidget" name="stackPage2">
 | 
			
		||||
@@ -198,13 +252,6 @@
 | 
			
		||||
     </widget>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="8" column="0" colspan="2">
 | 
			
		||||
    <widget class="QDialogButtonBox" name="buttonBox">
 | 
			
		||||
     <property name="standardButtons">
 | 
			
		||||
      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Retry</set>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="1" column="0">
 | 
			
		||||
    <widget class="QTableWidget" name="param_tableWidget">
 | 
			
		||||
     <property name="sizePolicy">
 | 
			
		||||
@@ -254,6 +301,38 @@
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="0" column="0">
 | 
			
		||||
    <widget class="ElideComboBox" name="sets_comboBox">
 | 
			
		||||
     <property name="sizePolicy">
 | 
			
		||||
      <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
 | 
			
		||||
       <horstretch>0</horstretch>
 | 
			
		||||
       <verstretch>0</verstretch>
 | 
			
		||||
      </sizepolicy>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="maximumSize">
 | 
			
		||||
      <size>
 | 
			
		||||
       <width>400</width>
 | 
			
		||||
       <height>16777215</height>
 | 
			
		||||
      </size>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="baseSize">
 | 
			
		||||
      <size>
 | 
			
		||||
       <width>200</width>
 | 
			
		||||
       <height>0</height>
 | 
			
		||||
      </size>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="sizeAdjustPolicy">
 | 
			
		||||
      <enum>QComboBox::AdjustToMinimumContentsLength</enum>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="2" column="0">
 | 
			
		||||
    <widget class="QCheckBox" name="reject_fit_checkBox">
 | 
			
		||||
     <property name="text">
 | 
			
		||||
      <string>Reject this fit</string>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="7" column="0" colspan="2">
 | 
			
		||||
    <widget class="QGroupBox" name="groupBox">
 | 
			
		||||
     <property name="title">
 | 
			
		||||
@@ -400,35 +479,10 @@
 | 
			
		||||
     </layout>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="0" column="0">
 | 
			
		||||
    <widget class="ElideComboBox" name="sets_comboBox">
 | 
			
		||||
     <property name="sizePolicy">
 | 
			
		||||
      <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
 | 
			
		||||
       <horstretch>0</horstretch>
 | 
			
		||||
       <verstretch>0</verstretch>
 | 
			
		||||
      </sizepolicy>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="maximumSize">
 | 
			
		||||
      <size>
 | 
			
		||||
       <width>400</width>
 | 
			
		||||
       <height>16777215</height>
 | 
			
		||||
      </size>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="baseSize">
 | 
			
		||||
      <size>
 | 
			
		||||
       <width>200</width>
 | 
			
		||||
       <height>0</height>
 | 
			
		||||
      </size>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="sizeAdjustPolicy">
 | 
			
		||||
      <enum>QComboBox::AdjustToMinimumContentsLength</enum>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="2" column="0">
 | 
			
		||||
    <widget class="QCheckBox" name="reject_fit_checkBox">
 | 
			
		||||
     <property name="text">
 | 
			
		||||
      <string>Reject this fit</string>
 | 
			
		||||
   <item row="8" column="0" colspan="2">
 | 
			
		||||
    <widget class="QDialogButtonBox" name="buttonBox">
 | 
			
		||||
     <property name="standardButtons">
 | 
			
		||||
      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Retry</set>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
@@ -448,4 +502,7 @@
 | 
			
		||||
 </customwidgets>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 <connections/>
 | 
			
		||||
 <buttongroups>
 | 
			
		||||
  <buttongroup name="buttonGroup"/>
 | 
			
		||||
 </buttongroups>
 | 
			
		||||
</ui>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user