231-dsc-empty-baseline #236

Merged
dominik merged 3 commits from 231-dsc-empty-baseline into master 2024-02-06 17:23:00 +00:00
3 changed files with 41 additions and 26 deletions

View File

@ -136,8 +136,8 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
max_x = max(max_x, data.x.max()) max_x = max(max_x, data.x.max())
item = QtWidgets.QListWidgetItem(name) item = QtWidgets.QListWidgetItem(name)
item.setCheckState(QtCore.Qt.Checked) item.setCheckState(QtCore.Qt.CheckState.Checked)
item.setData(QtCore.Qt.UserRole, key) item.setData(QtCore.Qt.ItemDataRole.UserRole, key)
item.setForeground(mkBrush(c.rgb())) item.setForeground(mkBrush(c.rgb()))
self.listWidget.addItem(item) self.listWidget.addItem(item)
@ -191,10 +191,10 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
for idx in range(self.listWidget.count()): for idx in range(self.listWidget.count()):
item = self.listWidget.item(idx) item = self.listWidget.item(idx)
if item.checkState() == QtCore.Qt.Unchecked: if item.checkState() == QtCore.Qt.CheckState.Unchecked:
continue continue
key = item.data(QtCore.Qt.UserRole) key = item.data(QtCore.Qt.ItemDataRole.UserRole)
plot = self._plots[key] plot = self._plots[key]
data, _ = self._dsc[key] data, _ = self._dsc[key]
@ -214,7 +214,7 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
item = self.listWidget.item(idx) item = self.listWidget.item(idx)
tree_item = QtWidgets.QTreeWidgetItem([item.text()]) tree_item = QtWidgets.QTreeWidgetItem([item.text()])
values = self._tg_value.get(item.data(QtCore.Qt.UserRole)) values = self._tg_value.get(item.data(QtCore.Qt.ItemDataRole.UserRole))
if values is not None: if values is not None:
for name, pos in values.items(): for name, pos in values.items():
@ -223,7 +223,7 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
self.tg_tree.addTopLevelItem(tree_item) self.tg_tree.addTopLevelItem(tree_item)
key = item.data(QtCore.Qt.UserRole) key = item.data(QtCore.Qt.ItemDataRole.UserRole)
plot = self._plots[key] plot = self._plots[key]
data, _ = self._dsc[key] data, _ = self._dsc[key]
@ -251,7 +251,7 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
@QtCore.pyqtSlot(QtWidgets.QListWidgetItem) @QtCore.pyqtSlot(QtWidgets.QListWidgetItem)
def change_visibility(self, item: QtWidgets.QListWidgetItem): def change_visibility(self, item: QtWidgets.QListWidgetItem):
is_checked = bool(item.checkState()) is_checked = bool(item.checkState())
plot = self._plots[item.data(QtCore.Qt.UserRole)] plot = self._plots[item.data(QtCore.Qt.ItemDataRole.UserRole)]
for val in plot: for val in plot:
val.setVisible(is_checked) val.setVisible(is_checked)
@ -275,10 +275,10 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
self.tnmh_tree.clear() self.tnmh_tree.clear()
for idx in range(self.listWidget.count()): for idx in range(self.listWidget.count()):
item = self.listWidget.item(idx) item = self.listWidget.item(idx)
if item.checkState() == QtCore.Qt.Unchecked: if item.checkState() == QtCore.Qt.CheckState.Unchecked:
continue continue
key = item.data(QtCore.Qt.UserRole) key = item.data(QtCore.Qt.ItemDataRole.UserRole)
data = self.get_fictive(key, baselines) data = self.get_fictive(key, baselines)
@ -292,7 +292,7 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
item = self.listWidget.item(idx) item = self.listWidget.item(idx)
tree_item = QtWidgets.QTreeWidgetItem([item.text()]) tree_item = QtWidgets.QTreeWidgetItem([item.text()])
values = self._fit.get(item.data(QtCore.Qt.UserRole)) values = self._fit.get(item.data(QtCore.Qt.ItemDataRole.UserRole))
if values is not None: if values is not None:
child_item = QtWidgets.QTreeWidgetItem([values.parameter_string()]) child_item = QtWidgets.QTreeWidgetItem([values.parameter_string()])
@ -305,10 +305,10 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
ret_dic = {} ret_dic = {}
for idx in range(self.listWidget.count()): for idx in range(self.listWidget.count()):
item = self.listWidget.item(idx) item = self.listWidget.item(idx)
if item.checkState() == QtCore.Qt.Unchecked: if item.checkState() == QtCore.Qt.CheckState.Unchecked:
continue continue
key = item.data(QtCore.Qt.UserRole) key = item.data(QtCore.Qt.ItemDataRole.UserRole)
cp = None cp = None
if self.fictive_export_check.isChecked(): if self.fictive_export_check.isChecked():
@ -332,10 +332,10 @@ class TgCalculator(QtWidgets.QWizard, Ui_DSCEvalDialog):
m = [] m = []
for idx in range(self.listWidget.count()): for idx in range(self.listWidget.count()):
item = self.listWidget.item(idx) item = self.listWidget.item(idx)
if item.checkState() == QtCore.Qt.Unchecked: if item.checkState() == QtCore.Qt.CheckState.Unchecked:
continue continue
key = item.data(QtCore.Qt.UserRole) key = item.data(QtCore.Qt.ItemDataRole.UserRole)
data, _ = self._dsc[key] data, _ = self._dsc[key]
try: try:
tg_value = self._tg_value[key][tg_type][0] tg_value = self._tg_value[key][tg_type][0]

