修正个数显示

添加说明
This commit is contained in:
marques 2022-04-21 13:12:53 +08:00
parent ec57c4d050
commit 7327eb01db
6 changed files with 407 additions and 58 deletions

View File

@ -40,7 +40,7 @@ back_add_second = 60
# 样本编号
sampNo = 670
# 从第几个心晓事件数量开始
start_bcg_index = 0
start_bcg_index = 1
if __name__ == '__main__':
parser = argparse.ArgumentParser()
@ -69,6 +69,6 @@ if __name__ == '__main__':
bcg_frequency=bcg_frequency,
focus_event_list=focus_event_list)
qualityRelabel.show_all_event(start_bcg_index=opt.start_bcg_index,
qualityRelabel.show_all_event(start_bcg_index=opt.start_bcg_index - 1,
front_add_second=opt.front_add_second,
back_add_second=opt.back_add_second)

189
README.md
View File

@ -4,10 +4,12 @@
```bash
Quality_Relabel 主目录
├── Data 数据
│ ├── BCG
│ ├── BCG_label
│ ├── PSG
│ └── PSG_label
│ ├── Artifact_label 体动标签
│ │ └──20220421Artifact_offset_value.xlsx 体动信号位置相对于心晓信号位置偏移量
│ ├── BCG 心晓信号
│ ├── BCG_label 心晓事件标签
│ ├── PSG PSG信号
│ └── PSG_label PSG事件标签
├── history 存放历史记录
│ └── history.log 历史记录
├── utils 基本库
@ -18,9 +20,57 @@ Quality_Relabel 主目录
```
## 测试数据集
670 [测试数据集](https://kod.server.marques22.com/#s/799gDeDw)
## 数据来源与格式
### PSG数据
直接从Alice中导出的EDF文件包括如下通道
| Signal Name | Frequency | Signal Name | Frequency |
| :---------: | :-------: | :---------: | :-------: |
| EEG C3-A2 | 200 | Flow T | 200 |
| EEG C4-A1 | 100 | Flow P | 100 |
| EEG F3-A2 | 200 | Effort Tho | 200 |
| EEG F3-A1 | 200 | Effort Abd | 10 |
| EEG O3-A2 | 200 | SpO2 | 1 |
| EEG O4-A1 | 200 | RR | 10 |
| EEG A1-A2 | 200 | ECG I | 200 |
| EOG Left | 200 | ECG II | 200 |
| EOG Right | 100 | Leg LEG1 | 200 |
| EMG Chin | 200 | leg LEG2 | 200 |
| Snore | 200 | Body | 1 |
| Imp | 200 | Pleth | 100 |
| Pluse | 1 | | |
### 心晓数据
由new_org_1000hz.txt 通过读取后保存成numpy的npy文件以加速读取。此份数据为相对于PSG信号对齐进行过补0与裁剪信号
### PSG标签
从Alice中导出包含所有事件的标签
<img src="graph/psg_label_example.png" style="zoom: 80%;" />
### 心晓标签
打标后从Alice中导出并重新计算标签的epoch、start、end
其中CSA标签为质量打标后的第三次修正的位置
<img src="graph/bcg_label_example.png" style="zoom: 80%;" />
### 体动标签
每个标签由四行构成, 其中体动位置相对于未经对齐的心晓信号故增加20220421Artifact_offset_value.xlsx 用于对齐
第一行为第几个事件, 第二行为事件标签编码, 第三行为事件起始点, 第四行为事件终止点
<img src="graph/artifact_Label_example.png" style="zoom: 100%;" />
@ -34,10 +84,130 @@ Quality_Relabel 主目录
| 3 | 阻塞型呼吸暂停 | 红色 |
| 4 | 混合型呼吸暂停 | 灰色 |
| 5 | 血氧饱和度下降 | 绿色 |
| 6 | 大体动 | 橙色 |
| 7 | 小体动 | 橙色 |
| 8 | 深呼吸 | 橙色 |
| 9 | 脉冲体动 | 橙色 |
| 10 | 无效片段 | 橙色 |
## 示例
## 依赖库
- pyedflib
- numpy
- pandas
- matplotlib
- tqdm
- pywt
- scipy
如果在windows服务器106上运行直接默认Anaconda环境就已满足
## 使用方法
### 1. 从PyCharm中运行
首先取消在pycharm的窗口内显示图片
File --> Settings --> Tools --> Python Scientific --> Show plots in tools window **取消勾选**
打开Main_Quality_Relabel.py
修改
focus_event_list 显示事件
sampNo 样本编号
start_bcg_index 从第几个事件开始显示
<img src="graph/pycharm_example.png" style="zoom: 80%;" />
点击右上角红色方块停止程序
<img src="graph/pycharm_close.png" style="zoom: 100%;" />
### 2. 从命令行运行
最新的代码支持从命令行中传入参数无需打开pycharm
在代码文件夹的路径栏输入cmd后回车进入到命令提示符
<img src="graph/cmd_example.png" style="zoom: 100%;" />
再在命令提示符中运行python 程序名 参数 即可运行
<img src="graph/cmd_example2.png" style="zoom: 100%;" />
#### 支持参数
```bash
usage: Main_Quality_Relabel.py [-h] [-n [SAMPNO]]
[-e [{OSA,CSA,MSA,HPY} [{OSA,CSA,MSA,HPY} ...]]]
[-i [START_BCG_INDEX]] [-f [FRONT_ADD_SECOND]]
[-b [BACK_ADD_SECOND]]
optional arguments:
-h, --help show this help message and exit
-n [SAMPNO], --sampNo [SAMPNO]
样本编号
-e [{OSA,CSA,MSA,HPY} [{OSA,CSA,MSA,HPY} ...]], --event [{OSA,CSA,MSA,HPY} [{OSA,CSA,MSA,HPY} ...]]
显示事件,从[OSA,CSA,MSA,HPY] 选择一个或多个 默认值OSA
-i [START_BCG_INDEX], --start_bcg_index [START_BCG_INDEX]
开始事件序号 默认值1
-f [FRONT_ADD_SECOND], --front_add_second [FRONT_ADD_SECOND]
在事件前添加信号长度 默认值60
-b [BACK_ADD_SECOND], --back_add_second [BACK_ADD_SECOND]
在事件后添加信号长度 默认值60
```
#### 命令行示例
##### 1. 打开样本编号为670查看事件OSA
```bash
python Main_Quality_Relabel.py -n 670
```
```bash
python Main_Quality_Relabel.py -n 670 -e OSA
```
##### 2. 打开样本编号为703查看事件OSA、CSA 从第三个事件开始
```bash
python Main_Quality_Relabel.py -n 703 -e OSA CSA -i 3
```
## 窗口示例
<img src="graph/example.png" style="zoom: 80%;" />
@ -67,9 +237,10 @@ Quality_Relabel 主目录
2022-04-15 2206
1. ~~删除了PSG开头部分不存在于心晓中的标签以后不用计算shifting~~
1. ~~删除了PSG开头部分不存在于心晓中的标签以后不用计算shifting~~
2022-04-17 2000
1. 添加命令行传入参数功能
1. ~~添加命令行传入参数功能~~
2. ~~添加显示目前位于第几个~~

View File

@ -246,9 +246,9 @@
<title>动态连接线.21</title>
<path d="M0 595.28 L21.26 595.28 L21.26 673.23 L34.17 673.23" class="st7"/>
</g>
<g id="shape24-54" v:mID="24" v:groupContext="shape" v:layerMember="0" transform="translate(447.874,-443.622)">
<g id="shape24-54" v:mID="24" v:groupContext="shape" v:layerMember="0" transform="translate(425.197,-432.638)">
<title>数据.24</title>
<desc>提取获得 心晓 心晓呼吸 ABD THO Flow T Flow P SpO2</desc>
<desc>提取获得 心晓 心晓呼吸 ABD THO Flow T Flow P SpO2 体动</desc>
<v:custProps>
<v:cp v:nameU="Cost" v:lbl="成本" v:prompt="" v:type="7" v:format="@" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
@ -270,29 +270,29 @@
<v:ud v:nameU="DefaultWidth" v:prompt="" v:val="VT0(0.98425196850394):24"/>
<v:ud v:nameU="DefaultHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(1.4566929133858):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(1.6535433070866):24"/>
</v:userDefs>
<v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/>
<v:textRect cx="35.4331" cy="537.874" width="47.25" height="114.803"/>
<path d="M-17.72 595.28 L53.15 595.28 L88.58 480.47 L17.72 480.47 L-17.72 595.28 Z" class="st1"/>
<text x="15.43" y="497.89" class="st2" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>提取获得<v:newlineChar/><tspan
<v:textRect cx="35.4331" cy="526.89" width="47.25" height="136.772"/>
<path d="M-17.72 595.28 L53.15 595.28 L88.58 458.5 L17.72 458.5 L-17.72 595.28 Z" class="st1"/>
<text x="15.43" y="480.25" class="st2" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>提取获得<v:newlineChar/><tspan
x="25.43" dy="1.331em" class="st3">心晓<v:newlineChar/></tspan><tspan x="15.43" dy="1.331em" class="st3">心晓呼吸<v:newlineChar/></tspan><tspan
x="26.74" dy="1.233em" class="st4">ABD<v:newlineChar/></tspan><tspan x="26.57" dy="1.2em" class="st4">THO<v:newlineChar/></tspan><tspan
x="22.21" dy="1.2em" class="st4">Flow T<v:newlineChar/></tspan><tspan x="22.06" dy="1.2em" class="st4">Flow P<v:newlineChar/></tspan><tspan
x="24.66" dy="1.2em" class="st4">SpO2</tspan></text> </g>
<g id="shape25-64" v:mID="25" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-493.583)">
x="24.66" dy="1.2em" class="st4">SpO2<v:newlineChar/></tspan><tspan x="25.43" dy="1.298em" class="st3">体动</tspan></text> </g>
<g id="shape25-65" v:mID="25" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-493.583)">
<title>动态连接线.25</title>
<path d="M0 588.54 L21.26 588.54 L21.26 587.83 L76.69 587.83" class="st7"/>
<path d="M0 588.54 L21.26 588.54 L21.26 587.83 L54.01 587.83" class="st7"/>
</g>
<g id="shape26-69" v:mID="26" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-437.953)">
<g id="shape26-70" v:mID="26" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-437.953)">
<title>动态连接线.26</title>
<path d="M0 595.28 L21.26 595.28 L21.26 532.2 L76.69 532.2" class="st7"/>
<path d="M0 595.28 L21.26 595.28 L21.26 532.2 L54.01 532.2" class="st7"/>
</g>
<g id="shape27-74" v:mID="27" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-296.22)">
<g id="shape27-75" v:mID="27" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-296.22)">
<title>动态连接线.27</title>
<path d="M0 595.28 L21.26 595.28 L21.26 390.47 L76.69 390.47" class="st7"/>
<path d="M0 595.28 L21.26 595.28 L21.26 390.47 L54.01 390.47" class="st7"/>
</g>
<g id="shape29-79" v:mID="29" v:groupContext="shape" v:layerMember="0" transform="translate(586.772,-464.173)">
<g id="shape29-80" v:mID="29" v:groupContext="shape" v:layerMember="0" transform="translate(586.772,-464.173)">
<title>判定</title>
<desc>根据心晓事件个数遍历</desc>
<v:custProps>
@ -322,7 +322,7 @@
<path d="M0 558.43 L41.1 521.57 L82.2 558.43 L41.1 595.28 L0 558.43 Z" class="st1"/>
<text x="11.1" y="554.77" class="st2" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>根据心晓事件<tspan x="21.1"
dy="1.298em" class="st3">个数遍历</tspan></text> </g>
<g id="shape30-83" v:mID="30" v:groupContext="shape" v:layerMember="0" transform="translate(724.252,-486.85)">
<g id="shape30-84" v:mID="30" v:groupContext="shape" v:layerMember="0" transform="translate(724.252,-486.85)">
<title>开始/结束.30</title>
<desc>结束</desc>
<v:custProps>
@ -352,7 +352,7 @@
<path d="M14.17 595.28 L56.69 595.28 A14.1732 14.1732 -180 0 0 56.69 566.93 L14.17 566.93 A14.1732 14.1732 -180 1 0 14.17
595.28 Z" class="st1"/>
<text x="27.43" y="583.77" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>结束</text> </g>
<g id="shape31-86" v:mID="31" v:groupContext="shape" v:layerMember="0" transform="translate(532.913,-379.134)">
<g id="shape31-87" v:mID="31" v:groupContext="shape" v:layerMember="0" transform="translate(532.913,-379.134)">
<title>流程.31</title>
<desc>获取PSG事件 长度、标签</desc>
<v:custProps>
@ -382,7 +382,7 @@
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="13.01" y="571.35" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>获取<tspan class="st4">PSG</tspan>事件<v:newlineChar/><tspan
x="15.43" dy="1.331em" class="st3">长度</tspan>、标签</text> </g>
<g id="shape32-91" v:mID="32" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-379.134)">
<g id="shape32-92" v:mID="32" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-379.134)">
<title>流程.32</title>
<desc>获取心晓事件 长度、标签</desc>
<v:custProps>
@ -412,7 +412,7 @@
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="11.43" y="571.35" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>获取心晓事件<v:newlineChar/><tspan
x="15.43" dy="1.331em" class="st3">长度</tspan>、标签</text> </g>
<g id="shape33-95" v:mID="33" v:groupContext="shape" v:layerMember="0" transform="translate(532.913,-314.646)">
<g id="shape33-96" v:mID="33" v:groupContext="shape" v:layerMember="0" transform="translate(532.913,-314.646)">
<title>流程.33</title>
<desc>向前、向后 获取一分钟</desc>
<v:custProps>
@ -442,7 +442,7 @@
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="15.43" y="571.35" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>向前、向后<v:newlineChar/><tspan
x="15.43" dy="1.331em" class="st3">获取一分钟</tspan></text> </g>
<g id="shape34-99" v:mID="34" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-314.646)">
<g id="shape34-100" v:mID="34" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-314.646)">
<title>流程.34</title>
<desc>向前、向后 获取一分钟+与PSG信号长度差值/2</desc>
<v:custProps>
@ -473,7 +473,7 @@
<text x="15.43" y="566.03" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>向前、向后<v:newlineChar/><tspan
x="3.01" dy="1.331em" class="st3">获取一分钟</tspan><tspan class="st4">+</tspan><tspan class="st4">PSG</tspan><tspan
x="7.86" dy="1.331em" class="st3">信号长度差值</tspan><tspan class="st4">/2</tspan></text> </g>
<g id="shape36-107" v:mID="36" v:groupContext="shape" v:layerMember="0" transform="translate(532.913,-250.157)">
<g id="shape36-108" v:mID="36" v:groupContext="shape" v:layerMember="0" transform="translate(532.913,-250.157)">
<title>流程.36</title>
<desc>事件上色标注</desc>
<v:custProps>
@ -502,7 +502,7 @@
<v:textRect cx="35.4331" cy="574.016" width="70.87" height="42.5197"/>
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="11.43" y="576.68" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>事件上色标注</text> </g>
<g id="shape38-110" v:mID="38" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-250.157)">
<g id="shape38-111" v:mID="38" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-250.157)">
<title>流程.38</title>
<desc>事件上色标注</desc>
<v:custProps>
@ -531,7 +531,7 @@
<v:textRect cx="35.4331" cy="574.016" width="70.87" height="42.5197"/>
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="11.43" y="576.68" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>事件上色标注</text> </g>
<g id="shape39-113" v:mID="39" v:groupContext="shape" v:layerMember="0" transform="translate(583.937,-185.669)">
<g id="shape39-114" v:mID="39" v:groupContext="shape" v:layerMember="0" transform="translate(637.795,-185.669)">
<title>流程.39</title>
<desc>显示</desc>
<v:custProps>
@ -560,49 +560,227 @@
<v:textRect cx="35.4331" cy="574.016" width="70.87" height="42.5197"/>
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="27.43" y="576.68" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>显示</text> </g>
<g id="shape40-116" v:mID="40" v:groupContext="shape" v:layerMember="1" transform="translate(518.74,-508.11)">
<g id="shape40-117" v:mID="40" v:groupContext="shape" v:layerMember="1" transform="translate(496.063,-508.11)">
<title>动态连接线.40</title>
<path d="M0 602.36 L62.52 602.36" class="st7"/>
<path d="M0 602.36 L44.65 602.36 L85.19 602.36" class="st7"/>
</g>
<g id="shape41-121" v:mID="41" v:groupContext="shape" v:layerMember="1" transform="translate(627.874,-464.173)">
<g id="shape41-122" v:mID="41" v:groupContext="shape" v:layerMember="1" transform="translate(627.874,-464.173)">
<title>动态连接线.41</title>
<path d="M0 595.28 L0 616.54 L-59.53 616.54 L-59.53 632.28" class="st7"/>
</g>
<g id="shape42-126" v:mID="42" v:groupContext="shape" v:layerMember="1" transform="translate(627.874,-464.173)">
<g id="shape42-127" v:mID="42" v:groupContext="shape" v:layerMember="1" transform="translate(627.874,-464.173)">
<title>动态连接线.42</title>
<path d="M0 595.28 L0 616.54 L45.35 616.54 L45.35 632.28" class="st7"/>
</g>
<g id="shape43-131" v:mID="43" v:groupContext="shape" v:layerMember="1" transform="translate(561.26,-379.134)">
<g id="shape43-132" v:mID="43" v:groupContext="shape" v:layerMember="1" transform="translate(561.26,-379.134)">
<title>动态连接线.43</title>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape44-136" v:mID="44" v:groupContext="shape" v:layerMember="1" transform="translate(666.142,-379.134)">
<g id="shape44-137" v:mID="44" v:groupContext="shape" v:layerMember="1" transform="translate(666.142,-379.134)">
<title>动态连接线.44</title>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape45-141" v:mID="45" v:groupContext="shape" v:layerMember="1" transform="translate(666.142,-314.646)">
<g id="shape45-142" v:mID="45" v:groupContext="shape" v:layerMember="1" transform="translate(666.142,-314.646)">
<title>动态连接线.45</title>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape46-146" v:mID="46" v:groupContext="shape" v:layerMember="1" transform="translate(561.26,-314.646)">
<g id="shape46-147" v:mID="46" v:groupContext="shape" v:layerMember="1" transform="translate(561.26,-314.646)">
<title>动态连接线.46</title>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape47-151" v:mID="47" v:groupContext="shape" v:layerMember="1" transform="translate(568.346,-250.157)">
<g id="shape47-152" v:mID="47" v:groupContext="shape" v:layerMember="1" transform="translate(568.346,-250.157)">
<title>动态连接线.47</title>
<path d="M0 595.28 L0 605.91 L51.02 605.91 L51.02 611.73" class="st7"/>
<path d="M0 595.28 L0 638.5 L63.93 638.5" class="st7"/>
</g>
<g id="shape48-156" v:mID="48" v:groupContext="shape" v:layerMember="1" transform="translate(673.228,-250.157)">
<g id="shape48-157" v:mID="48" v:groupContext="shape" v:layerMember="1" transform="translate(666.142,-250.157)">
<title>动态连接线.48</title>
<path d="M0 595.28 L0 605.91 L-53.86 605.91 L-53.86 611.73" class="st7"/>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape49-161" v:mID="49" v:groupContext="shape" v:layerMember="1" transform="translate(668.976,-508.11)">
<g id="shape49-162" v:mID="49" v:groupContext="shape" v:layerMember="1" transform="translate(668.976,-508.11)">
<title>动态连接线.49</title>
<path d="M0 602.36 L49.76 602.36" class="st7"/>
</g>
<g id="shape51-166" v:mID="51" v:groupContext="shape" v:layerMember="1" transform="translate(578.268,-206.929)">
<g id="shape51-167" v:mID="51" v:groupContext="shape" v:layerMember="1" transform="translate(673.228,-185.669)">
<title>动态连接线.51</title>
<path d="M5.67 595.28 L-66.61 595.28 L-66.61 359.29 L-38.27 359.29 L-38.27 301.18 L2.99 301.18" class="st7"/>
<path d="M0 595.28 L0 616.54 L-145.98 616.54 L-145.98 279.92 L-91.97 279.92" class="st7"/>
</g>
<g id="shape53-172" v:mID="53" v:groupContext="shape" v:layerMember="0" transform="translate(153.071,-177.165)">
<title>数据.53</title>
<desc>输入体动标签 获取偏移数量</desc>
<v:custProps>
<v:cp v:nameU="Cost" v:lbl="成本" v:prompt="" v:type="7" v:format="@" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="ProcessNumber" v:lbl="进程编号" v:prompt="" v:type="2" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Owner" v:lbl="所有者" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Function" v:lbl="函数" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0" v:val="VT4()"/>
<v:cp v:nameU="StartDate" v:lbl="开始日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="EndDate" v:lbl="结束日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Status" v:lbl="状态" v:prompt="" v:type="4" v:format=";未开始;进行中;已完成;已推迟;正在等待输入" v:sortKey=""
v:invis="false" v:ask="false" v:langID="2052" v:cal="0" v:val="VT4()"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
<v:ud v:nameU="DefaultWidth" v:prompt="" v:val="VT0(0.98425196850394):24"/>
<v:ud v:nameU="DefaultHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
</v:userDefs>
<v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/>
<v:textRect cx="50.315" cy="574.016" width="67.09" height="42.5197"/>
<path d="M-10.63 595.28 L90 595.28 L111.26 552.76 L10.63 552.76 L-10.63 595.28 Z" class="st1"/>
<text x="20.31" y="570.69" class="st2" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>输入体动标签<v:newlineChar/><tspan
x="20.31" dy="1.331em" class="st3">获取偏移数量</tspan></text> </g>
<g id="shape54-176" v:mID="54" v:groupContext="shape" v:layerMember="0" transform="translate(283.465,-177.165)">
<title>流程.54</title>
<desc>重新计算体动片段位置</desc>
<v:custProps>
<v:cp v:nameU="Cost" v:lbl="成本" v:prompt="" v:type="7" v:format="@" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="ProcessNumber" v:lbl="进程编号" v:prompt="" v:type="2" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Owner" v:lbl="所有者" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Function" v:lbl="函数" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0" v:val="VT4()"/>
<v:cp v:nameU="StartDate" v:lbl="开始日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="EndDate" v:lbl="结束日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Status" v:lbl="状态" v:prompt="" v:type="4" v:format=";未开始;进行中;已完成;已推迟;正在等待输入" v:sortKey=""
v:invis="false" v:ask="false" v:langID="2052" v:cal="0" v:val="VT4()"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
<v:ud v:nameU="DefaultWidth" v:prompt="" v:val="VT0(0.98425196850394):24"/>
<v:ud v:nameU="DefaultHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
</v:userDefs>
<v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/>
<v:textRect cx="41.1024" cy="574.016" width="82.21" height="42.5197"/>
<rect x="0" y="552.756" width="82.2047" height="42.5197" class="st1"/>
<text x="6.1" y="570.36" class="st2" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>重新计算体动片<tspan x="26.1"
dy="1.298em" class="st3">段位置</tspan></text> </g>
<g id="shape55-180" v:mID="55" v:groupContext="shape" v:layerMember="1" transform="translate(120.472,-374.173)">
<title>动态连接线.55</title>
<path d="M0 595.28 L21.26 595.28 L21.26 771.02 L27.08 771.02" class="st7"/>
</g>
<g id="shape56-185" v:mID="56" v:groupContext="shape" v:layerMember="1" transform="translate(253.701,-191.339)">
<title>动态连接线.56</title>
<path d="M0 588.19 L24.25 588.19" class="st7"/>
</g>
<g id="shape57-190" v:mID="57" v:groupContext="shape" v:layerMember="1" transform="translate(365.669,-198.425)">
<title>动态连接线.57</title>
<path d="M0 595.28 L21.26 595.28 L21.26 292.68 L54.01 292.68" class="st7"/>
</g>
<g id="shape58-195" v:mID="58" v:groupContext="shape" v:layerMember="0" transform="translate(742.677,-379.134)">
<title>流程.58</title>
<desc>获取体动事件 长度、标签</desc>
<v:custProps>
<v:cp v:nameU="Cost" v:lbl="成本" v:prompt="" v:type="7" v:format="@" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="ProcessNumber" v:lbl="进程编号" v:prompt="" v:type="2" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Owner" v:lbl="所有者" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Function" v:lbl="函数" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0" v:val="VT4()"/>
<v:cp v:nameU="StartDate" v:lbl="开始日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="EndDate" v:lbl="结束日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Status" v:lbl="状态" v:prompt="" v:type="4" v:format=";未开始;进行中;已完成;已推迟;正在等待输入" v:sortKey=""
v:invis="false" v:ask="false" v:langID="2052" v:cal="0" v:val="VT4()"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
<v:ud v:nameU="DefaultWidth" v:prompt="" v:val="VT0(0.98425196850394):24"/>
<v:ud v:nameU="DefaultHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
</v:userDefs>
<v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/>
<v:textRect cx="35.4331" cy="574.016" width="70.87" height="42.5197"/>
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="11.43" y="571.35" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>获取体动事件<v:newlineChar/><tspan
x="15.43" dy="1.331em" class="st3">长度</tspan>、标签</text> </g>
<g id="shape59-199" v:mID="59" v:groupContext="shape" v:layerMember="0" transform="translate(742.677,-314.646)">
<title>流程.59</title>
<desc>向前、向后 获取一分钟+与PSG信号长度差值/2</desc>
<v:custProps>
<v:cp v:nameU="Cost" v:lbl="成本" v:prompt="" v:type="7" v:format="@" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="ProcessNumber" v:lbl="进程编号" v:prompt="" v:type="2" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Owner" v:lbl="所有者" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Function" v:lbl="函数" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0" v:val="VT4()"/>
<v:cp v:nameU="StartDate" v:lbl="开始日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="EndDate" v:lbl="结束日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Status" v:lbl="状态" v:prompt="" v:type="4" v:format=";未开始;进行中;已完成;已推迟;正在等待输入" v:sortKey=""
v:invis="false" v:ask="false" v:langID="2052" v:cal="0" v:val="VT4()"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
<v:ud v:nameU="DefaultWidth" v:prompt="" v:val="VT0(0.98425196850394):24"/>
<v:ud v:nameU="DefaultHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
</v:userDefs>
<v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/>
<v:textRect cx="35.4331" cy="574.016" width="70.87" height="42.5197"/>
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="15.43" y="566.03" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>向前、向后<v:newlineChar/><tspan
x="3.01" dy="1.331em" class="st3">获取一分钟</tspan><tspan class="st4">+</tspan><tspan class="st4">PSG</tspan><tspan
x="7.86" dy="1.331em" class="st3">信号长度差值</tspan><tspan class="st4">/2</tspan></text> </g>
<g id="shape60-207" v:mID="60" v:groupContext="shape" v:layerMember="0" transform="translate(742.677,-250.157)">
<title>流程.60</title>
<desc>事件上色标注</desc>
<v:custProps>
<v:cp v:nameU="Cost" v:lbl="成本" v:prompt="" v:type="7" v:format="@" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="ProcessNumber" v:lbl="进程编号" v:prompt="" v:type="2" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Owner" v:lbl="所有者" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Function" v:lbl="函数" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0" v:val="VT4()"/>
<v:cp v:nameU="StartDate" v:lbl="开始日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false"
v:ask="false" v:langID="2052" v:cal="0"/>
<v:cp v:nameU="EndDate" v:lbl="结束日期" v:prompt="" v:type="5" v:format="" v:sortKey="" v:invis="false" v:ask="false"
v:langID="2052" v:cal="0"/>
<v:cp v:nameU="Status" v:lbl="状态" v:prompt="" v:type="4" v:format=";未开始;进行中;已完成;已推迟;正在等待输入" v:sortKey=""
v:invis="false" v:ask="false" v:langID="2052" v:cal="0" v:val="VT4()"/>
</v:custProps>
<v:userDefs>
<v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
<v:ud v:nameU="DefaultWidth" v:prompt="" v:val="VT0(0.98425196850394):24"/>
<v:ud v:nameU="DefaultHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
<v:ud v:nameU="ResizeTxtHeight" v:prompt="" v:val="VT0(0.59055118110236):24"/>
</v:userDefs>
<v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/>
<v:textRect cx="35.4331" cy="574.016" width="70.87" height="42.5197"/>
<rect x="0" y="552.756" width="70.8661" height="42.5197" class="st1"/>
<text x="11.43" y="576.68" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>事件上色标注</text> </g>
<g id="shape61-210" v:mID="61" v:groupContext="shape" v:layerMember="1" transform="translate(771.024,-379.134)">
<title>动态连接线.61</title>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape62-215" v:mID="62" v:groupContext="shape" v:layerMember="1" transform="translate(771.024,-314.646)">
<title>动态连接线.62</title>
<path d="M7.09 595.28 L7.09 611.73" class="st7"/>
</g>
<g id="shape63-220" v:mID="63" v:groupContext="shape" v:layerMember="1" transform="translate(627.874,-464.173)">
<title>动态连接线.63</title>
<path d="M0 595.28 L0 617.24 L150.24 617.24 L150.24 632.28" class="st7"/>
</g>
<g id="shape65-225" v:mID="65" v:groupContext="shape" v:layerMember="1" transform="translate(778.11,-250.157)">
<title>动态连接线.65</title>
<path d="M0 595.28 L0 606.61 L-104.88 606.61 L-104.88 611.73" class="st7"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 316 KiB

