From f71289bb4cef25fc2987eaf83828cb340bf9ce34 Mon Sep 17 00:00:00 2001
From: marques <20172333133@m.scnu.edu.cn>
Date: Thu, 15 May 2025 15:08:14 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AA=97=E5=8F=A3?=
=?UTF-8?q?=E5=A4=A7=E5=B0=8F=E8=AE=BE=E7=BD=AE=EF=BC=8C=E6=94=B9=E4=B8=BA?=
=?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=B1=8F=E5=B9=95=E5=88=86=E8=BE=A8=E7=8E=87?=
=?UTF-8?q?=E5=8A=A8=E6=80=81=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
func/Module_mainwindow.py | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/func/Module_mainwindow.py b/func/Module_mainwindow.py
index f6ba025..f817539 100644
--- a/func/Module_mainwindow.py
+++ b/func/Module_mainwindow.py
@@ -1,6 +1,7 @@
from pathlib import Path
from PySide6.QtWidgets import QMainWindow, QMessageBox, QFileDialog
+from PySide6.QtGui import QGuiApplication
from matplotlib import use
from yaml import dump, load, FullLoader
@@ -34,7 +35,15 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
self.ui = Ui_Signal_Label()
self.ui.setupUi(self)
- self.setFixedSize(720, 1080) # 设置固定大小,禁止缩放
+ # self.setFixedSize(720, 1080) # 设置固定大小,禁止缩放
+ # 获得屏幕分辨率,以3:4比例设置窗口大小,
+ screen = QGuiApplication.primaryScreen()
+ size = screen.availableGeometry()
+ screen_height = size.height()
+
+ window_height = int(screen_height * 0.75)
+ window_width = int(window_height * 1 / 2)
+ self.resize(window_width, window_height)
# 消息弹窗初始化
self.msgBox = QMessageBox()
From 0be88d9be724b72bab43df2ce9bbebad28393935 Mon Sep 17 00:00:00 2001
From: marques <20172333133@m.scnu.edu.cn>
Date: Thu, 15 May 2025 15:16:33 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E5=B0=86=E7=AA=97=E5=8F=A3=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E6=96=B9=E5=BC=8F=E4=BF=AE=E6=94=B9=E4=B8=BA=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=E6=9C=80=E5=A4=A7=E5=8C=96=EF=BC=8C=E6=8F=90=E5=8D=87?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
func/Module_mainwindow.py | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/func/Module_mainwindow.py b/func/Module_mainwindow.py
index f817539..18ef495 100644
--- a/func/Module_mainwindow.py
+++ b/func/Module_mainwindow.py
@@ -114,6 +114,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.approximately_align.show(root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.approximately_align.showMaximized()
def __slot_btn_preprocess__(self):
self.preprocess = MainWindow_preprocess()
@@ -132,6 +134,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.preprocess.show(mode, root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.preprocess.showMaximized()
def __slot_btn_detect_Jpeak__(self):
self.detect_Jpeak = MainWindow_detect_Jpeak()
@@ -142,6 +146,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.detect_Jpeak.show(root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.detect_Jpeak.showMaximized()
def __slot_btn_detect_Rpeak__(self):
self.detect_Rpeak = MainWindow_detect_Rpeak()
@@ -152,6 +158,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.detect_Rpeak.show(root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.detect_Rpeak.showMaximized()
def __slot_btn_label_check__(self):
self.label_check = MainWindow_label_check()
@@ -172,6 +180,9 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
else:
raise ValueError("模式不存在")
self.label_check.show(mode, root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.label_check.showMaximized()
+
def __slot_btn_precisely_align__(self):
self.precisely_align = MainWindow_precisely_align()
@@ -182,6 +193,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.precisely_align.show(root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.precisely_align.showMaximized()
def __slot_btn_cut_PSG__(self):
self.cut_PSG = MainWindow_cut_PSG()
@@ -192,6 +205,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.cut_PSG.show(root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.cut_PSG.showMaximized()
def __slot_btn_artifact_label__(self):
self.artifact_label = MainWindow_artifact_label()
@@ -202,6 +217,8 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
if not self.check_sampID():
return
self.artifact_label.show(root_path, int(sampID))
+ # 默认最大化显示而非固定分辨率
+ self.artifact_label.showMaximized()
def seek_sampID(self, path):
if not Path(path).exists():
@@ -211,6 +228,7 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
sub_folders = [item.name for item in Path(path).iterdir() if item.is_dir()]
self.ui.comboBox_sampID.addItems(sub_folders)
+
def check_root_path(self):
if self.ui.plainTextEdit_root_path.toPlainText() == Constants.STRING_IS_EMPTY:
PublicFunc.msgbox_output(self, Constants.MAINWINDOW_ROOT_PATH_NOT_EXIST, Constants.MSGBOX_TYPE_ERROR)
From adb90c258c8714708cd5f233ae6354b544675bc4 Mon Sep 17 00:00:00 2001
From: marques <20172333133@m.scnu.edu.cn>
Date: Mon, 19 May 2025 09:42:17 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B2=97=E5=AF=B9?=
=?UTF-8?q?=E9=BD=90=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96=E5=90=8E=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E6=98=BE=E7=A4=BA=E4=B8=BA=E7=A7=92=E6=95=B0=20?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A1=E7=AE=97=E5=AF=B9=E9=BD=90=E6=8C=89?=
=?UTF-8?q?=E9=92=AE=E4=BD=8D=E7=BD=AE=E5=88=B0=E5=AF=B9=E9=BD=90=E6=9D=BF?=
=?UTF-8?q?=E5=9D=97=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E7=9B=B8=E5=85=B3=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?=
=?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E7=B2=97=E5=AF=B9=E9=BD=90=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E8=AF=BB=E5=8F=96=E8=87=AA=E5=8A=A8=E8=AF=86=E5=88=AB?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E7=A7=B0=E4=B8=AD=E7=9A=84=E9=87=87?=
=?UTF-8?q?=E6=A0=B7=E7=8E=87=20=E6=B7=BB=E5=8A=A0=E7=B2=97=E5=AF=B9?=
=?UTF-8?q?=E9=BD=90=E9=80=89=E6=8B=A9=E5=AF=B9=E5=85=B6=E4=BD=8D=E7=BD=AE?=
=?UTF-8?q?=E5=90=8E=E9=80=90epoch=E6=8B=9F=E5=90=88=E8=A7=86=E5=9B=BE?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
func/Module_approximately_align.py | 435 ++++++++++++------
func/utils/ConfigParams.py | 7 +-
func/utils/Constants.py | 3 +
func/utils/PublicFunc.py | 14 +-
.../MainWindow_approximately_align.py | 104 +++--
.../MainWindow_approximately_align.ui | 210 ++++++---
.../approximately_align_input_setting.py | 11 +-
.../approximately_align_input_setting.ui | 15 +-
8 files changed, 557 insertions(+), 242 deletions(-)
diff --git a/func/Module_approximately_align.py b/func/Module_approximately_align.py
index fe9ca25..d925cc4 100644
--- a/func/Module_approximately_align.py
+++ b/func/Module_approximately_align.py
@@ -20,7 +20,6 @@ from func.utils.Result import Result
from ui.MainWindow.MainWindow_approximately_align import Ui_MainWindow_approximately_align
from ui.setting.approximately_align_input_setting import Ui_MainWindow_approximately_align_input_setting
-
Config = {
}
@@ -32,6 +31,7 @@ ButtonState = {
"pushButton_Standardize": False,
"pushButton_CutOff": False,
"pushButton_GetPos": False,
+ "pushButton_ChangeView": False,
"pushButton_JUMP": False,
"pushButton_EM1": False,
"pushButton_EM10": False,
@@ -39,7 +39,12 @@ ButtonState = {
"pushButton_EP1": False,
"pushButton_EP10": False,
"pushButton_EP100": False,
- "pushButton_save": False
+ "pushButton_save": False,
+ "radioButton_PTHO": False,
+ "radioButton_PABD": False,
+ "radioButton_NTHO": False,
+ "radioButton_NABD": False,
+ "radioButton_custom": False
},
"Current": {
"pushButton_input_setting": True,
@@ -47,6 +52,7 @@ ButtonState = {
"pushButton_Standardize": False,
"pushButton_CutOff": False,
"pushButton_GetPos": False,
+ "pushButton_ChangeView": False,
"pushButton_JUMP": False,
"pushButton_EM1": False,
"pushButton_EM10": False,
@@ -54,7 +60,12 @@ ButtonState = {
"pushButton_EP1": False,
"pushButton_EP10": False,
"pushButton_EP100": False,
- "pushButton_save": False
+ "pushButton_save": False,
+ "radioButton_PTHO": False,
+ "radioButton_PABD": False,
+ "radioButton_NTHO": False,
+ "radioButton_NABD": False,
+ "radioButton_custom": False
}
}
@@ -93,23 +104,19 @@ class SettingWindow(QMainWindow):
Config.update(file_config)
self.config = file_config
+ # 更新配置
+
Config.update({
"Path": {
"Input_orgBcg": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
- Path(str(self.sampID)) / Path(ConfigParams.APPROXIMATELY_ALIGN_INPUT_ORGBCG_FILENAME +
- str(Config["InputConfig"]["orgBcgFreq"]) +
- ConfigParams.ENDSWITH_TXT))),
+ Path(str(self.sampID)))),
"Input_Tho": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
- Path(str(self.sampID)) / Path(ConfigParams.APPROXIMATELY_ALIGN_INPUT_THO_FILENAME +
- str(Config["InputConfig"]["ThoFreq"]) +
- ConfigParams.ENDSWITH_TXT))),
+ Path(str(self.sampID)))),
"Input_Abd": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
- Path(str(self.sampID)) / Path(ConfigParams.APPROXIMATELY_ALIGN_INPUT_ABD_FILENAME +
- str(Config["InputConfig"]["AbdFreq"]) +
- ConfigParams.ENDSWITH_TXT))),
+ Path(str(self.sampID)))),
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
- Path(str(self.sampID)) / Path(ConfigParams.APPROXIMATELY_ALIGN_SAVE_FILENAME +
- ConfigParams.ENDSWITH_CSV)))
+ Path(str(self.sampID)) / Path(ConfigParams.APPROXIMATELY_ALIGN_SAVE_FILENAME +
+ ConfigParams.ENDSWITH_CSV)))
},
"orgBcgConfig": {},
"PSGConfig": {}
@@ -207,7 +214,7 @@ class MainWindow_approximately_align(QMainWindow):
self.progressbar = None
PublicFunc.add_progressbar(self)
- #初始化画框
+ # 初始化画框
self.fig = None
self.canvas = None
@@ -231,7 +238,7 @@ class MainWindow_approximately_align(QMainWindow):
PublicFunc.__resetAllButton__(self, ButtonState)
- self.ui.groupBox_align_position.setEnabled(False)
+ # self.ui.groupBox_align_position.setEnabled(False)
self.ui.pushButton_input.clicked.connect(self.__slot_btn_input__)
self.ui.pushButton_input_setting.clicked.connect(self.setting.show)
@@ -295,7 +302,6 @@ class MainWindow_approximately_align(QMainWindow):
self.ui.radioButton_PTHO.setText("备选1")
self.ui.radioButton_NABD.setText("备选4")
self.ui.radioButton_NTHO.setText("备选2")
- self.ui.groupBox_align_position.setEnabled(False)
self.ui.spinBox_SelectEpoch.setMinimum(0)
def __plot__(self, *args, **kwargs):
@@ -357,14 +363,14 @@ class MainWindow_approximately_align(QMainWindow):
else:
PublicFunc.text_output(self.ui, "(1/1)" + result.info, Constants.TIPS_TYPE_INFO)
- orgBcg_minutes = round(self.data.raw_orgBcg.shape[0] / Config["InputConfig"]["orgBcgFreq"] / 60)
- PSG_minutes = round(self.data.raw_Tho.shape[0] / Config["InputConfig"]["ThoFreq"] / 60)
+ orgBcg_seconds = round(self.data.raw_orgBcg.shape[0] / Config["InputConfig"]["orgBcgFreq"])
+ PSG_seconds = round(self.data.raw_Tho.shape[0] / Config["InputConfig"]["ThoFreq"])
Config.update({
- "orgBcg_minutes": orgBcg_minutes,
- "PSG_minutes": PSG_minutes
+ "orgBcg_seconds": orgBcg_seconds,
+ "PSG_seconds": PSG_seconds
})
- self.ui.label_orgBcg_length.setText(str(orgBcg_minutes))
- self.ui.label_PSG_length.setText(str(PSG_minutes))
+ self.ui.label_orgBcg_length.setText(str(orgBcg_seconds))
+ self.ui.label_PSG_length.setText(str(PSG_seconds))
self.__reset__()
PublicFunc.finish_operation(self, ButtonState)
@@ -474,14 +480,15 @@ class MainWindow_approximately_align(QMainWindow):
PublicFunc.__disableAllButton__(self, ButtonState)
Config["orgBcgConfig"].update({"PreA": self.ui.spinBox_orgBcgPreA.value(),
- "PreCut": self.ui.spinBox_orgBcgPreCut.value(),
- "PostCut": self.ui.spinBox_orgBcgPostCut.value()})
+ "PreCut": self.ui.spinBox_orgBcgPreCut.value(),
+ "PostCut": self.ui.spinBox_orgBcgPostCut.value()})
Config["PSGConfig"].update({"PreA": self.ui.spinBox_PSGPreA.value(),
- "PreCut": self.ui.spinBox_PSGPreCut.value(),
- "PostCut": self.ui.spinBox_PSGPostCut.value()})
+ "PreCut": self.ui.spinBox_PSGPreCut.value(),
+ "PostCut": self.ui.spinBox_PSGPostCut.value()})
PublicFunc.progressbar_update(self, 1, 1, Constants.DRAWING_DATA, 0)
result = self.__plot__()
+
if not result.status:
PublicFunc.text_output(self.ui, "(1/1)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
@@ -489,8 +496,8 @@ class MainWindow_approximately_align(QMainWindow):
return
else:
PublicFunc.text_output(self.ui, "(1/1)" + result.info, Constants.TIPS_TYPE_INFO)
+ ButtonState["Current"]["pushButton_GetPos"] = True
- ButtonState["Current"]["pushButton_GetPos"] = True
PublicFunc.finish_operation(self, ButtonState)
def __slot_btn_GetPosition__(self):
@@ -520,7 +527,8 @@ class MainWindow_approximately_align(QMainWindow):
# 绘图
PublicFunc.progressbar_update(self, 3, 4, Constants.DRAWING_DATA, 50)
- result = self.__plot__(result1.data["tho_relate"], result1.data["tho_relate2"], result2.data["abd_relate"], result2.data["abd_relate2"])
+ result = self.__plot__(result1.data["tho_relate"], result1.data["tho_relate2"], result2.data["abd_relate"],
+ result2.data["abd_relate2"])
if not result.status:
PublicFunc.text_output(self.ui, "(3/4)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
@@ -531,7 +539,8 @@ class MainWindow_approximately_align(QMainWindow):
# 计算最大值位置
PublicFunc.progressbar_update(self, 4, 4, Constants.APPROXIMATELY_MAXVALUE_POS_CALCULATING, 90)
- result = self.data.calculate_maxvalue_pos(result1.data["tho_relate"], result1.data["tho_relate2"], result2.data["abd_relate"], result2.data["abd_relate2"])
+ result = self.data.calculate_maxvalue_pos(result1.data["tho_relate"], result1.data["tho_relate2"],
+ result2.data["abd_relate"], result2.data["abd_relate2"])
if not result.status:
PublicFunc.text_output(self.ui, "(4/4)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
@@ -544,7 +553,12 @@ class MainWindow_approximately_align(QMainWindow):
self.ui.radioButton_PTHO.setText(str(result.data["tho_max"] + result.data["bias"]))
self.ui.radioButton_NABD.setText(str(result.data["abd_max2"] + result.data["bias"]))
self.ui.radioButton_NTHO.setText(str(result.data["tho_max2"] + result.data["bias"]))
- self.ui.groupBox_align_position.setEnabled(True)
+ ButtonState["Current"]["radioButton_PTHO"] = True
+ ButtonState["Current"]["radioButton_PABD"] = True
+ ButtonState["Current"]["radioButton_NTHO"] = True
+ ButtonState["Current"]["radioButton_NABD"] = True
+ ButtonState["Current"]["radioButton_custom"] = True
+ # self.ui.groupBox_align_position.setEnabled(True)
PublicFunc.finish_operation(self, ButtonState)
def __slot_btn_jump__(self):
@@ -638,7 +652,8 @@ class MainWindow_approximately_align(QMainWindow):
self.ui.spinBox_SelectEpoch.setMinimum(result3.data["epoch_min"])
self.ui.spinBox_SelectEpoch.setMaximum(result3.data["epoch_max"])
self.ui.spinBox_SelectEpoch.setValue(result3.data["epoch_min"])
- self.ui.spinBox_SelectEpoch.setToolTip("最小值:{}\n最大值:{}".format(result3.data["epoch_min"], result3.data["epoch_max"]))
+ self.ui.spinBox_SelectEpoch.setToolTip(
+ "最小值:{}\n最大值:{}".format(result3.data["epoch_min"], result3.data["epoch_max"]))
self.ui.spinBox_SelectEpoch.setEnabled(True)
ButtonState["Current"]["pushButton_JUMP"] = True
ButtonState["Current"]["pushButton_EM1"] = True
@@ -648,23 +663,25 @@ class MainWindow_approximately_align(QMainWindow):
ButtonState["Current"]["pushButton_EP10"] = True
ButtonState["Current"]["pushButton_EP100"] = True
ButtonState["Current"]["pushButton_save"] = True
+ ButtonState["Current"]["pushButton_ChangeView"] = True
PublicFunc.finish_operation(self, ButtonState)
def DrawPicRawOverview(self):
try:
- max_x = max(self.data.processed_Tho.shape[0], self.data.processed_Abd.shape[0], self.data.processed_orgBcg.shape[0])
+ max_x = max(self.data.processed_downsample_Tho.shape[0], self.data.processed_downsample_Abd.shape[0],
+ self.data.processed_downsample_orgBcg.shape[0])
ax1 = self.fig.add_subplot(311)
- ax1.plot(self.data.processed_Tho, color='blue')
+ ax1.plot(self.data.processed_downsample_Tho, color='blue')
ax1.set_xlim(0, max_x)
ax1.set_title("THO")
ax2 = self.fig.add_subplot(312, sharex=ax1, sharey=ax1)
- ax2.plot(self.data.processed_orgBcg, color='blue')
+ ax2.plot(self.data.processed_downsample_orgBcg, color='blue')
ax2.set_xlim(0, max_x)
ax2.set_title("orgBcg")
ax3 = self.fig.add_subplot(313, sharex=ax1, sharey=ax1)
- ax3.plot(self.data.processed_Abd, color='blue')
+ ax3.plot(self.data.processed_downsample_Abd, color='blue')
ax3.set_xlim(0, max_x)
ax3.set_title("ABD")
@@ -676,19 +693,20 @@ class MainWindow_approximately_align(QMainWindow):
def DrawPicOverviewWithCutOff(self):
try:
- max_x = max(self.data.processed_Tho.shape[0] + Config["PSGConfig"]["PreA"],
- self.data.processed_orgBcg.shape[0] + Config["orgBcgConfig"]["PreA"])
+ max_x = max(self.data.processed_downsample_Tho.shape[0] + Config["PSGConfig"]["PreA"],
+ self.data.processed_downsample_orgBcg.shape[0] + Config["orgBcgConfig"]["PreA"])
min_x = min(Config["PSGConfig"]["PreA"], Config["orgBcgConfig"]["PreA"], 0)
ax1 = self.fig.add_subplot(311)
ax1.plot(
linspace(Config["PSGConfig"]["PreA"],
- len(self.data.processed_Tho) + Config["PSGConfig"]["PreA"],
- len(self.data.processed_Tho)), self.data.processed_Tho, color='blue')
+ len(self.data.processed_downsample_Tho) + Config["PSGConfig"]["PreA"],
+ len(self.data.processed_downsample_Tho)), self.data.processed_downsample_Tho, color='blue')
# 绘制x = PreCut的线 和 x = PostCut的虚线
ax1.axvline(x=Config["PSGConfig"]["PreCut"] + Config["PSGConfig"]["PreA"], color='red',
linestyle='--')
ax1.axvline(
- x=len(self.data.processed_Tho) - Config["PSGConfig"]["PostCut"] + Config["PSGConfig"]["PreA"],
+ x=len(self.data.processed_downsample_Tho) - Config["PSGConfig"]["PostCut"] + Config["PSGConfig"][
+ "PreA"],
color='red', linestyle='--')
ax1.set_xlim(min_x, max_x)
@@ -696,24 +714,29 @@ class MainWindow_approximately_align(QMainWindow):
ax2 = self.fig.add_subplot(312, sharex=ax1, sharey=ax1)
ax2.plot(
- linspace(Config["orgBcgConfig"]["PreA"], len(self.data.processed_orgBcg) + Config["orgBcgConfig"]["PreA"],
- len(self.data.processed_orgBcg)), self.data.processed_orgBcg, color='blue')
+ linspace(Config["orgBcgConfig"]["PreA"],
+ len(self.data.processed_downsample_orgBcg) + Config["orgBcgConfig"]["PreA"],
+ len(self.data.processed_downsample_orgBcg)), self.data.processed_downsample_orgBcg,
+ color='blue')
ax2.axvline(x=Config["orgBcgConfig"]["PreCut"] + Config["orgBcgConfig"]["PreA"], color='red',
linestyle='--')
- ax2.axvline(x=len(self.data.processed_orgBcg) - Config["orgBcgConfig"]["PostCut"] + Config["orgBcgConfig"]["PreA"],
- color='red', linestyle='--')
+ ax2.axvline(
+ x=len(self.data.processed_downsample_orgBcg) - Config["orgBcgConfig"]["PostCut"] +
+ Config["orgBcgConfig"]["PreA"],
+ color='red', linestyle='--')
ax2.set_xlim(min_x, max_x)
ax2.set_title("orgBcg")
ax3 = self.fig.add_subplot(313, sharex=ax1, sharey=ax1)
ax3.plot(
linspace(Config["PSGConfig"]["PreA"],
- len(self.data.processed_Abd) + Config["PSGConfig"]["PreA"],
- len(self.data.processed_Abd)), self.data.processed_Abd, color='blue')
+ len(self.data.processed_downsample_Abd) + Config["PSGConfig"]["PreA"],
+ len(self.data.processed_downsample_Abd)), self.data.processed_downsample_Abd, color='blue')
ax3.axvline(x=Config["PSGConfig"]["PreCut"] + Config["PSGConfig"]["PreA"], color='red',
linestyle='--')
ax3.axvline(
- x=len(self.data.processed_Tho) - Config["PSGConfig"]["PostCut"] + Config["PSGConfig"]["PreA"],
+ x=len(self.data.processed_downsample_Tho) - Config["PSGConfig"]["PostCut"] + Config["PSGConfig"][
+ "PreA"],
color='red', linestyle='--')
ax3.set_xlim(min_x, max_x)
ax3.set_title("ABD")
@@ -750,29 +773,30 @@ class MainWindow_approximately_align(QMainWindow):
def DrawPicTryAlign(self):
try:
- max_x = max(self.data.processed_Tho.shape[0],
- self.data.processed_orgBcg.shape[0] + Config["pos"])
+ max_x = max(self.data.processed_downsample_Tho.shape[0],
+ self.data.processed_downsample_orgBcg.shape[0] + Config["pos"])
min_x = min(Config["PSGConfig"]["PreA"], Config["orgBcgConfig"]["PreA"] + Config["pos"], 0)
ax1 = self.fig.add_subplot(311)
ax1.plot(
- linspace(0, len(self.data.processed_Tho),
- len(self.data.processed_Tho)), self.data.processed_Tho, color='blue')
+ linspace(0, len(self.data.processed_downsample_Tho),
+ len(self.data.processed_downsample_Tho)), self.data.processed_downsample_Tho, color='blue')
# 绘制x = PreCut的线 和 x = PostCut的虚线
ax1.set_xlim(min_x, max_x)
ax1.set_title("THO")
ax2 = self.fig.add_subplot(312, sharex=ax1, sharey=ax1)
ax2.plot(linspace(Config["pos"],
- len(self.data.processed_orgBcg) + Config["pos"],
- len(self.data.processed_orgBcg)), self.data.processed_orgBcg, color='blue')
+ len(self.data.processed_downsample_orgBcg) + Config["pos"],
+ len(self.data.processed_downsample_orgBcg)), self.data.processed_downsample_orgBcg,
+ color='blue')
ax2.set_xlim(min_x, max_x)
ax2.set_title("orgBcg")
ax3 = self.fig.add_subplot(313, sharex=ax1, sharey=ax1)
ax3.plot(
- linspace(0, len(self.data.processed_Abd),
- len(self.data.processed_Abd)), self.data.processed_Abd, color='blue')
+ linspace(0, len(self.data.processed_downsample_Abd),
+ len(self.data.processed_downsample_Abd)), self.data.processed_downsample_Abd, color='blue')
ax3.set_xlim(min_x, max_x)
ax3.set_title("ABD")
@@ -790,9 +814,9 @@ class MainWindow_approximately_align(QMainWindow):
orgBcg_SP = PSG_SP - Config["pos"]
orgBcg_EP = PSG_EP - Config["pos"]
- tho_seg = self.data.processed_Tho[PSG_SP:PSG_EP]
- orgBcg_seg = self.data.processed_orgBcg[orgBcg_SP:orgBcg_EP] * Config["orgBcg_reverse"]
- abd_seg = self.data.processed_Abd[PSG_SP:PSG_EP]
+ tho_seg = self.data.processed_downsample_Tho[PSG_SP:PSG_EP]
+ orgBcg_seg = self.data.processed_downsample_orgBcg[orgBcg_SP:orgBcg_EP] * Config["orgBcg_reverse"]
+ abd_seg = self.data.processed_downsample_Abd[PSG_SP:PSG_EP]
# 根据PSG来和绘制
ax1 = self.fig.add_subplot(321)
@@ -842,6 +866,9 @@ class MainWindow_approximately_align(QMainWindow):
# 返回图片以便存到QPixImage
return Result().success(info=Constants.DRAWING_FINISHED)
+ def DrawAlignScatter(self):
+ pass
+
class Data:
@@ -852,22 +879,90 @@ class Data:
self.processed_orgBcg = None
self.processed_Tho = None
self.processed_Abd = None
+ self.processed_downsample_orgBcg = None
+ self.processed_downsample_Tho = None
+ self.processed_downsample_Abd = None
+ self.relate_list = None
+ self.relate_point = None
def open_file(self):
-
if not Path(Config["Path"]["Input_orgBcg"]).exists():
return Result().failure(
info=Constants.INPUT_FAILURE + "orgBcg: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
"Data_Path_Not_Exist"])
+ temp_orgBcg_path = list(
+ Path(Config["Path"]["Input_orgBcg"]).glob(f"{ConfigParams.APPROXIMATELY_ALIGN_INPUT_ORGBCG_FILENAME}*"))
+ if len(temp_orgBcg_path) == 0:
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "orgBcg: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_File_Not_Exist"])
+ elif len(temp_orgBcg_path) > 1:
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "orgBcg: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_File_More_Than_One"])
+ else:
+ orgBcg_path = temp_orgBcg_path[0]
+ Config["Path"]["Input_orgBcg"] = str(orgBcg_path)
+ orgBcg_freq = orgBcg_path.stem.split("_")[-1]
+ # 验证是否为整数或是否存在
+ if not orgBcg_freq.isdigit():
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "orgBcg: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_Frequency_Not_In_Filename"])
+ Config["InputConfig"]["orgBcgFreq"] = int(orgBcg_freq)
+
if not Path(Config["Path"]["Input_Tho"]).exists():
return Result().failure(
info=Constants.INPUT_FAILURE + "Tho: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
"Data_Path_Not_Exist"])
+ temp_Tho_path = list(
+ Path(Config["Path"]["Input_Tho"]).glob(f"{ConfigParams.APPROXIMATELY_ALIGN_INPUT_THO_FILENAME}*"))
+ if len(temp_Tho_path) == 0:
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "Tho: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_File_Not_Exist"])
+ elif len(temp_Tho_path) > 1:
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "Tho: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_File_More_Than_One"])
+ else:
+ tho_path = temp_Tho_path[0]
+ Config["Path"]["Input_Tho"] = str(tho_path)
+ tho_freq = tho_path.stem.split("_")[-1]
+ # 验证是否为整数或是否存在
+ if not tho_freq.isdigit():
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "Tho: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_Frequency_Not_In_Filename"])
+ Config["InputConfig"]["ThoFreq"] = int(tho_freq)
+
+
if not Path(Config["Path"]["Input_Abd"]).exists():
return Result().failure(
info=Constants.INPUT_FAILURE + "Abd: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
"Data_Path_Not_Exist"])
+ temp_Abd_path = list(
+ Path(Config["Path"]["Input_Abd"]).glob(f"{ConfigParams.APPROXIMATELY_ALIGN_INPUT_ABD_FILENAME}*"))
+ if len(temp_Abd_path) == 0:
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "Abd: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_File_Not_Exist"])
+ elif len(temp_Abd_path) > 1:
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "Abd: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_File_More_Than_One"])
+ else:
+ abd_path = temp_Abd_path[0]
+ Config["Path"]["Input_Abd"] = str(abd_path)
+ abd_freq = abd_path.stem.split("_")[-1]
+ # 验证是否为整数或是否存在
+ if not abd_freq.isdigit():
+ return Result().failure(
+ info=Constants.INPUT_FAILURE + "Abd: " + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Data_Frequency_Not_In_Filename"])
+ Config["InputConfig"]["AbdFreq"] = int(abd_freq)
+
try:
self.raw_orgBcg = read_csv(Config["Path"]["Input_orgBcg"],
encoding=ConfigParams.UTF8_ENCODING,
@@ -876,10 +971,11 @@ class Data:
encoding=ConfigParams.UTF8_ENCODING,
header=None).to_numpy().reshape(-1)
self.raw_Abd = read_csv(Config["Path"]["Input_Abd"],
- encoding=ConfigParams.UTF8_ENCODING,
- header=None).to_numpy().reshape(-1)
+ encoding=ConfigParams.UTF8_ENCODING,
+ header=None).to_numpy().reshape(-1)
except Exception as e:
- return Result().failure(info=Constants.INPUT_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Read_Data_Exception"] + "\n" + format_exc())
+ return Result().failure(info=Constants.INPUT_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Read_Data_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.INPUT_FINISHED)
@@ -891,20 +987,31 @@ class Data:
df = DataFrame({"pos": [pos], "epoch": [epoch], "ApplyFrequency": [ApplyFrequency]})
df.to_csv(Path(Config["Path"]["Save"]), mode="w", header=True, index=False)
except Exception as e:
- return Result().failure(info=Constants.SAVING_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Save_Exception"] + "\n" + format_exc())
+ return Result().failure(info=Constants.SAVING_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Save_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.SAVING_FINISHED)
def Standardize_0(self):
# 仅重采样
if self.raw_orgBcg is None or self.raw_Tho is None or self.raw_Abd is None:
- return Result().failure(info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Raw_Data_Not_Exist"])
+ return Result().failure(
+ info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Raw_Data_Not_Exist"])
try:
- self.processed_orgBcg = resample(self.raw_orgBcg, int(Config["orgBcg_minutes"] * 60 * Config["ApplyFrequency"]))
- self.processed_Tho = resample(self.raw_Tho, int(Config["PSG_minutes"] * 60 * Config["ApplyFrequency"]))
- self.processed_Abd = resample(self.raw_Abd, int(Config["PSG_minutes"] * 60 * Config["ApplyFrequency"]))
+ # 按照秒数进行截断
+ self.raw_orgBcg = self.raw_orgBcg[:int(Config["orgBcg_seconds"] * Config["InputConfig"]["orgBcgFreq"])]
+ self.raw_Tho = self.raw_Tho[:int(Config["PSG_seconds"] * Config["InputConfig"]["ThoFreq"])]
+ self.raw_Abd = self.raw_Abd[:int(Config["PSG_seconds"] * Config["InputConfig"]["AbdFreq"])]
+
+ self.processed_orgBcg = resample(self.raw_orgBcg,
+ int(Config["orgBcg_seconds"] * Config["ApplyFrequency"]))
+ self.processed_Tho = resample(self.raw_Tho, int(Config["PSG_seconds"] * Config["ApplyFrequency"]))
+ self.processed_Abd = resample(self.raw_Abd, int(Config["PSG_seconds"] * Config["ApplyFrequency"]))
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Only_Resample_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Only_Resample_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FINISHED)
@@ -915,24 +1022,32 @@ class Data:
high = highCut / (fs * 0.5)
sos = butter(order, [low, high], btype="bandpass", output='sos')
return sosfiltfilt(sos, data)
+
if self.raw_orgBcg is None or self.raw_Tho is None or self.raw_Abd is None:
- return Result().failure(info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Raw_Data_Not_Exist"])
+ return Result().failure(
+ info=Constants.APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Raw_Data_Not_Exist"])
try:
# 滤波
- self.processed_orgBcg = butter_bandpass_filter(self.raw_orgBcg, Config["Filter"]["BandPassLow"],
- Config["Filter"]["BandPassHigh"],
- Config["InputConfig"]["orgBcgFreq"],
- Config["Filter"]["BandPassOrder"])
- self.processed_Tho = butter_bandpass_filter(self.raw_Tho, Config["Filter"]["BandPassLow"],
- Config["Filter"]["BandPassHigh"],
- Config["InputConfig"]["ThoFreq"],
- Config["Filter"]["BandPassOrder"])
- self.processed_Abd = butter_bandpass_filter(self.raw_Abd, Config["Filter"]["BandPassLow"],
- Config["Filter"]["BandPassHigh"],
- Config["InputConfig"]["AbdFreq"],
- Config["Filter"]["BandPassOrder"])
+ self.processed_orgBcg = butter_bandpass_filter(
+ self.raw_orgBcg, Config["Filter"]["BandPassLow"],
+ Config["Filter"]["BandPassHigh"],
+ Config["InputConfig"]["orgBcgFreq"],
+ Config["Filter"]["BandPassOrder"])
+ self.processed_Tho = butter_bandpass_filter(
+ self.raw_Tho, Config["Filter"]["BandPassLow"],
+ Config["Filter"]["BandPassHigh"],
+ Config["InputConfig"]["ThoFreq"],
+ Config["Filter"]["BandPassOrder"])
+ self.processed_Abd = butter_bandpass_filter(
+ self.raw_Abd, Config["Filter"]["BandPassLow"],
+ Config["Filter"]["BandPassHigh"],
+ Config["InputConfig"]["AbdFreq"],
+ Config["Filter"]["BandPassOrder"])
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_RESP_GET_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Resp_Get_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_RESP_GET_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Resp_Get_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_RESP_GET_FINISHED)
@@ -940,27 +1055,24 @@ class Data:
# 预重采样
try:
# TODO:这里的采样率处理,如果THO和ABD的采样率不同,可能还是会导致之后的ApplyFrequency出问题,最后导致得到的粗同步坐标不正确
- # 修改Config
- if Config["InputConfig"]["ThoFreq"] < Config["InputConfig"]["AbdFreq"]:
- Config.update({"TempFrequency": Config["InputConfig"]["ThoFreq"]})
- self.processed_Abd = self.processed_Abd[::int(Config["InputConfig"]["AbdFreq"] / Config["TempFrequency"])]
- elif Config["InputConfig"]["ThoFreq"] > Config["InputConfig"]["AbdFreq"]:
- Config.update({"TempFrequency": Config["InputConfig"]["AbdFreq"]})
- self.processed_Tho = self.processed_Tho[::int(Config["InputConfig"]["ThoFreq"] / Config["TempFrequency"])]
- else:
- Config.update({"TempFrequency": Config["InputConfig"]["ThoFreq"]})
+ #
+ if Config["InputConfig"]["ThoFreq"] != Config["TempFrequency"]:
+ print(int(Config["InputConfig"]["ThoFreq"]), int(Config["TempFrequency"]))
+ self.processed_Tho = resample(self.processed_Tho,
+ int(Config["PSG_seconds"] * Config["TempFrequency"]))
- # 如果orgBcg采样率大于PSG采样率,那么orgBcg重采样到PSG采样率
- if Config["InputConfig"]["orgBcgFreq"] > Config["TempFrequency"]:
- # 用[::]完成
- self.processed_orgBcg = self.processed_orgBcg[::int(Config["InputConfig"]["orgBcgFreq"] / Config["TempFrequency"])]
- # 如果orgBcg采样率小于PSG采样率,那么orgBcg重采样到PSG采样率
- elif Config["InputConfig"]["orgBcgFreq"] < Config["TempFrequency"]:
- # 用repeat完成
- self.processed_orgBcg = repeat(self.processed_orgBcg, int(Config["TempFrequency"] / Config["InputConfig"]["orgBcgFreq"]), axis=0)
+ if Config["InputConfig"]["AbdFreq"] != Config["TempFrequency"]:
+ self.processed_Abd = resample(self.processed_Abd,
+ int(Config["PSG_seconds"] * Config["TempFrequency"]))
+
+ if Config["InputConfig"]["orgBcgFreq"] != Config["TempFrequency"]:
+ self.processed_orgBcg = resample(self.processed_orgBcg,
+ int(Config["orgBcg_seconds"] * Config["TempFrequency"]))
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_PRE_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Pre_Resample_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_PRE_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Pre_Resample_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_PRE_ALIGN_RESAMPLE_FINISHED)
@@ -970,18 +1082,17 @@ class Data:
temp_frequency = Config["TempFrequency"]
if Config["PSGConfig"]["PSGDelBase"]:
# 减去四秒钟平均滤波
- self.processed_Tho = self.processed_Tho - convolve(self.processed_Tho,
- ones(int(4 * temp_frequency)) / int(4 * temp_frequency),
- mode='same')
- self.processed_Abd = self.processed_Abd - convolve(self.processed_Abd,
- ones(int(4 * temp_frequency)) / int(4 * temp_frequency),
- mode='same')
+ self.processed_Tho = self.processed_Tho - convolve(
+ self.processed_Tho, ones(int(4 * temp_frequency)) / int(4 * temp_frequency), mode='same')
+ self.processed_Abd = self.processed_Abd - convolve(
+ self.processed_Abd, ones(int(4 * temp_frequency)) / int(4 * temp_frequency), mode='same')
if Config["orgBcgConfig"]["orgBcgDelBase"]:
- self.processed_orgBcg = self.processed_orgBcg - convolve(self.processed_orgBcg,
- ones(int(4 * temp_frequency)) / int(4 * temp_frequency),
- mode='same')
+ self.processed_orgBcg = self.processed_orgBcg - convolve(
+ self.processed_orgBcg, ones(int(4 * temp_frequency)) / int(4 * temp_frequency), mode='same')
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_DELETE_BASE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Delete_Base_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_DELETE_BASE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Delete_Base_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_DELETE_BASE_FINISHED)
@@ -993,9 +1104,12 @@ class Data:
self.processed_Tho = (self.processed_Tho - mean(self.processed_Tho)) / std(self.processed_Tho)
self.processed_Abd = (self.processed_Abd - mean(self.processed_Abd)) / std(self.processed_Abd)
if Config["orgBcgConfig"]["orgBcgZScore"]:
- self.processed_orgBcg = (self.processed_orgBcg - mean(self.processed_orgBcg)) / std(self.processed_orgBcg)
+ self.processed_orgBcg = (self.processed_orgBcg - mean(self.processed_orgBcg)) / std(
+ self.processed_orgBcg)
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_STANDARDIZE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Standardize_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_STANDARDIZE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Standardize_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_STANDARDIZE_FINISHED)
@@ -1004,11 +1118,13 @@ class Data:
try:
# 用[::]完成
temp_frequency = Config["TempFrequency"]
- self.processed_Tho = self.processed_Tho[::int(temp_frequency / Config["ApplyFrequency"])]
- self.processed_Abd = self.processed_Abd[::int(temp_frequency / Config["ApplyFrequency"])]
- self.processed_orgBcg = self.processed_orgBcg[::int(temp_frequency / Config["ApplyFrequency"])]
+ self.processed_downsample_Tho = self.processed_Tho[::int(temp_frequency / Config["ApplyFrequency"])]
+ self.processed_downsample_Abd = self.processed_Abd[::int(temp_frequency / Config["ApplyFrequency"])]
+ self.processed_downsample_orgBcg = self.processed_orgBcg[::int(temp_frequency / Config["ApplyFrequency"])]
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Resample_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_ALIGN_RESAMPLE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Resample_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_ALIGN_RESAMPLE_FINISHED)
@@ -1017,8 +1133,12 @@ class Data:
try:
# 计算因子
MULTIPLE_FACTOER = ConfigParams.APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT["Multiple_Factor"]
- a = self.processed_Tho[Config["PSGConfig"]["PreCut"]:len(self.processed_Tho) - Config["PSGConfig"]["PostCut"]].copy()
- v = self.processed_orgBcg[Config["orgBcgConfig"]["PreCut"]:len(self.processed_orgBcg) - Config["orgBcgConfig"]["PostCut"]].copy()
+ a = self.processed_downsample_Tho[
+ Config["PSGConfig"]["PreCut"]:len(self.processed_downsample_Tho) - Config["PSGConfig"][
+ "PostCut"]].copy()
+ v = self.processed_downsample_orgBcg[
+ Config["orgBcgConfig"]["PreCut"]:len(self.processed_downsample_orgBcg) - Config["orgBcgConfig"][
+ "PostCut"]].copy()
a *= MULTIPLE_FACTOER
v *= MULTIPLE_FACTOER
a = a.astype(int64)
@@ -1029,15 +1149,21 @@ class Data:
result = {"tho_relate": tho_relate, "tho_relate2": tho_relate2}
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_CORRELATION_CALCULATE1_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Calculate_Correlation1_Exception"] + "\n" + format_exc())
+ return Result().failure(info=Constants.APPROXIMATELY_CORRELATION_CALCULATE1_FAILURE +
+ Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Calculate_Correlation1_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_CORRELATION_CALCULATE1_FINISHED, data=result)
def calculate_correlation2(self):
# 计算互相关2/2
try:
- a = self.processed_Abd[Config["PSGConfig"]["PreCut"]:len(self.processed_Abd) - Config["PSGConfig"]["PostCut"]].copy()
- v = self.processed_orgBcg[Config["orgBcgConfig"]["PreCut"]:len(self.processed_orgBcg) - Config["orgBcgConfig"]["PostCut"]].copy()
+ a = self.processed_downsample_Abd[
+ Config["PSGConfig"]["PreCut"]:len(self.processed_downsample_Abd) - Config["PSGConfig"][
+ "PostCut"]].copy()
+ v = self.processed_downsample_orgBcg[
+ Config["orgBcgConfig"]["PreCut"]:len(self.processed_downsample_orgBcg) - Config["orgBcgConfig"][
+ "PostCut"]].copy()
a *= 100
v *= 100
a = a.astype(int64)
@@ -1048,7 +1174,9 @@ class Data:
result = {"abd_relate": abd_relate, "abd_relate2": abd_relate2}
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_CORRELATION_CALCULATE2_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Calculate_Correlation2_Exception"] + "\n" + format_exc())
+ return Result().failure(info=Constants.APPROXIMATELY_CORRELATION_CALCULATE2_FAILURE +
+ Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Calculate_Correlation2_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_CORRELATION_CALCULATE2_FINISHED, data=result)
@@ -1061,11 +1189,13 @@ class Data:
abd_max2 = argmax(abd_relate2)
pre = Config["PSGConfig"]["PreCut"] + Config["orgBcgConfig"]["PostCut"]
- bias = pre - len(self.processed_orgBcg) + 1
+ bias = pre - len(self.processed_downsample_orgBcg) + 1
result = {"tho_max": tho_max, "tho_max2": tho_max2, "abd_max": abd_max, "abd_max2": abd_max2, "bias": bias}
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_MAXVALUE_POS_CALCULATE_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Calculate_Maxvalue_Pos_Exception"] + "\n" + format_exc())
+ return Result().failure(info=Constants.APPROXIMATELY_MAXVALUE_POS_CALCULATE_FAILURE +
+ Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Calculate_Maxvalue_Pos_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_MAXVALUE_POS_CALCULATE_FINISHED, data=result)
@@ -1073,12 +1203,61 @@ class Data:
# 获取epoch
try:
epoch_min = max(0, Config["pos"] // 30 // Config["ApplyFrequency"] + 1)
- epoch_max = min(len(self.processed_Tho) // 30 // Config["ApplyFrequency"] - 1,
- (len(self.processed_orgBcg) + Config["pos"]) // 30 // Config["ApplyFrequency"] - 1)
+ epoch_max = min(len(self.processed_downsample_Tho) // 30 // Config["ApplyFrequency"] - 1,
+ (len(self.processed_downsample_orgBcg) + Config["pos"]) // 30 // Config[
+ "ApplyFrequency"] - 1)
result = {"epoch_min": epoch_min, "epoch_max": epoch_max}
except Exception as e:
- return Result().failure(info=Constants.APPROXIMATELY_EPOCH_GET_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON["Get_Epoch_Exception"] + "\n" + format_exc())
+ return Result().failure(
+ info=Constants.APPROXIMATELY_EPOCH_GET_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Get_Epoch_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.APPROXIMATELY_EPOCH_GET_FINISHED, data=result)
+ def get_corr_by_epoch(self):
+ # 获取相关系数
+ try:
+ # 获取 epoch 区间
+ response = self.get_epoch()
+ if not response.status:
+ raise Exception(response.info)
+
+ epoch_min = response.data["epoch_min"]
+ epoch_max = response.data["epoch_max"]
+
+ """
+ bias_list = []
+ samp_rate4 = 100
+ for epoch in tqdm(range(epoch_min, epoch_max)):
+ win1 = 30 * epoch
+ win2 = win1 + 30 * 3
+ SP = win1 * samp_rate4
+ EP = win2 * samp_rate4
+
+ tho_seg = tho_pn * tho_low[SP: EP]
+ abd_seg = abd_pn * abd_low[SP: EP]
+ resp_seg = resp_pn * resp_low[SP - tho_pos *
+ samp_rate4: EP - tho_pos * samp_rate4]
+
+ abd_relate_seg = correlate(abd_seg, resp_seg, mode="full")
+ abd_seg_pos = np.argmax(abd_relate_seg) - len(resp_seg)
+
+ bias_list.append(abd_seg_pos)
+
+ plt.figure()
+ plt.scatter(np.linspace(0, len(bias_list), len(bias_list)), bias_list, alpha=0.2)
+ """
+
+ for epoch in range(epoch_min, epoch_max):
+ SP = epoch * 30
+
+ result = None
+
+
+ except Exception as e:
+ return Result().failure(
+ info=Constants.APPROXIMATELY_EPOCH_GET_FAILURE + Constants.APPROXIMATELY_ALIGN_FAILURE_REASON[
+ "Get_Corr_By_Epoch"] + "\n" + format_exc())
+
+ return Result().success(info=Constants.APPROXIMATELY_EPOCH_GET_FINISHED, data=result)
diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py
index bad17a1..c7c34ea 100644
--- a/func/utils/ConfigParams.py
+++ b/func/utils/ConfigParams.py
@@ -38,12 +38,17 @@ class ConfigParams:
"AbdFreq": 100
},
"ApplyFrequency": 5,
+ "TempFrequency": 100,
"Filter": {
"BandPassOrder": 4,
"BandPassLow": 0.01,
"BandPassHigh": 0.7
},
- "Multiple_Factor":100
+ "Multiple_Factor":100,
+ "CorrByEpoch":
+ {
+ "window_second": 30
+ }
}
APPROXIMATELY_ALIGN_INPUT_ORGBCG_FILENAME: str = "orgBcg_Raw_"
APPROXIMATELY_ALIGN_INPUT_THO_FILENAME: str = "Effort Tho_Raw_"
diff --git a/func/utils/Constants.py b/func/utils/Constants.py
index eae3f26..7509bc6 100644
--- a/func/utils/Constants.py
+++ b/func/utils/Constants.py
@@ -118,6 +118,9 @@ class Constants:
APPROXIMATELY_ALIGN_FAILURE_REASON = {
"Data_Path_Not_Exist": "(路径不存在)",
+ "Data_File_Not_Exist": "(数据文件不存在)",
+ "Data_File_More_Than_One": "(数据文件超过一个)",
+ "Data_Frequency_Not_In_Filename": "(数据频率不在文件名中)",
"Read_Data_Exception": "(读取数据异常)",
"Raw_Data_Not_Exist": "(原始数据不存在)",
"Only_Resample_Exception": "(仅重采样异常)",
diff --git a/func/utils/PublicFunc.py b/func/utils/PublicFunc.py
index 4bc75f5..2949ba8 100644
--- a/func/utils/PublicFunc.py
+++ b/func/utils/PublicFunc.py
@@ -1,7 +1,7 @@
from datetime import datetime
from logging import error, info
-from PySide6.QtWidgets import QMessageBox, QWidget, QPushButton, QProgressBar, QApplication
+from PySide6.QtWidgets import QMessageBox, QWidget, QPushButton, QProgressBar, QApplication, QRadioButton
from func.utils.Constants import Constants
from func.utils.CustomException import TipsTypeValueNotExistError, MsgBoxTypeValueNotExistError
@@ -106,6 +106,10 @@ class PublicFunc:
if widget.objectName() in buttonState["Current"].keys():
widget.setEnabled(False)
+ if isinstance(widget, QRadioButton):
+ if widget.objectName() in buttonState["Current"].keys():
+ widget.setEnabled(False)
+
@staticmethod
def __enableAllButton__(mainWindow, buttonState):
# 启用按钮
@@ -117,6 +121,10 @@ class PublicFunc:
if widget.objectName() in buttonState["Current"].keys():
widget.setEnabled(buttonState["Current"][widget.objectName()])
+ if isinstance(widget, QRadioButton):
+ if widget.objectName() in buttonState["Current"].keys():
+ widget.setEnabled(buttonState["Current"][widget.objectName()])
+
@staticmethod
def __resetAllButton__(mainWindow, buttonState):
# 启用按钮
@@ -128,6 +136,10 @@ class PublicFunc:
if widget.objectName() in buttonState["Default"].keys():
widget.setEnabled(buttonState["Default"][widget.objectName()])
+ if isinstance(widget, QRadioButton):
+ if widget.objectName() in buttonState["Default"].keys():
+ widget.setEnabled(buttonState["Default"][widget.objectName()])
+
@staticmethod
def add_progressbar(mainWindow):
mainWindow.progressbar = QProgressBar()
diff --git a/ui/MainWindow/MainWindow_approximately_align.py b/ui/MainWindow/MainWindow_approximately_align.py
index f73b8e1..c03e1c9 100644
--- a/ui/MainWindow/MainWindow_approximately_align.py
+++ b/ui/MainWindow/MainWindow_approximately_align.py
@@ -3,7 +3,7 @@
################################################################################
## Form generated from reading UI file 'MainWindow_approximately_align.ui'
##
-## Created by: Qt User Interface Compiler version 6.8.2
+## Created by: Qt User Interface Compiler version 6.7.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@@ -177,7 +177,9 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_orgBcgPreA = QSpinBox(self.groupBox_get_position)
self.spinBox_orgBcgPreA.setObjectName(u"spinBox_orgBcgPreA")
+ self.spinBox_orgBcgPreA.setMinimumSize(QSize(93, 0))
self.spinBox_orgBcgPreA.setFont(font1)
+ self.spinBox_orgBcgPreA.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_orgBcgPreA.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_orgBcgPreA.setMaximum(999999)
@@ -191,7 +193,9 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_PSGPreA = QSpinBox(self.groupBox_get_position)
self.spinBox_PSGPreA.setObjectName(u"spinBox_PSGPreA")
+ self.spinBox_PSGPreA.setMinimumSize(QSize(93, 0))
self.spinBox_PSGPreA.setFont(font1)
+ self.spinBox_PSGPreA.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_PSGPreA.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_PSGPreA.setMaximum(999999)
@@ -215,6 +219,7 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_orgBcgPreCut = QSpinBox(self.groupBox_get_position)
self.spinBox_orgBcgPreCut.setObjectName(u"spinBox_orgBcgPreCut")
self.spinBox_orgBcgPreCut.setFont(font1)
+ self.spinBox_orgBcgPreCut.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_orgBcgPreCut.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_orgBcgPreCut.setMaximum(999999)
@@ -229,6 +234,7 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_PSGPreCut = QSpinBox(self.groupBox_get_position)
self.spinBox_PSGPreCut.setObjectName(u"spinBox_PSGPreCut")
self.spinBox_PSGPreCut.setFont(font1)
+ self.spinBox_PSGPreCut.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_PSGPreCut.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_PSGPreCut.setMaximum(999999)
@@ -251,7 +257,9 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_orgBcgPostCut = QSpinBox(self.groupBox_get_position)
self.spinBox_orgBcgPostCut.setObjectName(u"spinBox_orgBcgPostCut")
+ self.spinBox_orgBcgPostCut.setMinimumSize(QSize(93, 0))
self.spinBox_orgBcgPostCut.setFont(font1)
+ self.spinBox_orgBcgPostCut.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_orgBcgPostCut.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_orgBcgPostCut.setMaximum(999999)
@@ -265,7 +273,9 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_PSGPostCut = QSpinBox(self.groupBox_get_position)
self.spinBox_PSGPostCut.setObjectName(u"spinBox_PSGPostCut")
+ self.spinBox_PSGPostCut.setMinimumSize(QSize(93, 0))
self.spinBox_PSGPostCut.setFont(font1)
+ self.spinBox_PSGPostCut.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_PSGPostCut.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_PSGPostCut.setMaximum(999999)
@@ -278,36 +288,28 @@ class Ui_MainWindow_approximately_align(object):
self.verticalLayout_8.addLayout(self.horizontalLayout_9)
- self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+ self.verticalSpacer_2 = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.verticalLayout_8.addItem(self.verticalSpacer_2)
self.horizontalLayout_7 = QHBoxLayout()
self.horizontalLayout_7.setObjectName(u"horizontalLayout_7")
+ self.horizontalSpacer_5 = QSpacerItem(30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+
+ self.horizontalLayout_7.addItem(self.horizontalSpacer_5)
+
self.pushButton_CutOff = QPushButton(self.groupBox_get_position)
self.pushButton_CutOff.setObjectName(u"pushButton_CutOff")
self.pushButton_CutOff.setFont(font1)
self.horizontalLayout_7.addWidget(self.pushButton_CutOff)
- self.horizontalSpacer_5 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
-
- self.horizontalLayout_7.addItem(self.horizontalSpacer_5)
-
- self.pushButton_GetPos = QPushButton(self.groupBox_get_position)
- self.pushButton_GetPos.setObjectName(u"pushButton_GetPos")
- self.pushButton_GetPos.setFont(font1)
-
- self.horizontalLayout_7.addWidget(self.pushButton_GetPos)
-
self.verticalLayout_8.addLayout(self.horizontalLayout_7)
self.verticalLayout_8.setStretch(0, 2)
self.verticalLayout_8.setStretch(1, 2)
self.verticalLayout_8.setStretch(2, 2)
- self.verticalLayout_8.setStretch(3, 1)
- self.verticalLayout_8.setStretch(4, 2)
self.verticalLayout.addWidget(self.groupBox_get_position)
@@ -315,44 +317,60 @@ class Ui_MainWindow_approximately_align(object):
self.groupBox_align_position.setObjectName(u"groupBox_align_position")
self.gridLayout_2 = QGridLayout(self.groupBox_align_position)
self.gridLayout_2.setObjectName(u"gridLayout_2")
- self.radioButton_NTHO = QRadioButton(self.groupBox_align_position)
- self.radioButton_NTHO.setObjectName(u"radioButton_NTHO")
- self.radioButton_NTHO.setFont(font1)
-
- self.gridLayout_2.addWidget(self.radioButton_NTHO, 0, 1, 1, 1)
-
- self.radioButton_PTHO = QRadioButton(self.groupBox_align_position)
- self.radioButton_PTHO.setObjectName(u"radioButton_PTHO")
- self.radioButton_PTHO.setFont(font1)
-
- self.gridLayout_2.addWidget(self.radioButton_PTHO, 0, 0, 1, 1)
-
self.radioButton_PABD = QRadioButton(self.groupBox_align_position)
self.radioButton_PABD.setObjectName(u"radioButton_PABD")
self.radioButton_PABD.setFont(font1)
- self.gridLayout_2.addWidget(self.radioButton_PABD, 0, 2, 1, 1)
+ self.gridLayout_2.addWidget(self.radioButton_PABD, 1, 2, 1, 1)
- self.radioButton_NABD = QRadioButton(self.groupBox_align_position)
- self.radioButton_NABD.setObjectName(u"radioButton_NABD")
- self.radioButton_NABD.setFont(font1)
+ self.radioButton_NTHO = QRadioButton(self.groupBox_align_position)
+ self.radioButton_NTHO.setObjectName(u"radioButton_NTHO")
+ self.radioButton_NTHO.setFont(font1)
- self.gridLayout_2.addWidget(self.radioButton_NABD, 1, 0, 1, 1)
+ self.gridLayout_2.addWidget(self.radioButton_NTHO, 1, 1, 1, 1)
self.radioButton_custom = QRadioButton(self.groupBox_align_position)
self.radioButton_custom.setObjectName(u"radioButton_custom")
self.radioButton_custom.setFont(font1)
- self.gridLayout_2.addWidget(self.radioButton_custom, 1, 1, 1, 1)
+ self.gridLayout_2.addWidget(self.radioButton_custom, 2, 1, 1, 1)
self.spinBox_custom = QSpinBox(self.groupBox_align_position)
self.spinBox_custom.setObjectName(u"spinBox_custom")
+ self.spinBox_custom.setMinimumSize(QSize(90, 0))
self.spinBox_custom.setFont(font1)
+ self.spinBox_custom.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_custom.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_custom.setMinimum(-1000000)
self.spinBox_custom.setMaximum(1000000)
- self.gridLayout_2.addWidget(self.spinBox_custom, 1, 2, 1, 1)
+ self.gridLayout_2.addWidget(self.spinBox_custom, 2, 2, 1, 1)
+
+ self.radioButton_PTHO = QRadioButton(self.groupBox_align_position)
+ self.radioButton_PTHO.setObjectName(u"radioButton_PTHO")
+ self.radioButton_PTHO.setFont(font1)
+
+ self.gridLayout_2.addWidget(self.radioButton_PTHO, 1, 0, 1, 1)
+
+ self.radioButton_NABD = QRadioButton(self.groupBox_align_position)
+ self.radioButton_NABD.setObjectName(u"radioButton_NABD")
+ self.radioButton_NABD.setFont(font1)
+
+ self.gridLayout_2.addWidget(self.radioButton_NABD, 2, 0, 1, 1)
+
+ self.pushButton_GetPos = QPushButton(self.groupBox_align_position)
+ self.pushButton_GetPos.setObjectName(u"pushButton_GetPos")
+ self.pushButton_GetPos.setMinimumSize(QSize(0, 30))
+ self.pushButton_GetPos.setFont(font1)
+
+ self.gridLayout_2.addWidget(self.pushButton_GetPos, 0, 0, 1, 1)
+
+ self.pushButton_ChangeView = QPushButton(self.groupBox_align_position)
+ self.pushButton_ChangeView.setObjectName(u"pushButton_ChangeView")
+ self.pushButton_ChangeView.setMinimumSize(QSize(0, 30))
+ self.pushButton_ChangeView.setFont(font1)
+
+ self.gridLayout_2.addWidget(self.pushButton_ChangeView, 0, 2, 1, 1)
self.verticalLayout.addWidget(self.groupBox_align_position)
@@ -371,7 +389,9 @@ class Ui_MainWindow_approximately_align(object):
self.spinBox_SelectEpoch = QSpinBox(self.groupBox_view_partially)
self.spinBox_SelectEpoch.setObjectName(u"spinBox_SelectEpoch")
+ self.spinBox_SelectEpoch.setMinimumSize(QSize(90, 0))
self.spinBox_SelectEpoch.setFont(font1)
+ self.spinBox_SelectEpoch.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter)
self.spinBox_SelectEpoch.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.NoButtons)
self.spinBox_SelectEpoch.setMaximum(2000)
@@ -463,7 +483,6 @@ class Ui_MainWindow_approximately_align(object):
self.verticalLayout.setStretch(0, 1)
self.verticalLayout.setStretch(1, 1)
self.verticalLayout.setStretch(2, 3)
- self.verticalLayout.setStretch(3, 5)
self.verticalLayout.setStretch(4, 2)
self.verticalLayout.setStretch(5, 4)
self.verticalLayout.setStretch(6, 1)
@@ -502,9 +521,9 @@ class Ui_MainWindow_approximately_align(object):
self.groupBox_left.setTitle(QCoreApplication.translate("MainWindow_approximately_align", u"\u6570\u636e\u7c97\u540c\u6b65", None))
self.pushButton_input_setting.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5bfc\u5165\u8bbe\u7f6e", None))
self.pushButton_input.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5f00\u59cb\u5bfc\u5165", None))
- self.label_3.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg\u65f6\u957f(min)\uff1a", None))
+ self.label_3.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg\u65f6\u957f(\u79d2)\uff1a", None))
self.label_orgBcg_length.setText(QCoreApplication.translate("MainWindow_approximately_align", u"0", None))
- self.label_6.setText(QCoreApplication.translate("MainWindow_approximately_align", u"PSG\u65f6\u957f(min)\uff1a", None))
+ self.label_6.setText(QCoreApplication.translate("MainWindow_approximately_align", u"PSG\u65f6\u957f(\u79d2)\uff1a", None))
self.label_PSG_length.setText(QCoreApplication.translate("MainWindow_approximately_align", u"0", None))
self.groupBox_standardize.setTitle(QCoreApplication.translate("MainWindow_approximately_align", u"\u6807\u51c6\u5316", None))
self.checkBox_orgBcgDelBase.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg\u53bb\u57fa\u7ebf", None))
@@ -516,18 +535,19 @@ class Ui_MainWindow_approximately_align(object):
self.groupBox_get_position.setTitle(QCoreApplication.translate("MainWindow_approximately_align", u"\u622a\u65ad", None))
self.label.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg_\u8865\u96f6\uff1a", None))
self.label_2.setText(QCoreApplication.translate("MainWindow_approximately_align", u"PSG_\u8865\u96f6\uff1a", None))
- self.label_4.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg_Pre\uff1a", None))
- self.label_5.setText(QCoreApplication.translate("MainWindow_approximately_align", u"PSG_Pre\uff1a", None))
+ self.label_4.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg_Pre \uff1a", None))
+ self.label_5.setText(QCoreApplication.translate("MainWindow_approximately_align", u"PSG_Pre \uff1a", None))
self.label_7.setText(QCoreApplication.translate("MainWindow_approximately_align", u"orgBcg_Post\uff1a", None))
self.label_8.setText(QCoreApplication.translate("MainWindow_approximately_align", u"PSG_Post\uff1a", None))
self.pushButton_CutOff.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5e94\u7528", None))
- self.pushButton_GetPos.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u8ba1\u7b97\u5bf9\u9f50", None))
self.groupBox_align_position.setTitle(QCoreApplication.translate("MainWindow_approximately_align", u"\u5bf9\u9f50\u8d77\u59cb\u4f4d\u7f6e", None))
- self.radioButton_NTHO.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90092", None))
- self.radioButton_PTHO.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90091", None))
self.radioButton_PABD.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90093", None))
- self.radioButton_NABD.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90094", None))
+ self.radioButton_NTHO.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90092", None))
self.radioButton_custom.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u81ea\u5b9a\u4e49", None))
+ self.radioButton_PTHO.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90091", None))
+ self.radioButton_NABD.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5907\u90094", None))
+ self.pushButton_GetPos.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u8ba1\u7b97\u5bf9\u9f50", None))
+ self.pushButton_ChangeView.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u5207\u6362\u89c6\u56fe", None))
self.groupBox_view_partially.setTitle(QCoreApplication.translate("MainWindow_approximately_align", u"\u5c40\u90e8\u89c2\u6d4b", None))
self.label_9.setText(QCoreApplication.translate("MainWindow_approximately_align", u"Epoch\uff1a", None))
self.pushButton_JUMP.setText(QCoreApplication.translate("MainWindow_approximately_align", u"\u8df3\u8f6c", None))
diff --git a/ui/MainWindow/MainWindow_approximately_align.ui b/ui/MainWindow/MainWindow_approximately_align.ui
index 54aa8a3..daf2afc 100644
--- a/ui/MainWindow/MainWindow_approximately_align.ui
+++ b/ui/MainWindow/MainWindow_approximately_align.ui
@@ -25,7 +25,7 @@
数据粗同步
-
+
-
-
@@ -76,7 +76,7 @@
- orgBcg时长(min):
+ orgBcg时长(秒):
@@ -113,7 +113,7 @@
- PSG时长(min):
+ PSG时长(秒):
@@ -263,7 +263,7 @@
截断
-
+
-
-
@@ -280,11 +280,20 @@
-
+
+
+ 93
+ 0
+
+
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -307,11 +316,20 @@
-
+
+
+ 93
+ 0
+
+
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -332,7 +350,7 @@
- orgBcg_Pre:
+ orgBcg_Pre :
@@ -343,6 +361,9 @@
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -359,7 +380,7 @@
- PSG_Pre:
+ PSG_Pre :
@@ -370,6 +391,9 @@
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -396,11 +420,20 @@
-
+
+
+ 93
+ 0
+
+
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -423,11 +456,20 @@
-
+
+
+ 93
+ 0
+
+
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -446,13 +488,26 @@
20
- 40
+ 10
-
-
+
+
-
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ 30
+ 20
+
+
+
+
-
@@ -465,31 +520,6 @@
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 12
-
-
-
- 计算对齐
-
-
-
@@ -501,31 +531,7 @@
对齐起始位置
- -
-
-
-
- 12
-
-
-
- 备选2
-
-
-
- -
-
-
-
- 12
-
-
-
- 备选1
-
-
-
- -
+
-
@@ -537,19 +543,19 @@
- -
-
+
-
+
12
- 备选4
+ 备选2
- -
+
-
@@ -561,13 +567,22 @@
- -
+
-
+
+
+ 90
+ 0
+
+
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
@@ -579,6 +594,66 @@
+ -
+
+
+
+ 12
+
+
+
+ 备选1
+
+
+
+ -
+
+
+
+ 12
+
+
+
+ 备选4
+
+
+
+ -
+
+
+
+ 0
+ 30
+
+
+
+
+ 12
+
+
+
+ 计算对齐
+
+
+
+ -
+
+
+
+ 0
+ 30
+
+
+
+
+ 12
+
+
+
+ 切换视图
+
+
+
@@ -604,11 +679,20 @@
-
+
+
+ 90
+ 0
+
+
12
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
QAbstractSpinBox::ButtonSymbols::NoButtons
diff --git a/ui/setting/approximately_align_input_setting.py b/ui/setting/approximately_align_input_setting.py
index fdff502..db9e72b 100644
--- a/ui/setting/approximately_align_input_setting.py
+++ b/ui/setting/approximately_align_input_setting.py
@@ -3,7 +3,7 @@
################################################################################
## Form generated from reading UI file 'approximately_align_input_setting.ui'
##
-## Created by: Qt User Interface Compiler version 6.8.2
+## Created by: Qt User Interface Compiler version 6.7.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@@ -59,8 +59,9 @@ class Ui_MainWindow_approximately_align_input_setting(object):
self.spinBox_input_orgBcg_freq = QSpinBox(self.groupBox_2)
self.spinBox_input_orgBcg_freq.setObjectName(u"spinBox_input_orgBcg_freq")
self.spinBox_input_orgBcg_freq.setFont(font)
- self.spinBox_input_orgBcg_freq.setMinimum(1)
+ self.spinBox_input_orgBcg_freq.setMinimum(0)
self.spinBox_input_orgBcg_freq.setMaximum(1000000)
+ self.spinBox_input_orgBcg_freq.setValue(0)
self.horizontalLayout.addWidget(self.spinBox_input_orgBcg_freq)
@@ -92,8 +93,9 @@ class Ui_MainWindow_approximately_align_input_setting(object):
self.spinBox_input_Tho_freq = QSpinBox(self.groupBox_3)
self.spinBox_input_Tho_freq.setObjectName(u"spinBox_input_Tho_freq")
self.spinBox_input_Tho_freq.setFont(font)
- self.spinBox_input_Tho_freq.setMinimum(1)
+ self.spinBox_input_Tho_freq.setMinimum(0)
self.spinBox_input_Tho_freq.setMaximum(1000000)
+ self.spinBox_input_Tho_freq.setValue(0)
self.horizontalLayout_2.addWidget(self.spinBox_input_Tho_freq)
@@ -125,8 +127,9 @@ class Ui_MainWindow_approximately_align_input_setting(object):
self.spinBox_input_Abd_freq = QSpinBox(self.groupBox_4)
self.spinBox_input_Abd_freq.setObjectName(u"spinBox_input_Abd_freq")
self.spinBox_input_Abd_freq.setFont(font)
- self.spinBox_input_Abd_freq.setMinimum(1)
+ self.spinBox_input_Abd_freq.setMinimum(0)
self.spinBox_input_Abd_freq.setMaximum(1000000)
+ self.spinBox_input_Abd_freq.setValue(0)
self.horizontalLayout_3.addWidget(self.spinBox_input_Abd_freq)
diff --git a/ui/setting/approximately_align_input_setting.ui b/ui/setting/approximately_align_input_setting.ui
index 3f2404a..0909e66 100644
--- a/ui/setting/approximately_align_input_setting.ui
+++ b/ui/setting/approximately_align_input_setting.ui
@@ -66,11 +66,14 @@
- 1
+ 0
1000000
+
+ 0
+
@@ -116,11 +119,14 @@
- 1
+ 0
1000000
+
+ 0
+
@@ -166,11 +172,14 @@
- 1
+ 0
1000000
+
+ 0
+
From b87ca6ed42390691ac50c728131929f7fa45c8a3 Mon Sep 17 00:00:00 2001
From: marques <20172333133@m.scnu.edu.cn>
Date: Tue, 20 May 2025 15:04:48 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=86=E5=9B=BE?=
=?UTF-8?q?=E5=88=87=E6=8D=A2=E6=8C=89=E9=92=AE=E5=B9=B6=E5=AE=9E=E7=8E=B0?=
=?UTF-8?q?=E7=BB=98=E5=88=B6=E6=95=A3=E7=82=B9=E5=9B=BE=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?=
=?UTF-8?q?=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
func/Module_approximately_align.py | 93 ++++++++++++++++++++++--------
func/Module_precisely_align.py | 8 +--
func/utils/ConfigParams.py | 2 +-
3 files changed, 73 insertions(+), 30 deletions(-)
diff --git a/func/Module_approximately_align.py b/func/Module_approximately_align.py
index d925cc4..d161719 100644
--- a/func/Module_approximately_align.py
+++ b/func/Module_approximately_align.py
@@ -245,6 +245,7 @@ class MainWindow_approximately_align(QMainWindow):
self.ui.pushButton_Standardize.clicked.connect(self.__slot_btn_Standardize__)
self.ui.pushButton_CutOff.clicked.connect(self.__slot_btn_CutOff__)
self.ui.pushButton_GetPos.clicked.connect(self.__slot_btn_GetPosition__)
+ self.ui.pushButton_ChangeView.clicked.connect(self.__slot_btn_changeview__)
self.ui.pushButton_JUMP.clicked.connect(self.__slot_btn_jump__)
self.ui.pushButton_save.clicked.connect(self.__slot_btn_save__)
self.ui.pushButton_EM1.clicked.connect(self.__EpochChange__)
@@ -259,6 +260,7 @@ class MainWindow_approximately_align(QMainWindow):
self.ui.radioButton_NABD.clicked.connect(self.__enableAlign__)
self.ui.radioButton_custom.clicked.connect(self.__enableAlign__)
+
@overrides
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
@@ -325,6 +327,8 @@ class MainWindow_approximately_align(QMainWindow):
result = self.DrawPicTryAlign()
elif sender == self.ui.radioButton_custom:
result = self.DrawPicTryAlign()
+ elif sender == self.ui.pushButton_ChangeView:
+ result = self.DrawAlignScatter()
elif sender == self.ui.pushButton_JUMP:
result = self.DrawPicByEpoch(*args, **kwargs)
elif sender == self.ui.pushButton_EM1:
@@ -561,6 +565,22 @@ class MainWindow_approximately_align(QMainWindow):
# self.ui.groupBox_align_position.setEnabled(True)
PublicFunc.finish_operation(self, ButtonState)
+ def __slot_btn_changeview__(self):
+ PublicFunc.__disableAllButton__(self, ButtonState)
+
+ # 绘图
+ PublicFunc.progressbar_update(self, 1, 1, Constants.DRAWING_DATA, 0)
+ result = self.__plot__()
+ if not result.status:
+ PublicFunc.text_output(self.ui, "(1/1)" + result.info, Constants.TIPS_TYPE_ERROR)
+ PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
+ PublicFunc.finish_operation(self, ButtonState)
+ return
+ else:
+ PublicFunc.text_output(self.ui, "(1/1)" + result.info, Constants.TIPS_TYPE_INFO)
+
+ PublicFunc.finish_operation(self, ButtonState)
+
def __slot_btn_jump__(self):
PublicFunc.__disableAllButton__(self, ButtonState)
@@ -867,7 +887,27 @@ class MainWindow_approximately_align(QMainWindow):
return Result().success(info=Constants.DRAWING_FINISHED)
def DrawAlignScatter(self):
- pass
+ try:
+ response = self.data.get_corr_by_epoch()
+ epoch_min = response.data["epoch_min"]
+ epoch_max = response.data["epoch_max"]
+ tho_bias_list = response.data["tho_bias_list"]
+ abd_bias_list = response.data["abd_bias_list"]
+
+ ax1 = self.fig.add_subplot(211)
+ ax1.scatter(linspace(epoch_min, epoch_max, len(tho_bias_list)), tho_bias_list, alpha=0.2)
+ ax1.set_title("THO")
+
+ ax2 = self.fig.add_subplot(212)
+ ax2.scatter(linspace(epoch_min, epoch_max, len(abd_bias_list)), abd_bias_list, alpha=0.2)
+ ax2.set_title("ABD")
+ self.fig.canvas.draw()
+
+ return Result().success(info=Constants.DRAWING_FINISHED)
+
+ except Exception as e:
+ return Result().failure(info=Constants.DRAWING_FAILURE + "\n" + format_exc())
+
class Data:
@@ -1226,33 +1266,36 @@ class Data:
epoch_min = response.data["epoch_min"]
epoch_max = response.data["epoch_max"]
- """
- bias_list = []
- samp_rate4 = 100
- for epoch in tqdm(range(epoch_min, epoch_max)):
- win1 = 30 * epoch
- win2 = win1 + 30 * 3
- SP = win1 * samp_rate4
- EP = win2 * samp_rate4
-
- tho_seg = tho_pn * tho_low[SP: EP]
- abd_seg = abd_pn * abd_low[SP: EP]
- resp_seg = resp_pn * resp_low[SP - tho_pos *
- samp_rate4: EP - tho_pos * samp_rate4]
-
- abd_relate_seg = correlate(abd_seg, resp_seg, mode="full")
- abd_seg_pos = np.argmax(abd_relate_seg) - len(resp_seg)
-
- bias_list.append(abd_seg_pos)
-
- plt.figure()
- plt.scatter(np.linspace(0, len(bias_list), len(bias_list)), bias_list, alpha=0.2)
- """
+ temp_freq = ConfigParams.APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT["TempFrequency"]
+ window_epoch = ConfigParams.APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT["CorrByEpoch"]["window_epoch"]
+ tho_bias_list = []
+ abd_bias_list = []
+
+ # pos采样率转换
+ pos = Config["pos"] * temp_freq // Config["ApplyFrequency"]
for epoch in range(epoch_min, epoch_max):
- SP = epoch * 30
+ SP = epoch * 30 * temp_freq
+ EP = (epoch + window_epoch) * 30 * temp_freq
+ tho_seg = self.processed_Tho[SP:EP]
+ abd_seg = self.processed_Abd[SP:EP]
- result = None
+ orgBcg_seg = self.processed_orgBcg[SP - pos:EP - pos] * Config["orgBcg_reverse"]
+ tho_relate_seg = correlate(tho_seg, orgBcg_seg, mode='full')
+ abd_relate_seg = correlate(abd_seg, orgBcg_seg, mode='full')
+ tho_seg_pos = argmax(tho_relate_seg) - len(orgBcg_seg)
+ abd_seg_pos = argmax(abd_relate_seg) - len(orgBcg_seg)
+
+ tho_bias_list.append(tho_seg_pos // temp_freq)
+ abd_bias_list.append(abd_seg_pos // temp_freq)
+
+
+ result = {
+ "tho_bias_list": tho_bias_list,
+ "abd_bias_list": abd_bias_list,
+ "epoch_min": epoch_min,
+ "epoch_max": epoch_max
+ }
except Exception as e:
diff --git a/func/Module_precisely_align.py b/func/Module_precisely_align.py
index a47564c..f297148 100644
--- a/func/Module_precisely_align.py
+++ b/func/Module_precisely_align.py
@@ -1642,10 +1642,10 @@ class Data:
orgfs = Config["orgfs"]
off = Config["offset_anchor"]
- self.res_orgBcg = self.raw_orgBcg
- self.res_BCG = self.raw_BCG
- self.cut_ECG = self.raw_ECG
- self.cut_Rpeak = self.Rpeak
+ self.res_orgBcg = self.raw_orgBcg.copy()
+ self.res_BCG = self.raw_BCG.copy()
+ self.cut_ECG = self.raw_ECG.copy()
+ self.cut_Rpeak = self.Rpeak.copy()
if off > 0:
self.cut_ECG = self.cut_ECG[off:]
diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py
index c7c34ea..1efb4ca 100644
--- a/func/utils/ConfigParams.py
+++ b/func/utils/ConfigParams.py
@@ -47,7 +47,7 @@ class ConfigParams:
"Multiple_Factor":100,
"CorrByEpoch":
{
- "window_second": 30
+ "window_epoch": 6
}
}
APPROXIMATELY_ALIGN_INPUT_ORGBCG_FILENAME: str = "orgBcg_Raw_"