changed interpolation of empty dsc; closes #231
This commit is contained in:
		@@ -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]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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]])
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user