1、为<人工纠正>和<数据精同步>加入了<数据粗同步>获取到的粗同步坐标绘制的虚线
This commit is contained in:
@ -89,6 +89,9 @@ class SettingWindow(QMainWindow):
|
||||
"Input_Peak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_JPEAK_FILENAME +
|
||||
ConfigParams.ENDSWITH_TXT))),
|
||||
"Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME +
|
||||
ConfigParams.ENDSWITH_CSV))),
|
||||
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_SAVE_JPEAK_FILENAME +
|
||||
ConfigParams.ENDSWITH_TXT)))
|
||||
@ -105,6 +108,9 @@ class SettingWindow(QMainWindow):
|
||||
"Input_Peak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_RPEAK_FILENAME +
|
||||
ConfigParams.ENDSWITH_TXT))),
|
||||
"Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME +
|
||||
ConfigParams.ENDSWITH_CSV))),
|
||||
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_SAVE_RPEAK_FILENAME +
|
||||
ConfigParams.ENDSWITH_TXT)))
|
||||
@ -118,6 +124,7 @@ class SettingWindow(QMainWindow):
|
||||
self.ui.spinBox_input_freq_signal.setValue(Config["InputConfig"]["Freq"])
|
||||
self.ui.plainTextEdit_file_path_input_signal.setPlainText(Config["Path"]["Input_Signal"])
|
||||
self.ui.plainTextEdit_file_path_input_peak.setPlainText(Config["Path"]["Input_Peak"])
|
||||
self.ui.plainTextEdit_file_path_input_approximately_align.setPlainText(Config["Path"]["Input_Approximately_Align"])
|
||||
self.ui.plainTextEdit_file_path_save.setPlainText(Config["Path"]["Save"])
|
||||
if Config["Mode"] == "BCG":
|
||||
self.ui.spinBox_bandPassOrder.setValue(Config["Filter"]["BCGBandPassOrder"])
|
||||
@ -135,6 +142,7 @@ class SettingWindow(QMainWindow):
|
||||
Config["InputConfig"]["Freq"] = self.ui.spinBox_input_freq_signal.value()
|
||||
Config["Path"]["Input_Signal"] = self.ui.plainTextEdit_file_path_input_signal.toPlainText()
|
||||
Config["Path"]["Input_Peak"] = self.ui.plainTextEdit_file_path_input_peak.toPlainText()
|
||||
Config["Path"]["Input_Approximately_Align"] = self.ui.plainTextEdit_file_path_input_approximately_align.toPlainText()
|
||||
Config["Path"]["Save"] = self.ui.plainTextEdit_file_path_save.toPlainText()
|
||||
if Config["Mode"] == "BCG":
|
||||
Config["Filter"]["BCGBandPassOrder"] = self.ui.spinBox_bandPassOrder.value()
|
||||
@ -354,6 +362,10 @@ class MainWindow_label_check(QMainWindow):
|
||||
self.ax1.plot(self.data.processed_data,
|
||||
label=Constants.LABEL_CHECK_PLOT_LABEL_SIGNAL,
|
||||
color=Constants.PLOT_COLOR_BLUE)
|
||||
self.ax0.axvline(x=self.data.approximately_align_pos, color=Constants.PLOT_COLOR_BLACK, linestyle="--",
|
||||
label="Start Line")
|
||||
self.ax1.axvline(x=self.data.approximately_align_pos, color=Constants.PLOT_COLOR_BLACK, linestyle="--",
|
||||
label="Start Line")
|
||||
self.ax0.legend(loc=Constants.PLOT_UPPER_RIGHT)
|
||||
self.ax1.legend(loc=Constants.PLOT_UPPER_RIGHT)
|
||||
self.canvas.draw()
|
||||
@ -873,6 +885,7 @@ class Data:
|
||||
self.original_peak_y = None
|
||||
self.corrected_peak = None
|
||||
self.corrected_peak_y = None
|
||||
self.approximately_align_pos = None
|
||||
|
||||
def open_file(self):
|
||||
if (not Path(Config["Path"]["Input_Signal"]).exists()) or (not Path(Config["Path"]["Input_Peak"]).exists()):
|
||||
@ -888,6 +901,24 @@ class Data:
|
||||
except Exception:
|
||||
return Result().failure(info=Constants.INPUT_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Read_Data_Exception"])
|
||||
|
||||
try:
|
||||
df = read_csv(Config["Path"]["Input_Approximately_Align"])
|
||||
pos = df["pos"].values[-1]
|
||||
ApplyFrequency = df["ApplyFrequency"].values[-1]
|
||||
self.approximately_align_pos = int(pos * (Config["InputConfig"]["Freq"] / ApplyFrequency))
|
||||
if Config["Mode"] == "BCG":
|
||||
if self.approximately_align_pos > 0:
|
||||
self.approximately_align_pos = 0
|
||||
else:
|
||||
self.approximately_align_pos = - self.approximately_align_pos
|
||||
elif Config["Mode"] == "ECG":
|
||||
if self.approximately_align_pos < 0:
|
||||
self.approximately_align_pos = 0
|
||||
else:
|
||||
raise ValueError("模式不存在")
|
||||
except Exception:
|
||||
self.approximately_align_pos = 0
|
||||
|
||||
return Result().success(info=Constants.INPUT_FINISHED)
|
||||
|
||||
def get_archive(self):
|
||||
|
||||
@ -128,6 +128,9 @@ class SettingWindow(QMainWindow):
|
||||
"Input_Rpeak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_INPUT_RPEAK_FILENAME +
|
||||
ConfigParams.ENDSWITH_TXT))),
|
||||
"Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_APPROXIMATELY_ALIGNINFO_FILENAME +
|
||||
ConfigParams.ENDSWITH_CSV))),
|
||||
"Save_BCG_AlignInfo": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
|
||||
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_SAVE_BCG_ALIGNINFO_FILENAME +
|
||||
ConfigParams.ENDSWITH_TXT))),
|
||||
@ -203,6 +206,7 @@ class SettingWindow(QMainWindow):
|
||||
self.ui.plainTextEdit_file_path_input_Jpeak.setPlainText(Config["Path"]["Input_Jpeak"])
|
||||
self.ui.plainTextEdit_file_path_input_ECG.setPlainText(Config["Path"]["Input_ECG"])
|
||||
self.ui.plainTextEdit_file_path_input_Rpeak.setPlainText(Config["Path"]["Input_Rpeak"])
|
||||
self.ui.plainTextEdit_file_path_input_approximately_align.setPlainText(Config["Path"]["Input_Approximately_Align"])
|
||||
self.ui.plainTextEdit_file_path_save_BCG_AlignInfo.setPlainText(Config["Path"]["Save_BCG_AlignInfo"])
|
||||
self.ui.plainTextEdit_file_path_save_ECG_AlignInfo.setPlainText(Config["Path"]["Save_ECG_AlignInfo"])
|
||||
self.ui.plainTextEdit_file_path_save_orgBcg.setPlainText(Config["Path"]["Save_orgBcg"])
|
||||
@ -219,6 +223,7 @@ class SettingWindow(QMainWindow):
|
||||
Config["Path"]["Input_Jpeak"] = self.ui.plainTextEdit_file_path_input_Jpeak.toPlainText()
|
||||
Config["Path"]["Input_ECG"] = self.ui.plainTextEdit_file_path_input_ECG.toPlainText()
|
||||
Config["Path"]["Input_Rpeak"] = self.ui.plainTextEdit_file_path_input_Rpeak.toPlainText()
|
||||
Config["Path"]["Input_Approximately_Align"] = self.ui.plainTextEdit_file_path_input_approximately_align.toPlainText()
|
||||
Config["Path"]["Save_BCG_AlignInfo"] = self.ui.plainTextEdit_file_path_save_BCG_AlignInfo.toPlainText()
|
||||
Config["Path"]["Save_ECG_AlignInfo"] = self.ui.plainTextEdit_file_path_save_ECG_AlignInfo.toPlainText()
|
||||
Config["Path"]["Save_orgBcg"] = self.ui.plainTextEdit_file_path_save_orgBcg.toPlainText()
|
||||
@ -485,6 +490,19 @@ class MainWindow_precisely_align(QMainWindow):
|
||||
self.ax1.stem(Rpeak, plot_element["RRIVs"],
|
||||
markerfmt="C0.", linefmt=Constants.PLOT_COLOR_ORANGE,
|
||||
label=Constants.PRECISELY_ALIGN_PLOT_LABEL_RRIV)
|
||||
if self.data.BCG_early is True:
|
||||
self.ax0.axvline(x=self.data.approximately_align_pos, color=Constants.PLOT_COLOR_BLACK, linestyle="--",
|
||||
label="Start Line")
|
||||
self.ax1.axvline(x=0, color=Constants.PLOT_COLOR_BLACK, linestyle="--", label="Start Line")
|
||||
elif self.data.BCG_early is False:
|
||||
self.ax0.axvline(x=0, color=Constants.PLOT_COLOR_BLACK, linestyle="--", label="Start Line")
|
||||
self.ax1.axvline(x=self.data.approximately_align_pos, color=Constants.PLOT_COLOR_BLACK, linestyle="--",
|
||||
label="Start Line")
|
||||
else:
|
||||
self.ax0.axvline(x=self.data.approximately_align_pos, color=Constants.PLOT_COLOR_BLACK, linestyle="--", label="Start Line")
|
||||
self.ax1.axvline(x=self.data.approximately_align_pos, color=Constants.PLOT_COLOR_BLACK, linestyle="--",
|
||||
label="Start Line")
|
||||
|
||||
self.ax0.legend(loc=Constants.PLOT_UPPER_RIGHT)
|
||||
self.ax1.legend(loc=Constants.PLOT_UPPER_RIGHT)
|
||||
self.canvas.draw()
|
||||
@ -1139,7 +1157,7 @@ class MainWindow_precisely_align(QMainWindow):
|
||||
self.canvas.draw()
|
||||
self.ax4.autoscale(False)
|
||||
|
||||
PublicFunc.text_output(self.ui, Constants.LABEL_CHECK_RECOVER_SCALE, Constants.TIPS_TYPE_INFO)
|
||||
PublicFunc.text_output(self.ui, Constants.PRECISELY_ALIGN_RECOVER_SCALE, Constants.TIPS_TYPE_INFO)
|
||||
|
||||
def toggle_getRange(self, state):
|
||||
if state:
|
||||
@ -1307,25 +1325,25 @@ class MainWindow_precisely_align(QMainWindow):
|
||||
if self.figToolbar.ax0_BCG_rectangle_front is None and self.is_left_button_pressed:
|
||||
self.figToolbar.ax0_BCG_rectangle_front = patches.Rectangle((0, 0), 1, 1,
|
||||
fill=True,
|
||||
alpha=ConfigParams.LABEL_CHECK_LABEL_TRANSPARENCY,
|
||||
alpha=ConfigParams.PRECISELY_ALIGN_LABEL_TRANSPARENCY,
|
||||
color=Constants.PLOT_COLOR_PINK)
|
||||
self.ax0.add_patch(self.figToolbar.ax0_BCG_rectangle_front)
|
||||
if self.figToolbar.ax0_BCG_rectangle_back is None and self.is_left_button_pressed:
|
||||
self.figToolbar.ax0_BCG_rectangle_back = patches.Rectangle((0, 0), 1, 1,
|
||||
fill=True,
|
||||
alpha=ConfigParams.LABEL_CHECK_LABEL_TRANSPARENCY,
|
||||
alpha=ConfigParams.PRECISELY_ALIGN_LABEL_TRANSPARENCY,
|
||||
color=Constants.PLOT_COLOR_PINK)
|
||||
self.ax0.add_patch(self.figToolbar.ax0_BCG_rectangle_back)
|
||||
if self.figToolbar.ax1_ECG_rectangle_front is None and self.is_left_button_pressed:
|
||||
self.figToolbar.ax1_ECG_rectangle_front = patches.Rectangle((0, 0), 1, 1,
|
||||
fill=True,
|
||||
alpha=ConfigParams.LABEL_CHECK_LABEL_TRANSPARENCY,
|
||||
alpha=ConfigParams.PRECISELY_ALIGN_LABEL_TRANSPARENCY,
|
||||
color=Constants.PLOT_COLOR_PINK)
|
||||
self.ax1.add_patch(self.figToolbar.ax1_ECG_rectangle_front)
|
||||
if self.figToolbar.ax1_ECG_rectangle_back is None and self.is_left_button_pressed:
|
||||
self.figToolbar.ax1_ECG_rectangle_back = patches.Rectangle((0, 0), 1, 1,
|
||||
fill=True,
|
||||
alpha=ConfigParams.LABEL_CHECK_LABEL_TRANSPARENCY,
|
||||
alpha=ConfigParams.PRECISELY_ALIGN_LABEL_TRANSPARENCY,
|
||||
color=Constants.PLOT_COLOR_PINK)
|
||||
self.ax1.add_patch(self.figToolbar.ax1_ECG_rectangle_back)
|
||||
|
||||
@ -1391,6 +1409,8 @@ class Data:
|
||||
self.raw_ECG = None
|
||||
self.Rpeak = None
|
||||
self.Rpeak_y = None
|
||||
self.approximately_align_pos = None
|
||||
self.BCG_early = None
|
||||
|
||||
self.res_orgBcg = None
|
||||
self.res_BCG = None
|
||||
@ -1446,6 +1466,21 @@ class Data:
|
||||
except Exception:
|
||||
return Result().failure(info=Constants.INPUT_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Read_Data_Exception"])
|
||||
|
||||
try:
|
||||
df = read_csv(Config["Path"]["Input_Approximately_Align"])
|
||||
pos = df["pos"].values[-1]
|
||||
ApplyFrequency = df["ApplyFrequency"].values[-1]
|
||||
self.approximately_align_pos = int(pos * (Config["InputConfig"]["ECGFreq"] / ApplyFrequency))
|
||||
if self.approximately_align_pos > 0:
|
||||
self.BCG_early = False
|
||||
elif self.approximately_align_pos < 0:
|
||||
self.BCG_early = True
|
||||
else:
|
||||
self.approximately_align_pos = 0
|
||||
self.BCG_early = None
|
||||
except Exception:
|
||||
self.approximately_align_pos = 0
|
||||
|
||||
return Result().success(info=Constants.INPUT_FINISHED)
|
||||
|
||||
def data_process_for_calculate_correlation(self):
|
||||
|
||||
@ -142,6 +142,7 @@ class ConfigParams:
|
||||
LABEL_CHECK_INPUT_ECG_FILENAME: str = "ECG_Raw_"
|
||||
LABEL_CHECK_INPUT_RPEAK_FILENAME: str = "Rpeak_final"
|
||||
LABEL_CHECK_SAVE_RPEAK_FILENAME: str = "Rpeak_final_corrected"
|
||||
LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME: str = "Approximately_Align_Info"
|
||||
LABEL_CHECK_SAVE_CHUNK_SIZE: int = 100
|
||||
LABEL_CHECK_LABEL_TRANSPARENCY: float = 0.2
|
||||
LABEL_CHECK_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY: str = "Z"
|
||||
@ -165,9 +166,11 @@ class ConfigParams:
|
||||
PRECISELY_ALIGN_SAVE_ECG_FILENAME: str = "ECG_Sync_"
|
||||
PRECISELY_ALIGN_SAVE_JPEAK_FILENAME: str = "JPeak_Sync"
|
||||
PRECISELY_ALIGN_SAVE_RPEAK_FILENAME: str = "Rpeak_Sync"
|
||||
PRECISELY_ALIGN_APPROXIMATELY_ALIGNINFO_FILENAME: str = "Approximately_Align_Info"
|
||||
PRECISELY_ALIGN_ACTION_GET_RANGE_SHORTCUT_KEY: str = "Z"
|
||||
PRECISELY_ALIGN_SAVE_CHUNK_SIZE: int = 1000000
|
||||
PRECISELY_ALIGN_SAVE_PEAK_CHUNK_SIZE: int = 100
|
||||
PRECISELY_ALIGN_LABEL_TRANSPARENCY: float = 0.2
|
||||
|
||||
# 冗余数据切割和标签映射
|
||||
CUT_PSG_CONFIG_FILE_PATH: str = "./config/Config_cut_PSG.yaml"
|
||||
|
||||
@ -326,6 +326,7 @@ class Constants:
|
||||
PRECISELY_ALIGN_PLOT_LABEL_JPEAK: str = "peak_BCG"
|
||||
PRECISELY_ALIGN_PLOT_LABEL_SELECTED_POINT: str = "Selected Point"
|
||||
PRECISELY_ALIGN_NO_POINT_IN_THE_INTERVAL: str = "所选区间内无有效点"
|
||||
PRECISELY_ALIGN_RECOVER_SCALE: str = "尺度恢复"
|
||||
PRECISELY_ALIGN_ACTION_GET_RANGE_NAME: str = f"设置范围({ConfigParams.PRECISELY_ALIGN_ACTION_GET_RANGE_SHORTCUT_KEY})"
|
||||
|
||||
# 冗余数据切割和标签映射
|
||||
|
||||
Reference in New Issue
Block a user