diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py index 1061583..9c94d2e 100644 --- a/func/utils/ConfigParams.py +++ b/func/utils/ConfigParams.py @@ -50,7 +50,7 @@ class ConfigParams: } } PREPROCESS_INPUT_BCG_FILENAME: str = "orgBcg_Raw_" - PREPROCESS_INPUT_ECG_FILENAME: str = "ECG I_Raw_" + PREPROCESS_INPUT_ECG_FILENAME: str = "ECG II_Raw_" PREPROCESS_SAVE_BCG_FILENAME: str = "BCG_Raw_" PREPROCESS_SAVE_ECG_FILENAME: str = "ECG_Raw_" PREPROCESS_SAVE_CHUNK_SIZE: int = 1000000 @@ -151,6 +151,12 @@ class ConfigParams: PRECISELY_ALIGN_SAVE_CHUNK_SIZE: int = 1000000 PRECISELY_ALIGN_SAVE_PEAK_CHUNK_SIZE: int = 100 + # 冗余数据切割和标签映射 + + CUT_PSG_CHANNEL_LIST: list = ["Effort Abd_Raw_", "Effort Tho_Raw_", "Flow Patient_Raw_", "Snore_Raw_", "SpO2_Raw_"] + CUT_PST_LABEL_LIST: list = ["5_class_Raw_", "SA Label_Raw"] + CUT_PST_STARTTIME: list = ["StartTime_Raw"] + # 体动标注 # TODO:弃用 diff --git a/ui/MainWindow/MainWindow_cut_PSG.py b/ui/MainWindow/MainWindow_cut_PSG.py new file mode 100644 index 0000000..bfca523 --- /dev/null +++ b/ui/MainWindow/MainWindow_cut_PSG.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'MainWindow_cut_PSG.ui' +## +## Created by: Qt User Interface Compiler version 6.8.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, + QCursor, QFont, QFontDatabase, QGradient, + QIcon, QImage, QKeySequence, QLinearGradient, + QPainter, QPalette, QPixmap, QRadialGradient, + QTransform) +from PySide6.QtWidgets import (QApplication, QGridLayout, QGroupBox, QHBoxLayout, + QLabel, QMainWindow, QPlainTextEdit, QProgressBar, + QPushButton, QSizePolicy, QSpacerItem, QStatusBar, + QTextBrowser, QVBoxLayout, QWidget) + +class Ui_MainWindow_cut_PSG(object): + def setupUi(self, MainWindow_cut_PSG): + if not MainWindow_cut_PSG.objectName(): + MainWindow_cut_PSG.setObjectName(u"MainWindow_cut_PSG") + MainWindow_cut_PSG.setEnabled(True) + MainWindow_cut_PSG.resize(540, 720) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow_cut_PSG.sizePolicy().hasHeightForWidth()) + MainWindow_cut_PSG.setSizePolicy(sizePolicy) + font = QFont() + font.setPointSize(12) + MainWindow_cut_PSG.setFont(font) + self.action_selectPath = QAction(MainWindow_cut_PSG) + self.action_selectPath.setObjectName(u"action_selectPath") + font1 = QFont() + font1.setFamilies([u"\u9ed1\u4f53"]) + font1.setPointSize(14) + self.action_selectPath.setFont(font1) + self.action = QAction(MainWindow_cut_PSG) + self.action.setObjectName(u"action") + self.action.setFont(font1) + self.centralwidget = QWidget(MainWindow_cut_PSG) + self.centralwidget.setObjectName(u"centralwidget") + self.gridLayout = QGridLayout(self.centralwidget) + self.gridLayout.setObjectName(u"gridLayout") + self.groupBox_3 = QGroupBox(self.centralwidget) + self.groupBox_3.setObjectName(u"groupBox_3") + font2 = QFont() + font2.setPointSize(10) + self.groupBox_3.setFont(font2) + self.gridLayout_2 = QGridLayout(self.groupBox_3) + self.gridLayout_2.setObjectName(u"gridLayout_2") + self.groupBox = QGroupBox(self.groupBox_3) + self.groupBox.setObjectName(u"groupBox") + self.verticalLayout_6 = QVBoxLayout(self.groupBox) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.textBrowser_info = QTextBrowser(self.groupBox) + self.textBrowser_info.setObjectName(u"textBrowser_info") + + self.verticalLayout_6.addWidget(self.textBrowser_info) + + + self.gridLayout_2.addWidget(self.groupBox, 1, 0, 1, 1) + + self.groupBox_2 = QGroupBox(self.groupBox_3) + self.groupBox_2.setObjectName(u"groupBox_2") + self.verticalLayout_5 = QVBoxLayout(self.groupBox_2) + self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.label_2 = QLabel(self.groupBox_2) + self.label_2.setObjectName(u"label_2") + self.label_2.setFont(font) + self.label_2.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) + + self.horizontalLayout.addWidget(self.label_2) + + self.plainTextEdit_channel = QPlainTextEdit(self.groupBox_2) + self.plainTextEdit_channel.setObjectName(u"plainTextEdit_channel") + + self.horizontalLayout.addWidget(self.plainTextEdit_channel) + + self.horizontalLayout.setStretch(0, 1) + self.horizontalLayout.setStretch(1, 1) + + self.verticalLayout_5.addLayout(self.horizontalLayout) + + self.horizontalLayout_6 = QHBoxLayout() + self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") + self.label_6 = QLabel(self.groupBox_2) + self.label_6.setObjectName(u"label_6") + self.label_6.setFont(font) + + self.horizontalLayout_6.addWidget(self.label_6) + + self.plainTextEdit_label = QPlainTextEdit(self.groupBox_2) + self.plainTextEdit_label.setObjectName(u"plainTextEdit_label") + + self.horizontalLayout_6.addWidget(self.plainTextEdit_label) + + self.horizontalLayout_6.setStretch(0, 1) + self.horizontalLayout_6.setStretch(1, 1) + + self.verticalLayout_5.addLayout(self.horizontalLayout_6) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_5.addItem(self.verticalSpacer) + + self.horizontalLayout_2 = QHBoxLayout() + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.label_show = QLabel(self.groupBox_2) + self.label_show.setObjectName(u"label_show") + self.label_show.setFont(font) + self.label_show.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) + + self.horizontalLayout_2.addWidget(self.label_show) + + + self.verticalLayout_5.addLayout(self.horizontalLayout_2) + + self.progressBar = QProgressBar(self.groupBox_2) + self.progressBar.setObjectName(u"progressBar") + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth()) + self.progressBar.setSizePolicy(sizePolicy1) + self.progressBar.setStyleSheet(u"") + self.progressBar.setValue(0) + + self.verticalLayout_5.addWidget(self.progressBar) + + self.verticalLayout_5.setStretch(0, 2) + self.verticalLayout_5.setStretch(1, 2) + self.verticalLayout_5.setStretch(2, 2) + self.verticalLayout_5.setStretch(3, 1) + self.verticalLayout_5.setStretch(4, 1) + + self.gridLayout_2.addWidget(self.groupBox_2, 0, 0, 1, 2) + + self.pushButton_execute = QPushButton(self.groupBox_3) + self.pushButton_execute.setObjectName(u"pushButton_execute") + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.pushButton_execute.sizePolicy().hasHeightForWidth()) + self.pushButton_execute.setSizePolicy(sizePolicy2) + self.pushButton_execute.setFont(font) + + self.gridLayout_2.addWidget(self.pushButton_execute, 1, 1, 1, 1) + + self.gridLayout_2.setRowStretch(0, 7) + self.gridLayout_2.setRowStretch(1, 3) + self.gridLayout_2.setColumnStretch(0, 4) + self.gridLayout_2.setColumnStretch(1, 1) + + self.gridLayout.addWidget(self.groupBox_3, 0, 0, 1, 1) + + self.gridLayout.setColumnStretch(0, 2) + MainWindow_cut_PSG.setCentralWidget(self.centralwidget) + self.statusbar = QStatusBar(MainWindow_cut_PSG) + self.statusbar.setObjectName(u"statusbar") + MainWindow_cut_PSG.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow_cut_PSG) + + QMetaObject.connectSlotsByName(MainWindow_cut_PSG) + # setupUi + + def retranslateUi(self, MainWindow_cut_PSG): + MainWindow_cut_PSG.setWindowTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"BCG\u7684J\u5cf0\u7b97\u6cd5\u5b9a\u4f4d", None)) + self.action_selectPath.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u6570\u636e\u8def\u5f84\u9009\u62e9", None)) + self.action.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u52a0\u8f7d\u5b58\u6863", None)) + self.groupBox_3.setTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"\u5197\u4f59\u6570\u636e\u5207\u5272\u548c\u6807\u7b7e\u6620\u5c04", None)) + self.groupBox.setTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"\u65e5\u5fd7", None)) + self.groupBox_2.setTitle(QCoreApplication.translate("MainWindow_cut_PSG", u"\u786e\u5b9a\u6570\u636e", None)) + self.label_2.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u9700\u8981\u5207\u5272\u7684\u901a\u9053\u540d\uff1a", None)) + self.label_6.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u9700\u8981\u6620\u5c04\u7684\u6807\u7b7e\uff1a", None)) + self.label_show.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u70b9\u51fb\u6267\u884c\u4ee5\u5f00\u59cb...", None)) + self.pushButton_execute.setText(QCoreApplication.translate("MainWindow_cut_PSG", u"\u6267\u884c", None)) + # retranslateUi + diff --git a/ui/MainWindow/MainWindow_cut_PSG.ui b/ui/MainWindow/MainWindow_cut_PSG.ui new file mode 100644 index 0000000..ae28df2 --- /dev/null +++ b/ui/MainWindow/MainWindow_cut_PSG.ui @@ -0,0 +1,202 @@ + + + MainWindow_cut_PSG + + + true + + + + 0 + 0 + 540 + 720 + + + + + 0 + 0 + + + + + 12 + + + + BCG的J峰算法定位 + + + + + + + + 10 + + + + 冗余数据切割和标签映射 + + + + + + 日志 + + + + + + + + + + + + 确定数据 + + + + + + + + + 12 + + + + 需要切割的通道名: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + + + + + + 12 + + + + 需要映射的标签: + + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + 12 + + + + 点击执行以开始... + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + 0 + 0 + + + + + + + 0 + + + + + + + + + + + 0 + 0 + + + + + 12 + + + + 执行 + + + + + + + + + + + + 数据路径选择 + + + + 黑体 + 14 + + + + + + 加载存档 + + + + 黑体 + 14 + + + + + + + diff --git a/数据结构化输入和输出命名规范.md b/数据结构化输入和输出命名规范.md index 3fe6cbd..15b7e8d 100644 --- a/数据结构化输入和输出命名规范.md +++ b/数据结构化输入和输出命名规范.md @@ -1,5 +1,62 @@ # 文件命名规范 +### 当一份数据被完整走完标注流程后,数据文件夹目录结构将会是: + +``` +.../Label/ + |-Artifact_a.txt + |-Artifact_b.txt + |-Artifact_c.csv + |-SQ_label_10s.csv + |-SQ_label_30s.csv + |-Resp_quality_label.txt + |-Tho_peak.txt + |-SA Label_corrected.csv + |-SA Label_add.csv` +.../OrgBCG_Aligned/ + |-Align_info.txt + |-BCG_Sync_采样率.txt + |-orgBcg_Sync_采样率.txt + |-Jpeak_Sync.txt +.../OrgBCG_Text/ + |-orgBcg_Raw_采样率.txt + |-BCG_Raw_采样率.txt + |-JPeak_revise.txt + |-JPeak_revise_corrected.txt +.../OrgBCG_Origin/ + |-... +.../PSG_Aligned/ + |-Align_info.txt + |-ECG_Sync_采样率.txt + |-Rpeak_Sync.txt + |-5_class_Sync_1.txt + |-SA Label_Sync.csv + |-Effort Abd_Sync_采样率.txt + |-Effort Tho_Sync_采样率.txt + |-Flow Patient_Sync_采样率.txt + |-Snore_Sync_采样率.txt + |-SpO2_Sync_采样率.txt +.../PSG_Text/ + |-Axxxxxxx.edf + |-ECG II_Raw_采样率.txt + |-ECG_Raw_采样率.txt + |-Rpeak_final.txt + |-Rpeak_final_corrected.txt + |-5_class_Raw_1.txt + |-SA Label_Raw.csv + |-Effort Abd_Raw_采样率.txt + |-Effort Tho_Raw_采样率.txt + |-Flow Patient_Raw_采样率.txt + |-Snore_Raw_采样率.txt + |-SpO2_Raw_采样率.txt +.../PSG_Origin/ + |-... +.../Receive_Origin + |-... +.../Report + |-... +``` + ### 1 数据粗同步 输入: @@ -16,7 +73,7 @@ 输入: 原始orgBcg信号:`./OrgBCG_Text//orgBcg_Raw_采样率.txt` -原始ECG信号:`./PSG_Text//ECG I_Raw_采样率.txt` +原始ECG信号:`./PSG_Text//ECG II_Raw_采样率.txt` 输出: @@ -25,22 +82,6 @@ ### 3 数据精同步 -输入: - -带通滤波BCG信号:`./OrgBCG_Text//BCG_Raw_采样率.txt` -滤波后的ECG信号:`./PSG_Text//ECG_Raw_采样率.txt` - -输出: - -PSG的对齐信息:`./PSG_Aligned//Align_info.txt` -同步后的ECG信号:`./PSG_Aligned//ECG_Sync_采样率.txt` -同步后的R峰坐标:`./PSG_Aligned//Rpeaks_Sync.txt` -同步后的其他PSG通道信号:`./PSG_Aligned//通道名_Sync_采样率.txt` -BCG的对齐信息:`./OrgBCG_Aligned//Align_info.txt` -同步后的BCG信号:`./OrgBCG_Aligned//BCG_Sync_采样率.txt` -同步后的orgBcg信号:`./OrgBCG_Aligned//orgBcg_Sync_采样率.txt` -同步后的J峰坐标:`./OrgBCG_Aligned//Jpeaks_Sync.txt` - #### 3.1 算法定位 #### 3.1.1 R峰算法定位 @@ -95,6 +136,7 @@ BCG的对齐信息:`./OrgBCG_Aligned//Align_info.txt` 人工纠正后的R峰坐标:`./PSG_Text//Rpeak_final_corrected.txt` 带通滤波BCG信号:`./OrgBCG_Text//BCG_Raw_采样率.txt` 人工纠正后的J峰坐标:`./OrgBCG_Text//JPeak_revise_corrected.txt` +原始orgBcg信号:`./OrgBCG_Text//orgBcg_Raw_采样率.txt` 输出: @@ -112,10 +154,15 @@ BCG的对齐信息:`./OrgBCG_Aligned//Align_info.txt` PSG的对齐信息:`./PSG_Aligned//Align_info.txt` BCG的对齐信息:`./OrgBCG_Aligned//Align_info.txt` +原始的其他PSG通道信号:`./PSG_Text//通道名_Raw_采样率.txt`(通道名包括:Effort Abd, Effort Tho, Flow Patient, Snore, SpO2) +原始的睡眠分期标签:`./PSG_Text//5_class_Raw_1.txt` +原始的睡眠呼吸暂停事件标签:`./PSG_Text//SA Label_Raw.csv` 输出: -同步后的其他PSG通道信号:`./PSG_Aligned//通道名_Sync_采样率.txt` +同步后的其他PSG通道信号:`./PSG_Aligned//通道名_Sync_采样率.txt`(通道名包括:Effort Abd, Effort Tho, Flow Patient, Snore, SpO2) +同步后的睡眠分期标签:`./PSG_Aligned//5_class_Sync_1.txt` +同步后的睡眠呼吸暂停事件标签:`./PSG_Aligned//SA Label_Sync.csv` ### 4 体动标记 @@ -145,12 +192,7 @@ txt格式的体动标签:`./Label//Artifact_a.txt` 输入: -同步后的ECG信号:`./PSG_Aligned//ECG_Sync_采样率.txt` -同步后的BCG信号:`./OrgBCG_Aligned//BCG_Sync_采样率.txt` -同步后的R峰坐标:`./PSG_Aligned//Rpeak_Sync.txt` -同步后的J峰坐标:`./OrgBCG_Aligned//Jpeak_Sync.txt` -txt格式的体动标签:`./Label//Artifact_a.txt` -质量标签:`./Label//SQ_label_10s.csv`或`./Label//SQ_label_30s.csv` +? 输出: @@ -161,7 +203,7 @@ txt格式的体动标签:`./Label//Artifact_a.txt` 输入: 同步后的orgBcg信号:`./OrgBCG_Aligned//orgBcg_Sync_采样率.txt` -同步后的THO信号:`./PSG_Aligned//Effort_Tho_Sync_采样率.txt` +同步后的THO信号:`./PSG_Aligned//Effort Tho_Sync_采样率.txt` txt格式的体动标签:`./Label//Artifact_a.txt` 输出: @@ -175,13 +217,14 @@ THO信号呼吸间期标签:`./Label//Tho_peak.txt` 同步后的orgBcg信号:`./OrgBCG_Aligned//orgBcg_Sync_采样率.txt` txt格式的体动标签:`./Label//Artifact_a.txt` -同步后的FlowT信号:`./PSG_Aligned//Effort_Tho_Sync_采样率.txt` -同步后的FlowP信号:`./PSG_Aligned//Effort_Tho_Sync_采样率.txt` -同步后的THO信号:`./PSG_Aligned//Effort_Tho_Sync_采样率.txt` -同步后的ABD信号:`./PSG_Aligned//Effort_Abd_Sync_采样率.txt` +同步后的FlowT信号:`./PSG_Aligned//Effort Tho_Sync_采样率.txt` +同步后的FlowP信号:`./PSG_Aligned//Effort Tho_Sync_采样率.txt` +同步后的THO信号:`./PSG_Aligned//Effort Tho_Sync_采样率.txt` +同步后的ABD信号:`./PSG_Aligned//Effort Abd_Sync_采样率.txt` 同步后的SpO2信号:`./PSG_Aligned//SpO2_Sync_采样率.txt` -原始呼吸暂停标签:`./PSG_`? +同步后的呼吸暂停标签:`./PSG_Aligned//SA Label_Sync.csv` 输出: -? \ No newline at end of file +修正后的呼吸暂停标签:`./Label//SA Label_corrected.csv` +新增的呼吸暂停标签:`./Label//SA Label_add.csv` \ No newline at end of file