添加了<体动标注>的重采样

根据规范修改变量名称
This commit is contained in:
Yorusora
2025-05-21 10:28:46 +08:00
parent f1447596b0
commit 74d9642be9
10 changed files with 143 additions and 138 deletions

View File

@ -12,6 +12,7 @@ from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg
from numpy.fft import fft, fftfreq
from overrides import overrides
from pandas import read_csv, DataFrame, concat
from scipy.signal import resample
from yaml import dump, load, FullLoader
from func.utils.PublicFunc import PublicFunc
@ -90,21 +91,21 @@ class SettingWindow(QMainWindow):
Config.update({
"Path": {
"Input_orgBcg": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_LABEL_INPUT_ORGBCG_FILENAME +
Path(str(self.sampID)) / Path(ConfigParams.ORGBCG_SYNC +
str(Config["InputConfig"]["orgBcgFreq"]) +
ConfigParams.ENDSWITH_TXT))),
"Input_BCG": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_LABEL_INPUT_BCG_FILENAME +
Path(str(self.sampID)) / Path(ConfigParams.BCG_SYNC +
str(Config["InputConfig"]["BCGFreq"]) +
ConfigParams.ENDSWITH_TXT))),
"Save_a": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL /
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_LABEL_SAVE_FILENAME_A +
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_A +
ConfigParams.ENDSWITH_TXT))),
"Save_b": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL /
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_LABEL_SAVE_FILENAME_B +
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_B +
ConfigParams.ENDSWITH_TXT))),
"Save_c": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL /
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_LABEL_SAVE_FILENAME_C +
Path(str(self.sampID)) / Path(ConfigParams.ARTIFACT_C +
ConfigParams.ENDSWITH_CSV)))
}
})
@ -145,14 +146,14 @@ class SettingWindow(QMainWindow):
str((Path(self.root_path) /
ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
Path(str(self.sampID)) /
Path(ConfigParams.ARTIFACT_LABEL_INPUT_ORGBCG_FILENAME +
Path(ConfigParams.ORGBCG_SYNC +
str(self.ui.spinBox_input_freq_orgBcg.value()) +
ConfigParams.ENDSWITH_TXT))))
self.ui.plainTextEdit_file_path_input_BCG.setPlainText(
str((Path(self.root_path) /
ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
Path(str(self.sampID)) /
Path(ConfigParams.ARTIFACT_LABEL_INPUT_BCG_FILENAME +
Path(ConfigParams.BCG_SYNC +
str(self.ui.spinBox_input_freq_BCG.value()) +
ConfigParams.ENDSWITH_TXT))))
@ -240,7 +241,7 @@ class MainWindow_artifact_label(QMainWindow):
self.ax0.grid(True)
self.ax0.xaxis.set_major_formatter(ConfigParams.FORMATTER)
self.ax0.tick_params(axis='x', colors=Constants.PLOT_COLOR_WHITE)
self.ax1 = self.fig.add_subplot(self.gs[1], sharex=self.ax0, sharey=self.ax0)
self.ax1 = self.fig.add_subplot(self.gs[1], sharex=self.ax0)
self.ax1.grid(True)
self.ax1.xaxis.set_major_formatter(ConfigParams.FORMATTER)
@ -344,13 +345,13 @@ class MainWindow_artifact_label(QMainWindow):
self.ax0.autoscale(False)
self.ax1.autoscale(False)
except Exception as e:
return Result().failure(info=Constants.DRAWING_FAILURE + "\n" + format_exc())
return Result().success(info=Constants.DRAWING_FINISHED)
return Result().failure(info=Constants.DRAW_FAILURE + "\n" + format_exc())
return Result().success(info=Constants.DRAW_FINISHED)
else:
self.canvas.draw()
self.ax0.autoscale(False)
self.ax1.autoscale(False)
return Result().failure(info=Constants.DRAWING_FAILURE)
return Result().failure(info=Constants.DRAW_FAILURE)
def __plot_artifact__(self):
if len(self.ax0.patches) != 0:
@ -524,9 +525,9 @@ class MainWindow_artifact_label(QMainWindow):
self.ui.tableWidget_type_5.setItem(self.ui.tableWidget_type_5.rowCount() - 1, 1, QTableWidgetItem(str(data["startTime"])))
self.ui.tableWidget_type_5.setItem(self.ui.tableWidget_type_5.rowCount() - 1, 2, QTableWidgetItem(str(data["endTime"])))
except Exception as e:
return Result().failure(info=Constants.ARTIFACT_LABEL_UPDATE_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON["Update_tableWidget_Exception"] + "\n" + format_exc())
return Result().failure(info=Constants.UPDATE_FAILURE + Constants.FAILURE_REASON["Update_tableWidget_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.ARTIFACT_LABEL_UPDATE_FINISHED)
return Result().success(info=Constants.UPDATE_FINISHED)
def update_Info(self):
try:
@ -560,9 +561,9 @@ class MainWindow_artifact_label(QMainWindow):
self.ui.spinBox_duration_type_4.setValue(artifact_total_duration[3])
self.ui.spinBox_duration_type_5.setValue(artifact_total_duration[4])
except Exception as e:
return Result().failure(info=Constants.ARTIFACT_LABEL_UPDATE_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON["Update_Info_Exception"] + "\n" + format_exc())
return Result().failure(info=Constants.UPDATE_FAILURE + Constants.FAILURE_REASON["Update_Info_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.ARTIFACT_LABEL_UPDATE_FINISHED)
return Result().success(info=Constants.UPDATE_FAILURE)
def __slot_btn_input__(self):
PublicFunc.__disableAllButton__(self, ButtonState)
@ -573,7 +574,7 @@ class MainWindow_artifact_label(QMainWindow):
self.data = Data()
# 导入数据
PublicFunc.progressbar_update(self, 1, 5, Constants.INPUTTING_DATA, 0)
PublicFunc.progressbar_update(self, 1, 6, Constants.INPUTTING_DATA, 0)
result = self.data.open_file()
if not result.status:
PublicFunc.text_output(self.ui, "(1/5)" + result.info, Constants.TIPS_TYPE_ERROR)
@ -583,49 +584,63 @@ class MainWindow_artifact_label(QMainWindow):
else:
PublicFunc.text_output(self.ui, "(1/5)" + result.info, Constants.TIPS_TYPE_INFO)
# 重采样
PublicFunc.progressbar_update(self, 2, 6, Constants.RESAMPLING_DATA, 0)
result = self.data.resample()
if not result.status:
PublicFunc.text_output(self.ui, "(2/6)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
PublicFunc.finish_operation(self, ButtonState)
return
else:
PublicFunc.text_output(self.ui, "(2/6)" + result.info, Constants.TIPS_TYPE_INFO)
self.__reset__()
PublicFunc.finish_operation(self, ButtonState)
# 获取存档
PublicFunc.progressbar_update(self, 2, 5, Constants.ARTIFACT_LABEL_LOADING_ARCHIVE, 50)
PublicFunc.progressbar_update(self, 3, 6, Constants.LOADING_ARCHIVE, 50)
result = self.data.get_archive()
if not result.status:
PublicFunc.text_output(self.ui, "(2/5)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.text_output(self.ui, "(3/6)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
PublicFunc.finish_operation(self, ButtonState)
return
else:
PublicFunc.text_output(self.ui, "(2/5)" + result.info, Constants.TIPS_TYPE_INFO)
PublicFunc.text_output(self.ui, "(3/6)" + result.info, Constants.TIPS_TYPE_INFO)
# 绘图
PublicFunc.progressbar_update(self, 3, 5, Constants.DRAWING_DATA, 60)
PublicFunc.progressbar_update(self, 4, 6, Constants.DRAWING_DATA, 60)
result = self.__plot__()
if not result.status:
PublicFunc.text_output(self.ui, "(3/5)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.text_output(self.ui, "(4/6)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
PublicFunc.finish_operation(self, ButtonState)
return
else:
PublicFunc.text_output(self.ui, "(3/5)" + result.info, Constants.TIPS_TYPE_INFO)
PublicFunc.text_output(self.ui, "(4/6)" + result.info, Constants.TIPS_TYPE_INFO)
# 更新表格
PublicFunc.progressbar_update(self, 4, 5, Constants.ARTIFACT_LABEL_UPDATING_TABLE, 90)
PublicFunc.progressbar_update(self, 5, 6, Constants.UPDATING_TABLEWIDGET, 90)
result = self.update_tableWidget()
if not result.status:
PublicFunc.text_output(self.ui, "(4/5)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.text_output(self.ui, "(5/6)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
PublicFunc.finish_operation(self, ButtonState)
return
else:
PublicFunc.text_output(self.ui, "(4/5)" + result.info, Constants.TIPS_TYPE_INFO)
PublicFunc.text_output(self.ui, "(5/6)" + result.info, Constants.TIPS_TYPE_INFO)
# 更新信息
PublicFunc.progressbar_update(self, 5, 5, Constants.ARTIFACT_LABEL_UPDATING_INFO, 95)
PublicFunc.progressbar_update(self, 6, 6, Constants.UPDATING_INFO, 95)
result = self.update_Info()
if not result.status:
PublicFunc.text_output(self.ui, "(5/5)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.text_output(self.ui, "(6/6)" + result.info, Constants.TIPS_TYPE_ERROR)
PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR)
PublicFunc.finish_operation(self, ButtonState)
return
else:
PublicFunc.text_output(self.ui, "(5/5)" + result.info, Constants.TIPS_TYPE_INFO)
PublicFunc.text_output(self.ui, "(6/6)" + result.info, Constants.TIPS_TYPE_INFO)
self.__reset__()
self.figToolbar.action_Label_Artifact.setEnabled(True)
@ -1159,7 +1174,7 @@ class Data:
def open_file(self):
if (not Path(Config["Path"]["Input_orgBcg"]).exists()) or (not Path(Config["Path"]["Input_BCG"]).exists()):
return Result().failure(info=Constants.INPUT_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON["Data_Path_Not_Exist"])
return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Path_Not_Exist"])
try:
self.orgBcg = read_csv(Config["Path"]["Input_orgBcg"],
@ -1169,18 +1184,35 @@ class Data:
encoding=ConfigParams.UTF8_ENCODING,
header=None).to_numpy().reshape(-1)
except Exception as e:
return Result().failure(info=Constants.INPUT_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON["Read_Data_Exception"] + "\n" + format_exc())
return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Open_Data_Exception"] + "\n" + format_exc())
# 检查同步后的orgBcg信号和同步后的BCG信号长度是否相同
if len(self.orgBcg) != len(self.BCG):
return Result().failure(info=Constants.INPUT_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON["Data_Length_not_Correct"])
return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Data_Length_not_Correct"])
return Result().success(info=Constants.INPUT_FINISHED)
def resample(self):
if self.orgBcg is None:
Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"])
try:
if Config["InputConfig"]["orgBcgFreq"] != Config["InputConfig"]["UseFreq"]:
self.orgBcg = resample(self.orgBcg,
int(len(self.orgBcg) *
(Config["InputConfig"]["UseFreq"] / Config["InputConfig"]["orgBcgFreq"])))
else:
return Result().success(info=Constants.RESAMPLE_NO_NEED)
except Exception as e:
Result().failure(info=Constants.RESAMPLE_FAILURE +
Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.RESAMPLE_FINISHED)
def get_archive(self):
if not Path(Config["Path"]["Save_a"]).exists():
self.Artifact_a = []
return Result().success(info=Constants.ARTIFACT_LABEL_ARCHIVE_NOT_EXIST)
return Result().success(info=Constants.ARCHIVE_NOT_EXIST)
else:
self.Artifact_a = read_csv(Config["Path"]["Save_a"],
encoding=ConfigParams.UTF8_ENCODING,
@ -1188,7 +1220,7 @@ class Data:
try:
# 检查体动标签正确性,长度
if len(self.Artifact_a) % 4 != 0:
return Result().failure(info=Constants.INPUT_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON[
return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON[
"Artifact_Format_Not_Correct"])
for i in range(0, len(self.Artifact_a), 4):
unit_data = self.Artifact_a[i:i + 4]
@ -1196,10 +1228,10 @@ class Data:
break
self.df_Artifact_a.loc[len(self.df_Artifact_a)] = [int(unit_data[j]) for j in range(4)]
except Exception as e:
return Result().failure(info=Constants.INPUT_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON[
return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON[
"Get_Artifact_Format_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.ARTIFACT_LABEL_ARCHIVE_EXIST)
return Result().success(info=Constants.ARCHIVE_EXIST)
def save(self, amount, duration):
try:
@ -1224,10 +1256,10 @@ class Data:
self.df_Artifact_a.to_csv(Path(Config["Path"]["Save_c"]), index=False,
encoding=ConfigParams.GBK_ENCODING)
except Exception as e:
return Result().failure(info=Constants.SAVING_FAILURE + Constants.ARTIFACT_LABEL_FAILURE_REASON[
return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON[
"Save_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.SAVING_FINISHED)
return Result().success(info=Constants.SAVE_FINISHED)
class CustomNavigationToolbar(NavigationToolbar2QT):