from PySide6.QtGui import QIntValidator, QDoubleValidator from matplotlib.ticker import FuncFormatter class ConfigParams: # 公共 PUBLIC_CONFIG_FILE_PATH: str = "./config/Config_public.yaml" PUBLIC_PATH_ORGBCG_TEXT: str = "OrgBCG_Text" PUBLIC_PATH_PSG_TEXT: str = "PSG_Text" PUBLIC_PATH_ORGBCG_ALIGNED: str = "OrgBCG_Aligned" PUBLIC_PATH_PSG_ALIGNED: str = "PSG_Aligned" PUBLIC_PATH_LABEL: str = "Label" PUBLIC_CONFIG_NEW_CONTENT = { "Path": { "Root": "" } } UTF8_ENCODING: str = "utf-8" # 目前用到这个编码的地方: # 里的保存和读取csv文件的地方(注意的是,读取原始数据时依然使用UTF-8) GBK_ENCODING: str = "gbk" ENDSWITH_TXT: str = ".txt" ENDSWITH_CSV: str = ".csv" ENDSWITH_EDF: str = ".edf" FORMATTER = FuncFormatter(lambda x, p: f"{x:.0f}") ACTION_PAN_SHORTCUT_KEY: str = "X" ACTION_ZOOM_SHORTCUT_KEY: str = "C" FONT: str = "Microsoft YaHei UI" VALIDATOR_INTEGER = QIntValidator(-2**31, 2**31 - 1) VALIDATOR_DOUBLE = QDoubleValidator(-1e100, 1e100, 10) # 文件命名 # Folder: OrgBCG_Text ORGBCG_RAW: str = "OrgBCG_Raw_" BCG_FILTER: str = "BCG_Filter_" JPEAK_REVISE: str = "Jpeak_revise_" JPEAK_REVISE_CORRECTED: str = "Jpeak_revise_corrected_" # Folder: PSG_Text ECG_RAW: str = "ECG II_Raw_" THO_RAW: str = "Effort Tho_Raw_" ABD_RAW: str = "Effort Abd_Raw_" FLOWT_RAW: str = "Flow T_Raw_" FLOWP_RAW: str = "Flow P_Raw_" SNORE_RAW: str = "Snore_Raw_" SPO2_RAW: str = "SpO2_Raw_" FIVE_CLASS_RAW: str = "5_class_Raw_" STARTTIME_RAW: str = "StartTime_Raw" SA_LABEL_RAW: str = "SA Label_Raw" ECG_FILTER: str = "ECG_Filter_" RPEAK_FINAL: str = "Rpeak_final_" RPEAK_FINAL_CORRECTED: str = "Rpeak_final_corrected_" # Folder: OrgBCG_Aligned ORGBCG_SYNC: str = "OrgBCG_Sync_" BCG_SYNC: str = "BCG_Sync_" # Folder: PSG_Aligned ECG_SYNC: str = "ECG_Sync_" THO_SYNC: str = "Effort Tho_Sync_" ABD_SYNC: str = "Effort Abd_Sync_" FLOWT_SYNC: str = "Flow T_Sync_" FLOWP_SYNC: str = "Flow P_Sync_" SNORE_SYNC: str = "Snore_Sync_" SPO2_SYNC: str = "SpO2_Sync_" FIVE_CLASS_SYNC: str = "5_class_Sync_" SA_LABEL_SYNC: str = "SA Label_Sync" JPEAK_SYNC: str = "Jpeak_Sync_" RPEAK_SYNC: str = "Rpeak_Sync_" # Folder: Label APPROXIMATELY_ALIGN_INFO: str = "Approximately_Align_Info" PRECISELY_ALIGN_INFO: str = "Precisely_Align_Info" ARTIFACT_A: str = "Artifact_a_" ARTIFACT_B: str = "Artifact_b_" ARTIFACT_C: str = "Artifact_c_" SA_LABEL_CORRECTED: str = "SA Label_corrected" SA_LABEL_ADD: str = "SA Label_add" RESP_QUALITY_LABEL: str = "Resp_quality_label" THO_PEAK: str = "Tho_peak_" SQ_LABEL_10S: str = "SQ_label_10s" SQ_LABEL_30S: str = "SQ_label_30s" # 数据粗同步 APPROXIMATELY_ALIGN_CONFIG_FILE_PATH: str = "./config/Config_approximately_align.yaml" APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "orgBcgFreq": 1000, "ThoFreq": 100, "AbdFreq": 100 }, "ApplyFrequency": 5, "TempFrequency": 100, "Filter": { "BandPassOrder": 4, "BandPassLow": 0.01, "BandPassHigh": 0.7 }, "Multiple_Factor":100, "CorrByEpoch": { "window_epoch": 6 } } # 预处理 PREPROCESS_CONFIG_FILE_PATH: str = "./config/Config_preprocess.yaml" PREPROCESS_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "Freq": 1000 }, "OutputConfig": { "Freq": 1000 }, "Filter": { "BCGBandPassOrder": 4, "BCGBandPassLow": 2, "BCGBandPassHigh": 10, "ECGBandPassOrder": 3, "ECGBandPassLow": 1, "ECGBandPassHigh": 25 } } PREPROCESS_SAVE_CHUNK_SIZE: int = 1000000 # BCG的J峰算法定位 DETECT_JPEAK_CONFIG_FILE_PATH: str = "./config/Config_detect_Jpeak.yaml" DETECT_JPEAK_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "Freq": 1000 }, "Filter": { "BandPassLow": 2, "BandPassHigh": 10 }, "ModelFolderPath": "./func/detect_Jpeak_model", "PeaksValue": 100, "AmpValue": 5, "IntervalLow": 50, "IntervalHigh": 140, "UseCPU": False, "DetectMethod": "" } DETECT_JPEAK_SAVE_CHUNK_SIZE: int = 100 # ECG的R峰算法定位 DETECT_RPEAK_CONFIG_FILE_PATH: str = "./config/Config_detect_Rpeak.yaml" DETECT_RPEAK_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "Freq": 1000 }, "Filter": { "BandPassLow": 2, "BandPassHigh": 15 }, "PeaksValue": 200, "DetectMethod": "" } DETECT_RPEAK_SAVE_CHUNK_SIZE: int = 100 # 人工纠正 LABEL_CHECK_CONFIG_FILE_PATH: str = "./config/Config_label_check.yaml" LABEL_CHECK_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "Freq": 1000 }, "Filter": { "BCGBandPassOrder": 2, "BCGBandPassLow": 2, "BCGBandPassHigh": 10, "ECGBandPassOrder": 2, "ECGBandPassLow": 2, "ECGBandPassHigh": 15 }, "FindPeaks" : { "MinInterval": 1000, "MinHeight": 0.5 }, "CustomAutoplayArgs": { "MoveLength": 15000, "MaxRange": 60000, "MoveSpeed": 1000 } } LABEL_CHECK_SAVE_CHUNK_SIZE: int = 100 LABEL_CHECK_LABEL_TRANSPARENCY: float = 0.2 LABEL_CHECK_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY: str = "Z" # 数据精同步 PRECISELY_ALIGN_CONFIG_FILE_PATH: str = "./config/Config_precisely_align.yaml" PRECISELY_ALIGN_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "orgBcgFreq": 1000, "BCGFreq": 1000, "ECGFreq": 1000, "UseFreq": 1000 } } 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" CUT_PSG_CONFIG_NEW_CONTENT: dict = { "ECGFreq": 1000, "ChannelInput": { "Effort Tho": THO_RAW, "Effort Abd": ABD_RAW, "Flow T": FLOWT_RAW, "Flow P": FLOWP_RAW, "Snore": SNORE_RAW, "SpO2": SPO2_RAW, "5_class": FIVE_CLASS_RAW }, "LabelInput": { "SA Label": SA_LABEL_RAW }, "StartTime": STARTTIME_RAW, "ChannelSave": { "Effort Tho": THO_SYNC, "Effort Abd": ABD_SYNC, "Flow T": FLOWT_SYNC, "Flow P": FLOWP_SYNC, "Snore": SNORE_SYNC, "SpO2": SPO2_SYNC, "5_class": FIVE_CLASS_SYNC }, "LabelSave": { "SA Label": SA_LABEL_SYNC }, "EndWith": { "Effort Tho": ENDSWITH_TXT, "Effort Abd": ENDSWITH_TXT, "Flow T": ENDSWITH_TXT, "Flow P": ENDSWITH_TXT, "Flow Patient": ENDSWITH_TXT, "Snore": ENDSWITH_TXT, "SpO2": ENDSWITH_TXT, "5_class": ENDSWITH_TXT, "SA Label": ENDSWITH_CSV, "StartTime": ENDSWITH_TXT }, } CUT_PSG_SALABEL_EVENT: list = ["Hypopnea", "Central apnea", "Obstructive apnea", "Mixed apnea"] # 体动标注 ARTIFACT_LABEL_CONFIG_FILE_PATH: str = "./config/Config_artifact_label.yaml" ARTIFACT_LABEL_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "orgBcgFreq": 1000, "BCGFreq": 1000, "UseFreq": 1000 }, "CustomAutoplayArgs": { "MoveLength": 15000, "MaxRange": 60000, "MoveSpeed": 1000 } } ARTIFACT_LABEL_LABEL_TRANSPARENCY: float = 0.3 ARTIFACT_LABEL_ACTION_LABEL_ARTIFACT_SHORTCUT_KEY: str = "Z" # BCG的质量标注 BCG_QUALITY_LABEL_CONFIG_FILE_PATH: str = "./config/Config_bcg_quality_label.yaml" BCG_QUALITY_LABEL_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "BCGFreq": 1000, "UseFreq": 1000 } } BCG_QUALITY_LABEL_BTN_PREV_SHORTCUT_KEY: str = "A" BCG_QUALITY_LABEL_BTN_NEXT_SHORTCUT_KEY: str = "D" # 呼吸可用性及间期标注 RESP_QUALITY_LABEL_CONFIG_FILE_PATH: str = "./config/Config_resp_quality_label.yaml" RESP_QUALITY_LABEL_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "OrgBCGFreq": 1000, "ThoFreq": 100, "OrgBCGUseFreq": 1000, "ThoUseFreq": 100 }, "Threshold": { "Low": 0.65, "High": 0.8 }, "FindPeaks" : { "MinInterval": 300, "MinHeight": 0.1 }, "Filter": { "BandPassLow": 0.1, "BandPassHigh": 1 } } RESP_QUALITY_LABEL_PREPROCESS_FC: int = 1 RESP_QUALITY_LABEL_PARTS_TIME_SEC: int = 30 RESP_QUALITY_LABEL_LABEL_TRANSPARENCY: float = 0.2 RESP_QUALITY_LABEL_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY: str = "Z" # 睡眠呼吸暂停事件标注 SA_LABEL_CONFIG_FILE_PATH: str = "./config/Config_SA_label.yaml" SA_LABEL_CONFIG_NEW_CONTENT: dict = { "InputConfig": { "OrgBCGFreq": 1000, "ThoFreq": 100, "AbdFreq": 100, "FlowTFreq": 10, "FlowPFreq": 100, "SpO2Freq": 1, "PlotFreq": 100 }, "AddSecond": { "Front": 60, "Back": 60 } } SA_LABEL_TRANSPARENCY: float = 0.05 SA_LABEL_BTN_PREV_SHORTCUT_KEY: str = "A" SA_LABEL_BTN_NEXT_SHORTCUT_KEY: str = "D" SA_LABEL_BTN_CONFIRMLABEL_SHORTCUT_KEY: str = "S" SA_LABEL_BTN_QUICK_REMARK_WAITINGFORTALK_SHORTCUT_KEY: str = "J" SA_LABEL_RADIOBUTTON_OSA_SHORTCUT_KEY: str = "1" SA_LABEL_RADIOBUTTON_CSA_SHORTCUT_KEY: str = "2" SA_LABEL_RADIOBUTTON_MSA_SHORTCUT_KEY: str = "3" SA_LABEL_RADIOBUTTON_HPY_SHORTCUT_KEY: str = "4" SA_LABEL_RADIOBUTTON_1_CLASS_SHORTCUT_KEY: str = "U" SA_LABEL_RADIOBUTTON_2_CLASS_SHORTCUT_KEY: str = "I" SA_LABEL_RADIOBUTTON_3_CLASS_SHORTCUT_KEY: str = "O" # 禁止实例化 def __new__(cls): raise TypeError("Constants class cannot be instantiated") # 禁止修改常量 @classmethod def __setattr__(cls, key, value): raise AttributeError("Cannot modify constants")