From f5386bb0b3a49697e64fa85270e42c930401ac64 Mon Sep 17 00:00:00 2001 From: Yorusora <2944763079@qq.com> Date: Thu, 9 Jan 2025 13:59:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=89=80=E6=9C=89?= =?UTF-8?q?=E4=BD=BF=E7=94=A8PSG=5Flabel=E7=9A=84=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=8C=E6=89=80=E6=9C=89=E6=A0=87=E7=AD=BE=E5=B0=86=E4=BB=85?= =?UTF-8?q?=E4=BD=BF=E7=94=A8BCG=5Flabel=E8=BF=9B=E8=A1=8C=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E3=80=82PSG=5Flabel=5F2=5FBCG=5Flabel=E5=9C=A8?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E5=8F=AF=E6=95=B4=E5=90=88=E5=88=B0=E4=B8=BB?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=B8=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainWindow.py | 334 ++++++++++++------------ MainWindow.ui | 504 +++++++++++++++++------------------- Main_Quality_Relabel_GUI.py | 177 +++---------- PSG_label_2_BCG_label.py | 48 ++++ 4 files changed, 483 insertions(+), 580 deletions(-) create mode 100644 PSG_label_2_BCG_label.py diff --git a/MainWindow.py b/MainWindow.py index 68053cc..117eab9 100644 --- a/MainWindow.py +++ b/MainWindow.py @@ -255,80 +255,6 @@ class Ui_MainWindow(object): self.groupBox_4.setObjectName("groupBox_4") self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_4) self.gridLayout_2.setObjectName("gridLayout_2") - self.lineEdit_remark = QtWidgets.QLineEdit(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lineEdit_remark.sizePolicy().hasHeightForWidth()) - self.lineEdit_remark.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.lineEdit_remark.setFont(font) - self.lineEdit_remark.setObjectName("lineEdit_remark") - self.gridLayout_2.addWidget(self.lineEdit_remark, 5, 2, 1, 3) - self.pushButton_left = QtWidgets.QPushButton(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.pushButton_left.sizePolicy().hasHeightForWidth()) - self.pushButton_left.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.pushButton_left.setFont(font) - self.pushButton_left.setObjectName("pushButton_left") - self.gridLayout_2.addWidget(self.pushButton_left, 15, 0, 1, 1) - self.lineEdit_correctStart = QtWidgets.QLineEdit(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lineEdit_correctStart.sizePolicy().hasHeightForWidth()) - self.lineEdit_correctStart.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.lineEdit_correctStart.setFont(font) - self.lineEdit_correctStart.setObjectName("lineEdit_correctStart") - self.gridLayout_2.addWidget(self.lineEdit_correctStart, 7, 2, 1, 3) - self.label_correctStart = QtWidgets.QLabel(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_correctStart.sizePolicy().hasHeightForWidth()) - self.label_correctStart.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.label_correctStart.setFont(font) - self.label_correctStart.setObjectName("label_correctStart") - self.gridLayout_2.addWidget(self.label_correctStart, 7, 0, 1, 1) - self.checkBox_examineLabeled = QtWidgets.QCheckBox(self.groupBox_4) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.checkBox_examineLabeled.setFont(font) - self.checkBox_examineLabeled.setObjectName("checkBox_examineLabeled") - self.gridLayout_2.addWidget(self.checkBox_examineLabeled, 0, 0, 1, 4) - self.label_quick_remark_input = QtWidgets.QLabel(self.groupBox_4) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.label_quick_remark_input.setFont(font) - self.label_quick_remark_input.setObjectName("label_quick_remark_input") - self.gridLayout_2.addWidget(self.label_quick_remark_input, 6, 0, 1, 1) - self.lineEdit_correctEnd = QtWidgets.QLineEdit(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.lineEdit_correctEnd.sizePolicy().hasHeightForWidth()) - self.lineEdit_correctEnd.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.lineEdit_correctEnd.setFont(font) - self.lineEdit_correctEnd.setObjectName("lineEdit_correctEnd") - self.gridLayout_2.addWidget(self.lineEdit_correctEnd, 9, 2, 1, 3) self.label_correctEnd = QtWidgets.QLabel(self.groupBox_4) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -340,7 +266,84 @@ class Ui_MainWindow(object): font.setPointSize(14) self.label_correctEnd.setFont(font) self.label_correctEnd.setObjectName("label_correctEnd") - self.gridLayout_2.addWidget(self.label_correctEnd, 9, 0, 1, 1) + self.gridLayout_2.addWidget(self.label_correctEnd, 8, 0, 1, 1) + self.lineEdit_correctEnd = QtWidgets.QLineEdit(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_correctEnd.sizePolicy().hasHeightForWidth()) + self.lineEdit_correctEnd.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_correctEnd.setFont(font) + self.lineEdit_correctEnd.setObjectName("lineEdit_correctEnd") + self.gridLayout_2.addWidget(self.lineEdit_correctEnd, 8, 2, 1, 3) + self.horizontalLayout_12 = QtWidgets.QHBoxLayout() + self.horizontalLayout_12.setObjectName("horizontalLayout_12") + self.label_score = QtWidgets.QLabel(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_score.sizePolicy().hasHeightForWidth()) + self.label_score.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_score.setFont(font) + self.label_score.setObjectName("label_score") + self.horizontalLayout_12.addWidget(self.label_score) + self.radioButton_1_class = QtWidgets.QRadioButton(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_1_class.sizePolicy().hasHeightForWidth()) + self.radioButton_1_class.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.radioButton_1_class.setFont(font) + self.radioButton_1_class.setObjectName("radioButton_1_class") + self.horizontalLayout_12.addWidget(self.radioButton_1_class) + self.radioButton_2_class = QtWidgets.QRadioButton(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_2_class.sizePolicy().hasHeightForWidth()) + self.radioButton_2_class.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.radioButton_2_class.setFont(font) + self.radioButton_2_class.setObjectName("radioButton_2_class") + self.horizontalLayout_12.addWidget(self.radioButton_2_class) + self.radioButton_3_class = QtWidgets.QRadioButton(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.radioButton_3_class.sizePolicy().hasHeightForWidth()) + self.radioButton_3_class.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.radioButton_3_class.setFont(font) + self.radioButton_3_class.setObjectName("radioButton_3_class") + self.horizontalLayout_12.addWidget(self.radioButton_3_class) + self.gridLayout_2.addLayout(self.horizontalLayout_12, 3, 0, 1, 5) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_2.addItem(spacerItem3, 14, 1, 1, 1) + self.lineEdit_correctStart = QtWidgets.QLineEdit(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_correctStart.sizePolicy().hasHeightForWidth()) + self.lineEdit_correctStart.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_correctStart.setFont(font) + self.lineEdit_correctStart.setObjectName("lineEdit_correctStart") + self.gridLayout_2.addWidget(self.lineEdit_correctStart, 6, 2, 1, 3) self.label_BCG_event = QtWidgets.QLabel(self.groupBox_4) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -356,14 +359,47 @@ class Ui_MainWindow(object): self.label_BCG_event.setText("") self.label_BCG_event.setAlignment(QtCore.Qt.AlignCenter) self.label_BCG_event.setObjectName("label_BCG_event") - self.gridLayout_2.addWidget(self.label_BCG_event, 2, 0, 1, 5) + self.gridLayout_2.addWidget(self.label_BCG_event, 1, 0, 1, 5) self.pushButton_quick_remark_input_waitingForTalk = QtWidgets.QPushButton(self.groupBox_4) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(14) self.pushButton_quick_remark_input_waitingForTalk.setFont(font) self.pushButton_quick_remark_input_waitingForTalk.setObjectName("pushButton_quick_remark_input_waitingForTalk") - self.gridLayout_2.addWidget(self.pushButton_quick_remark_input_waitingForTalk, 6, 2, 1, 3) + self.gridLayout_2.addWidget(self.pushButton_quick_remark_input_waitingForTalk, 5, 2, 1, 3) + self.pushButton_right = QtWidgets.QPushButton(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_right.sizePolicy().hasHeightForWidth()) + self.pushButton_right.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.pushButton_right.setFont(font) + self.pushButton_right.setObjectName("pushButton_right") + self.gridLayout_2.addWidget(self.pushButton_right, 15, 0, 1, 1) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_2.addItem(spacerItem4, 15, 1, 1, 1) + self.label_remark = QtWidgets.QLabel(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_remark.sizePolicy().hasHeightForWidth()) + self.label_remark.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_remark.setFont(font) + self.label_remark.setObjectName("label_remark") + self.gridLayout_2.addWidget(self.label_remark, 4, 0, 1, 1) + self.label_quick_remark_input = QtWidgets.QLabel(self.groupBox_4) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_quick_remark_input.setFont(font) + self.label_quick_remark_input.setObjectName("label_quick_remark_input") + self.gridLayout_2.addWidget(self.label_quick_remark_input, 5, 0, 1, 1) self.horizontalLayout_radioButton = QtWidgets.QHBoxLayout() self.horizontalLayout_radioButton.setObjectName("horizontalLayout_radioButton") self.label_events = QtWidgets.QLabel(self.groupBox_4) @@ -426,98 +462,38 @@ class Ui_MainWindow(object): self.radioButton_HPY.setFont(font) self.radioButton_HPY.setObjectName("radioButton_HPY") self.horizontalLayout_radioButton.addWidget(self.radioButton_HPY) - self.gridLayout_2.addLayout(self.horizontalLayout_radioButton, 3, 0, 1, 5) - self.label_PSG_event = QtWidgets.QLabel(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + self.gridLayout_2.addLayout(self.horizontalLayout_radioButton, 2, 0, 1, 5) + self.lineEdit_remark = QtWidgets.QLineEdit(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_PSG_event.sizePolicy().hasHeightForWidth()) - self.label_PSG_event.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - self.label_PSG_event.setFont(font) - self.label_PSG_event.setText("") - self.label_PSG_event.setAlignment(QtCore.Qt.AlignCenter) - self.label_PSG_event.setObjectName("label_PSG_event") - self.gridLayout_2.addWidget(self.label_PSG_event, 1, 0, 1, 5) - self.label_remark = QtWidgets.QLabel(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_remark.sizePolicy().hasHeightForWidth()) - self.label_remark.setSizePolicy(sizePolicy) + sizePolicy.setHeightForWidth(self.lineEdit_remark.sizePolicy().hasHeightForWidth()) + self.lineEdit_remark.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(14) - self.label_remark.setFont(font) - self.label_remark.setObjectName("label_remark") - self.gridLayout_2.addWidget(self.label_remark, 5, 0, 1, 1) - self.pushButton_right = QtWidgets.QPushButton(self.groupBox_4) + self.lineEdit_remark.setFont(font) + self.lineEdit_remark.setObjectName("lineEdit_remark") + self.gridLayout_2.addWidget(self.lineEdit_remark, 4, 2, 1, 3) + self.pushButton_left = QtWidgets.QPushButton(self.groupBox_4) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.pushButton_right.sizePolicy().hasHeightForWidth()) - self.pushButton_right.setSizePolicy(sizePolicy) + sizePolicy.setHeightForWidth(self.pushButton_left.sizePolicy().hasHeightForWidth()) + self.pushButton_left.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(14) - self.pushButton_right.setFont(font) - self.pushButton_right.setObjectName("pushButton_right") - self.gridLayout_2.addWidget(self.pushButton_right, 16, 0, 1, 1) - self.horizontalLayout_12 = QtWidgets.QHBoxLayout() - self.horizontalLayout_12.setObjectName("horizontalLayout_12") - self.label_score = QtWidgets.QLabel(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_score.sizePolicy().hasHeightForWidth()) - self.label_score.setSizePolicy(sizePolicy) + self.pushButton_left.setFont(font) + self.pushButton_left.setObjectName("pushButton_left") + self.gridLayout_2.addWidget(self.pushButton_left, 14, 0, 1, 1) + self.checkBox_examineLabeled = QtWidgets.QCheckBox(self.groupBox_4) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(14) - self.label_score.setFont(font) - self.label_score.setObjectName("label_score") - self.horizontalLayout_12.addWidget(self.label_score) - self.radioButton_1_class = QtWidgets.QRadioButton(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.radioButton_1_class.sizePolicy().hasHeightForWidth()) - self.radioButton_1_class.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.radioButton_1_class.setFont(font) - self.radioButton_1_class.setObjectName("radioButton_1_class") - self.horizontalLayout_12.addWidget(self.radioButton_1_class) - self.radioButton_2_class = QtWidgets.QRadioButton(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.radioButton_2_class.sizePolicy().hasHeightForWidth()) - self.radioButton_2_class.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.radioButton_2_class.setFont(font) - self.radioButton_2_class.setObjectName("radioButton_2_class") - self.horizontalLayout_12.addWidget(self.radioButton_2_class) - self.radioButton_3_class = QtWidgets.QRadioButton(self.groupBox_4) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.radioButton_3_class.sizePolicy().hasHeightForWidth()) - self.radioButton_3_class.setSizePolicy(sizePolicy) - font = QtGui.QFont() - font.setFamily("Times New Roman") - font.setPointSize(14) - self.radioButton_3_class.setFont(font) - self.radioButton_3_class.setObjectName("radioButton_3_class") - self.horizontalLayout_12.addWidget(self.radioButton_3_class) - self.gridLayout_2.addLayout(self.horizontalLayout_12, 4, 0, 1, 5) + self.checkBox_examineLabeled.setFont(font) + self.checkBox_examineLabeled.setObjectName("checkBox_examineLabeled") + self.gridLayout_2.addWidget(self.checkBox_examineLabeled, 0, 0, 1, 4) self.pushButton_confirmLabel = QtWidgets.QPushButton(self.groupBox_4) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -529,11 +505,19 @@ class Ui_MainWindow(object): font.setPointSize(14) self.pushButton_confirmLabel.setFont(font) self.pushButton_confirmLabel.setObjectName("pushButton_confirmLabel") - self.gridLayout_2.addWidget(self.pushButton_confirmLabel, 15, 2, 2, 3) - spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.gridLayout_2.addItem(spacerItem3, 16, 1, 1, 1) - spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.gridLayout_2.addItem(spacerItem4, 15, 1, 1, 1) + self.gridLayout_2.addWidget(self.pushButton_confirmLabel, 14, 2, 2, 3) + self.label_correctStart = QtWidgets.QLabel(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_correctStart.sizePolicy().hasHeightForWidth()) + self.label_correctStart.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_correctStart.setFont(font) + self.label_correctStart.setObjectName("label_correctStart") + self.gridLayout_2.addWidget(self.label_correctStart, 6, 0, 1, 1) self.verticalLayout_left.addWidget(self.groupBox_4) spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_left.addItem(spacerItem5) @@ -739,14 +723,20 @@ class Ui_MainWindow(object): self.lineEdit_back_add_second.setText(_translate("MainWindow", "60")) self.lineEdit_back_add_second.setPlaceholderText(_translate("MainWindow", "信号显示事件后多少秒")) self.groupBox_4.setTitle(_translate("MainWindow", "打标操作")) - self.pushButton_left.setText(_translate("MainWindow", "上一个事件(A)")) - self.pushButton_left.setShortcut(_translate("MainWindow", "A")) - self.label_correctStart.setText(_translate("MainWindow", "修正后起始时间(s)")) - self.checkBox_examineLabeled.setText(_translate("MainWindow", "仅检查未确定打标参数的事件")) - self.label_quick_remark_input.setText(_translate("MainWindow", "快速备注输入")) self.label_correctEnd.setText(_translate("MainWindow", "修正后终止时间(s)")) + self.label_score.setText(_translate("MainWindow", "标签类型")) + self.radioButton_1_class.setText(_translate("MainWindow", "一类(U)")) + self.radioButton_1_class.setShortcut(_translate("MainWindow", "U")) + self.radioButton_2_class.setText(_translate("MainWindow", "二类(I)")) + self.radioButton_2_class.setShortcut(_translate("MainWindow", "I")) + self.radioButton_3_class.setText(_translate("MainWindow", "删除(O)")) + self.radioButton_3_class.setShortcut(_translate("MainWindow", "O")) self.pushButton_quick_remark_input_waitingForTalk.setText(_translate("MainWindow", "待讨论(J)")) self.pushButton_quick_remark_input_waitingForTalk.setShortcut(_translate("MainWindow", "J")) + self.pushButton_right.setText(_translate("MainWindow", "下一个事件(D)")) + self.pushButton_right.setShortcut(_translate("MainWindow", "D")) + self.label_remark.setText(_translate("MainWindow", "备注")) + self.label_quick_remark_input.setText(_translate("MainWindow", "快速备注输入")) self.label_events.setText(_translate("MainWindow", "事件类型")) self.radioButton_OSA.setText(_translate("MainWindow", "OSA")) self.radioButton_OSA.setShortcut(_translate("MainWindow", "1")) @@ -756,17 +746,11 @@ class Ui_MainWindow(object): self.radioButton_MSA.setShortcut(_translate("MainWindow", "3")) self.radioButton_HPY.setText(_translate("MainWindow", "HPY")) self.radioButton_HPY.setShortcut(_translate("MainWindow", "4")) - self.label_remark.setText(_translate("MainWindow", "备注")) - self.pushButton_right.setText(_translate("MainWindow", "下一个事件(D)")) - self.pushButton_right.setShortcut(_translate("MainWindow", "D")) - self.label_score.setText(_translate("MainWindow", "标签类型")) - self.radioButton_1_class.setText(_translate("MainWindow", "一类(U)")) - self.radioButton_1_class.setShortcut(_translate("MainWindow", "U")) - self.radioButton_2_class.setText(_translate("MainWindow", "二类(I)")) - self.radioButton_2_class.setShortcut(_translate("MainWindow", "I")) - self.radioButton_3_class.setText(_translate("MainWindow", "删除(O)")) - self.radioButton_3_class.setShortcut(_translate("MainWindow", "O")) + self.pushButton_left.setText(_translate("MainWindow", "上一个事件(A)")) + self.pushButton_left.setShortcut(_translate("MainWindow", "A")) + self.checkBox_examineLabeled.setText(_translate("MainWindow", "仅检查未确定打标参数的事件")) self.pushButton_confirmLabel.setText(_translate("MainWindow", "确定打标参数(S)")) + self.label_correctStart.setText(_translate("MainWindow", "修正后起始时间(s)")) self.groupBox_5.setTitle(_translate("MainWindow", "逐帧检查")) self.pushButton_next10s.setText(_translate("MainWindow", "+10s")) self.pushButton_previous10s.setText(_translate("MainWindow", "-10s")) diff --git a/MainWindow.ui b/MainWindow.ui index d33fce4..7642cb7 100644 --- a/MainWindow.ui +++ b/MainWindow.ui @@ -437,122 +437,7 @@ 打标操作 - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - 上一个事件(A) - - - A - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - 修正后起始时间(s) - - - - - - - - Times New Roman - 14 - - - - 仅检查未确定打标参数的事件 - - - - - - - - Times New Roman - 14 - - - - 快速备注输入 - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - - + @@ -571,7 +456,141 @@ - + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 标签类型 + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 一类(U) + + + U + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 二类(I) + + + I + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 删除(O) + + + O + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + + @@ -595,7 +614,7 @@ - + @@ -611,7 +630,74 @@ - + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 下一个事件(D) + + + D + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 备注 + + + + + + + + Times New Roman + 14 + + + + 快速备注输入 + + + + @@ -722,34 +808,10 @@ - - + + - - 0 - 0 - - - - - Times New Roman - 12 - 50 - false - - - - - - - Qt::AlignCenter - - - - - - - + 0 0 @@ -760,13 +822,10 @@ 14 - - 备注 - - - + + 0 @@ -780,103 +839,27 @@ - 下一个事件(D) + 上一个事件(A) - D + A - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - 标签类型 - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - 一类(U) - - - U - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - 二类(I) - - - I - - - - - - - - 0 - 0 - - - - - Times New Roman - 14 - - - - 删除(O) - - - O - - - - + + + + + Times New Roman + 14 + + + + 仅检查未确定打标参数的事件 + + - + @@ -895,31 +878,24 @@ - - - - Qt::Horizontal + + + + + 0 + 0 + - - - 40 - 20 - + + + Times New Roman + 14 + - - - - - - Qt::Horizontal + + 修正后起始时间(s) - - - 40 - 20 - - - + diff --git a/Main_Quality_Relabel_GUI.py b/Main_Quality_Relabel_GUI.py index a2617b5..137ffee 100644 --- a/Main_Quality_Relabel_GUI.py +++ b/Main_Quality_Relabel_GUI.py @@ -157,12 +157,11 @@ class MainWindow(QMainWindow, Ui_MainWindow): if self.dir_path: logging.info("Loading Data Path...") self.PSG_Data_Path = Path(os.path.join(self.dir_path, "PSG")) - self.PSG_Label_Path = Path(os.path.join(self.dir_path, "PSG_label")) self.BCG_Data_Path = Path(os.path.join(self.dir_path, "BCG")) self.BCG_Label_Path = Path(os.path.join(self.dir_path, "BCG_label")) self.Artifact_Label_Path = Path(os.path.join(self.dir_path, "Artifact_label")) self.Artifact_Offset_Path = Path(os.path.join(self.dir_path, "Artifact_label", "20220421Artifact_offset_value.xlsx")) - if self.PSG_Data_Path.exists() and self.PSG_Label_Path.exists() and self.BCG_Data_Path.exists() and self.BCG_Label_Path.exists() and self.Artifact_Label_Path.exists() and self.Artifact_Label_Path.exists(): + if self.PSG_Data_Path.exists() and self.BCG_Data_Path.exists() and self.BCG_Label_Path.exists() and self.Artifact_Label_Path.exists() and self.Artifact_Label_Path.exists(): sampIDs = os.listdir(self.BCG_Data_Path) sampID_for_comboBox = [] for sampID in sampIDs: @@ -171,7 +170,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): bcg_path = self.BCG_Data_Path / f"{sampID}samp.npy" ecg_path = self.PSG_Data_Path / f"A{str(sampID).rjust(7, '0')}.edf" bcg_label_path = self.BCG_Label_Path / f"export{sampID}_all.csv" - ecg_label_path = self.PSG_Label_Path / f"export{sampID}.csv" if not bcg_path.exists(): logging.error(f"Can't find {bcg_path}!") self.msgBox.setText(f"找不到数据{bcg_path}") @@ -190,12 +188,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.msgBox.setIcon(QMessageBox.Critical) self.msgBox.exec() return - if not ecg_label_path.exists(): - logging.error(f"Can't find {ecg_label_path}!") - self.msgBox.setText(f"找不到数据{ecg_label_path}") - self.msgBox.setIcon(QMessageBox.Critical) - self.msgBox.exec() - return self.comboBox_sampID.setEnabled(True) self.lineEdit_start_bcg_index.setEnabled(True) self.comboBox_sampID.addItems(sampID_for_comboBox) @@ -307,7 +299,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.msgBox.setIcon(QMessageBox.Information) self.msgBox.exec() self.pd.to_csv(Path(os.path.join(self.BCG_Label_Path, f"export{self.comboBox_sampID.currentText()}_all.csv")), mode='w', index=None, encoding="gbk") - self.show_one_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second) + self.show_one_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second) if not str(self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "remark"]) == "nan": self.lineEdit_remark.setText(str(self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "remark"])) else: @@ -329,7 +321,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): if self.checkBox_examineLabeled.isChecked() == True: while self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "isLabeled"] == 1 and self.plotEventIndex > self.start_bcg_index: self.plotEventIndex = self.plotEventIndex - 1 - self.show_one_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_one_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second) if not str(self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "remark"]) == "nan": self.lineEdit_remark.setText(str(self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "remark"])) @@ -362,7 +354,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): if self.checkBox_examineLabeled.isChecked() == True: while self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "isLabeled"] == 1 and self.plotEventIndex < len(self.bcg_event_label_filtered_df) - 1: self.plotEventIndex = self.plotEventIndex + 1 - self.show_one_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_one_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second) if not str(self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "remark"]) == "nan": self.lineEdit_remark.setText(str(self.pd.at[self.bcg_event_label_index_list[self.plotEventIndex], "remark"])) @@ -459,7 +451,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("操作:向前10秒") self.radioButton_OSA.setChecked(True) self.time_move_count = self.time_move_count - 10 - self.show_new_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_new_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second, time_move_count = self.time_move_count) # -30s的槽函数 @@ -469,7 +461,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("操作:向前30秒") self.radioButton_OSA.setChecked(True) self.time_move_count = self.time_move_count - 30 - self.show_new_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_new_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second, time_move_count = self.time_move_count) # -60s的槽函数 @@ -479,7 +471,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("操作:向前60秒") self.radioButton_OSA.setChecked(True) self.time_move_count = self.time_move_count - 60 - self.show_new_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_new_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second, time_move_count = self.time_move_count) # +10s的槽函数 @@ -489,7 +481,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("操作:向后10秒") self.radioButton_OSA.setChecked(True) self.time_move_count = self.time_move_count + 10 - self.show_new_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_new_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second, time_move_count = self.time_move_count) # +30s的槽函数 @@ -499,7 +491,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("操作:向后30秒") self.radioButton_OSA.setChecked(True) self.time_move_count = self.time_move_count + 30 - self.show_new_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_new_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second, time_move_count = self.time_move_count) # +30s的槽函数 @@ -509,7 +501,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("操作:向后60秒") self.radioButton_OSA.setChecked(True) self.time_move_count = self.time_move_count + 60 - self.show_new_event(self.plotEventIndex, self.plotEventIndex, front_add_second=self.front_add_second, + self.show_new_event(self.plotEventIndex, front_add_second=self.front_add_second, back_add_second=self.back_add_second, time_move_count = self.time_move_count) # +60s的槽函数 @@ -603,20 +595,14 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.start_bcg_index = int(self.lineEdit_start_bcg_index.text()) self.plotEventIndex = self.start_bcg_index - self.ecg_start_time = None - # 用来显示颜色时按点匹配事件 - self.ecg_event_label = None self.bcg_event_label = None - self.spo2_event_label = None self.artifact_event_label = None # 仅包含关注暂停事件的列表 - self.ecg_event_label_filtered_df = None self.bcg_event_label_filtered_df = None # 所有事件列表 - self.ecg_event_label_df = None self.bcg_event_label_df = None # 各通道信号 @@ -659,13 +645,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): signal_label = file.getSignalLabels() logging.debug(f"{self.sampNo} EDF file signal label : {signal_label}") - self.ecg_start_time = file.getStartdatetime() - - # 根据PSG记录长度生成事件表 - self.ecg_event_label = np.zeros( - int(file.getFileDuration()) * self.frequency + self.extend_second * self.frequency) - self.spo2_event_label = np.zeros( - int(file.getFileDuration()) * self.frequency + self.extend_second * self.frequency) # 打印PSG信息 file.file_info_long() @@ -723,56 +702,15 @@ class MainWindow(QMainWindow, Ui_MainWindow): def read_event(self): bcg_label_path = self.BCG_Label_Path / f"export{self.sampNo}_all.csv" - ecg_label_path = self.PSG_Label_Path / f"export{self.sampNo}.csv" if not bcg_label_path.exists(): logging.error(f"Can't find {bcg_label_path} !") raise FileNotFoundError(f"Can't find {bcg_label_path} !") - if not ecg_label_path.exists(): - logging.error(f"Can't find {ecg_label_path} !") - raise FileNotFoundError(f"Can't find {ecg_label_path} !") - - df = pd.read_csv(ecg_label_path, encoding="gbk") - self.ecg_event_label_df = df - - # 过滤不关注的事件 - df2 = df[df["Event type"].isin(self.focus_event_list)] - # 根据epoch进行排列方便索引 - df2 = df2.sort_values(by='Epoch') - self.ecg_event_label_filtered_df = df2 - - logging.info("Traversaling PSG events...") - self.textBrowser_update("提示:正在遍历PSG事件") - for one_data in tqdm(df.index, ncols=80): - one_data = df.loc[one_data] - - # 通过开始时间推算事件起始点与结束点 - event_start_time = datetime.strptime(one_data["Date"] + " " + one_data["Time"], '%Y/%m/%d %H:%M:%S') - SP = (event_start_time - self.ecg_start_time).seconds - # 对括号进行切分,避免Duration 20 (20) 这种带括号的问题 - EP = int(SP + float(one_data["Duration"].split("(")[0])) - SP *= self.frequency - EP *= self.frequency - - # 对事件重新编码并存到事件记录表中 - if one_data["Event type"] == "Hypopnea": - self.ecg_event_label[SP:EP] = 1 - elif one_data["Event type"] == "Central apnea": - self.ecg_event_label[SP:EP] = 2 - elif one_data["Event type"] == "Obstructive apnea": - self.ecg_event_label[SP:EP] = 3 - elif one_data["Event type"] == "Mixed apnea": - self.ecg_event_label[SP:EP] = 4 - elif one_data["Event type"] == "Desaturation": - self.spo2_event_label[SP:EP] = 5 - logging.info("Finished Traversal PSG events") - self.textBrowser_update("提示:完成遍历PSG事件") - # 读取心晓事件 df = pd.read_csv(bcg_label_path, encoding="gbk") - df["new_start"] = df["new_start"].astype("int") - df["new_end"] = df["new_end"].astype("int") + df["Start"] = df["Start"].astype("int") + df["End"] = df["End"].astype("int") self.bcg_event_label_df = df # 过滤不关注事件 @@ -784,8 +722,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.textBrowser_update("提示:正在遍历心晓事件") for one_data in tqdm(df.index): one_data = df.loc[one_data] - SP = one_data["new_start"] * self.frequency - EP = one_data["new_end"] * self.frequency + SP = one_data["Start"] * self.frequency + EP = one_data["End"] * self.frequency if one_data["Event type"] == "Hypopnea": self.bcg_event_label[SP:EP] = 1 @@ -820,53 +758,32 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.artifact_event_label[SP:EP] = artifact_type - # assert len(self.ecg_event_label_filtered_df) == len(self.bcg_event_label_filtered_df), \ - # f"PSG与心晓事件数量不一致, PSG事件数量{len(self.ecg_event_label_filtered_df)}, - # 心晓事件数量{len(self.bcg_event_label_filtered_df)}" - - def show_one_event(self, bcg_index: int, ecg_index: int, front_add_second: int, back_add_second: int): + def show_one_event(self, bcg_index: int, front_add_second: int, back_add_second: int): """ :param bcg_index: 心晓事件在csv中行号 - :param ecg_index: PSG事件在csv中序号 :param front_add_second: 向前延伸时间 :param back_add_second: 向后延伸时间 :return: """ # 获取事件实际在csv文件中的序号 bcg_real_index = self.bcg_event_label_filtered_df.index[bcg_index], - ecg_real_index = self.ecg_event_label_filtered_df.index[ecg_index], one_bcg_data = self.bcg_event_label_df.loc[bcg_real_index] - one_ecg_data = self.ecg_event_label_df.loc[ecg_real_index] - - # 获取ECG事件开始与结束时间 - event_start_time = datetime.strptime(one_ecg_data["Date"] + " " + one_ecg_data["Time"], '%Y/%m/%d %H:%M:%S') - ecg_SP = (event_start_time - self.ecg_start_time).seconds - ecg_duration = int(float(str(one_ecg_data["Duration"]).split("(")[0]) + 0.5) - ecg_EP = ecg_SP + ecg_duration # 获取BCG事件开始与结束时间 - bcg_SP = one_bcg_data["new_start"] - bcg_EP = one_bcg_data["new_end"] + bcg_SP = one_bcg_data["Start"] + bcg_EP = one_bcg_data["End"] self.bcg_SP = bcg_SP self.bcg_EP = bcg_EP bcg_duration = bcg_EP - bcg_SP logging.info(f"sampNo:{self.sampNo} " f"bcg[index:{bcg_index} epoch:{one_bcg_data['Epoch']} event:{one_bcg_data['Event type']}] " - f"ecg:[index:{ecg_index} epoch:{one_ecg_data['Epoch']} event:{one_ecg_data['Event type']}]") - - if one_bcg_data['Event type'] != one_ecg_data['Event type']: - logging.error(f"sampNo:{self.sampNo} PSG事件与心晓时间不一致,请排查" - f"bcg[index:{bcg_index} epoch:{one_bcg_data['Epoch']} event:{one_bcg_data['Event type']}] " - f"ecg:[index:{ecg_index} epoch:{one_ecg_data['Epoch']} event:{one_ecg_data['Event type']}]") - raise ValueError() + f"ecg:[index:{bcg_index} epoch:{one_bcg_data['Epoch']} event:{one_bcg_data['Event type']}]") self.lineEdit_correctStart.setText(str(self.bcg_SP)) self.lineEdit_correctEnd.setText(str(self.bcg_EP)) # 进行向两边延展 - ecg_SP = ecg_SP - front_add_second - ecg_EP = ecg_EP + back_add_second bcg_SP = bcg_SP - front_add_second bcg_EP = bcg_EP + back_add_second @@ -880,20 +797,20 @@ class MainWindow(QMainWindow, Ui_MainWindow): # 绘制 Flow1 self.ax0 = self.figure.add_subplot(gs[0]) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Flow T") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Flow T") # 绘制 Flow2 self.ax1 = self.figure.add_subplot(gs[1], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Flow P") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Flow P") self.ax2 = self.figure.add_subplot(gs[2], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Effort Tho") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Effort Tho") self.ax3 = self.figure.add_subplot(gs[3], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Effort Abd") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Effort Abd") self.ax4 = self.figure.add_subplot(gs[4], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="SpO2", event_code=[5]) + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="SpO2", event_code=[5]) self.ax5 = self.figure.add_subplot(gs[5], sharex=self.ax0) self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="orgdata", @@ -906,9 +823,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): event_show_under=False, title=f"sampNo:{self.sampNo} Index:{bcg_index + 1}/{len(self.bcg_event_label_filtered_df)}") - self.label_PSG_event.setText(f"PSG sampNo:{self.sampNo} Index:{ecg_index + 1}/{len(self.ecg_event_label_filtered_df)} " - f"Epoch:{one_ecg_data['Epoch']} Duration:{ecg_duration}s") - self.label_BCG_event.setText(f"心晓 sampNo:{self.sampNo} Index:{bcg_index + 1}/{len(self.bcg_event_label_filtered_df)} " + self.label_BCG_event.setText(f"sampNo:{self.sampNo} Index:{bcg_index + 1}/{len(self.bcg_event_label_filtered_df)} " f"Epoch:{one_bcg_data['Epoch']} Duration:{bcg_duration}s") # figManager = plt.get_current_fig_manager() @@ -939,7 +854,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): for j in event_code: if channel == "SpO2": - mask = self.spo2_event_label[SP * self.frequency:EP * self.frequency] == j + mask = self.bcg_event_label[SP * self.frequency:EP * self.frequency] == j elif channel == "orgdata" or channel == "0.7lowpass_resp": if j <= 5: mask = self.bcg_event_label[SP * self.frequency:EP * self.frequency] == j @@ -947,7 +862,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): mask = self.artifact_event_label[SP * self.frequency:EP * self.frequency] == j linestyle = "-" else: - mask = self.ecg_event_label[SP * self.frequency:EP * self.frequency] == j + mask = self.bcg_event_label[SP * self.frequency:EP * self.frequency] == j if event_show_under: min_point = self.signal_select[channel][SP * self.frequency:EP * self.frequency].min() @@ -973,10 +888,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): # print(xticks) # plt_.xticks(*xticks) # 去掉x轴 - def show_new_event(self, bcg_index: int, ecg_index: int, front_add_second: int, back_add_second: int, time_move_count: int): + def show_new_event(self, bcg_index: int, front_add_second: int, back_add_second: int, time_move_count: int): """ :param bcg_index: 心晓事件在csv中行号 - :param ecg_index: PSG事件在csv中序号 :param front_add_second: 向前延伸时间 :param back_add_second: 向后延伸时间 :param time_move_count: 时间轴移动的时间 @@ -984,34 +898,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): """ # 获取事件实际在csv文件中的序号 bcg_real_index = self.bcg_event_label_filtered_df.index[bcg_index], - ecg_real_index = self.ecg_event_label_filtered_df.index[ecg_index], one_bcg_data = self.bcg_event_label_df.loc[bcg_real_index] - one_ecg_data = self.ecg_event_label_df.loc[ecg_real_index] - - # 获取ECG事件开始与结束时间 - event_start_time = datetime.strptime(one_ecg_data["Date"] + " " + one_ecg_data["Time"], '%Y/%m/%d %H:%M:%S') - ecg_SP = (event_start_time - self.ecg_start_time).seconds - ecg_duration = int(float(str(one_ecg_data["Duration"]).split("(")[0]) + 0.5) - ecg_EP = ecg_SP + ecg_duration # 获取BCG事件开始与结束时间 - bcg_SP = one_bcg_data["new_start"] - bcg_EP = one_bcg_data["new_end"] + bcg_SP = one_bcg_data["Start"] + bcg_EP = one_bcg_data["End"] bcg_duration = bcg_EP - bcg_SP logging.info(f"sampNo:{self.sampNo} " f"bcg[index:{bcg_index} epoch:{one_bcg_data['Epoch']} event:{one_bcg_data['Event type']}] " - f"ecg:[index:{ecg_index} epoch:{one_ecg_data['Epoch']} event:{one_ecg_data['Event type']}]") - - if one_bcg_data['Event type'] != one_ecg_data['Event type']: - logging.error(f"sampNo:{self.sampNo} PSG事件与心晓时间不一致,请排查" - f"bcg[index:{bcg_index} epoch:{one_bcg_data['Epoch']} event:{one_bcg_data['Event type']}] " - f"ecg:[index:{ecg_index} epoch:{one_ecg_data['Epoch']} event:{one_ecg_data['Event type']}]") - raise ValueError() + f"ecg:[index:{bcg_index} epoch:{one_bcg_data['Epoch']} event:{one_bcg_data['Event type']}]") # 进行向两边延展 - ecg_SP = ecg_SP - front_add_second + time_move_count - ecg_EP = ecg_EP + back_add_second + time_move_count bcg_SP = bcg_SP - front_add_second + time_move_count bcg_EP = bcg_EP + back_add_second + time_move_count @@ -1030,20 +928,20 @@ class MainWindow(QMainWindow, Ui_MainWindow): # 绘制 Flow1 self.ax0 = self.figure.add_subplot(gs[0]) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Flow T") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Flow T") # 绘制 Flow2 self.ax1 = self.figure.add_subplot(gs[1], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Flow P") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Flow P") self.ax2 = self.figure.add_subplot(gs[2], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Effort Tho") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Effort Tho") self.ax3 = self.figure.add_subplot(gs[3], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Effort Abd") + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="Effort Abd") self.ax4 = self.figure.add_subplot(gs[4], sharex=self.ax0) - self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="SpO2", event_code=[5]) + self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="SpO2", event_code=[5]) self.ax5 = self.figure.add_subplot(gs[5], sharex=self.ax0) self.plt_channel(plt_=plt, SP=bcg_SP, EP=bcg_EP, channel="orgdata", @@ -1056,11 +954,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): event_show_under=False, title=f"sampNo:{self.sampNo} Index:{bcg_index + 1}/{len(self.bcg_event_label_filtered_df)}") - self.label_PSG_event.setText( - f"PSG sampNo:{self.sampNo} Index:{ecg_index + 1}/{len(self.ecg_event_label_filtered_df)} " - f"Epoch:{one_ecg_data['Epoch']} Duration:{ecg_duration}s") self.label_BCG_event.setText( - f"心晓 sampNo:{self.sampNo} Index:{bcg_index + 1}/{len(self.bcg_event_label_filtered_df)} " + f"sampNo:{self.sampNo} Index:{bcg_index + 1}/{len(self.bcg_event_label_filtered_df)} " f"Epoch:{one_bcg_data['Epoch']} Duration:{bcg_duration}s") # figManager = plt.get_current_fig_manager() diff --git a/PSG_label_2_BCG_label.py b/PSG_label_2_BCG_label.py new file mode 100644 index 0000000..ebfc11c --- /dev/null +++ b/PSG_label_2_BCG_label.py @@ -0,0 +1,48 @@ +import os +import pandas as pd +import pyedflib +from pathlib import Path + +def get_time_to_seconds(time_str): + h, m, s = map(int, time_str.split(":")) + return h * 3600 + m * 60 + s + +base_event = ["Hypopnea", "Central apnea", "Obstructive apnea", "Mixed apnea"] + +# 输入设置 +sampID = 888 +dir_path = r"E:\data_annotation\6SleepApnea_annotation_GUI_demo\data" + +# 数据路径设置 +PSG_Data_Path = Path(os.path.join(dir_path, "PSG")) +PSG_Label_Path = Path(os.path.join(dir_path, "PSG_label")) +BCG_Data_Path = Path(os.path.join(dir_path, "BCG")) +BCG_Label_Path = Path(os.path.join(dir_path, "BCG_label")) +# Artifact_Label_Path = Path(os.path.join(dir_path, "Artifact_label")) +# Artifact_Offset_Path = Path(os.path.join(dir_path, "Artifact_label", "20220421Artifact_offset_value.xlsx")) + +# 读取PSG标签 +df_PSG_label = pd.read_csv(PSG_Label_Path / (f"export" + str(sampID) + ".csv"), encoding="gbk") +df_PSG_label = df_PSG_label.loc[:, ~df_PSG_label.columns.str.contains('^Unnamed')] +df_PSG_label = df_PSG_label[df_PSG_label["Event type"].isin(base_event)] +df_PSG_label['Duration'] = df_PSG_label['Duration'].str.replace(r' \(.*?\)', '', regex=True) + +# 读取EDF文件 +edf_File = pyedflib.EdfReader(str(PSG_Data_Path / f"A{str(sampID).rjust(7, '0')}.edf")) + +# 获取PSG记录开始时间 +start_time = str(edf_File.getStartdatetime()).split(" ")[1] +start_time_abs = get_time_to_seconds(start_time) + +# 计算起始时间秒数和终止时间秒数 +df_PSG_label['Start'] = (df_PSG_label['Time'].apply(get_time_to_seconds) - start_time_abs).apply(lambda x: x + 24 * 3600 if x < 0 else x).astype(int) +df_PSG_label['End'] = df_PSG_label['Start'] + df_PSG_label['Duration'].astype(float).round(0).astype(int) + +# 打印结果 +print(df_PSG_label) + +# 写入csv文件 +df_PSG_label.to_csv(r"E:\data_annotation\6SleepApnea_annotation_GUI_demo\data\BCG_label\export" + str(sampID) + "_all.csv", index=False, encoding="gbk") + +# 打印结果 +print("sampID_" + str(sampID) + "写入csv成功") \ No newline at end of file