View File

@ -264,11 +264,16 @@ class QDSCReader(QtWidgets.QDialog, Ui_Dialog):
except TypeError: except TypeError:
return return
if self.cp_checkBox.isChecked() and self.references:
y_label = 'cp'
else:
y_label = 'q'
rate, mode = self.current_run rate, mode = self.current_run
new_val = DSC(sample_data[0], sample_data[1], value=rate, name=f'{self.fname.stem} {rate} ({mode})') new_val = DSC(sample_data[0], sample_data[1], value=rate, name=f'{self.fname.stem} {rate}K-min ({mode}, {y_label})')
if filesave: if filesave:
new_val.savetxt(self.fname.with_name(f'{self.fname.stem} {rate}K-min {mode}.dat'.replace(' ', '_'))) new_val.savetxt(self.fname.with_name(f'{self.fname.stem}_{rate}K-min_{y_label}{mode}.dat'.replace(' ', '_')))
close_after = False close_after = False
else: else:
self.data_read.emit([new_val]) self.data_read.emit([new_val])

View File

@ -11,7 +11,8 @@ try:
from scipy.integrate import simpson from scipy.integrate import simpson
except ImportError: except ImportError:
from scipy.integrate import simps as simpson from scipy.integrate import simps as simpson
from scipy.interpolate import interp1d from scipy.interpolate import CubicSpline
ReferenceValue = namedtuple('Reference', ['name', 'transitions']) ReferenceValue = namedtuple('Reference', ['name', 'transitions'])
Cyclohexane = ReferenceValue('Cyclohexane', [(-87.06+273.15, 79.58), (6.54+273.15, None)]) Cyclohexane = ReferenceValue('Cyclohexane', [(-87.06+273.15, 79.58), (6.54+273.15, None)])
@ -38,7 +39,7 @@ class DSCSample:
def read_file(self, fname: str | Path) -> None: def read_file(self, fname: str | Path) -> None:
fname = Path(fname) fname = Path(fname)
# file contains weird deg C character in stupiod ISO encoding # file contains weird deg C character in stupid ISO encoding
with fname.open('r', encoding='iso-8859-15') as f: with fname.open('r', encoding='iso-8859-15') as f:
ii = 1 ii = 1
for line in f: for line in f:
@ -144,9 +145,12 @@ class DSCCalibrator:
self.reference = [] self.reference = []
self.ref_list = [] self.ref_list = []
def set_measurement(self, def set_measurement(
fname: str | Path | DSCSample, mode: str = 'sample', self: DSCCalibrator,
reference: ReferenceValue = Cyclohexane): fname: str | Path | DSCSample,
mode: str = 'sample',
reference: ReferenceValue = Cyclohexane
):
if mode not in ['sample', 'empty', 'reference']: if mode not in ['sample', 'empty', 'reference']:
raise ValueError(f'Unknown mode {mode}, not "sample", "empty", "reference"') raise ValueError(f'Unknown mode {mode}, not "sample", "empty", "reference"')
if mode == 'reference' and not isinstance(reference, ReferenceValue): if mode == 'reference' and not isinstance(reference, ReferenceValue):
@ -266,7 +270,12 @@ class DSCCalibrator:
return sol return sol
def get_data(self, idx: int, slope: str = 'iso', limits: tuple[float, float] = None): def get_data(
self: DSCCalibrator,
idx: int,
slope: str = 'iso',
limits: tuple[float, float] = None
) -> tuple[np.ndarray, np.ndarray, np.ndarray,np.ndarray | None, np.ndarray]:
if self.sample.steps[idx][0] == 'i': if self.sample.steps[idx][0] == 'i':
raise ValueError('baseline correction is not implemented for isotherms') raise ValueError('baseline correction is not implemented for isotherms')
@ -292,7 +301,7 @@ class DSCCalibrator:
empty_y = empty_data[1] empty_y = empty_data[1]
if self.sample.length(idx) != self.empty.length(idx_empty): if self.sample.length(idx) != self.empty.length(idx_empty):
with np.errstate(all='ignore'): with np.errstate(all='ignore'):
empty_y = interp1d(empty_data[2]-empty_data[2, 0], empty_data[1], fill_value='extrapolate')(sample_data[2, 0]) empty_y = CubicSpline(empty_data[2]-empty_data[2, 0], empty_data[1], extrapolate=True)(sample_data[2] - sample_data[2, 0])
sample_data[1] -= empty_y sample_data[1] -= empty_y
drift_value = sample_data.copy()[(2, 1), :] drift_value = sample_data.copy()[(2, 1), :]
@ -346,9 +355,10 @@ class DSCCalibrator:
offset = region[0, 0] offset = region[0, 0]
sample_data[1] -= m * (sample_data[2] - region[1, 0]) + offset sample_data[1] -= m * (sample_data[2] - region[1, 0]) + offset
line = np.array([[sample_data[2, 0], sample_data[2, -1]], line = np.array([
[m * (sample_data[2, 0] - region[1, 0]) + offset, [sample_data[2, 0], sample_data[2, -1]],
m * (sample_data[2, -1] - region[1, 0]) + offset]]) [m * (sample_data[2, 0] - region[1, 0]) + offset, m * (sample_data[2, -1] - region[1, 0]) + offset]
])
else: else:
line = np.array([[sample_data[2, 0], sample_data[2, -1]], [0, 0]]) line = np.array([[sample_data[2, 0], sample_data[2, -1]], [0, 0]])