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" ORGBCG_RAW: str = "OrgBCG_Raw_" 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_" BCG_FILTER: str = "BCG_Filter_" ECG_FILTER: str = "ECG_Filter_" JPEAK_REVISE: str = "Jpeak_revise_" 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" PRECISELY_ALIGN_INFO: str = "Precisely_Align_Info" ORGBCG_SYNC: str = "OrgBCG_Sync_" 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_" BCG_SYNC: str = "BCG_Sync_" ECG_SYNC: str = "ECG_Sync_" JPEAK_SYNC: str = "Jpeak_Sync_" RPEAK_SYNC: str = "Rpeak_Sync_" # 数据粗同步 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 } } APPROXIMATELY_ALIGN_INPUT_ORGBCG_FILENAME: str = "OrgBCG_Raw_" APPROXIMATELY_ALIGN_INPUT_THO_FILENAME: str = "Effort Tho_Raw_" APPROXIMATELY_ALIGN_INPUT_ABD_FILENAME: str = "Effort Abd_Raw_" APPROXIMATELY_ALIGN_SAVE_FILENAME: str = "Approximately_Align_Info" # 预处理 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 }, "CustomAutoplayArgs": { "MoveLength": 15000, "MaxRange": 60000, "MoveSpeed": 1000 } } ARTIFACT_LABEL_INPUT_ORGBCG_FILENAME: str = "OrgBCG_Sync_" ARTIFACT_LABEL_INPUT_BCG_FILENAME: str = "BCG_Sync_" ARTIFACT_LABEL_SAVE_FILENAME_A: str = "Artifact_a" ARTIFACT_LABEL_SAVE_FILENAME_B: str = "Artifact_b" ARTIFACT_LABEL_SAVE_FILENAME_C: str = "Artifact_c" ARTIFACT_LABEL_LABEL_TRANSPARENCY: float = 0.3 ARTIFACT_LABEL_ACTION_LABEL_ARTIFACT_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": 100, "FlowPFreq": 100, "SpO2Freq": 1, "PlotFreq": 100 }, "AddSecond": { "Front": 60, "Back": 60 } } SA_LABEL_INPUT_ORGBCG_FILENAME: str = "OrgBCG_Sync_" SA_LABEL_INPUT_THO_FILENAME: str = "Effort Tho_Sync_" SA_LABEL_INPUT_ABD_FILENAME: str = "Effort Abd_Sync_" SA_LABEL_INPUT_FLOWT_FILENAME: str = "Flow T_Sync_" SA_LABEL_INPUT_FLOWP_FILENAME: str = "Flow P_Sync_" SA_LABEL_INPUT_SPO2_FILENAME: str = "SpO2_Sync_" SA_LABEL_INPUT_ARTIFACT_FILENAME: str = "Artifact_a" SA_LABEL_INPUT_LABEL_FILENAME: str = "SA Label_Sync" SA_LABEL_SAVE_FILENAME: str = "SA Label_corrected" SA_LABEL_SAVE2_FILENAME: str = "SA Label_add" # TODO:弃用 # 通用 VALIDATOR_INTEGER = QIntValidator(-2**31, 2**31 - 1) VALIDATOR_DOUBLE = QDoubleValidator(-1e100, 1e100, 10) # 质量打标 BCG_QUALITY_LABEL_INPUT_BCG_FILENAME: str = "BCG_sync_" BCG_QUALITY_LABEL_INPUT_ARTIFACT_FILENAME: str = "Artifact_a" BCG_QUALITY_LABEL_SAVE_FILENAME: str = "SQ_label_" BCG_QUALITY_LABEL_INPUT_DEFAULT_FS: int = 1000 BCG_QUALITY_LABEL_SAVE_MODE_10S: str = "10s" BCG_QUALITY_LABEL_SAVE_MODE_30S: str = "30s" BCG_QUALITY_LABEL_MODE_10S_LENGTH = 10 * BCG_QUALITY_LABEL_INPUT_DEFAULT_FS BCG_QUALITY_LABEL_MODE_30S_LENGTH = 30 * BCG_QUALITY_LABEL_INPUT_DEFAULT_FS # 呼吸可用性及间期标注 RESP_QUALITY_LABEL_INPUT_XINXIAO_FILENAME: str = "orgBcg_sync_" RESP_QUALITY_LABEL_INPUT_THO_FILENAME: str = "Effort_Tho_sync_" RESP_QUALITY_LABEL_INPUT_ARTIFACT_FILENAME: str = "Artifact_a" RESP_QUALITY_LABEL_SAVE_RESP_QUALITY_LABNEL_FILENAME: str = "Resp_quality_label" RESP_QUALITY_LABEL_SAVE_THO_PEAK_FILENAME: str = "Tho_peak" RESP_QUALITY_LABEL_INPUT_XINXIAO_DEFAULT_FS: int = 1000 RESP_QUALITY_LABEL_INPUT_THO_DEFAULT_FS: int = 200 RESP_QUALITY_LABEL_PARTS_TIME_SEC: int = 30 RESP_QUALITY_LABEL_PREPROCESS_FC: int = 1 RESP_QUALITY_LABEL_THRESHOLD1_DEFAULT: float = 0.65 RESP_QUALITY_LABEL_THRESHOLD2_DEFAULT: float = 0.8 RESP_QUALITY_LABEL_FINDPEAKS_MIN_INTERVAL_DEFAULT: int = 300 RESP_QUALITY_LABEL_FINDPEAKS_MIN_HEIGHT_DEFAULT: float = 0.1 RESP_QUALITY_LABEL_CUSTOM_LOW_DEFAULT: float = 0.1 RESP_QUALITY_LABEL_CUSTOM_HIGH_DEFAULT: float = 1 RESP_QUALITY_LABEL_LABEL_TRANSPARENCY: float = 0.2 RESP_QUALITY_LABEL_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY: str = "Z" # 睡眠呼吸暂停事件打标 # 禁止实例化 def __new__(cls): raise TypeError("Constants class cannot be instantiated") # 禁止修改常量 @classmethod def __setattr__(cls, key, value): raise AttributeError("Cannot modify constants")