From d2e0a61056c875f0530375697c58de64e8aa68ff Mon Sep 17 00:00:00 2001 From: Yorusora <2944763079@qq.com> Date: Tue, 20 May 2025 17:31:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96<=E4=BA=BA=E5=B7=A5=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3>=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_label_check.py | 89 ++++++++++++++++++++++++-------------- func/utils/ConfigParams.py | 1 + func/utils/Constants.py | 70 +++++++++++++++--------------- 3 files changed, 92 insertions(+), 68 deletions(-) diff --git a/func/Module_label_check.py b/func/Module_label_check.py index 6149004..d3ac375 100644 --- a/func/Module_label_check.py +++ b/func/Module_label_check.py @@ -84,18 +84,13 @@ class SettingWindow(QMainWindow): Config.update({ "Path": { "Input_Signal": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / - Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_BCG_FILENAME + - str(Config["InputConfig"]["Freq"]) + - ConfigParams.ENDSWITH_TXT))), + Path(str(self.sampID)))), "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))), + Path(str(self.sampID)))), "Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL / - Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME + - ConfigParams.ENDSWITH_CSV))), + Path(str(self.sampID)))), "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))) + Path(str(self.sampID)))) }, "Mode": self.mode }) @@ -103,18 +98,13 @@ class SettingWindow(QMainWindow): Config.update({ "Path": { "Input_Signal": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / - Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_ECG_FILENAME + - str(Config["InputConfig"]["Freq"]) + - ConfigParams.ENDSWITH_TXT))), + Path(str(self.sampID)))), "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))), + Path(str(self.sampID)))), "Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL / - Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME + - ConfigParams.ENDSWITH_CSV))), + Path(str(self.sampID)))), "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))) + Path(str(self.sampID)))) }, "Mode": self.mode }) @@ -173,7 +163,7 @@ class SettingWindow(QMainWindow): str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / Path(str(self.sampID)) / - Path(ConfigParams.LABEL_CHECK_INPUT_BCG_FILENAME + + Path(ConfigParams.BCG_FILTER + str(self.ui.spinBox_input_freq_signal.value()) + ConfigParams.ENDSWITH_TXT)))) elif self.mode == "ECG": @@ -181,7 +171,7 @@ class SettingWindow(QMainWindow): str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / Path(str(self.sampID)) / - Path(ConfigParams.LABEL_CHECK_INPUT_ECG_FILENAME + + Path(ConfigParams.ECG_FILTER + str(self.ui.spinBox_input_freq_signal.value()) + ConfigParams.ENDSWITH_TXT)))) else: @@ -402,7 +392,7 @@ class MainWindow_label_check(QMainWindow): def __update_tableWidget_and_info__(self): if self.data.original_peak is None or self.data.corrected_peak is None: - return False, Constants.LABEL_CHECK_FAILURE_REASON["Peak_Not_Exist"] + return False, Constants.FAILURE_REASON["Data_Not_Exist"] try: self.ui.tableWidget_peak_original.setRowCount(len(self.data.original_peak)) @@ -457,7 +447,7 @@ class MainWindow_label_check(QMainWindow): PublicFunc.text_output(self.ui, "(1/6)" + result.info, Constants.TIPS_TYPE_INFO) # 获取存档 - PublicFunc.progressbar_update(self, 2, 6, Constants.LABEL_CHECK_LOADING_ARCHIVE, 20) + PublicFunc.progressbar_update(self, 2, 6, Constants.LOADING_ARCHIVE, 20) result = self.data.get_archive() if not result.status: PublicFunc.text_output(self.ui, "(2/6)" + result.info, Constants.TIPS_TYPE_ERROR) @@ -468,7 +458,7 @@ class MainWindow_label_check(QMainWindow): PublicFunc.text_output(self.ui, "(2/6)" + result.info, Constants.TIPS_TYPE_INFO) # 数据预处理 - PublicFunc.progressbar_update(self, 3, 6, Constants.LABEL_CHECK_PROCESSING_DATA, 30) + PublicFunc.progressbar_update(self, 3, 6, Constants.PREPROCESSING_DATA, 30) result = self.data.preprocess() if not result.status: PublicFunc.text_output(self.ui, "(3/6)" + result.info, Constants.TIPS_TYPE_ERROR) @@ -889,8 +879,40 @@ class Data: self.approximately_align_pos = None def open_file(self): + if Config["Mode"] == "BCG": + signal = ConfigParams.BCG_FILTER + peak = ConfigParams.JPEAK_REVISE + save = ConfigParams.JPEAK_REVISE_CORRECTED + elif Config["Mode"] == "ECG": + signal = ConfigParams.ECG_FILTER + peak = ConfigParams.RPEAK_FINAL + save = ConfigParams.RPEAK_FINAL_CORRECTED + else: + raise ValueError("模式不存在") + if Path(Config["Path"]["Input_Signal"]).is_file(): + Config["Path"]["Input_Signal"] = str(Path(Config["Path"]["Input_Signal"]).parent) + if Path(Config["Path"]["Input_Peak"]).is_file(): + Config["Path"]["Input_Peak"] = str(Path(Config["Path"]["Input_Peak"]).parent) + if Path(Config["Path"]["Input_Approximately_Align"]).is_file(): + Config["Path"]["Input_Approximately_Align"] = str(Path(Config["Path"]["Input_Approximately_Align"]).parent) + if Path(Config["Path"]["Save"]).is_file(): + Config["Path"]["Save"] = str(Path(Config["Path"]["Save"]).parent) + + result = PublicFunc.examine_file(Config["Path"]["Input_Signal"], signal) + if result.status: + Config["Path"]["Input_Signal"] = result.data["path"] + Config["Path"]["Input_Peak"] = str( + Path(Config["Path"]["Input_Peak"]) / Path(peak + str(Config["InputConfig"]["Freq"]) + ConfigParams.ENDSWITH_TXT)) + Config["InputConfig"]["Freq"] = result.data["freq"] + Config["Path"]["Input_Approximately_Align"] = str( + Path(Config["Path"]["Input_Approximately_Align"]) / Path(ConfigParams.APPROXIMATELY_ALIGN_INFO + ConfigParams.ENDSWITH_CSV)) + Config["Path"]["Save"] = str( + Path(Config["Path"]["Save"]) / Path(save + str(Config["InputConfig"]["Freq"]) + ConfigParams.ENDSWITH_TXT)) + else: + return result + if (not Path(Config["Path"]["Input_Signal"]).exists()) or (not Path(Config["Path"]["Input_Peak"]).exists()): - return Result().failure(info=Constants.INPUT_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Data_Path_Not_Exist"]) + return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Path_Not_Exist"]) try: self.raw_data = read_csv(Config["Path"]["Input_Signal"], @@ -900,7 +922,8 @@ class Data: encoding=ConfigParams.UTF8_ENCODING, header=None).to_numpy().reshape(-1) except Exception as e: - return Result().failure(info=Constants.INPUT_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Read_Data_Exception"] + "\n" + format_exc()) + return Result().failure(info=Constants.INPUT_FAILURE + + Constants.FAILURE_REASON["Open_Data_Exception"] + "\n" + format_exc()) try: df = read_csv(Config["Path"]["Input_Approximately_Align"]) @@ -925,16 +948,16 @@ class Data: def get_archive(self): if not Path(Config["Path"]["Save"]).exists(): self.corrected_peak = self.original_peak - return Result().success(info=Constants.LABEL_CHECK_ARCHIVE_NOT_EXIST) + return Result().success(info=Constants.ARCHIVE_NOT_EXIST) else: self.corrected_peak = read_csv(Config["Path"]["Save"], encoding=ConfigParams.UTF8_ENCODING, header=None).to_numpy().reshape(-1) - return Result().success(info=Constants.LABEL_CHECK_ARCHIVE_EXIST) + return Result().success(info=Constants.ARCHIVE_EXIST) def preprocess(self): if self.raw_data is None: - return Result().failure(info=Constants.LABEL_CHECK_PROCESS_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Raw_Data_Not_Exist"]) + return Result().failure(info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if Config["Mode"] == "BCG": @@ -954,18 +977,20 @@ class Data: self.original_peak_y = [self.processed_data[x] for x in self.original_peak] self.corrected_peak_y = [self.processed_data[x] for x in self.corrected_peak] except Exception as e: - return Result().failure(info=Constants.LABEL_CHECK_PROCESS_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Filter_Exception"] + "\n" + format_exc()) + return Result().failure(info=Constants.PREPROCESS_FAILURE + + Constants.FAILURE_REASON["Preprocess_Exception"] + "\n" + format_exc()) - return Result().success(info=Constants.LABEL_CHECK_PROCESS_FINISHED) + return Result().success(info=Constants.PREPROCESS_FINISHED) def save(self, chunk): if self.corrected_peak is None: - return Result().failure(info=Constants.SAVING_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Peak_Not_Exist"]) + return Result().failure(info=Constants.SAVING_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: chunk.to_csv(Config["Path"]["Save"], mode='a', index=False, header=False) except Exception as e: - return Result().failure(info=Constants.SAVING_FAILURE + Constants.LABEL_CHECK_FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) + return Result().failure(info=Constants.SAVING_FAILURE + + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.SAVING_FINISHED) diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py index 26c72ca..2b8ffc7 100644 --- a/func/utils/ConfigParams.py +++ b/func/utils/ConfigParams.py @@ -40,6 +40,7 @@ class ConfigParams: RPEAK_FINAL: str = "Rpeak_final_" JPEAK_REVISE_CORRECTED: str = "Jpeak_revise_corrected_" RPEAK_FINAL_CORRECTED: str = "Rpeak_final_corrected_" + APPROXIMATELY_ALIGN_INFO: str = "Approximately_Align_Info" diff --git a/func/utils/Constants.py b/func/utils/Constants.py index 6c2df27..c730311 100644 --- a/func/utils/Constants.py +++ b/func/utils/Constants.py @@ -27,6 +27,10 @@ class Constants: RESAMPLE_FINISHED: str = "重采样完成" RESAMPLE_FAILURE: str = "重采样失败" + LOADING_ARCHIVE: str = "正在获取历史存档" + ARCHIVE_EXIST: str = "找到历史存档,成功读取" + ARCHIVE_NOT_EXIST: str = "未找到历史存档,创建新存档" + DRAWING_DATA: str = "正在绘制图形" DRAWING_FINISHED: str = "绘制完成" DRAWING_FAILURE: str = "绘制失败" @@ -149,6 +153,36 @@ class Constants: DETECT_RPEAK_PLOT_LABEL_R_PEAKS: str = "R_Peaks" DETECT_RPEAK_PLOT_LABEL_INTERVAL: str = "Interval" + # 人工纠正 + LABEL_CHECK_FAILURE_REASON = { + "Data_Path_Not_Exist": "(数据路径不存在)", + "Read_Data_Exception": "(读取数据异常)", + "Raw_Data_Not_Exist": "(原始数据不存在)", + "Filter_Exception": "(滤波器异常)", + "Processed_Data_Not_Exist": "(处理后数据不存在)", + "Peak_Not_Exist": "(峰值不存在)", + "Save_Exception": "(保存异常)" + } + + LABEL_CHECK_PLOT_LABEL_SIGNAL: str = "Data_Processed" + LABEL_CHECK_PLOT_LABEL_PEAK_ORIGINAL: str = "Peaks_Original" + LABEL_CHECK_PLOT_LABEL_PEAK_CORRECTED: str = "Peaks_Corrected" + LABEL_CHECK_PREV_MOVE: str = "向前移动" + LABEL_CHECK_NEXT_MOVE: str = "向后移动" + LABEL_CHECK_PAUSE: str = "暂停移动" + LABEL_CHECK_SWITCH_PRESET_1: str = "变更为预设1" + LABEL_CHECK_SWITCH_PRESET_2: str = "变更为预设2" + LABEL_CHECK_SWITCH_PRESET_3: str = "变更为预设3" + LABEL_CHECK_SWITCH_CUSTOM: str = "变更为自定义,请注意,自定义的参数未经校验,过大或过小的参数可能导致程序异常" + LABEL_CHECK_JUMP_X_INDEX: str = "跳转到x坐标: " + LABEL_CHECK_RECOVER_SCALE: str = "尺度恢复" + LABEL_CHECK_ADD_POINTS_SUCCESSFULLY: str = "成功新增点,横坐标:" + LABEL_CHECK_REMOVE_POINTS_SUCCESSFULLY: str = "成功删除点,横坐标:" + LABEL_CHECK_NO_POINT_IN_THE_INTERVAL: str = "所选区间内无新增或删除点" + LABEL_CHECK_ACTION_LABEL_MULTIPLE_NAME: str = f"批量更改标签({ConfigParams.LABEL_CHECK_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY})" + + + # 数据粗同步 APPROXIMATELY_ONLY_ALIGN_RESAMPLING: str = "正在仅重采样" APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FINISHED: str = "仅重采样完成" @@ -211,42 +245,6 @@ class Constants: "Save_Exception": "(保存异常)" } - # 人工纠正 - LABEL_CHECK_PROCESSING_DATA: str = "正在处理数据" - LABEL_CHECK_PROCESS_FINISHED: str = "处理完成" - LABEL_CHECK_PROCESS_FAILURE: str = "处理失败" - - LABEL_CHECK_LOADING_ARCHIVE: str = "正在获取历史存档" - LABEL_CHECK_ARCHIVE_EXIST: str = "找到历史存档,成功读取" - LABEL_CHECK_ARCHIVE_NOT_EXIST: str = "未找到历史存档,创建新存档" - - LABEL_CHECK_FAILURE_REASON = { - "Data_Path_Not_Exist": "(数据路径不存在)", - "Read_Data_Exception": "(读取数据异常)", - "Raw_Data_Not_Exist": "(原始数据不存在)", - "Filter_Exception": "(滤波器异常)", - "Processed_Data_Not_Exist": "(处理后数据不存在)", - "Peak_Not_Exist": "(峰值不存在)", - "Save_Exception": "(保存异常)" - } - - LABEL_CHECK_PLOT_LABEL_SIGNAL: str = "Data_Processed" - LABEL_CHECK_PLOT_LABEL_PEAK_ORIGINAL: str = "Peaks_Original" - LABEL_CHECK_PLOT_LABEL_PEAK_CORRECTED: str = "Peaks_Corrected" - LABEL_CHECK_PREV_MOVE: str = "向前移动" - LABEL_CHECK_NEXT_MOVE: str = "向后移动" - LABEL_CHECK_PAUSE: str = "暂停移动" - LABEL_CHECK_SWITCH_PRESET_1: str = "变更为预设1" - LABEL_CHECK_SWITCH_PRESET_2: str = "变更为预设2" - LABEL_CHECK_SWITCH_PRESET_3: str = "变更为预设3" - LABEL_CHECK_SWITCH_CUSTOM: str = "变更为自定义,请注意,自定义的参数未经校验,过大或过小的参数可能导致程序异常" - LABEL_CHECK_JUMP_X_INDEX: str = "跳转到x坐标: " - LABEL_CHECK_RECOVER_SCALE: str = "尺度恢复" - LABEL_CHECK_ADD_POINTS_SUCCESSFULLY: str = "成功新增点,横坐标:" - LABEL_CHECK_REMOVE_POINTS_SUCCESSFULLY: str = "成功删除点,横坐标:" - LABEL_CHECK_NO_POINT_IN_THE_INTERVAL: str = "所选区间内无新增或删除点" - LABEL_CHECK_ACTION_LABEL_MULTIPLE_NAME: str = f"批量更改标签({ConfigParams.LABEL_CHECK_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY})" - # 数据精同步 PRECISELY_ALIGN_PROCESSING_DATA: str = "正在处理数据" PRECISELY_ALIGN_PROCESS_FINISHED: str = "处理完成"