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