From 9fc85615d6aff28d9600266742d2918f87b9f865 Mon Sep 17 00:00:00 2001
From: andrew <gitea@marques22.com>
Date: Fri, 22 Sep 2023 20:43:58 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9F=BA=E6=9C=AC=E5=8A=9F?=
 =?UTF-8?q?=E8=83=BD=EF=BC=8C=E9=9C=80=E8=A6=81=E5=AF=B9=E8=AE=A1=E7=AE=97?=
 =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=B3=BB=E6=95=B0=E8=BF=9B=E4=B8=80=E6=AD=A5?=
 =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=81=BF=E5=85=8D=E5=8D=A1=E9=A1=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore         |   5 +
 RespCoarseAlign.py | 302 +++++++++++++++++++++++++++++++++++++++++----
 ui/Mian.py         |  72 ++++++-----
 ui/Mian.ui         | 110 ++++++++++++-----
 4 files changed, 408 insertions(+), 81 deletions(-)

diff --git a/.gitignore b/.gitignore
index ea0da03..8c8c7cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -230,3 +230,8 @@ ipython_config.py
 # Remove previous ipynb_checkpoints
 #   git rm -r .ipynb_checkpoints/
 
+./Data/*
+./Data/PSG/*
+./Data/XX/*
+!./Data/PSG
+!./Data/XX
\ No newline at end of file
diff --git a/RespCoarseAlign.py b/RespCoarseAlign.py
index 050bd7b..95f734e 100644
--- a/RespCoarseAlign.py
+++ b/RespCoarseAlign.py
@@ -9,6 +9,7 @@
 """
 
 import sys
+from datetime import datetime
 from pathlib import Path
 import pyedflib
 import numpy as np
@@ -65,6 +66,7 @@ ButtonState = {
         "pushButton_EP10": False,
         "pushButton_EP100": False,
         "pushButton_SaveInfo": False,
+        "pushButton_ReadInfo": False,
         "pushButton_Exit": True},
     "Current": {
         "pushButton_Refresh": True,
@@ -80,6 +82,7 @@ ButtonState = {
         "pushButton_EP10": False,
         "pushButton_EP100": False,
         "pushButton_SaveInfo": False,
+        "pushButton_ReadInfo": False,
         "pushButton_Exit": True}
 }
 
@@ -410,7 +413,7 @@ class Data:
         # 返回图片以便存到QPixImage
         return canvas.buffer_rgba(), width, height
 
-    def DrawPicOTryAlign(self):
+    def DrawPicTryAlign(self):
         fig = Figure(figsize=(8, 7), dpi=100)
         canvas = FigureCanvas(fig)
         max_x = max(self.processed_THO.shape[0] + self.Config["PSGConfig"]["PreA"],
@@ -444,6 +447,67 @@ class Data:
         # 返回图片以便存到QPixImage
         return canvas.buffer_rgba(), width, height
 
+    def DrawPicByEpoch(self, epoch):
+
+        PSG_SP = epoch * 30 * self.Config["ApplyFrequency"]
+        PSG_EP = (epoch + 6) * 30 * self.Config["ApplyFrequency"]
+
+        XX_SP = PSG_SP - self.Config["pos"]
+        XX_EP = PSG_EP - self.Config["pos"]
+
+        tho_seg = self.processed_THO[PSG_SP:PSG_EP]
+        xx_seg = self.processed_XX[XX_SP:XX_EP] * self.Config["XX_reverse"]
+        abd_seg = self.processed_ABD[PSG_SP:PSG_EP]
+
+        fig = Figure(figsize=(8, 7), dpi=100)
+        canvas = FigureCanvas(fig)
+        # 根据PSG来和绘制
+        ax1 = fig.add_subplot(321)
+        ax1.plot(np.linspace(PSG_SP, PSG_EP, len(tho_seg)), tho_seg)
+        tho_peaks, _ = signal.find_peaks(tho_seg, prominence=0, distance=3 * self.Config["ApplyFrequency"])
+        ax1.plot(np.linspace(PSG_SP, PSG_EP, len(tho_seg))[tho_peaks], tho_seg[tho_peaks], "x")
+
+        ax3 = fig.add_subplot(323)
+        ax3.plot(np.linspace(XX_SP, XX_EP, len(xx_seg)), xx_seg)
+        xx_peaks, _ = signal.find_peaks(xx_seg, prominence=0, distance=3 * self.Config["ApplyFrequency"])
+        ax3.plot(np.linspace(XX_SP, XX_EP, len(xx_seg))[xx_peaks], xx_seg[xx_peaks], "x")
+
+        ax2 = fig.add_subplot(325)
+        ax2.plot(np.linspace(PSG_SP, PSG_EP, len(abd_seg)), abd_seg)
+        abd_peaks, _ = signal.find_peaks(abd_seg, prominence=0, distance=3 * self.Config["ApplyFrequency"])
+        ax2.plot(np.linspace(PSG_SP, PSG_EP, len(abd_seg))[abd_peaks], abd_seg[abd_peaks], "x")
+
+        # 绘制间期
+        ax4 = fig.add_subplot(322)
+        ax4.plot(np.linspace(PSG_SP, PSG_EP, len(np.diff(tho_peaks).repeat(self.Config["ApplyFrequency"]))),
+                 np.diff(tho_peaks).repeat(self.Config["ApplyFrequency"]), alpha=0.5, label="tho")
+        ax4.plot(np.linspace(PSG_SP, PSG_EP, len(np.diff(xx_peaks).repeat(self.Config["ApplyFrequency"]))),
+                 np.diff(xx_peaks).repeat(self.Config["ApplyFrequency"]), label="resp")
+        ax4.set_title("tho_interval")
+        ax4.legend()
+        ax4.set_ylim((10, 50))
+
+        ax5 = fig.add_subplot(324)
+        ax5.plot(np.linspace(XX_SP, XX_EP, len(np.diff(tho_peaks).repeat(self.Config["ApplyFrequency"]))),
+                 np.diff(tho_peaks).repeat(self.Config["ApplyFrequency"]))
+        ax5.plot(np.linspace(XX_SP, XX_EP, len(np.diff(xx_peaks).repeat(self.Config["ApplyFrequency"]))),
+                 np.diff(xx_peaks).repeat(self.Config["ApplyFrequency"]), label="resp")
+        ax5.set_title("resp_interval")
+        ax5.set_ylim((10, 50))
+
+        ax6 = fig.add_subplot(326)
+        ax6.plot(np.linspace(PSG_SP, PSG_EP, len(np.diff(abd_peaks).repeat(self.Config["ApplyFrequency"]))),
+                 np.diff(abd_peaks).repeat(self.Config["ApplyFrequency"]))
+        ax6.plot(np.linspace(PSG_SP, PSG_EP, len(np.diff(xx_peaks).repeat(self.Config["ApplyFrequency"]))),
+                 np.diff(xx_peaks).repeat(self.Config["ApplyFrequency"]), label="resp")
+        ax6.set_title("abd_interval")
+        ax6.set_ylim((10, 50))
+
+        width, height = fig.figbbox.width, fig.figbbox.height
+        fig.canvas.draw()
+        # 返回图片以便存到QPixImage
+        return canvas.buffer_rgba(), width, height
+
 
 @njit("int64[:](int64[:],int64[:])", nogil=True, parallel=True)
 def get_Correlate(a, v):
@@ -472,6 +536,12 @@ class MainWindow(QMainWindow):
 
         self.ui.pushButton_Refresh.setEnabled(True)
         self.ui.pushButton_OpenFile.setEnabled(True)
+        self.ui.checkBox_NABD.setEnabled(False)
+        self.ui.checkBox_NTHO.setEnabled(False)
+        self.ui.checkBox_PABD.setEnabled(False)
+        self.ui.checkBox_PTHO.setEnabled(False)
+        self.ui.checkBox_custom.setEnabled(False)
+
 
         # 绑定事件
         # 刷新键分别获取PSG和XX文件夹里面的数据,获取所有编号显示在下拉框,比对编号同时存在的可选,仅存在一个文件夹的编号不可选
@@ -480,15 +550,17 @@ class MainWindow(QMainWindow):
         self.ui.pushButton_Standardize.clicked.connect(self.__standardize__)
         self.ui.pushButton_CutOff.clicked.connect(self.__cutOff__)
         self.ui.pushButton_GetPos.clicked.connect(self.__getPosition__)
-        # self.ui.pushButton_Align.clicked.connect(self.__align__)
-        # self.ui.pushButton_JUMP.clicked.connect(self.__jump__)
-        # self.ui.pushButton_EM1.clicked.connect(self.__EM1__)
-        # self.ui.pushButton_EM10.clicked.connect(self.__EM10__)
-        # self.ui.pushButton_EM100.clicked.connect(self.__EM100__)
-        # self.ui.pushButton_EP1.clicked.connect(self.__EP1__)
-        # self.ui.pushButton_EP10.clicked.connect(self.__EP10__)
-        # self.ui.pushButton_EP100.clicked.connect(self.__EP100__)
-        # self.ui.pushButton_SaveInfo.clicked.connect(self.__saveInfo__)
+        self.ui.pushButton_JUMP.clicked.connect(self.__jump__)
+        # spin_custom 按下回车绑定事件
+        self.ui.spinBox_SelectEpoch.editingFinished.connect(self.__jump__)
+        self.ui.pushButton_EM1.clicked.connect(self.__EpochChange__)
+        self.ui.pushButton_EM10.clicked.connect(self.__EpochChange__)
+        self.ui.pushButton_EM100.clicked.connect(self.__EpochChange__)
+        self.ui.pushButton_EP1.clicked.connect(self.__EpochChange__)
+        self.ui.pushButton_EP10.clicked.connect(self.__EpochChange__)
+        self.ui.pushButton_EP100.clicked.connect(self.__EpochChange__)
+        self.ui.pushButton_SaveInfo.clicked.connect(self.__saveInfo__)
+        self.ui.pushButton_ReadInfo.clicked.connect(self.__readInfo__)
         self.ui.pushButton_Exit.clicked.connect(self.__exit__)
 
         # 按下checkbox_NTHO、PTHO、 PABD、NABD后启用pushbutton_Align
@@ -498,6 +570,136 @@ class MainWindow(QMainWindow):
         self.ui.checkBox_NABD.stateChanged.connect(self.__enableAlign__)
         self.ui.spinBox_custom.valueChanged.connect(self.__enableAlign__)
 
+    def __readInfo__(self):
+        """
+        读取信息
+        判断是否存在,不存在不读取并提示
+        :return:
+        """
+        sampNo = self.ui.comboBox_SelectFile.currentText()
+        if Path("./RespCoarseAlignInfo.csv").exists():
+            df = pd.read_csv("./RespCoarseAlignInfo.csv")
+            print(df)
+            df["sampNo"] = df["sampNo"].astype(str)
+            df = df[df["sampNo"] == sampNo]
+            print(df)
+            if len(df) == 0:
+                QMessageBox.warning(self, "警告", f"记录中无编号{sampNo},请计算对齐")
+                return
+            # 去最后一个
+            PSG_SampRate = df["PSG_SampRate"].values[-1]
+            XX_SampRate = df["XX_SampRate"].values[-1]
+            pos = df["pos"].values[-1]
+            epoch = df["epoch"].values[-1]
+            # 将信息写入界面
+            self.ui.spinBox_PSGFreq.setValue(PSG_SampRate)
+            self.ui.spinBox_XXFreq.setValue(XX_SampRate)
+            self.ui.spinBox_SelectEpoch.setValue(epoch)
+            self.ui.spinBox_custom.setValue(pos)
+
+            if pos > 0:
+                self.ui.spinBox_XXPreA.setValue(pos)
+            else:
+                self.ui.spinBox_PSGPreA.setValue(-pos)
+            # 加载到Conf中
+            self.data.Config["PSGConfig"].update({"PreA": self.ui.spinBox_PSGPreA.value(),
+                                                  "PreCut": self.ui.spinBox_PSGPreCut.value(),
+                                                  "PostCut": self.ui.spinBox_PSGPostCut.value()})
+            self.data.Config["XXConfig"].update({"PreA": self.ui.spinBox_XXPreA.value(),
+                                                 "PreCut": self.ui.spinBox_XXPreCut.value(),
+                                                 "PostCut": self.ui.spinBox_XXPostCut.value()})
+
+            relate = pos
+            reverse = 1
+            self.data.Config["XX_reverse"] = reverse
+            self.data.Config["pos"] = relate
+            epoch_min = max(0, relate // 30 // self.data.Config["ApplyFrequency"] + 1)
+            epoch_max = min(len(self.data.processed_THO) // 30 // self.data.Config["ApplyFrequency"] - 1,
+                            (len(self.data.processed_XX) - relate) // 30 // self.data.Config["ApplyFrequency"] - 1)
+
+            self.ui.spinBox_SelectEpoch.setMinimum(epoch_min)
+            self.ui.spinBox_SelectEpoch.setMaximum(epoch_max)
+            self.ui.spinBox_SelectEpoch.setValue(epoch_min)
+            # set tooltip
+            self.ui.spinBox_SelectEpoch.setToolTip(f"最小值:{epoch_min}\n最大值:{epoch_max}")
+            self.ui.spinBox_SelectEpoch.setEnabled(True)
+            # 执行按下checkBox_custom
+            self.ui.checkBox_custom.setChecked(True)
+            ButtonState["Current"]["pushButton_JUMP"] = True
+            ButtonState["Current"]["pushButton_EM1"] = True
+            ButtonState["Current"]["pushButton_EM10"] = True
+            ButtonState["Current"]["pushButton_EM100"] = True
+            ButtonState["Current"]["pushButton_EP1"] = True
+            ButtonState["Current"]["pushButton_EP10"] = True
+            ButtonState["Current"]["pushButton_EP100"] = True
+            self.__enableAllButton__()
+
+        else:
+            QMessageBox.warning(self, "警告", f"没有保存记录,请检查当前路径是否有RespCoarseAlignInfo.csv")
+
+    def __saveInfo__(self):
+        """
+        保存信息
+        编号、PSG采样率、XinXiao采样率、 相差位置pos、观测Epoch、保存时间
+        使用dataframe 保存到 csv中
+        首先判断csv是否存在,不存在则新建,存在则追加
+        :return:
+        """
+        sampNo = self.ui.comboBox_SelectFile.currentText()
+        PSG_SampRate = self.ui.spinBox_PSGFreq.value()
+        XX_SampRate = self.ui.spinBox_XXFreq.value()
+        pos = self.data.Config["pos"]
+        epoch = self.ui.spinBox_SelectEpoch.value()
+        save_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+        # 保存到csv中
+        df = pd.DataFrame({"sampNo": [sampNo], "PSG_SampRate": [PSG_SampRate], "XX_SampRate": [XX_SampRate],
+                           "pos": [pos], "epoch": [epoch], "save_time": [save_time]})
+        if Path("./RespCoarseAlignInfo.csv").exists():
+            df.to_csv("./RespCoarseAlignInfo.csv", mode="a", header=False, index=False)
+        else:
+            df.to_csv("./RespCoarseAlignInfo.csv", mode="w", header=True, index=False)
+        # noinspection PyUnresolvedReferences
+        QMessageBox.information(self, "提示", "保存成功", QMessageBox.Ok)
+
+    def __EpochChange__(self):
+        # 获取当前值
+        value = self.ui.spinBox_SelectEpoch.value()
+        # print(self.sender())
+        # print(self.sender() == self.ui.pushButton_EM1)
+        # 判断按键
+        if self.sender() == self.ui.pushButton_EM1:
+            epoch = max(self.ui.spinBox_SelectEpoch.minimum(), value - 1)
+        elif self.sender() == self.ui.pushButton_EM10:
+            epoch = max(self.ui.spinBox_SelectEpoch.minimum(), value - 10)
+        elif self.sender() == self.ui.pushButton_EM100:
+            epoch = max(self.ui.spinBox_SelectEpoch.minimum(), value - 100)
+        elif self.sender() == self.ui.pushButton_EP1:
+            epoch = min(self.ui.spinBox_SelectEpoch.maximum(), value + 1)
+        elif self.sender() == self.ui.pushButton_EP10:
+            epoch = min(self.ui.spinBox_SelectEpoch.maximum(), value + 10)
+        elif self.sender() == self.ui.pushButton_EP100:
+            epoch = min(self.ui.spinBox_SelectEpoch.maximum(), value + 100)
+        else:
+            return
+        # print(epoch)
+        self.ui.spinBox_SelectEpoch.setValue(epoch)
+        QApplication.processEvents()
+        self.__jump__()
+
+    def __jump__(self):
+
+        self.__disableAllButton__()
+        self.ui.label_Info.setText("开始绘制···")
+        self.ui.progressBar.setValue(0)
+        # 获取选择的Epoch
+        epoch = self.ui.spinBox_SelectEpoch.value()
+        # 绘制图像
+        self.__plot__(epoch=epoch)
+        self.ui.progressBar.setValue(100)
+        self.ui.label_Info.setText(f"Epoch: {epoch}, 绘制完成")
+        self.__enableAllButton__()
+
     def __enableAlign__(self):
         self.__disableAllButton__()
         self.ui.label_Info.setText("绘制对齐图像···")
@@ -505,14 +707,19 @@ class MainWindow(QMainWindow):
         QApplication.processEvents()
         if self.ui.checkBox_NTHO.isChecked():
             relate = int(self.ui.checkBox_NTHO.text())
+            reverse = -1
         elif self.ui.checkBox_PTHO.isChecked():
             relate = int(self.ui.checkBox_PTHO.text())
+            reverse = 1
         elif self.ui.checkBox_PABD.isChecked():
             relate = int(self.ui.checkBox_PABD.text())
+            reverse = 1
         elif self.ui.checkBox_NABD.isChecked():
             relate = int(self.ui.checkBox_NABD.text())
+            reverse = -1
         elif self.ui.checkBox_custom.isChecked():
             relate = self.ui.spinBox_custom.value()
+            reverse = 1
         else:
             return
 
@@ -520,8 +727,27 @@ class MainWindow(QMainWindow):
         self.data.Config["pos"] = relate
         self.__plot__()
         self.ui.label_Info.setText("相对位置:{}".format(relate))
+
+        # 设置epoch上下限
+        self.data.Config["XX_reverse"] = reverse
+        epoch_min = max(0, relate // 30 // self.data.Config["ApplyFrequency"] + 1)
+        epoch_max = min(len(self.data.processed_THO) // 30 // self.data.Config["ApplyFrequency"] - 1,
+                        (len(self.data.processed_XX) - relate) // 30 // self.data.Config["ApplyFrequency"] - 1)
+        self.ui.spinBox_SelectEpoch.setMinimum(epoch_min)
+        self.ui.spinBox_SelectEpoch.setMaximum(epoch_max)
+        self.ui.spinBox_SelectEpoch.setValue(epoch_min)
+        # set tooltip
+        self.ui.spinBox_SelectEpoch.setToolTip(f"最小值:{epoch_min}\n最大值:{epoch_max}")
+        self.ui.spinBox_SelectEpoch.setEnabled(True)
+        ButtonState["Current"]["pushButton_JUMP"] = True
+        ButtonState["Current"]["pushButton_EM1"] = True
+        ButtonState["Current"]["pushButton_EM10"] = True
+        ButtonState["Current"]["pushButton_EM100"] = True
+        ButtonState["Current"]["pushButton_EP1"] = True
+        ButtonState["Current"]["pushButton_EP10"] = True
+        ButtonState["Current"]["pushButton_EP100"] = True
+        ButtonState["Current"]["pushButton_SaveInfo"] = True
         self.__enableAllButton__()
-        self.ui.pushButton_JUMP.setEnabled(True)
 
     def __getPosition__(self):
         # 根据截断选择,对信号进行互相关操作,得到最大值的位置
@@ -574,12 +800,19 @@ class MainWindow(QMainWindow):
         tho_max2 = np.argmax(tho_relate2)
         abd_max = np.argmax(abd_relate)
         abd_max2 = np.argmax(abd_relate2)
-        pre = self.data.Config["PSGConfig"]["PreCut"] + self.data.Config["PSGConfig"]["PreA"]
+        pre = self.data.Config["PSGConfig"]["PreCut"] + self.data.Config["XXConfig"]["PostCut"]
+
         bias = pre - len(self.data.processed_XX) + 1
         self.ui.checkBox_PABD.setText(str(abd_max + bias))
         self.ui.checkBox_PTHO.setText(str(tho_max + bias))
         self.ui.checkBox_NABD.setText(str(abd_max2 + bias))
         self.ui.checkBox_NTHO.setText(str(tho_max2 + bias))
+        self.ui.checkBox_PABD.setEnabled(True)
+        self.ui.checkBox_PTHO.setEnabled(True)
+        self.ui.checkBox_NABD.setEnabled(True)
+        self.ui.checkBox_NTHO.setEnabled(True)
+        self.ui.checkBox_custom.setEnabled(True)
+        # print(abd_max2)
         self.ui.progressBar.setValue(100)
         self.ui.label_Info.setText("计算完成")
         self.__enableAllButton__()
@@ -600,10 +833,18 @@ class MainWindow(QMainWindow):
         self.ui.checkBox_custom.setChecked(False)
         self.ui.spinBox_SelectEpoch.setValue(0)
         self.ui.spinBox_custom.setValue(0)
-        self.ui.checkBox_PABD.setText("备选1")
-        self.ui.checkBox_PTHO.setText("备选2")
-        self.ui.checkBox_NABD.setText("备选3")
-        self.ui.checkBox_NTHO.setText("备选4")
+        self.ui.spinBox_custom.setEnabled(False)
+        self.ui.spinBox_SelectEpoch.setToolTip("")
+        self.ui.checkBox_PABD.setText("备选3")
+        self.ui.checkBox_PTHO.setText("备选1")
+        self.ui.checkBox_NABD.setText("备选4")
+        self.ui.checkBox_NTHO.setText("备选2")
+        self.ui.checkBox_PABD.setEnabled(False)
+        self.ui.checkBox_PTHO.setEnabled(False)
+        self.ui.checkBox_NABD.setEnabled(False)
+        self.ui.checkBox_NTHO.setEnabled(False)
+        self.ui.checkBox_custom.setEnabled(False)
+        self.ui.spinBox_SelectEpoch.setMinimum(0)
 
     def __cutOff__(self):
         self.ui.label_Info.setText("开始绘制···")
@@ -635,15 +876,29 @@ class MainWindow(QMainWindow):
         elif self.sender() == self.ui.pushButton_GetPos:
             buffer, width, height = self.data.DrawPicCorrelate(*args, **kwargs)
         elif self.sender() == self.ui.checkBox_NTHO:
-            buffer, width, height = self.data.DrawPicOTryAlign()
+            buffer, width, height = self.data.DrawPicTryAlign()
         elif self.sender() == self.ui.checkBox_NABD:
-            buffer, width, height = self.data.DrawPicOTryAlign()
+            buffer, width, height = self.data.DrawPicTryAlign()
         elif self.sender() == self.ui.checkBox_PTHO:
-            buffer, width, height = self.data.DrawPicOTryAlign()
+            buffer, width, height = self.data.DrawPicTryAlign()
         elif self.sender() == self.ui.checkBox_PABD:
-            buffer, width, height = self.data.DrawPicOTryAlign()
+            buffer, width, height = self.data.DrawPicTryAlign()
         elif self.sender() == self.ui.spinBox_custom:
-            buffer, width, height = self.data.DrawPicOTryAlign()
+            buffer, width, height = self.data.DrawPicTryAlign()
+        elif self.sender() == self.ui.pushButton_JUMP:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
+        elif self.sender() == self.ui.pushButton_EM1:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
+        elif self.sender() == self.ui.pushButton_EM10:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
+        elif self.sender() == self.ui.pushButton_EM100:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
+        elif self.sender() == self.ui.pushButton_EP1:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
+        elif self.sender() == self.ui.pushButton_EP10:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
+        elif self.sender() == self.ui.pushButton_EP100:
+            buffer, width, height = self.data.DrawPicByEpoch(*args, **kwargs)
         else:
             return
         # 显示到labelPic上
@@ -681,12 +936,12 @@ class MainWindow(QMainWindow):
         sorted(PSGFiles)
         sorted(XXFiles)
         # 获取两文件夹下同时存在的编号
-        print(PSGFiles, XXFiles)
+        # print(PSGFiles, XXFiles)
         Files = list(set(PSGFiles).intersection(set(XXFiles)))
         # 获取两文件夹下仅存在一个的编号
         FilesOnlyInPSG = list(set(PSGFiles).difference(set(XXFiles)))
         FilesOnlyInXX = list(set(XXFiles).difference(set(PSGFiles)))
-        print(Files, FilesOnlyInPSG, FilesOnlyInXX)
+        # print(Files, FilesOnlyInPSG, FilesOnlyInXX)
         # 均显示到下拉框
         self.ui.comboBox_SelectFile.clear()
         self.ui.comboBox_SelectFile.addItems([file for file in Files])
@@ -803,6 +1058,7 @@ class MainWindow(QMainWindow):
         self.__plot__()
         self.ui.progressBar.setValue(100)
         ButtonState["Current"]["pushButton_CutOff"] = True
+        ButtonState["Current"]["pushButton_ReadInfo"] = True
         self.__enableAllButton__()
 
 
diff --git a/ui/Mian.py b/ui/Mian.py
index 5648eba..986b8d6 100644
--- a/ui/Mian.py
+++ b/ui/Mian.py
@@ -51,7 +51,7 @@ class Ui_mainWindow(object):
         self.groupBox.setObjectName(u"groupBox")
         self.verticalLayoutWidget_7 = QWidget(self.groupBox)
         self.verticalLayoutWidget_7.setObjectName(u"verticalLayoutWidget_7")
-        self.verticalLayoutWidget_7.setGeometry(QRect(10, 20, 281, 61))
+        self.verticalLayoutWidget_7.setGeometry(QRect(10, 20, 283, 61))
         self.verticalLayout_8 = QVBoxLayout(self.verticalLayoutWidget_7)
         self.verticalLayout_8.setObjectName(u"verticalLayout_8")
         self.verticalLayout_8.setContentsMargins(0, 0, 0, 0)
@@ -277,7 +277,7 @@ class Ui_mainWindow(object):
         self.groupBox_5.setObjectName(u"groupBox_5")
         self.verticalLayoutWidget_3 = QWidget(self.groupBox_5)
         self.verticalLayoutWidget_3.setObjectName(u"verticalLayoutWidget_3")
-        self.verticalLayoutWidget_3.setGeometry(QRect(10, 20, 281, 121))
+        self.verticalLayoutWidget_3.setGeometry(QRect(10, 20, 281, 131))
         self.verticalLayout_3 = QVBoxLayout(self.verticalLayoutWidget_3)
         self.verticalLayout_3.setObjectName(u"verticalLayout_3")
         self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
@@ -454,7 +454,7 @@ class Ui_mainWindow(object):
         self.pushButton_CutOff.setObjectName(u"pushButton_CutOff")
         sizePolicy.setHeightForWidth(self.pushButton_CutOff.sizePolicy().hasHeightForWidth())
         self.pushButton_CutOff.setSizePolicy(sizePolicy)
-        self.pushButton_CutOff.setMinimumSize(QSize(85, 0))
+        self.pushButton_CutOff.setMinimumSize(QSize(60, 0))
         self.pushButton_CutOff.setMaximumSize(QSize(85, 16777215))
 
         self.horizontalLayout_8.addWidget(self.pushButton_CutOff)
@@ -467,6 +467,8 @@ class Ui_mainWindow(object):
         self.pushButton_GetPos.setObjectName(u"pushButton_GetPos")
         sizePolicy1.setHeightForWidth(self.pushButton_GetPos.sizePolicy().hasHeightForWidth())
         self.pushButton_GetPos.setSizePolicy(sizePolicy1)
+        self.pushButton_GetPos.setMinimumSize(QSize(60, 0))
+        self.pushButton_GetPos.setMaximumSize(QSize(85, 16777215))
 
         self.horizontalLayout_8.addWidget(self.pushButton_GetPos)
 
@@ -474,6 +476,17 @@ class Ui_mainWindow(object):
 
         self.horizontalLayout_8.addItem(self.horizontalSpacer_9)
 
+        self.pushButton_ReadInfo = QPushButton(self.verticalLayoutWidget_3)
+        self.pushButton_ReadInfo.setObjectName(u"pushButton_ReadInfo")
+        self.pushButton_ReadInfo.setMinimumSize(QSize(60, 0))
+        self.pushButton_ReadInfo.setMaximumSize(QSize(85, 16777215))
+
+        self.horizontalLayout_8.addWidget(self.pushButton_ReadInfo)
+
+        self.horizontalSpacer_7 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_8.addItem(self.horizontalSpacer_7)
+
 
         self.verticalLayout_3.addLayout(self.horizontalLayout_8)
 
@@ -530,6 +543,8 @@ class Ui_mainWindow(object):
         self.spinBox_custom.setEnabled(False)
         self.spinBox_custom.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
         self.spinBox_custom.setButtonSymbols(QAbstractSpinBox.NoButtons)
+        self.spinBox_custom.setMinimum(-1000000)
+        self.spinBox_custom.setMaximum(1000000)
 
         self.horizontalLayout_11.addWidget(self.spinBox_custom)
 
@@ -585,26 +600,6 @@ class Ui_mainWindow(object):
 
         self.verticalLayout_5.addLayout(self.horizontalLayout_13)
 
-        self.horizontalLayout_14 = QHBoxLayout()
-        self.horizontalLayout_14.setObjectName(u"horizontalLayout_14")
-        self.pushButton_EM1 = QPushButton(self.verticalLayoutWidget_5)
-        self.pushButton_EM1.setObjectName(u"pushButton_EM1")
-
-        self.horizontalLayout_14.addWidget(self.pushButton_EM1)
-
-        self.pushButton_EM10 = QPushButton(self.verticalLayoutWidget_5)
-        self.pushButton_EM10.setObjectName(u"pushButton_EM10")
-
-        self.horizontalLayout_14.addWidget(self.pushButton_EM10)
-
-        self.pushButton_EM100 = QPushButton(self.verticalLayoutWidget_5)
-        self.pushButton_EM100.setObjectName(u"pushButton_EM100")
-
-        self.horizontalLayout_14.addWidget(self.pushButton_EM100)
-
-
-        self.verticalLayout_5.addLayout(self.horizontalLayout_14)
-
         self.horizontalLayout_12 = QHBoxLayout()
         self.horizontalLayout_12.setObjectName(u"horizontalLayout_12")
         self.pushButton_EP1 = QPushButton(self.verticalLayoutWidget_5)
@@ -625,6 +620,26 @@ class Ui_mainWindow(object):
 
         self.verticalLayout_5.addLayout(self.horizontalLayout_12)
 
+        self.horizontalLayout_14 = QHBoxLayout()
+        self.horizontalLayout_14.setObjectName(u"horizontalLayout_14")
+        self.pushButton_EM1 = QPushButton(self.verticalLayoutWidget_5)
+        self.pushButton_EM1.setObjectName(u"pushButton_EM1")
+
+        self.horizontalLayout_14.addWidget(self.pushButton_EM1)
+
+        self.pushButton_EM10 = QPushButton(self.verticalLayoutWidget_5)
+        self.pushButton_EM10.setObjectName(u"pushButton_EM10")
+
+        self.horizontalLayout_14.addWidget(self.pushButton_EM10)
+
+        self.pushButton_EM100 = QPushButton(self.verticalLayoutWidget_5)
+        self.pushButton_EM100.setObjectName(u"pushButton_EM100")
+
+        self.horizontalLayout_14.addWidget(self.pushButton_EM100)
+
+
+        self.verticalLayout_5.addLayout(self.horizontalLayout_14)
+
 
         self.verticalLayout.addWidget(self.groupBox_6)
 
@@ -766,7 +781,8 @@ class Ui_mainWindow(object):
         self.spinBox_PSGPostCut.setPrefix("")
         self.label_23.setText(QCoreApplication.translate("mainWindow", u"\u5fc3\u6653_Post:", None))
         self.pushButton_CutOff.setText(QCoreApplication.translate("mainWindow", u"\u5e94\u7528", None))
-        self.pushButton_GetPos.setText(QCoreApplication.translate("mainWindow", u"\u83b7\u53d6\u5bf9\u9f50\u4f4d\u7f6e", None))
+        self.pushButton_GetPos.setText(QCoreApplication.translate("mainWindow", u"\u8ba1\u7b97\u5bf9\u9f50", None))
+        self.pushButton_ReadInfo.setText(QCoreApplication.translate("mainWindow", u"\u8bfb\u53d6\u5bf9\u9f50", None))
         self.groupBox_4.setTitle(QCoreApplication.translate("mainWindow", u"\u5bf9\u9f50\u8d77\u59cb\u4f4d\u7f6e", None))
         self.checkBox_PTHO.setText(QCoreApplication.translate("mainWindow", u"\u5907\u90091", None))
         self.checkBox_NTHO.setText(QCoreApplication.translate("mainWindow", u"\u5907\u90092", None))
@@ -776,14 +792,14 @@ class Ui_mainWindow(object):
         self.groupBox_6.setTitle(QCoreApplication.translate("mainWindow", u"\u5c40\u90e8\u89c2\u6d4b", None))
         self.label_4.setText(QCoreApplication.translate("mainWindow", u"Epoch:", None))
         self.pushButton_JUMP.setText(QCoreApplication.translate("mainWindow", u"\u8df3\u8f6c", None))
-        self.pushButton_EM1.setText(QCoreApplication.translate("mainWindow", u"Epoch-1", None))
-        self.pushButton_EM10.setText(QCoreApplication.translate("mainWindow", u"Epoch-10", None))
-        self.pushButton_EM100.setText(QCoreApplication.translate("mainWindow", u"Epoch-100", None))
         self.pushButton_EP1.setText(QCoreApplication.translate("mainWindow", u"Epoch+1", None))
         self.pushButton_EP10.setText(QCoreApplication.translate("mainWindow", u"Epoch+10", None))
         self.pushButton_EP100.setText(QCoreApplication.translate("mainWindow", u"Epoch+100", None))
+        self.pushButton_EM1.setText(QCoreApplication.translate("mainWindow", u"Epoch-1", None))
+        self.pushButton_EM10.setText(QCoreApplication.translate("mainWindow", u"Epoch-10", None))
+        self.pushButton_EM100.setText(QCoreApplication.translate("mainWindow", u"Epoch-100", None))
         self.groupBox_2.setTitle(QCoreApplication.translate("mainWindow", u"\u4fdd\u5b58", None))
-        self.pushButton_SaveInfo.setText(QCoreApplication.translate("mainWindow", u"\u4fdd\u5b58\u53c2\u6570", None))
+        self.pushButton_SaveInfo.setText(QCoreApplication.translate("mainWindow", u"\u4fdd\u5b58\u5bf9\u9f50", None))
         self.pushButton_Exit.setText(QCoreApplication.translate("mainWindow", u"\u9000\u51fa", None))
         self.label_Info.setText(QCoreApplication.translate("mainWindow", u"Info", None))
         self.label_Pic.setText(QCoreApplication.translate("mainWindow", u"TextLabel", None))
diff --git a/ui/Mian.ui b/ui/Mian.ui
index a6c4af4..e923bc0 100644
--- a/ui/Mian.ui
+++ b/ui/Mian.ui
@@ -60,7 +60,7 @@
            <rect>
             <x>10</x>
             <y>20</y>
-            <width>281</width>
+            <width>283</width>
             <height>61</height>
            </rect>
           </property>
@@ -493,7 +493,7 @@
             <x>10</x>
             <y>20</y>
             <width>281</width>
-            <height>121</height>
+            <height>131</height>
            </rect>
           </property>
           <layout class="QVBoxLayout" name="verticalLayout_3">
@@ -957,7 +957,7 @@
                </property>
                <property name="minimumSize">
                 <size>
-                 <width>85</width>
+                 <width>60</width>
                  <height>0</height>
                 </size>
                </property>
@@ -993,8 +993,20 @@
                  <verstretch>0</verstretch>
                 </sizepolicy>
                </property>
+               <property name="minimumSize">
+                <size>
+                 <width>60</width>
+                 <height>0</height>
+                </size>
+               </property>
+               <property name="maximumSize">
+                <size>
+                 <width>85</width>
+                 <height>16777215</height>
+                </size>
+               </property>
                <property name="text">
-                <string>获取对齐位置</string>
+                <string>计算对齐</string>
                </property>
               </widget>
              </item>
@@ -1011,6 +1023,38 @@
                </property>
               </spacer>
              </item>
+             <item>
+              <widget class="QPushButton" name="pushButton_ReadInfo">
+               <property name="minimumSize">
+                <size>
+                 <width>60</width>
+                 <height>0</height>
+                </size>
+               </property>
+               <property name="maximumSize">
+                <size>
+                 <width>85</width>
+                 <height>16777215</height>
+                </size>
+               </property>
+               <property name="text">
+                <string>读取对齐</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_7">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
             </layout>
            </item>
           </layout>
@@ -1099,6 +1143,12 @@
                <property name="buttonSymbols">
                 <enum>QAbstractSpinBox::NoButtons</enum>
                </property>
+               <property name="minimum">
+                <number>-1000000</number>
+               </property>
+               <property name="maximum">
+                <number>1000000</number>
+               </property>
               </widget>
              </item>
             </layout>
@@ -1199,31 +1249,6 @@
              </item>
             </layout>
            </item>
-           <item>
-            <layout class="QHBoxLayout" name="horizontalLayout_14">
-             <item>
-              <widget class="QPushButton" name="pushButton_EM1">
-               <property name="text">
-                <string>Epoch-1</string>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pushButton_EM10">
-               <property name="text">
-                <string>Epoch-10</string>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QPushButton" name="pushButton_EM100">
-               <property name="text">
-                <string>Epoch-100</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
            <item>
             <layout class="QHBoxLayout" name="horizontalLayout_12">
              <item>
@@ -1249,6 +1274,31 @@
              </item>
             </layout>
            </item>
+           <item>
+            <layout class="QHBoxLayout" name="horizontalLayout_14">
+             <item>
+              <widget class="QPushButton" name="pushButton_EM1">
+               <property name="text">
+                <string>Epoch-1</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pushButton_EM10">
+               <property name="text">
+                <string>Epoch-10</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pushButton_EM100">
+               <property name="text">
+                <string>Epoch-100</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </item>
           </layout>
          </widget>
         </widget>
@@ -1268,7 +1318,7 @@
            </rect>
           </property>
           <property name="text">
-           <string>保存参数</string>
+           <string>保存对齐</string>
           </property>
          </widget>
          <widget class="QPushButton" name="pushButton_Exit">