View File

@ -63,12 +63,12 @@ class Quality_Relabel:
# 3 红色 阻塞型
# 4 灰色 混合型
# 5 绿色 血氧饱和度下降
# 6 色 大体动
# 7 色 小体动
# 8 色 深呼吸
# 9 色 脉冲体动
# 10 色 无效片段
color_cycle = ["black", "pink", "blue", "red", "silver", "green", "yellow", "yellow", "yellow", "yellow", "yellow"]
# 6 色 大体动
# 7 色 小体动
# 8 色 深呼吸
# 9 色 脉冲体动
# 10 色 无效片段
color_cycle = ["black", "pink", "blue", "red", "silver", "green", "orange", "orange", "orange", "orange", "orange"]
# assert len(color_cycle) == len(base_event) + 1, "基础事件数量与颜色数量不一致"
@ -348,7 +348,7 @@ class Quality_Relabel:
# 绘制 Flow2
plt.subplot(gs[1])
self.plt_channel(plt_=plt, SP=ecg_SP, EP=ecg_EP, channel="Flow P",
title=f"PSG sampNo:{self.sampNo} Index:{ecg_index}/{len(self.ecg_event_label_df)} "
title=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}")
plt.subplot(gs[2])
@ -370,7 +370,7 @@ class Quality_Relabel:
event_code=[1, 2, 3, 4, 6, 7, 8, 9, 10],
event_show_under=False,
ax_bottom=True,
title=f"心晓 sampNo:{self.sampNo} Index:{bcg_index}/{len(self.bcg_event_label_df)} "
title=f"心晓 sampNo:{self.sampNo} Index:{bcg_index+1}/{len(self.bcg_event_label_filtered_df)} "
f"Epoch:{one_bcg_data['Epoch']} Duration:{bcg_duration}",
)
@ -405,11 +405,11 @@ class Quality_Relabel:
if channel == "SpO2":
mask = self.spo2_event_label[SP * self.frequency:EP * self.frequency] == j
elif channel == "orgdata" or channel == "0.7lowpass_resp":
if j < 4:
if j <= 5:
mask = self.bcg_event_label[SP * self.frequency:EP * self.frequency] == j
else:
mask = self.artifact_event_label[SP * self.frequency:EP * self.frequency] == j
linestyle = "--"
linestyle = "-"
else:
mask = self.ecg_event_label[SP * self.frequency:EP * self.frequency] == j