forked from IPKM/nmreval
Parameter are new initial values after fit
This commit is contained in:
parent
54a23702b6
commit
13de2714b5
@ -1,2 +0,0 @@
|
|||||||
|
|
||||||
from .version import __version__, __releasename__
|
|
@ -12,7 +12,6 @@
|
|||||||
#
|
#
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import sphinx_bootstrap_theme
|
|
||||||
sys.path.append('/autohome/dominik/nmreval')
|
sys.path.append('/autohome/dominik/nmreval')
|
||||||
import nmreval
|
import nmreval
|
||||||
|
|
||||||
|
@ -100,12 +100,12 @@ class MultiModel:
|
|||||||
if v.default is not Parameter.empty}
|
if v.default is not Parameter.empty}
|
||||||
|
|
||||||
for k, v in temp_dic.items():
|
for k, v in temp_dic.items():
|
||||||
key_ = '%s_%d' % (k, idx)
|
key_ = f'{k}_{idx}'
|
||||||
kw_dict[key_] = v
|
kw_dict[key_] = v
|
||||||
self._fun_kwargs[key_] = v
|
self._fun_kwargs[key_] = v
|
||||||
self._ext_int_kw[key_] = k
|
self._ext_int_kw[key_] = k
|
||||||
|
|
||||||
strcnt = '(%d)' % idx
|
strcnt = f'({idx})'
|
||||||
|
|
||||||
self.params += [pp+strcnt for pp in func.params]
|
self.params += [pp+strcnt for pp in func.params]
|
||||||
self.name += func.name + strcnt
|
self.name += func.name + strcnt
|
||||||
|
@ -17,7 +17,7 @@ class Model(object):
|
|||||||
elif inspect.isfunction(model):
|
elif inspect.isfunction(model):
|
||||||
self._init_from_function(model)
|
self._init_from_function(model)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'No idea how to use datatype {model}.')
|
raise ValueError(f'No idea how to use datatype {model!r}.')
|
||||||
|
|
||||||
self.lb = [i if i is not None else -inf for i in self.lb]
|
self.lb = [i if i is not None else -inf for i in self.lb]
|
||||||
self.ub = [i if i is not None else inf for i in self.ub]
|
self.ub = [i if i is not None else inf for i in self.ub]
|
||||||
@ -140,7 +140,6 @@ class Model(object):
|
|||||||
return [self.func(p, x, **kwargs)]
|
return [self.func(p, x, **kwargs)]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print('multi model')
|
|
||||||
if not kwargs:
|
if not kwargs:
|
||||||
kwargs = self.fun_kwargs
|
kwargs = self.fun_kwargs
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
from numbers import Number
|
from numbers import Number
|
||||||
from itertools import count
|
from itertools import count
|
||||||
|
|
||||||
@ -115,6 +117,15 @@ class Parameter:
|
|||||||
else:
|
else:
|
||||||
return start + f'{self.value:} (fixed)'
|
return start + f'{self.value:} (fixed)'
|
||||||
|
|
||||||
|
def __add__(self, other: Parameter | float) -> float:
|
||||||
|
if isinstance(other, float):
|
||||||
|
return self.value + other
|
||||||
|
elif isinstance(other, Parameter):
|
||||||
|
return self.value + other.value
|
||||||
|
|
||||||
|
def __radd__(self, other: Parameter | float) -> float:
|
||||||
|
return self.__add__(other)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def scaled_value(self):
|
def scaled_value(self):
|
||||||
return self.value / self.scale
|
return self.value / self.scale
|
||||||
|
@ -94,8 +94,13 @@ class FitResultCreator:
|
|||||||
correlation = corr
|
correlation = corr
|
||||||
partial_correlation = pcorr
|
partial_correlation = pcorr
|
||||||
|
|
||||||
return FitResult(_x, _y, x_orig, y_orig, parameters, fun_kwargs, resid, nobs, nvar, model.name, stats,
|
return (
|
||||||
idx=idx, corr=correlation, pcorr=partial_correlation, islog=islog, iscomplex=model.is_complex), part_functions
|
FitResult(_x, _y, x_orig, y_orig, parameters, fun_kwargs, resid,
|
||||||
|
nobs, nvar, model.name, stats,
|
||||||
|
idx=idx, corr=correlation, pcorr=partial_correlation,
|
||||||
|
islog=islog, iscomplex=model.is_complex),
|
||||||
|
part_functions,
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def calc_statistics(y, residual, nobs=None, nvar=None):
|
def calc_statistics(y, residual, nobs=None, nvar=None):
|
||||||
|
@ -27,6 +27,69 @@ class Ui_Dialog(object):
|
|||||||
self.sets_comboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength)
|
self.sets_comboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLength)
|
||||||
self.sets_comboBox.setObjectName("sets_comboBox")
|
self.sets_comboBox.setObjectName("sets_comboBox")
|
||||||
self.gridLayout.addWidget(self.sets_comboBox, 0, 0, 1, 1)
|
self.gridLayout.addWidget(self.sets_comboBox, 0, 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, 6, 0, 1, 2)
|
||||||
|
self.param_tableWidget = QtWidgets.QTableWidget(Dialog)
|
||||||
|
self.param_tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
|
||||||
|
self.param_tableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
|
||||||
|
self.param_tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||||||
|
self.param_tableWidget.setAlternatingRowColors(True)
|
||||||
|
self.param_tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
|
||||||
|
self.param_tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectColumns)
|
||||||
|
self.param_tableWidget.setShowGrid(False)
|
||||||
|
self.param_tableWidget.setColumnCount(0)
|
||||||
|
self.param_tableWidget.setObjectName("param_tableWidget")
|
||||||
|
self.param_tableWidget.setRowCount(0)
|
||||||
|
self.param_tableWidget.horizontalHeader().setStretchLastSection(False)
|
||||||
|
self.gridLayout.addWidget(self.param_tableWidget, 1, 0, 1, 1)
|
||||||
|
self.groupBox = QtWidgets.QGroupBox(Dialog)
|
||||||
|
self.groupBox.setObjectName("groupBox")
|
||||||
|
self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox)
|
||||||
|
self.gridLayout_2.setContentsMargins(3, 3, 3, 3)
|
||||||
|
self.gridLayout_2.setSpacing(3)
|
||||||
|
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||||
|
self.graph_checkBox = QtWidgets.QCheckBox(self.groupBox)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.graph_checkBox.sizePolicy().hasHeightForWidth())
|
||||||
|
self.graph_checkBox.setSizePolicy(sizePolicy)
|
||||||
|
self.graph_checkBox.setChecked(True)
|
||||||
|
self.graph_checkBox.setObjectName("graph_checkBox")
|
||||||
|
self.gridLayout_2.addWidget(self.graph_checkBox, 1, 1, 1, 1)
|
||||||
|
self.graph_comboBox = QtWidgets.QComboBox(self.groupBox)
|
||||||
|
self.graph_comboBox.setEnabled(False)
|
||||||
|
self.graph_comboBox.setObjectName("graph_comboBox")
|
||||||
|
self.gridLayout_2.addWidget(self.graph_comboBox, 1, 2, 1, 1)
|
||||||
|
self.curve_checkbox = QtWidgets.QCheckBox(self.groupBox)
|
||||||
|
self.curve_checkbox.setChecked(True)
|
||||||
|
self.curve_checkbox.setObjectName("curve_checkbox")
|
||||||
|
self.gridLayout_2.addWidget(self.curve_checkbox, 0, 0, 1, 1)
|
||||||
|
self.partial_checkBox = QtWidgets.QCheckBox(self.groupBox)
|
||||||
|
self.partial_checkBox.setObjectName("partial_checkBox")
|
||||||
|
self.gridLayout_2.addWidget(self.partial_checkBox, 1, 0, 1, 1)
|
||||||
|
self.parameter_checkbox = QtWidgets.QCheckBox(self.groupBox)
|
||||||
|
self.parameter_checkbox.setChecked(True)
|
||||||
|
self.parameter_checkbox.setObjectName("parameter_checkbox")
|
||||||
|
self.gridLayout_2.addWidget(self.parameter_checkbox, 0, 1, 1, 1)
|
||||||
|
self.gridLayout.addWidget(self.groupBox, 5, 0, 1, 2)
|
||||||
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||||
|
self.horizontalLayout_2.setSpacing(3)
|
||||||
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||||
|
self.reject_fit_checkBox = QtWidgets.QCheckBox(Dialog)
|
||||||
|
self.reject_fit_checkBox.setObjectName("reject_fit_checkBox")
|
||||||
|
self.horizontalLayout_2.addWidget(self.reject_fit_checkBox)
|
||||||
|
self.del_prev_checkBox = QtWidgets.QCheckBox(Dialog)
|
||||||
|
self.del_prev_checkBox.setObjectName("del_prev_checkBox")
|
||||||
|
self.horizontalLayout_2.addWidget(self.del_prev_checkBox)
|
||||||
|
self.gridLayout.addLayout(self.horizontalLayout_2, 2, 0, 1, 1)
|
||||||
|
self.line = QtWidgets.QFrame(Dialog)
|
||||||
|
self.line.setFrameShape(QtWidgets.QFrame.HLine)
|
||||||
|
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
|
||||||
|
self.line.setObjectName("line")
|
||||||
|
self.gridLayout.addWidget(self.line, 3, 0, 1, 2)
|
||||||
self.stack = QtWidgets.QToolBox(Dialog)
|
self.stack = QtWidgets.QToolBox(Dialog)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
@ -35,7 +98,7 @@ class Ui_Dialog(object):
|
|||||||
self.stack.setSizePolicy(sizePolicy)
|
self.stack.setSizePolicy(sizePolicy)
|
||||||
self.stack.setObjectName("stack")
|
self.stack.setObjectName("stack")
|
||||||
self.page = QtWidgets.QWidget()
|
self.page = QtWidgets.QWidget()
|
||||||
self.page.setGeometry(QtCore.QRect(0, 0, 399, 414))
|
self.page.setGeometry(QtCore.QRect(0, 0, 399, 346))
|
||||||
self.page.setObjectName("page")
|
self.page.setObjectName("page")
|
||||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.page)
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.page)
|
||||||
self.verticalLayout.setContentsMargins(3, 3, 3, 3)
|
self.verticalLayout.setContentsMargins(3, 3, 3, 3)
|
||||||
@ -50,7 +113,7 @@ class Ui_Dialog(object):
|
|||||||
self.verticalLayout.addWidget(self.logy_box)
|
self.verticalLayout.addWidget(self.logy_box)
|
||||||
self.stack.addItem(self.page, "")
|
self.stack.addItem(self.page, "")
|
||||||
self.page_2 = QtWidgets.QWidget()
|
self.page_2 = QtWidgets.QWidget()
|
||||||
self.page_2.setGeometry(QtCore.QRect(0, 0, 399, 414))
|
self.page_2.setGeometry(QtCore.QRect(0, 0, 399, 346))
|
||||||
self.page_2.setObjectName("page_2")
|
self.page_2.setObjectName("page_2")
|
||||||
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.page_2)
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.page_2)
|
||||||
self.verticalLayout_2.setContentsMargins(3, 3, 3, 3)
|
self.verticalLayout_2.setContentsMargins(3, 3, 3, 3)
|
||||||
@ -67,7 +130,7 @@ class Ui_Dialog(object):
|
|||||||
self.verticalLayout_2.addWidget(self.stats_tableWidget)
|
self.verticalLayout_2.addWidget(self.stats_tableWidget)
|
||||||
self.stack.addItem(self.page_2, "")
|
self.stack.addItem(self.page_2, "")
|
||||||
self.page_3 = QtWidgets.QWidget()
|
self.page_3 = QtWidgets.QWidget()
|
||||||
self.page_3.setGeometry(QtCore.QRect(0, 0, 399, 414))
|
self.page_3.setGeometry(QtCore.QRect(0, 0, 399, 346))
|
||||||
self.page_3.setObjectName("page_3")
|
self.page_3.setObjectName("page_3")
|
||||||
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.page_3)
|
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.page_3)
|
||||||
self.verticalLayout_3.setContentsMargins(3, 3, 3, 3)
|
self.verticalLayout_3.setContentsMargins(3, 3, 3, 3)
|
||||||
@ -92,64 +155,7 @@ class Ui_Dialog(object):
|
|||||||
self.corr_tableWidget.verticalHeader().setVisible(False)
|
self.corr_tableWidget.verticalHeader().setVisible(False)
|
||||||
self.verticalLayout_3.addWidget(self.corr_tableWidget)
|
self.verticalLayout_3.addWidget(self.corr_tableWidget)
|
||||||
self.stack.addItem(self.page_3, "")
|
self.stack.addItem(self.page_3, "")
|
||||||
self.gridLayout.addWidget(self.stack, 0, 1, 4, 1)
|
self.gridLayout.addWidget(self.stack, 0, 1, 3, 1)
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
|
||||||
self.horizontalLayout.setSpacing(3)
|
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
||||||
self.partial_checkBox = QtWidgets.QCheckBox(Dialog)
|
|
||||||
self.partial_checkBox.setObjectName("partial_checkBox")
|
|
||||||
self.horizontalLayout.addWidget(self.partial_checkBox)
|
|
||||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
||||||
self.horizontalLayout.addItem(spacerItem)
|
|
||||||
self.label_2 = QtWidgets.QLabel(Dialog)
|
|
||||||
self.label_2.setObjectName("label_2")
|
|
||||||
self.horizontalLayout.addWidget(self.label_2)
|
|
||||||
self.graph_checkBox = QtWidgets.QCheckBox(Dialog)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.graph_checkBox.sizePolicy().hasHeightForWidth())
|
|
||||||
self.graph_checkBox.setSizePolicy(sizePolicy)
|
|
||||||
self.graph_checkBox.setChecked(True)
|
|
||||||
self.graph_checkBox.setObjectName("graph_checkBox")
|
|
||||||
self.horizontalLayout.addWidget(self.graph_checkBox)
|
|
||||||
self.graph_comboBox = QtWidgets.QComboBox(Dialog)
|
|
||||||
self.graph_comboBox.setEnabled(False)
|
|
||||||
self.graph_comboBox.setObjectName("graph_comboBox")
|
|
||||||
self.horizontalLayout.addWidget(self.graph_comboBox)
|
|
||||||
self.gridLayout.addLayout(self.horizontalLayout, 5, 0, 1, 2)
|
|
||||||
self.line_2 = QtWidgets.QFrame(Dialog)
|
|
||||||
self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
|
|
||||||
self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
|
|
||||||
self.line_2.setObjectName("line_2")
|
|
||||||
self.gridLayout.addWidget(self.line_2, 3, 0, 1, 1)
|
|
||||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
|
||||||
self.horizontalLayout_2.setSpacing(3)
|
|
||||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
|
||||||
self.reject_fit_checkBox = QtWidgets.QCheckBox(Dialog)
|
|
||||||
self.reject_fit_checkBox.setObjectName("reject_fit_checkBox")
|
|
||||||
self.horizontalLayout_2.addWidget(self.reject_fit_checkBox)
|
|
||||||
self.del_prev_checkBox = QtWidgets.QCheckBox(Dialog)
|
|
||||||
self.del_prev_checkBox.setObjectName("del_prev_checkBox")
|
|
||||||
self.horizontalLayout_2.addWidget(self.del_prev_checkBox)
|
|
||||||
self.gridLayout.addLayout(self.horizontalLayout_2, 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, 6, 0, 1, 2)
|
|
||||||
self.param_tableWidget = QtWidgets.QTableWidget(Dialog)
|
|
||||||
self.param_tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
|
|
||||||
self.param_tableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
|
|
||||||
self.param_tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
|
||||||
self.param_tableWidget.setAlternatingRowColors(True)
|
|
||||||
self.param_tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
|
|
||||||
self.param_tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectColumns)
|
|
||||||
self.param_tableWidget.setShowGrid(False)
|
|
||||||
self.param_tableWidget.setColumnCount(0)
|
|
||||||
self.param_tableWidget.setObjectName("param_tableWidget")
|
|
||||||
self.param_tableWidget.setRowCount(0)
|
|
||||||
self.param_tableWidget.horizontalHeader().setStretchLastSection(False)
|
|
||||||
self.gridLayout.addWidget(self.param_tableWidget, 1, 0, 1, 1)
|
|
||||||
|
|
||||||
self.retranslateUi(Dialog)
|
self.retranslateUi(Dialog)
|
||||||
self.stack.setCurrentIndex(0)
|
self.stack.setCurrentIndex(0)
|
||||||
@ -159,6 +165,13 @@ class Ui_Dialog(object):
|
|||||||
def retranslateUi(self, Dialog):
|
def retranslateUi(self, Dialog):
|
||||||
_translate = QtCore.QCoreApplication.translate
|
_translate = QtCore.QCoreApplication.translate
|
||||||
Dialog.setWindowTitle(_translate("Dialog", "Fit results"))
|
Dialog.setWindowTitle(_translate("Dialog", "Fit results"))
|
||||||
|
self.groupBox.setTitle(_translate("Dialog", "Output"))
|
||||||
|
self.graph_checkBox.setText(_translate("Dialog", "New graph"))
|
||||||
|
self.curve_checkbox.setText(_translate("Dialog", "Plot fit curve"))
|
||||||
|
self.partial_checkBox.setText(_translate("Dialog", "Plot partial functions"))
|
||||||
|
self.parameter_checkbox.setText(_translate("Dialog", "Plot parameter"))
|
||||||
|
self.reject_fit_checkBox.setText(_translate("Dialog", "Reject this fit"))
|
||||||
|
self.del_prev_checkBox.setText(_translate("Dialog", "Delete previous fits"))
|
||||||
self.logy_box.setText(_translate("Dialog", "logarithmic y axis"))
|
self.logy_box.setText(_translate("Dialog", "logarithmic y axis"))
|
||||||
self.stack.setItemText(self.stack.indexOf(self.page), _translate("Dialog", "Plot"))
|
self.stack.setItemText(self.stack.indexOf(self.page), _translate("Dialog", "Plot"))
|
||||||
self.stack.setItemText(self.stack.indexOf(self.page_2), _translate("Dialog", "Statistics"))
|
self.stack.setItemText(self.stack.indexOf(self.page_2), _translate("Dialog", "Statistics"))
|
||||||
@ -171,10 +184,5 @@ class Ui_Dialog(object):
|
|||||||
item = self.corr_tableWidget.horizontalHeaderItem(3)
|
item = self.corr_tableWidget.horizontalHeaderItem(3)
|
||||||
item.setText(_translate("Dialog", "Partial Corr."))
|
item.setText(_translate("Dialog", "Partial Corr."))
|
||||||
self.stack.setItemText(self.stack.indexOf(self.page_3), _translate("Dialog", "Correlations"))
|
self.stack.setItemText(self.stack.indexOf(self.page_3), _translate("Dialog", "Correlations"))
|
||||||
self.partial_checkBox.setText(_translate("Dialog", "Plot partial functions"))
|
|
||||||
self.label_2.setText(_translate("Dialog", "Location of parameters:"))
|
|
||||||
self.graph_checkBox.setText(_translate("Dialog", "New graph"))
|
|
||||||
self.reject_fit_checkBox.setText(_translate("Dialog", "Reject this fit"))
|
|
||||||
self.del_prev_checkBox.setText(_translate("Dialog", "Delete previous fits"))
|
|
||||||
from ..lib.forms import ElideComboBox
|
from ..lib.forms import ElideComboBox
|
||||||
from pyqtgraph import GraphicsLayoutWidget
|
from pyqtgraph import GraphicsLayoutWidget
|
||||||
|
@ -9,7 +9,7 @@ from ...data.points import Points
|
|||||||
from ...data.signals import Signal
|
from ...data.signals import Signal
|
||||||
from ...utils.text import convert
|
from ...utils.text import convert
|
||||||
from ...data.bds import BDS
|
from ...data.bds import BDS
|
||||||
from ...lib.colors import Colors
|
from ...lib.colors import BaseColor, TUColors
|
||||||
from ...lib.lines import LineStyle
|
from ...lib.lines import LineStyle
|
||||||
from ...lib.symbols import SymbolStyle, symbolcycle
|
from ...lib.symbols import SymbolStyle, symbolcycle
|
||||||
from ...data.nmr import Spectrum, FID
|
from ...data.nmr import Spectrum, FID
|
||||||
@ -24,7 +24,7 @@ class ExperimentContainer(QtCore.QObject):
|
|||||||
dataChanged = QtCore.pyqtSignal(str)
|
dataChanged = QtCore.pyqtSignal(str)
|
||||||
labelChanged = QtCore.pyqtSignal(str, str)
|
labelChanged = QtCore.pyqtSignal(str, str)
|
||||||
groupChanged = QtCore.pyqtSignal(str, str)
|
groupChanged = QtCore.pyqtSignal(str, str)
|
||||||
colors = cycle(Colors)
|
colors = cycle(TUColors)
|
||||||
|
|
||||||
def __init__(self, identifier, data, **kwargs):
|
def __init__(self, identifier, data, **kwargs):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -63,25 +63,27 @@ class ExperimentContainer(QtCore.QObject):
|
|||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self._data)
|
return len(self._data)
|
||||||
|
|
||||||
def copy(self, full: bool = False):
|
def copy(self, full: bool = False, keep_color: bool = True):
|
||||||
if full:
|
if full:
|
||||||
# pen_dict = {
|
pen_dict = {}
|
||||||
# 'symbol': self.plot_real.symbol,
|
if keep_color:
|
||||||
# 'symbolcolor': self.plot_real.symbolcolor,
|
pen_dict = {
|
||||||
# 'symbolsize': self.plot_real.symbolsize,
|
'symbol': self.plot_real.symbol,
|
||||||
# 'linestyle': self.plot_real.linestyle,
|
'symbolcolor': self.plot_real.symbolcolor,
|
||||||
# 'linecolor': self.plot_real.linecolor,
|
'symbolsize': self.plot_real.symbolsize,
|
||||||
# 'linewidth': self.plot_real.linewidth,
|
'linestyle': self.plot_real.linestyle,
|
||||||
# }
|
'linecolor': self.plot_real.linecolor,
|
||||||
|
'linewidth': self.plot_real.linewidth,
|
||||||
|
}
|
||||||
|
|
||||||
new_data = type(self)(str(self.id), self._data.copy(), manager=self._manager)
|
new_data = type(self)(str(self.id), self._data.copy(), manager=self._manager, **pen_dict)
|
||||||
new_data.mode = self.mode
|
new_data.mode = self.mode
|
||||||
|
|
||||||
# if self.plot_imag is not None:
|
if keep_color and self.plot_imag is not None:
|
||||||
# new_data.plot_imag.set_symbol(symbol=self.plot_imag.symbol, size=self.plot_imag.symbolsize,
|
new_data.plot_imag.set_symbol(symbol=self.plot_imag.symbol, size=self.plot_imag.symbolsize,
|
||||||
# color=self.plot_imag.symbolcolor)
|
color=self.plot_imag.symbolcolor)
|
||||||
# new_data.plot_imag.set_line(style=self.plot_imag.linestyle, width=self.plot_imag.linewidth,
|
new_data.plot_imag.set_line(style=self.plot_imag.linestyle, width=self.plot_imag.linewidth,
|
||||||
# color=self.plot_imag.linecolor)
|
color=self.plot_imag.linecolor)
|
||||||
|
|
||||||
return new_data
|
return new_data
|
||||||
|
|
||||||
@ -548,7 +550,7 @@ class FitContainer(ExperimentContainer):
|
|||||||
|
|
||||||
def _init_plot(self, **kwargs):
|
def _init_plot(self, **kwargs):
|
||||||
color = kwargs.get('color', (0, 0, 0))
|
color = kwargs.get('color', (0, 0, 0))
|
||||||
if isinstance(color, Colors):
|
if isinstance(color, BaseColor):
|
||||||
color = color.rgb()
|
color = color.rgb()
|
||||||
|
|
||||||
self.plot_real = PlotItem(x=self._data.x, y=self._data.y.real, name=self.name,
|
self.plot_real = PlotItem(x=self._data.x, y=self._data.y.real, name=self.name,
|
||||||
|
@ -23,6 +23,7 @@ class DataTree(QtWidgets.QTreeWidget):
|
|||||||
self.invisibleRootItem().setFlags(self.invisibleRootItem().flags() ^ QtCore.Qt.ItemIsDropEnabled)
|
self.invisibleRootItem().setFlags(self.invisibleRootItem().flags() ^ QtCore.Qt.ItemIsDropEnabled)
|
||||||
|
|
||||||
self.itemChanged.connect(self.data_change)
|
self.itemChanged.connect(self.data_change)
|
||||||
|
self.itemClicked.connect(self.new_selection)
|
||||||
|
|
||||||
self.setColumnCount(2)
|
self.setColumnCount(2)
|
||||||
|
|
||||||
@ -76,7 +77,7 @@ class DataTree(QtWidgets.QTreeWidget):
|
|||||||
break
|
break
|
||||||
|
|
||||||
@QtCore.pyqtSlot(QtWidgets.QTreeWidgetItem)
|
@QtCore.pyqtSlot(QtWidgets.QTreeWidgetItem)
|
||||||
def data_change(self, item: QtWidgets.QTreeWidgetItem) -> (list, list):
|
def data_change(self, item: QtWidgets.QTreeWidgetItem) -> tuple[set, set]:
|
||||||
idd = item.data(0, QtCore.Qt.UserRole)
|
idd = item.data(0, QtCore.Qt.UserRole)
|
||||||
is_selected = item.checkState(0) == QtCore.Qt.Checked
|
is_selected = item.checkState(0) == QtCore.Qt.Checked
|
||||||
to_be_hidden = set()
|
to_be_hidden = set()
|
||||||
@ -140,6 +141,11 @@ class DataTree(QtWidgets.QTreeWidget):
|
|||||||
|
|
||||||
return to_be_shown, to_be_hidden
|
return to_be_shown, to_be_hidden
|
||||||
|
|
||||||
|
@QtCore.pyqtSlot(QtWidgets.QTreeWidgetItem)
|
||||||
|
def new_selection(self, item: QtWidgets.QTreeWidgetItem):
|
||||||
|
if item.parent() is None:
|
||||||
|
self.management.select_window(item.data(0, QtCore.Qt.UserRole))
|
||||||
|
|
||||||
def dropEvent(self, evt: QtGui.QDropEvent):
|
def dropEvent(self, evt: QtGui.QDropEvent):
|
||||||
dropped_index = self.indexAt(evt.pos())
|
dropped_index = self.indexAt(evt.pos())
|
||||||
if not dropped_index.isValid():
|
if not dropped_index.isValid():
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
from typing import Tuple, Union
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import List, Tuple, Union
|
||||||
|
|
||||||
from ...utils.text import convert
|
from ...utils.text import convert
|
||||||
from ..Qt import QtCore, QtWidgets, QtGui
|
from ..Qt import QtCore, QtWidgets, QtGui
|
||||||
@ -51,8 +53,8 @@ class FitModelWidget(QtWidgets.QWidget, Ui_FitParameter):
|
|||||||
return convert(self.parametername.text().strip(), old='html', new='str')
|
return convert(self.parametername.text().strip(), old='html', new='str')
|
||||||
|
|
||||||
def set_parameter_string(self, p: str):
|
def set_parameter_string(self, p: str):
|
||||||
self.parameter_line.setText(str(p))
|
self.parameter_line.setText(p)
|
||||||
self.parameter_line.setToolTip(str(p))
|
self.parameter_line.setToolTip(p)
|
||||||
|
|
||||||
def set_bounds(self, lb: float, ub: float, cbox: bool = True):
|
def set_bounds(self, lb: float, ub: float, cbox: bool = True):
|
||||||
self.checkBox.setCheckState(QtCore.Qt.Checked if cbox else QtCore.Qt.Unchecked)
|
self.checkBox.setCheckState(QtCore.Qt.Checked if cbox else QtCore.Qt.Unchecked)
|
||||||
@ -66,20 +68,24 @@ class FitModelWidget(QtWidgets.QWidget, Ui_FitParameter):
|
|||||||
self.lineEdit.setEnabled(value == 2)
|
self.lineEdit.setEnabled(value == 2)
|
||||||
self.lineEdit_2.setEnabled(value == 2)
|
self.lineEdit_2.setEnabled(value == 2)
|
||||||
|
|
||||||
def set_parameter(self, p: list, bds: Tuple[float, float, bool] = (None, None, False),
|
def set_parameter(self, p: float | None, bds: Tuple[float, float, bool] = None,
|
||||||
fixed: bool = False, glob: bool = False):
|
fixed: bool = None, glob: bool = None):
|
||||||
if p is None:
|
if p is None:
|
||||||
# bad hack: linked parameter return (None, linked parameter)
|
# bad hack: linked parameter return (None, linked parameter)
|
||||||
# if p is None -> parameter is linked to argument given by bds
|
# if p is None -> parameter is linked to argument given by bds
|
||||||
self.link_parameter(linkto=bds)
|
self.link_parameter(linkto=bds)
|
||||||
else:
|
else:
|
||||||
ptext = ' '.join([f'{pp:.4g}' for pp in p])
|
ptext = f'{p:.4g}'
|
||||||
|
|
||||||
self.set_parameter_string(ptext)
|
self.set_parameter_string(ptext)
|
||||||
|
|
||||||
|
if bds is not None:
|
||||||
self.set_bounds(*bds)
|
self.set_bounds(*bds)
|
||||||
|
|
||||||
|
if fixed is not None:
|
||||||
self.fixed_check.setCheckState(QtCore.Qt.Unchecked if fixed else QtCore.Qt.Checked)
|
self.fixed_check.setCheckState(QtCore.Qt.Unchecked if fixed else QtCore.Qt.Checked)
|
||||||
|
|
||||||
|
if glob is not None:
|
||||||
self.global_checkbox.setCheckState(QtCore.Qt.Checked if glob else QtCore.Qt.Unchecked)
|
self.global_checkbox.setCheckState(QtCore.Qt.Checked if glob else QtCore.Qt.Unchecked)
|
||||||
|
|
||||||
def get_parameter(self):
|
def get_parameter(self):
|
||||||
@ -323,7 +329,7 @@ class FitModelTree(QtWidgets.QTreeWidget):
|
|||||||
|
|
||||||
return function_nr, idx
|
return function_nr, idx
|
||||||
|
|
||||||
def get_functions(self, full=True, parent=None, pos=-1, return_pos=False):
|
def get_functions(self, full: bool = True, pos: int = -1, return_pos: bool = False, parent=None):
|
||||||
"""
|
"""
|
||||||
Create nested list of functions in tree. Parameters saved are idx (Index of function in list of all functions),
|
Create nested list of functions in tree. Parameters saved are idx (Index of function in list of all functions),
|
||||||
cnt (counter of number to associate with functione values), ops (+, -, *, /), and maybe children.
|
cnt (counter of number to associate with functione values), ops (+, -, *, /), and maybe children.
|
||||||
@ -397,7 +403,7 @@ class FitTableWidget(QtWidgets.QTableWidget):
|
|||||||
self.hideColumn(1)
|
self.hideColumn(1)
|
||||||
self.resizeColumnToContents(0)
|
self.resizeColumnToContents(0)
|
||||||
|
|
||||||
def load(self, set_ids: list):
|
def load(self, set_ids: List[str]):
|
||||||
self.blockSignals(True)
|
self.blockSignals(True)
|
||||||
|
|
||||||
while self.rowCount():
|
while self.rowCount():
|
||||||
@ -419,8 +425,7 @@ class FitTableWidget(QtWidgets.QTableWidget):
|
|||||||
|
|
||||||
self.blockSignals(False)
|
self.blockSignals(False)
|
||||||
|
|
||||||
def collect_data(self, default=None, include_name=False):
|
def collect_data(self, default: str = None, include_name: bool = False) -> dict:
|
||||||
|
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
for i in range(self.rowCount()):
|
for i in range(self.rowCount()):
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from ...utils.text import convert
|
from ...utils.text import convert
|
||||||
from ..Qt import QtWidgets, QtCore, QtGui
|
from ..Qt import QtWidgets, QtCore, QtGui
|
||||||
from .._py.fitfuncwidget import Ui_FormFit
|
from .._py.fitfuncwidget import Ui_FormFit
|
||||||
@ -50,6 +54,7 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
self.comboBox.addItem(name, userData=sid)
|
self.comboBox.addItem(name, userData=sid)
|
||||||
self._make_parameter(sid)
|
self._make_parameter(sid)
|
||||||
self.comboBox.blockSignals(False)
|
self.comboBox.blockSignals(False)
|
||||||
|
self.change_data(0)
|
||||||
|
|
||||||
def set_function(self, func, idx):
|
def set_function(self, func, idx):
|
||||||
self.func = func
|
self.func = func
|
||||||
@ -71,7 +76,7 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
if self.max_width.width() < size.width():
|
if self.max_width.width() < size.width():
|
||||||
self.max_width = size
|
self.max_width = size
|
||||||
|
|
||||||
widgt.state_changed.connect(self.set_global)
|
widgt.state_changed.connect(self.make_global)
|
||||||
widgt.value_requested.connect(self.look_for_value)
|
widgt.value_requested.connect(self.look_for_value)
|
||||||
widgt.value_changed.connect(self.change_global_parameter)
|
widgt.value_changed.connect(self.change_global_parameter)
|
||||||
|
|
||||||
@ -115,12 +120,14 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
w.add_links(parameter)
|
w.add_links(parameter)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(str)
|
@QtCore.pyqtSlot(str)
|
||||||
def change_global_parameter(self, value: str):
|
def change_global_parameter(self, value: str, idx: int = None):
|
||||||
|
if idx is None:
|
||||||
idx = self.global_parameter.index(self.sender())
|
idx = self.global_parameter.index(self.sender())
|
||||||
|
|
||||||
self.glob_values[idx] = float(value)
|
self.glob_values[idx] = float(value)
|
||||||
if self.data_values[self.comboBox.currentData()][idx] is None:
|
if self.data_values[self.comboBox.currentData()][idx] is None:
|
||||||
self.data_parameter[idx].blockSignals(True)
|
self.data_parameter[idx].blockSignals(True)
|
||||||
self.data_parameter[idx].value = value
|
self.data_parameter[idx].value = float(value)
|
||||||
self.data_parameter[idx].blockSignals(False)
|
self.data_parameter[idx].blockSignals(False)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(str, object)
|
@QtCore.pyqtSlot(str, object)
|
||||||
@ -138,7 +145,7 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
idx = self.data_parameter.index(sender)
|
idx = self.data_parameter.index(sender)
|
||||||
self.data_values[self.comboBox.currentData()][idx] = value
|
self.data_values[self.comboBox.currentData()][idx] = value
|
||||||
|
|
||||||
def change_single_choice(self, argname, value, sender=None):
|
def change_single_choice(self, _, value, sender=None):
|
||||||
if sender is None:
|
if sender is None:
|
||||||
sender = self.sender()
|
sender = self.sender()
|
||||||
idx = self.data_parameter.index(sender)
|
idx = self.data_parameter.index(sender)
|
||||||
@ -149,7 +156,7 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
self.value_requested.emit(self.global_parameter.index(sender))
|
self.value_requested.emit(self.global_parameter.index(sender))
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def set_global(self):
|
def make_global(self):
|
||||||
# disable single parameter if it is set global, enable if global is unset
|
# disable single parameter if it is set global, enable if global is unset
|
||||||
widget = self.sender()
|
widget = self.sender()
|
||||||
idx = self.global_parameter.index(widget)
|
idx = self.global_parameter.index(widget)
|
||||||
@ -233,6 +240,7 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
raise ValueError(f'Parameter {g.name} is outside bounds ({lb[i]}, {ub[i]})')
|
raise ValueError(f'Parameter {g.name} is outside bounds ({lb[i]}, {ub[i]})')
|
||||||
except TypeError:
|
except TypeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if p[i] < lb[i]:
|
if p[i] < lb[i]:
|
||||||
raise ValueError(f'Parameter {g.name} is outside bounds ({lb[i]}, {ub[i]})')
|
raise ValueError(f'Parameter {g.name} is outside bounds ({lb[i]}, {ub[i]})')
|
||||||
@ -250,3 +258,19 @@ class QFitParameterWidget(QtWidgets.QWidget, Ui_FormFit):
|
|||||||
data_parameter[sid] = (p, kw_p)
|
data_parameter[sid] = (p, kw_p)
|
||||||
|
|
||||||
return data_parameter, lb, ub, is_fixed, global_p, is_linked
|
return data_parameter, lb, ub, is_fixed, global_p, is_linked
|
||||||
|
|
||||||
|
def set_parameter(self, set_id: str | None, parameter: List[float]) -> int:
|
||||||
|
if set_id is None:
|
||||||
|
for val, g in zip(parameter, self.global_parameter):
|
||||||
|
if isinstance(g, SelectionWidget):
|
||||||
|
continue
|
||||||
|
g.set_parameter(val)
|
||||||
|
|
||||||
|
else:
|
||||||
|
new_param = self.data_values[set_id]
|
||||||
|
for i in range(len(new_param)):
|
||||||
|
new_param[i] = parameter[i]
|
||||||
|
|
||||||
|
self.change_data(self.comboBox.currentIndex())
|
||||||
|
|
||||||
|
return len(self.global_parameter)
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from functools import reduce
|
||||||
from itertools import count, cycle
|
from itertools import count, cycle
|
||||||
|
from operator import add
|
||||||
from string import ascii_letters
|
from string import ascii_letters
|
||||||
|
from typing import Dict, List, Tuple
|
||||||
|
|
||||||
from pyqtgraph import mkPen
|
from pyqtgraph import mkPen
|
||||||
|
|
||||||
@ -9,6 +14,7 @@ from ..lib.pg_objects import PlotItem
|
|||||||
from ..Qt import QtGui, QtCore, QtWidgets
|
from ..Qt import QtGui, QtCore, QtWidgets
|
||||||
from .._py.fitdialog import Ui_FitDialog
|
from .._py.fitdialog import Ui_FitDialog
|
||||||
from ...fit._meta import MultiModel, ModelFactory
|
from ...fit._meta import MultiModel, ModelFactory
|
||||||
|
from ...fit.result import FitResult
|
||||||
|
|
||||||
|
|
||||||
class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
||||||
@ -27,7 +33,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
self.parameters = {}
|
self.parameters = {}
|
||||||
self.preview_lines = []
|
self.preview_lines = []
|
||||||
self._current_function = None
|
self._current_function = None
|
||||||
self.function_widgets = {}
|
self.param_widgets = {}
|
||||||
self._management = mgmt
|
self._management = mgmt
|
||||||
|
|
||||||
self._current_model = next(QFitDialog.model_cnt)
|
self._current_model = next(QFitDialog.model_cnt)
|
||||||
@ -63,10 +69,10 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
"""
|
"""
|
||||||
Remove function and children from tree and dictionary
|
Remove function and children from tree and dictionary
|
||||||
"""
|
"""
|
||||||
w = self.function_widgets[idx]
|
w = self.param_widgets[idx]
|
||||||
self.stackedWidget.removeWidget(w)
|
self.stackedWidget.removeWidget(w)
|
||||||
w.deleteLater()
|
w.deleteLater()
|
||||||
del self.function_widgets[idx]
|
del self.param_widgets[idx]
|
||||||
|
|
||||||
if len(self.functionwidget) == 0:
|
if len(self.functionwidget) == 0:
|
||||||
# empty model
|
# empty model
|
||||||
@ -82,8 +88,8 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
"""
|
"""
|
||||||
Display parameter associated with selected function.
|
Display parameter associated with selected function.
|
||||||
"""
|
"""
|
||||||
if function_id in self.function_widgets:
|
if function_id in self.param_widgets:
|
||||||
dialog = self.function_widgets[function_id]
|
dialog = self.param_widgets[function_id]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# create new widget for function
|
# create new widget for function
|
||||||
@ -103,7 +109,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
dialog.value_requested.connect(self.look_value)
|
dialog.value_requested.connect(self.look_value)
|
||||||
|
|
||||||
self.stackedWidget.addWidget(dialog)
|
self.stackedWidget.addWidget(dialog)
|
||||||
self.function_widgets[function_id] = dialog
|
self.param_widgets[function_id] = dialog
|
||||||
|
|
||||||
self.stackedWidget.setCurrentWidget(dialog)
|
self.stackedWidget.setCurrentWidget(dialog)
|
||||||
|
|
||||||
@ -114,13 +120,13 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
# show same tab (general parameter/Data parameter)
|
# show same tab (general parameter/Data parameter)
|
||||||
tab_idx = 0
|
tab_idx = 0
|
||||||
if self._current_function is not None:
|
if self._current_function is not None:
|
||||||
tab_idx = self.function_widgets[self._current_function].tabWidget.currentIndex()
|
tab_idx = self.param_widgets[self._current_function].tabWidget.currentIndex()
|
||||||
dialog.tabWidget.setCurrentIndex(tab_idx)
|
dialog.tabWidget.setCurrentIndex(tab_idx)
|
||||||
|
|
||||||
self._current_function = function_id
|
self._current_function = function_id
|
||||||
|
|
||||||
def look_value(self, idx):
|
def look_value(self, idx: int):
|
||||||
func_widget = self.function_widgets[self._current_function]
|
func_widget = self.param_widgets[self._current_function]
|
||||||
set_ids = [func_widget.comboBox.itemData(i) for i in range(func_widget.comboBox.count())]
|
set_ids = [func_widget.comboBox.itemData(i) for i in range(func_widget.comboBox.count())]
|
||||||
for s in set_ids:
|
for s in set_ids:
|
||||||
func_widget.data_values[s][idx] = self._management[s].value
|
func_widget.data_values[s][idx] = self._management[s].value
|
||||||
@ -132,7 +138,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
self._complex[self._current_model] = self.functionwidget.get_complex_state()
|
self._complex[self._current_model] = self.functionwidget.get_complex_state()
|
||||||
self._func_list[self._current_model] = self.functionwidget.get_parameter_list()
|
self._func_list[self._current_model] = self.functionwidget.get_parameter_list()
|
||||||
|
|
||||||
def load(self, ids: list):
|
def load(self, ids: List[str]):
|
||||||
"""
|
"""
|
||||||
Add name and id of dataset to list.
|
Add name and id of dataset to list.
|
||||||
"""
|
"""
|
||||||
@ -143,7 +149,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
else:
|
else:
|
||||||
self.data_table.add_model(self._current_model)
|
self.data_table.add_model(self._current_model)
|
||||||
|
|
||||||
for dialog in self.function_widgets.values():
|
for dialog in self.param_widgets.values():
|
||||||
dialog.load(ids)
|
dialog.load(ids)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(name='on_newmodel_button_clicked')
|
@QtCore.pyqtSlot(name='on_newmodel_button_clicked')
|
||||||
@ -190,9 +196,9 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
|
|
||||||
for m in self.models[model_id]:
|
for m in self.models[model_id]:
|
||||||
func_id = m['cnt']
|
func_id = m['cnt']
|
||||||
self.stackedWidget.removeWidget(self.function_widgets[func_id])
|
self.stackedWidget.removeWidget(self.param_widgets[func_id])
|
||||||
|
|
||||||
self.function_widgets.pop(func_id)
|
self.param_widgets.pop(func_id)
|
||||||
|
|
||||||
self._complex.pop(model_id)
|
self._complex.pop(model_id)
|
||||||
self._func_list.pop(model_id)
|
self._func_list.pop(model_id)
|
||||||
@ -203,7 +209,8 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
if len(self.models) == 1:
|
if len(self.models) == 1:
|
||||||
self.model_frame.hide()
|
self.model_frame.hide()
|
||||||
|
|
||||||
def _prepare(self, model: list, function_use=None, parameter=None, add_idx=False, cnt=0):
|
def _prepare(self, model: list, function_use: list = None,
|
||||||
|
parameter: dict = None, add_idx: bool = False, cnt: int = 0) -> Tuple[dict, int]:
|
||||||
if parameter is None:
|
if parameter is None:
|
||||||
parameter = {'parameter': {}, 'lb': (), 'ub': (), 'var': [],
|
parameter = {'parameter': {}, 'lb': (), 'ub': (), 'var': [],
|
||||||
'glob': {'idx': [], 'p': [], 'var': [], 'lb': [], 'ub': []},
|
'glob': {'idx': [], 'p': [], 'var': [], 'lb': [], 'ub': []},
|
||||||
@ -212,12 +219,13 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
for i, f in enumerate(model):
|
for i, f in enumerate(model):
|
||||||
if not f['active']:
|
if not f['active']:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
p, lb, ub, var, glob, links = self.function_widgets[f['cnt']].get_parameter(function_use)
|
p, lb, ub, var, glob, links = self.param_widgets[f['cnt']].get_parameter(function_use)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
_ = QtWidgets.QMessageBox().warning(self, 'Invalid value', str(e),
|
_ = QtWidgets.QMessageBox().warning(self, 'Invalid value', str(e),
|
||||||
QtWidgets.QMessageBox.Ok)
|
QtWidgets.QMessageBox.Ok)
|
||||||
return None, -1
|
return {}, -1
|
||||||
|
|
||||||
p_len = len(parameter['lb'])
|
p_len = len(parameter['lb'])
|
||||||
|
|
||||||
@ -337,7 +345,6 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot(int, name='on_preview_checkbox_stateChanged')
|
@QtCore.pyqtSlot(int, name='on_preview_checkbox_stateChanged')
|
||||||
def show_preview(self, state: int):
|
def show_preview(self, state: int):
|
||||||
print('state', state)
|
|
||||||
if state:
|
if state:
|
||||||
self.preview_button.show()
|
self.preview_button.show()
|
||||||
self.preview_checkbox.setText('')
|
self.preview_checkbox.setText('')
|
||||||
@ -405,13 +412,9 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
y = f.func(x, *p, **kwargs)
|
y = f.func(x, *p, **kwargs)
|
||||||
if is_complex is None:
|
if is_complex is None:
|
||||||
self.preview_lines.append(PlotItem(x=x, y=y, pen=mkPen(width=3)))
|
self.preview_lines.append(PlotItem(x=x, y=y, pen=mkPen(width=3)))
|
||||||
|
if is_complex in [0, 1]:
|
||||||
elif is_complex == 0:
|
|
||||||
self.preview_lines.append(PlotItem(x=x, y=y.real, pen=mkPen(width=3)))
|
self.preview_lines.append(PlotItem(x=x, y=y.real, pen=mkPen(width=3)))
|
||||||
self.preview_lines.append(PlotItem(x=x, y=y.imag, pen=mkPen(width=3)))
|
if is_complex in [0, 2]:
|
||||||
elif is_complex == 1:
|
|
||||||
self.preview_lines.append(PlotItem(x=x, y=y.real, pen=mkPen(width=3)))
|
|
||||||
else:
|
|
||||||
self.preview_lines.append(PlotItem(x=x, y=y.imag, pen=mkPen(width=3)))
|
self.preview_lines.append(PlotItem(x=x, y=y.imag, pen=mkPen(width=3)))
|
||||||
|
|
||||||
if isinstance(f, MultiModel):
|
if isinstance(f, MultiModel):
|
||||||
@ -419,16 +422,39 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
|
|||||||
pen_i = mkPen(QtGui.QColor.fromRgbF(*color[i]))
|
pen_i = mkPen(QtGui.QColor.fromRgbF(*color[i]))
|
||||||
if is_complex is None:
|
if is_complex is None:
|
||||||
self.preview_lines.append(PlotItem(x=x, y=s, pen=pen_i))
|
self.preview_lines.append(PlotItem(x=x, y=s, pen=pen_i))
|
||||||
elif is_complex == 0:
|
if is_complex in [0, 1]:
|
||||||
self.preview_lines.append(PlotItem(x=x, y=s.real, pen=pen_i))
|
self.preview_lines.append(PlotItem(x=x, y=s.real, pen=pen_i))
|
||||||
self.preview_lines.append(PlotItem(x=x, y=s.imag, pen=pen_i))
|
if is_complex in [0, 2]:
|
||||||
elif is_complex == 1:
|
|
||||||
self.preview_lines.append(PlotItem(x=x, y=s.real, pen=pen_i))
|
|
||||||
else:
|
|
||||||
self.preview_lines.append(PlotItem(x=x, y=s.imag, pen=pen_i))
|
self.preview_lines.append(PlotItem(x=x, y=s.imag, pen=pen_i))
|
||||||
|
|
||||||
return self.preview_lines
|
return self.preview_lines
|
||||||
|
|
||||||
|
def set_parameter(self, parameter: Dict[str, FitResult]):
|
||||||
|
# which data uses which model
|
||||||
|
data = self.data_table.collect_data(default=self.default_combobox.currentData())
|
||||||
|
|
||||||
|
glob_fit_parameter = []
|
||||||
|
|
||||||
|
for fitted_model, fitted_data in data.items():
|
||||||
|
for fit_id, fit_curve in parameter.items():
|
||||||
|
if fit_id in fitted_data:
|
||||||
|
fit_parameter = list(fit_curve.parameter.values())
|
||||||
|
glob_fit_parameter.append(fit_parameter)
|
||||||
|
|
||||||
|
self.set_parameter_iter(fit_id, [p.value for p in fit_parameter], self.models[fitted_model])
|
||||||
|
|
||||||
|
mean_parameter = [reduce(add, p)/len(p) for p in zip(*glob_fit_parameter)]
|
||||||
|
|
||||||
|
self.set_parameter_iter(None, mean_parameter, self.models[fitted_model])
|
||||||
|
|
||||||
|
def set_parameter_iter(self, fit_id: str | None, param: List[float], functions: List, cnt: int = 0):
|
||||||
|
for model_p in functions:
|
||||||
|
cnt += self.param_widgets[model_p['cnt']].set_parameter(fit_id, param[cnt:])
|
||||||
|
if model_p['children']:
|
||||||
|
cnt += self.set_parameter_iter(fit_id, param, model_p['children'], cnt=cnt)
|
||||||
|
|
||||||
|
return cnt
|
||||||
|
|
||||||
def closeEvent(self, evt: QtGui.QCloseEvent):
|
def closeEvent(self, evt: QtGui.QCloseEvent):
|
||||||
self.preview_emit.emit({}, -1, False)
|
self.preview_emit.emit({}, -1, False)
|
||||||
self.preview_lines = []
|
self.preview_lines = []
|
||||||
|
@ -11,7 +11,7 @@ from ..lib.pg_objects import PlotItem
|
|||||||
|
|
||||||
|
|
||||||
class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
||||||
closed = QtCore.pyqtSignal(dict, list)
|
closed = QtCore.pyqtSignal(dict, list, str, bool, dict)
|
||||||
redoFit = QtCore.pyqtSignal(dict)
|
redoFit = QtCore.pyqtSignal(dict)
|
||||||
|
|
||||||
def __init__(self, results: list, management, parent=None):
|
def __init__(self, results: list, management, parent=None):
|
||||||
@ -25,7 +25,6 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
|||||||
|
|
||||||
for (res, parts) in results:
|
for (res, parts) in results:
|
||||||
idx = res.idx
|
idx = res.idx
|
||||||
print(parts)
|
|
||||||
data_k = management.data[idx]
|
data_k = management.data[idx]
|
||||||
|
|
||||||
if res.name not in self._models:
|
if res.name not in self._models:
|
||||||
@ -64,7 +63,11 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
|||||||
self.set_parameter(0)
|
self.set_parameter(0)
|
||||||
self.buttonBox.accepted.connect(self.accept)
|
self.buttonBox.accepted.connect(self.accept)
|
||||||
|
|
||||||
self.param_tableWidget.horizontalHeader().sectionClicked.connect(self.show_results)
|
self.param_tableWidget.itemClicked.connect(self.show_results)
|
||||||
|
self.param_tableWidget.horizontalHeader().sectionClicked.connect(lambda i: self.show_results(None, idx=i))
|
||||||
|
|
||||||
|
self.graph_checkBox.stateChanged.connect(lambda x: self.graph_comboBox.setEnabled(x == QtCore.Qt.Unchecked))
|
||||||
|
|
||||||
self.logy_box.stateChanged.connect(lambda x: self.fitplot.setLogMode(y=bool(x)))
|
self.logy_box.stateChanged.connect(lambda x: self.fitplot.setLogMode(y=bool(x)))
|
||||||
|
|
||||||
def add_graphs(self, graphs: list):
|
def add_graphs(self, graphs: list):
|
||||||
@ -72,10 +75,6 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
|||||||
for (graph_id, graph_name) in graphs:
|
for (graph_id, graph_name) in graphs:
|
||||||
self.graph_comboBox.addItem(graph_name, userData=graph_id)
|
self.graph_comboBox.addItem(graph_name, userData=graph_id)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(int, name='on_graph_checkBox_stateChanged')
|
|
||||||
def change_graph(self, state: int):
|
|
||||||
self.graph_comboBox.setEnabled(state == QtCore.Qt.Unchecked)
|
|
||||||
|
|
||||||
@QtCore.pyqtSlot(int, name='on_sets_comboBox_currentIndexChanged')
|
@QtCore.pyqtSlot(int, name='on_sets_comboBox_currentIndexChanged')
|
||||||
def set_parameter(self, idx: int):
|
def set_parameter(self, idx: int):
|
||||||
model_name = self.sets_comboBox.itemText(idx)
|
model_name = self.sets_comboBox.itemText(idx)
|
||||||
@ -109,22 +108,32 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
|||||||
|
|
||||||
self.param_tableWidget.resizeColumnsToContents()
|
self.param_tableWidget.resizeColumnsToContents()
|
||||||
self.param_tableWidget.selectColumn(0)
|
self.param_tableWidget.selectColumn(0)
|
||||||
self.show_results(0)
|
self.show_results(None, idx=0)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(int, name='on_reject_fit_checkBox_stateChanged')
|
@QtCore.pyqtSlot(int, name='on_reject_fit_checkBox_stateChanged')
|
||||||
@QtCore.pyqtSlot(int, name='on_del_prev_checkBox_stateChanged')
|
@QtCore.pyqtSlot(int, name='on_del_prev_checkBox_stateChanged')
|
||||||
def change_opts(self, _):
|
def change_opts(self, _):
|
||||||
idx = self.sets_comboBox.currentIndex()
|
idx = self.param_tableWidget.currentIndex().column()
|
||||||
|
|
||||||
self._opts[idx] = (self.reject_fit_checkBox.checkState() == QtCore.Qt.Checked,
|
self._opts[idx] = (self.reject_fit_checkBox.checkState() == QtCore.Qt.Checked,
|
||||||
self.del_prev_checkBox.checkState() == QtCore.Qt.Checked)
|
self.del_prev_checkBox.checkState() == QtCore.Qt.Checked)
|
||||||
|
|
||||||
def show_results(self, idx: int):
|
def show_results(self, item, idx=None):
|
||||||
|
if item is not None:
|
||||||
|
idx = self.param_tableWidget.indexFromItem(item).column()
|
||||||
|
|
||||||
set_id = self.param_tableWidget.horizontalHeaderItem(idx).data(QtCore.Qt.UserRole)
|
set_id = self.param_tableWidget.horizontalHeaderItem(idx).data(QtCore.Qt.UserRole)
|
||||||
self.set_plot(set_id)
|
self.set_plot(set_id)
|
||||||
self.set_correlation(set_id)
|
self.set_correlation(set_id)
|
||||||
self.set_statistics(set_id)
|
self.set_statistics(set_id)
|
||||||
|
|
||||||
|
self.reject_fit_checkBox.blockSignals(True)
|
||||||
|
self.reject_fit_checkBox.setChecked(self._opts[idx][0])
|
||||||
|
self.reject_fit_checkBox.blockSignals(False)
|
||||||
|
self.del_prev_checkBox.blockSignals(True)
|
||||||
|
self.del_prev_checkBox.setChecked(self._opts[idx][1])
|
||||||
|
self.del_prev_checkBox.blockSignals(False)
|
||||||
|
|
||||||
def set_plot(self, idx: str):
|
def set_plot(self, idx: str):
|
||||||
res = self._results[idx]
|
res = self._results[idx]
|
||||||
iscomplex = res.iscomplex
|
iscomplex = res.iscomplex
|
||||||
@ -234,10 +243,19 @@ class QFitResult(QtWidgets.QDialog, Ui_Dialog):
|
|||||||
self.redoFit.emit(self._results)
|
self.redoFit.emit(self._results)
|
||||||
|
|
||||||
elif button_type == self.buttonBox.Ok:
|
elif button_type == self.buttonBox.Ok:
|
||||||
graph = '' if self.graph_checkBox.checkState() == QtCore.Qt.Checked else self.graph_comboBox.currentData()
|
graph = None
|
||||||
subplots = self.partial_checkBox.checkState() == QtCore.Qt.Checked
|
if self.parameter_checkbox.isChecked():
|
||||||
self._opts.extend([graph, subplots])
|
if self.graph_checkBox.checkState() == QtCore.Qt.Checked:
|
||||||
self.closed.emit(self._results, self._opts)
|
graph = ''
|
||||||
|
else:
|
||||||
|
graph = self.graph_comboBox.currentData()
|
||||||
|
|
||||||
|
plot_fits = self.curve_checkbox.isChecked()
|
||||||
|
|
||||||
|
if self.partial_checkBox.checkState() == QtCore.Qt.Checked:
|
||||||
|
self.closed.emit(self._results, self._opts, graph, plot_fits, self._parts)
|
||||||
|
else:
|
||||||
|
self.closed.emit(self._results, self._opts, graph, plot_fits, {})
|
||||||
|
|
||||||
self.accept()
|
self.accept()
|
||||||
|
|
||||||
|
@ -15,6 +15,11 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
|
|||||||
|
|
||||||
self.reader = AsciiReader(fname)
|
self.reader = AsciiReader(fname)
|
||||||
|
|
||||||
|
pal = QtWidgets.QApplication.instance().palette()
|
||||||
|
rgb = pal.color(pal.Base).getRgb()[:3]
|
||||||
|
rgb2 = pal.color(pal.Text).getRgb()[:3]
|
||||||
|
self.plainTextEdit_2.setStyleSheet(f'QPlainTextEdit {{ background-color: rgb{rgb} ; color: rgb{rgb2}; }}')
|
||||||
|
|
||||||
self.ascii_table.horizontalHeader().setStretchLastSection(True)
|
self.ascii_table.horizontalHeader().setStretchLastSection(True)
|
||||||
self.buttonbox.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.apply)
|
self.buttonbox.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.apply)
|
||||||
self.buttonbox.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self.accept)
|
self.buttonbox.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self.accept)
|
||||||
|
@ -61,7 +61,11 @@ def get_icon(icon_name):
|
|||||||
|
|
||||||
global HAS_IMPORTLIB_RESOURCE
|
global HAS_IMPORTLIB_RESOURCE
|
||||||
|
|
||||||
dirname = 'resources.icons.%s_light' % icon_type
|
if icon_name != 'logo':
|
||||||
|
dirname = f'resources.icons.{icon_type}_light'
|
||||||
|
else:
|
||||||
|
dirname = 'resources.icons'
|
||||||
|
|
||||||
if HAS_IMPORTLIB_RESOURCE:
|
if HAS_IMPORTLIB_RESOURCE:
|
||||||
with path(dirname, icon_name+'.png') as imgpath:
|
with path(dirname, icon_name+'.png') as imgpath:
|
||||||
icon = QtGui.QIcon()
|
icon = QtGui.QIcon()
|
||||||
|
@ -2,7 +2,7 @@ import re
|
|||||||
|
|
||||||
from ..Qt import QtWidgets, QtGui, QtCore
|
from ..Qt import QtWidgets, QtGui, QtCore
|
||||||
|
|
||||||
from ...lib.colors import BaseColor, Colors
|
from ...lib.colors import BaseColor, TUColors
|
||||||
from ...lib.lines import LineStyle
|
from ...lib.lines import LineStyle
|
||||||
from ...lib.symbols import SymbolStyle, make_symbol_pixmap
|
from ...lib.symbols import SymbolStyle, make_symbol_pixmap
|
||||||
|
|
||||||
@ -101,12 +101,12 @@ class ColorListEditor(QtWidgets.QComboBox):
|
|||||||
@value.setter
|
@value.setter
|
||||||
def value(self, val):
|
def value(self, val):
|
||||||
for i in range(self.count()):
|
for i in range(self.count()):
|
||||||
if val == self.itemData(i):
|
if val.name == self.itemData(i).name:
|
||||||
self.setCurrentIndex(i)
|
self.setCurrentIndex(i)
|
||||||
break
|
break
|
||||||
|
|
||||||
def populateList(self):
|
def populateList(self):
|
||||||
for i, colorName in enumerate(Colors):
|
for i, colorName in enumerate(TUColors):
|
||||||
color = QtGui.QColor(*colorName.value)
|
color = QtGui.QColor(*colorName.value)
|
||||||
self.insertItem(i, colorName.name)
|
self.insertItem(i, colorName.name)
|
||||||
self.setItemData(i, colorName)
|
self.setItemData(i, colorName)
|
||||||
|
@ -56,7 +56,7 @@ class LineEdit(QtWidgets.QLineEdit):
|
|||||||
|
|
||||||
def contextMenuEvent(self, evt):
|
def contextMenuEvent(self, evt):
|
||||||
menu = self.createStandardContextMenu()
|
menu = self.createStandardContextMenu()
|
||||||
request_action = menu.addAction('Use value of set(s)')
|
request_action = menu.addAction('Use value of sets')
|
||||||
|
|
||||||
action = menu.exec(evt.globalPos())
|
action = menu.exec(evt.globalPos())
|
||||||
|
|
||||||
@ -89,9 +89,11 @@ class LineEditPost(QtWidgets.QLineEdit):
|
|||||||
|
|
||||||
|
|
||||||
class FormWidget(QtWidgets.QWidget):
|
class FormWidget(QtWidgets.QWidget):
|
||||||
types = {'float': (float, QtGui.QDoubleValidator),
|
types = {
|
||||||
|
'float': (float, QtGui.QDoubleValidator),
|
||||||
'int': (int, QtGui.QIntValidator),
|
'int': (int, QtGui.QIntValidator),
|
||||||
'str': (str, lambda: 0)}
|
'str': (str, lambda: 0),
|
||||||
|
}
|
||||||
|
|
||||||
valueChanged = QtCore.pyqtSignal(object)
|
valueChanged = QtCore.pyqtSignal(object)
|
||||||
stateChanged = QtCore.pyqtSignal(bool)
|
stateChanged = QtCore.pyqtSignal(bool)
|
||||||
@ -140,7 +142,12 @@ class FormWidget(QtWidgets.QWidget):
|
|||||||
|
|
||||||
@value.setter
|
@value.setter
|
||||||
def value(self, val):
|
def value(self, val):
|
||||||
self.vals.setText(str(val))
|
if self._type == 'str':
|
||||||
|
self.vals.setText(val)
|
||||||
|
elif self._type == 'int':
|
||||||
|
self.vals.setText(f'{val:.0f}')
|
||||||
|
else:
|
||||||
|
self.vals.setText(f'{val:.5g}')
|
||||||
|
|
||||||
def setChecked(self, enable):
|
def setChecked(self, enable):
|
||||||
if self._checkable:
|
if self._checkable:
|
||||||
|
@ -4,10 +4,10 @@ from pyqtgraph import (
|
|||||||
ErrorBarItem,
|
ErrorBarItem,
|
||||||
LinearRegionItem, mkBrush,
|
LinearRegionItem, mkBrush,
|
||||||
mkColor, mkPen,
|
mkColor, mkPen,
|
||||||
PlotDataItem
|
PlotDataItem,
|
||||||
)
|
)
|
||||||
|
|
||||||
from ...lib.colors import BaseColor, Colors
|
from ...lib.colors import BaseColor, Colors, TUColors
|
||||||
from ...lib.lines import LineStyle
|
from ...lib.lines import LineStyle
|
||||||
from ...lib.symbols import SymbolStyle
|
from ...lib.symbols import SymbolStyle
|
||||||
|
|
||||||
|
@ -391,6 +391,8 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
|
|||||||
self.management.current_graph = wd.widget().id
|
self.management.current_graph = wd.widget().id
|
||||||
self.current_plotitem = self.current_graph_widget.graphic
|
self.current_plotitem = self.current_graph_widget.graphic
|
||||||
|
|
||||||
|
self.change_mouse_mode(self.actionMouse_behaviour.isChecked())
|
||||||
|
|
||||||
pick = False
|
pick = False
|
||||||
block = False
|
block = False
|
||||||
if self.ptsselectwidget.isVisible():
|
if self.ptsselectwidget.isVisible():
|
||||||
@ -720,6 +722,10 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
|
|||||||
for s in sets:
|
for s in sets:
|
||||||
self.datawidget.tree.move_sets(s, dest, src)
|
self.datawidget.tree.move_sets(s, dest, src)
|
||||||
|
|
||||||
|
@QtCore.pyqtSlot(name='on_action_idx_cut_triggered')
|
||||||
|
def cut_with_idx(self):
|
||||||
|
print('schnippschnapp')
|
||||||
|
|
||||||
@QtCore.pyqtSlot(str)
|
@QtCore.pyqtSlot(str)
|
||||||
def show_data_values(self, sid: str):
|
def show_data_values(self, sid: str):
|
||||||
if sid == '':
|
if sid == '':
|
||||||
@ -776,7 +782,6 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
if onoff:
|
if onoff:
|
||||||
if self.management.active_sets:
|
|
||||||
self.fit_dialog.connected_figure = self.management.current_graph
|
self.fit_dialog.connected_figure = self.management.current_graph
|
||||||
self.fit_dialog.load(self.management.active_sets)
|
self.fit_dialog.load(self.management.active_sets)
|
||||||
for item in self.fit_dialog.preview_lines:
|
for item in self.fit_dialog.preview_lines:
|
||||||
@ -834,18 +839,21 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
|
|||||||
for item in self.fit_dialog.preview_lines:
|
for item in self.fit_dialog.preview_lines:
|
||||||
g.add_external(item)
|
g.add_external(item)
|
||||||
|
|
||||||
self.raise_()
|
|
||||||
|
|
||||||
@QtCore.pyqtSlot(list)
|
@QtCore.pyqtSlot(list)
|
||||||
def show_fit_results(self, results: list):
|
def show_fit_results(self, results: list):
|
||||||
self.fit_dialog.fit_button.setEnabled(True)
|
self.fit_dialog.fit_button.setEnabled(True)
|
||||||
if results:
|
if results:
|
||||||
res_dialog = QFitResult(results, self.management, parent=self)
|
res_dialog = QFitResult(results, self.management, parent=self)
|
||||||
res_dialog.add_graphs(self.management.graphs.list())
|
res_dialog.add_graphs(self.management.graphs.list())
|
||||||
res_dialog.closed.connect(self.management.make_fits)
|
res_dialog.closed.connect(self.accepts_fit)
|
||||||
res_dialog.redoFit.connect(self.management.redo_fits)
|
res_dialog.redoFit.connect(self.management.redo_fits)
|
||||||
res_dialog.show()
|
res_dialog.show()
|
||||||
|
|
||||||
|
@QtCore.pyqtSlot(dict, list, str, bool, dict)
|
||||||
|
def accepts_fit(self, res: dict, opts: list, param_graph: str, show_fit: bool, parts: dict) -> None:
|
||||||
|
self.fit_dialog.set_parameter(res)
|
||||||
|
self.management.make_fits(res, opts, param_graph, show_fit, parts)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(name='on_actionFunction_editor_triggered')
|
@QtCore.pyqtSlot(name='on_actionFunction_editor_triggered')
|
||||||
def edit_models(self):
|
def edit_models(self):
|
||||||
if self.editor is None:
|
if self.editor is None:
|
||||||
@ -885,14 +893,14 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
|
|||||||
evt.accept()
|
evt.accept()
|
||||||
|
|
||||||
@QtCore.pyqtSlot(bool, name='on_actionMouse_behaviour_toggled')
|
@QtCore.pyqtSlot(bool, name='on_actionMouse_behaviour_toggled')
|
||||||
def change_mouse_mode(self, is_checked):
|
def change_mouse_mode(self, is_checked: bool):
|
||||||
if is_checked:
|
if is_checked:
|
||||||
self.current_plotitem.plotItem.vb.setMouseMode(ViewBox.RectMode)
|
self.current_plotitem.plotItem.vb.setMouseMode(ViewBox.RectMode)
|
||||||
else:
|
else:
|
||||||
self.current_plotitem.plotItem.vb.setMouseMode(ViewBox.PanMode)
|
self.current_plotitem.plotItem.vb.setMouseMode(ViewBox.PanMode)
|
||||||
|
|
||||||
def mousemoved(self, xpos, ypos):
|
def mousemoved(self, xpos, ypos):
|
||||||
self.mousepos.setText('x={:.3g}; y={:.3g}'.format(xpos, ypos))
|
self.mousepos.setText(f'x={xpos:.3g}; y={ypos:.3g}')
|
||||||
|
|
||||||
@QtCore.pyqtSlot(name='on_actionSnake_triggered')
|
@QtCore.pyqtSlot(name='on_actionSnake_triggered')
|
||||||
@QtCore.pyqtSlot(name='on_actionTetris_triggered')
|
@QtCore.pyqtSlot(name='on_actionTetris_triggered')
|
||||||
|
@ -9,6 +9,7 @@ from ...fit import data as fit_d
|
|||||||
from ...fit.model import Model
|
from ...fit.model import Model
|
||||||
from ...fit.result import FitResult
|
from ...fit.result import FitResult
|
||||||
from ...fit.minimizer import FitRoutine
|
from ...fit.minimizer import FitRoutine
|
||||||
|
from ...lib.colors import TUColorsC
|
||||||
from ...math.interpol import interpolate
|
from ...math.interpol import interpolate
|
||||||
from ...math.logfourier import logft
|
from ...math.logfourier import logft
|
||||||
from ...math.smooth import smooth
|
from ...math.smooth import smooth
|
||||||
@ -78,8 +79,7 @@ class UpperManagement(QtCore.QObject):
|
|||||||
properties_collected = QtCore.pyqtSignal(dict)
|
properties_collected = QtCore.pyqtSignal(dict)
|
||||||
unset_state = QtCore.pyqtSignal(list)
|
unset_state = QtCore.pyqtSignal(list)
|
||||||
|
|
||||||
|
_colors = cycle(TUColors)
|
||||||
_colors = cycle(Colors)
|
|
||||||
|
|
||||||
_actions = {
|
_actions = {
|
||||||
'ls': (ShiftCommand, 'Left shift'),
|
'ls': (ShiftCommand, 'Left shift'),
|
||||||
@ -238,6 +238,11 @@ class UpperManagement(QtCore.QObject):
|
|||||||
# move to correct position
|
# move to correct position
|
||||||
self.graphs[dest].move_sets(sets, pos)
|
self.graphs[dest].move_sets(sets, pos)
|
||||||
|
|
||||||
|
def select_window(self, gid: str):
|
||||||
|
for key, plot in self.graphs.items():
|
||||||
|
if key == gid:
|
||||||
|
self.window.area.setActiveSubWindow(plot.parent())
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
@QtCore.pyqtSlot(list, str)
|
@QtCore.pyqtSlot(list, str)
|
||||||
def copy_sets(self, sets: list = None, src: str = None):
|
def copy_sets(self, sets: list = None, src: str = None):
|
||||||
@ -466,14 +471,22 @@ class UpperManagement(QtCore.QObject):
|
|||||||
parameter[set_id] = (new_values, set_parameter[1])
|
parameter[set_id] = (new_values, set_parameter[1])
|
||||||
self.start_fit(*self.__fit_options)
|
self.start_fit(*self.__fit_options)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(dict, list)
|
def make_fits(self, res: dict, opts: list, param_graph: str, show_fit: bool, parts: dict) -> None:
|
||||||
def make_fits(self, res: dict, opts: list):
|
"""
|
||||||
|
|
||||||
|
Args:
|
||||||
|
res: key is that of original data, value is FitResult
|
||||||
|
opts: (ignore this fits, delete previous fits)
|
||||||
|
param_graph: None if no parameter to plot, '' for new graph, or id of existig graph
|
||||||
|
show_fit: plot fit curve?
|
||||||
|
parts: key is that of original data, value is list of subplots
|
||||||
|
|
||||||
|
"""
|
||||||
f_id_list = []
|
f_id_list = []
|
||||||
gid = ''
|
gid = ''
|
||||||
|
|
||||||
subplots = opts.pop(-1)
|
|
||||||
param_graph = opts.pop(-1)
|
|
||||||
tobedeleted = []
|
tobedeleted = []
|
||||||
|
accepted = []
|
||||||
for i, (k, fit) in enumerate(res.items()):
|
for i, (k, fit) in enumerate(res.items()):
|
||||||
reject, delete_prev = opts[i]
|
reject, delete_prev = opts[i]
|
||||||
if reject:
|
if reject:
|
||||||
@ -493,19 +506,31 @@ class UpperManagement(QtCore.QObject):
|
|||||||
fit.value = data_k.value
|
fit.value = data_k.value
|
||||||
fit.group = data_k.group
|
fit.group = data_k.group
|
||||||
|
|
||||||
|
accepted.append(fit)
|
||||||
|
|
||||||
|
if show_fit:
|
||||||
f_id = self.add(fit, color=color, src=k)
|
f_id = self.add(fit, color=color, src=k)
|
||||||
|
|
||||||
f_id_list.append(f_id)
|
f_id_list.append(f_id)
|
||||||
data_k.set_fits(f_id)
|
data_k.set_fits(f_id)
|
||||||
|
|
||||||
gid = data_k.graph
|
gid = data_k.graph
|
||||||
|
|
||||||
|
if k in parts and show_fit:
|
||||||
|
for subfunc, col in zip(parts[k], TUColorsC):
|
||||||
|
sub_f_id = self.add(subfunc, color=col, linestyle=LineStyle.Dashed, symbol=SymbolStyle.No)
|
||||||
|
subfunc.value = data_k.value
|
||||||
|
subfunc.group = data_k.group
|
||||||
|
f_id_list.append(sub_f_id)
|
||||||
|
|
||||||
self.delete_sets(tobedeleted)
|
self.delete_sets(tobedeleted)
|
||||||
|
|
||||||
if f_id_list:
|
if accepted and param_graph is not None:
|
||||||
self.newData.emit(f_id_list, gid)
|
self.make_fit_parameter(accepted, graph_id=param_graph)
|
||||||
self.make_fit_parameter(f_id_list, graph_id=param_graph)
|
|
||||||
|
|
||||||
def make_fit_parameter(self, fit_sets: List[str], graph_id: str = None):
|
self.newData.emit(f_id_list, gid)
|
||||||
|
|
||||||
|
def make_fit_parameter(self, fit_sets: List[str | FitResult], graph_id: str = None):
|
||||||
fit_dict = self._collect_fit_parameter(fit_sets)
|
fit_dict = self._collect_fit_parameter(fit_sets)
|
||||||
|
|
||||||
if fit_dict:
|
if fit_dict:
|
||||||
@ -530,13 +555,18 @@ class UpperManagement(QtCore.QObject):
|
|||||||
|
|
||||||
data.data.save_parameter(fname)
|
data.data.save_parameter(fname)
|
||||||
|
|
||||||
def _collect_fit_parameter(self, fit_sets: List[str]) -> dict:
|
def _collect_fit_parameter(self, fit_sets: List[str | FitResult]) -> dict:
|
||||||
fit_dict = {}
|
fit_dict = {}
|
||||||
|
|
||||||
for set_id in fit_sets:
|
for set_id in fit_sets:
|
||||||
|
if isinstance(set_id, str):
|
||||||
data = self.data[set_id]
|
data = self.data[set_id]
|
||||||
if data.mode != 'fit':
|
if data.mode != 'fit':
|
||||||
continue
|
continue
|
||||||
|
elif isinstance(set_id, FitResult):
|
||||||
|
data = set_id
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
|
||||||
for key, pvalue in data.parameter.items():
|
for key, pvalue in data.parameter.items():
|
||||||
name = pvalue.full_name
|
name = pvalue.full_name
|
||||||
@ -811,7 +841,6 @@ class UpperManagement(QtCore.QObject):
|
|||||||
err_msg.exec()
|
err_msg.exec()
|
||||||
|
|
||||||
self.sender().success = not failures
|
self.sender().success = not failures
|
||||||
|
|
||||||
self.sender().add_data(self.active_sets)
|
self.sender().add_data(self.active_sets)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(list, dict)
|
@QtCore.pyqtSlot(list, dict)
|
||||||
|
@ -147,7 +147,7 @@ class BaseColor(enum.Enum):
|
|||||||
return cls((r, g, b))
|
return cls((r, g, b))
|
||||||
|
|
||||||
|
|
||||||
class TuColorsA(BaseColor):
|
class TUColorsA(BaseColor):
|
||||||
TuDa1a = (93, 133, 195)
|
TuDa1a = (93, 133, 195)
|
||||||
TuDa2a = (0, 156, 218)
|
TuDa2a = (0, 156, 218)
|
||||||
TuDa3a = (80, 182, 149)
|
TuDa3a = (80, 182, 149)
|
||||||
@ -161,7 +161,7 @@ class TuColorsA(BaseColor):
|
|||||||
TuDa11a = (128, 69, 151)
|
TuDa11a = (128, 69, 151)
|
||||||
|
|
||||||
|
|
||||||
class TuColorsB(BaseColor):
|
class TUColorsB(BaseColor):
|
||||||
TuDa1b = (0, 90, 169)
|
TuDa1b = (0, 90, 169)
|
||||||
TuDa2b = (0, 131, 204)
|
TuDa2b = (0, 131, 204)
|
||||||
TuDa3b = (0, 157, 129)
|
TuDa3b = (0, 157, 129)
|
||||||
@ -175,7 +175,7 @@ class TuColorsB(BaseColor):
|
|||||||
TuDa11b = (114, 16, 133)
|
TuDa11b = (114, 16, 133)
|
||||||
|
|
||||||
|
|
||||||
class TuColorsC(BaseColor):
|
class TUColorsC(BaseColor):
|
||||||
TuDa1c = (0, 78, 138)
|
TuDa1c = (0, 78, 138)
|
||||||
TuDa2c = (0, 104, 157)
|
TuDa2c = (0, 104, 157)
|
||||||
TuDa3c = (0, 136, 119)
|
TuDa3c = (0, 136, 119)
|
||||||
@ -243,28 +243,26 @@ class Tab20(BaseColor):
|
|||||||
TabBlue = (31, 119, 180)
|
TabBlue = (31, 119, 180)
|
||||||
TabBlue2 = (174, 199, 232)
|
TabBlue2 = (174, 199, 232)
|
||||||
TabOrange = (255, 127, 14)
|
TabOrange = (255, 127, 14)
|
||||||
TabOrange2 = (255, 127, 14)
|
TabOrange2 = (255, 187, 120)
|
||||||
TabGreen = (44, 160, 44)
|
TabGreen = (44, 160, 44)
|
||||||
TabGreen2 = (44, 160, 44)
|
TabGreen2 = (152, 223, 138)
|
||||||
TabRed = (214, 39, 40)
|
TabRed = (214, 39, 40)
|
||||||
TabRed2 = (214, 39, 40)
|
TabRed2 = (255, 152, 150)
|
||||||
TabPurple = (148, 103, 189)
|
TabPurple = (148, 103, 189)
|
||||||
TabPurple2 = (148, 103, 189)
|
TabPurple2 = (197, 176, 213)
|
||||||
TabBrown = (140, 86, 75)
|
TabBrown = (140, 86, 75)
|
||||||
TabBrown2 = (140, 86, 75)
|
TabBrown2 = (196, 156, 148)
|
||||||
TabRose = (227, 119, 194)
|
TabRose = (227, 119, 194)
|
||||||
TabRose2 = (227, 119, 194)
|
TabRose2 = (247, 182, 210)
|
||||||
TabGrey = (220, 220, 220)
|
TabGrey = (220, 220, 220)
|
||||||
TabGrey2 = (220, 220, 220)
|
TabGrey2 = (199, 199, 199)
|
||||||
TabChartreuse = (188, 189, 34)
|
TabChartreuse = (188, 189, 34)
|
||||||
TabChartreuse2 = (188, 189, 34)
|
TabChartreuse2 = (219, 219, 141)
|
||||||
TabTurquoise = (23, 190, 207)
|
TabTurquoise = (23, 190, 207)
|
||||||
TabTurquoise2 = (23, 190, 207)
|
TabTurquoise2 = (158, 218, 229)
|
||||||
|
|
||||||
|
|
||||||
class GraceColors(BaseColor):
|
class GraceColors(BaseColor):
|
||||||
White = (255, 255, 255)
|
|
||||||
Black = (0, 0, 0)
|
|
||||||
Red = (255, 0, 0)
|
Red = (255, 0, 0)
|
||||||
Green = (0, 255, 0)
|
Green = (0, 255, 0)
|
||||||
Blue = (0, 0, 255)
|
Blue = (0, 0, 255)
|
||||||
@ -281,25 +279,30 @@ class GraceColors(BaseColor):
|
|||||||
Green4 = (0, 139, 0)
|
Green4 = (0, 139, 0)
|
||||||
|
|
||||||
|
|
||||||
|
class BlackWhite(BaseColor):
|
||||||
|
White = (255, 255, 255)
|
||||||
|
Black = (0, 0, 0)
|
||||||
|
|
||||||
|
|
||||||
TUColors = enum.Enum(
|
TUColors = enum.Enum(
|
||||||
value='TUColors',
|
value='TUColors',
|
||||||
names={member.name: member.value for palette in [TuColorsA, TuColorsB, TuColorsC, TUColorsD, TUGrays] for member in palette},
|
names={member.name: member.value for palette in [TUColorsA, TUColorsB, TUColorsC, TUColorsD] for member in palette},
|
||||||
type=BaseColor
|
type=BaseColor,
|
||||||
)
|
)
|
||||||
|
|
||||||
Colors = enum.Enum(
|
Colors = enum.Enum(
|
||||||
value='Colors',
|
value='Colors',
|
||||||
names={member.name: member.value for palette in [TUColors, GraceColors, Tab10] for member in palette},
|
names={member.name: member.value for palette in [TUColors, TUGrays, GraceColors, Tab10, BlackWhite] for member in palette},
|
||||||
type=BaseColor
|
type=BaseColor,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_palettes():
|
def get_palettes():
|
||||||
palettes = {
|
palettes = {
|
||||||
'Full': Colors,
|
'Full': Colors,
|
||||||
'TuDa:a': TuColorsA,
|
'TuDa:a': TUColorsA,
|
||||||
'TuDa:b': TuColorsB,
|
'TuDa:b': TUColorsB,
|
||||||
'TuDa:c': TuColorsC,
|
'TuDa:c': TUColorsC,
|
||||||
'TuDa:d': TUColorsD,
|
'TuDa:d': TUColorsD,
|
||||||
'Tab10': Tab10,
|
'Tab10': Tab10,
|
||||||
'Grace': GraceColors
|
'Grace': GraceColors
|
||||||
|
@ -31,12 +31,12 @@ big_greek = [
|
|||||||
'Nu Xi Omicron Pi Rho Sigma Tau Ypsilon Phi Chi Psi Omega',
|
'Nu Xi Omicron Pi Rho Sigma Tau Ypsilon Phi Chi Psi Omega',
|
||||||
]
|
]
|
||||||
special_chars = [
|
special_chars = [
|
||||||
r'\infty \int \sum \langle \rangle \pm \perp \para \leftarrow \rightarrow \leftrightarrow \cdot \hbar',
|
r'\infty \int \sum \langle \rangle \pm \perp \para \leftarrow \rightarrow \leftrightarrow \cdot \hbar \n',
|
||||||
'\u221e \u222b \u2211 \u27e8 \u27e9 \u00b1 \u27c2 \u2225 \u21d0 \u21d2 \u21d4 \u00b7 \u0127',
|
'\u221e \u222b \u2211 \u27e8 \u27e9 \u00b1 \u27c2 \u2225 \u21d0 \u21d2 \u21d4 \u00b7 \u0127 <br>',
|
||||||
r'\f{Symbol}¥\f{} \f{Symbol}ò\f{} \f{Symbol}å\f{} \f{Symbol}á\f{} \f{Symbol}ñ\f{} \f{Symbol}±\f{} '
|
r'\f{Symbol}¥\f{} \f{Symbol}ò\f{} \f{Symbol}å\f{} \f{Symbol}á\f{} \f{Symbol}ñ\f{} \f{Symbol}±\f{} \n'
|
||||||
r'\f{Symbol}^\f{} \f{Symbol}||\f{} \f{Symbol}¬\f{} \f{Symbol}®\f{} \f{Symbol}«\f{} \f{Symbol}×\f{Symbol} '
|
r'\f{Symbol}^\f{} \f{Symbol}||\f{} \f{Symbol}¬\f{} \f{Symbol}®\f{} \f{Symbol}«\f{} \f{Symbol}×\f{Symbol} '
|
||||||
r'h\h{-0.6}\v{0.3}-\v{-0.3}\h{0.3}',
|
r'h\h{-0.6}\v{0.3}-\v{-0.3}\h{0.3}',
|
||||||
r'infty int sum < > \+- perp para <- -> <-> \* hbar',
|
r'infty int sum < > \+- perp para <- -> <-> \* hbar \s',
|
||||||
]
|
]
|
||||||
funcs = [
|
funcs = [
|
||||||
r'\exp \log \ln \sin \cos \tan',
|
r'\exp \log \ln \sin \cos \tan',
|
||||||
|
@ -39,7 +39,147 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1" rowspan="4">
|
<item row="6" 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="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QAbstractScrollArea::AdjustIgnored</enum>
|
||||||
|
</property>
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::SingleSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectColumns</enum>
|
||||||
|
</property>
|
||||||
|
<property name="showGrid">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="columnCount">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderStretchLastSection">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Output</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QCheckBox" name="graph_checkBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>New graph</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QComboBox" name="graph_comboBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="curve_checkbox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Plot fit curve</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="partial_checkBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Plot partial functions</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QCheckBox" name="parameter_checkbox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Plot parameter</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="reject_fit_checkBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Reject this fit</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="del_prev_checkBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Delete previous fits</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<widget class="Line" name="line">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" rowspan="3">
|
||||||
<widget class="QToolBox" name="stack">
|
<widget class="QToolBox" name="stack">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||||
@ -59,7 +199,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>399</width>
|
<width>399</width>
|
||||||
<height>414</height>
|
<height>346</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
@ -102,7 +242,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>399</width>
|
<width>399</width>
|
||||||
<height>414</height>
|
<height>346</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
@ -152,7 +292,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>399</width>
|
<width>399</width>
|
||||||
<height>414</height>
|
<height>346</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
@ -217,129 +357,6 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0" colspan="2">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="partial_checkBox">
|
|
||||||
<property name="text">
|
|
||||||
<string>Plot partial functions</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<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>
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Location of parameters:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="graph_checkBox">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>New graph</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QComboBox" name="graph_comboBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="Line" name="line_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="reject_fit_checkBox">
|
|
||||||
<property name="text">
|
|
||||||
<string>Reject this fit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="del_prev_checkBox">
|
|
||||||
<property name="text">
|
|
||||||
<string>Delete previous fits</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="6" 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="horizontalScrollBarPolicy">
|
|
||||||
<enum>Qt::ScrollBarAsNeeded</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeAdjustPolicy">
|
|
||||||
<enum>QAbstractScrollArea::AdjustIgnored</enum>
|
|
||||||
</property>
|
|
||||||
<property name="editTriggers">
|
|
||||||
<set>QAbstractItemView::NoEditTriggers</set>
|
|
||||||
</property>
|
|
||||||
<property name="alternatingRowColors">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="selectionMode">
|
|
||||||
<enum>QAbstractItemView::SingleSelection</enum>
|
|
||||||
</property>
|
|
||||||
<property name="selectionBehavior">
|
|
||||||
<enum>QAbstractItemView::SelectColumns</enum>
|
|
||||||
</property>
|
|
||||||
<property name="showGrid">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="columnCount">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<attribute name="horizontalHeaderStretchLastSection">
|
|
||||||
<bool>false</bool>
|
|
||||||
</attribute>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
@ -1 +0,0 @@
|
|||||||
/autohome/dominik/nmreval/resources/icons/logo.png
|
|
@ -1 +0,0 @@
|
|||||||
/autohome/dominik/nmreval/resources/icons/logo.png
|
|
Loading…
Reference in New Issue
Block a user