Skip to content

Commit bffb196

Browse files
flyskymanclaude
andcommitted
refactor(core)!: 转码逻辑三套平行实现合一(治本)
新建 epycon/conversion.py 作为转换语义的唯一权威实现: - convert_study():merge/normal 两条路径(自修复后的 __main__ 移植) - entries_to_marks():标注定位唯一实现(fid 归属、有符号亚秒偏移、 round 采样点映射、范围校验) - __main__.py 瘦身为 config 处理 + 调用(510 -> 133 行) - app_gui.execute_epycon_conversion 删除自带 merge/normal 块改为调用 (GUI 特有的进度回调、entries 清洗、汇总 CSV、智能输出目录保留) 随平行实现消亡的 GUI 转码 bug: - e.msg 字段名错误:单文件模式标注嵌入必然 AttributeError(被吞为 "转换失败"),GUI 单文件标注从未成功写出 - merge 标注按墙钟时间差映射到无间隙采样轴:录制有间隙时第二个 文件起全部错位,且只有下界校验 - int() 截断亚秒偏移;get_raw_log_start_seconds 固定按 x64 <Q 读 时间戳(WMx32 全错);(size-32)//(ch*2) 错误时长公式残留 - 删除 _process_datalog_file:第四套实现,零调用方、调用不存在的 LogParser API(headers/stream_data/start_timestamp),bb74e5e 引入即死亡 附带修复: - save_prefs 漏合并请求数据,保存偏好一直是空操作 - _tosel 用 timedelta.seconds(按天回绕+丢亚秒)改纯减法+round - CLI 统一 need_entries 语义:pin_entries=True 而 convert=False 时 此前不读 entries,嵌入静默失效(GUI 语义本来是对的) - conversion 统一写入 credentials 与 extra_attributes(GUI 的 PatientName/PatientID 保留) 测试:新增 tests/test_conversion.py(10 个)——标注定位单元测试 + GUI/CLI 等价性测试(两端 Marks 必须逐采样点一致 [1074]/[50]), 防止实现再次分叉。全套 157 个通过。 台账:#17 入"已解决";新增两个需真实数据验证的调查项 (#15 fid 十六进制 vs 文件名进制、#16 双极导联极性)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 3b26894 commit bffb196

6 files changed

Lines changed: 623 additions & 768 deletions

File tree

app_gui.py

Lines changed: 31 additions & 371 deletions
Large diffs are not rendered by default.

docs/KNOWN_ISSUES.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@
99

1010
## 中优先级
1111

12+
### 15. 【调查】entries fid 十六进制 vs 日志文件名进制
13+
- **位置**`epycon/iou/parsers.py` `_readentries``f"{datalog_uid:08x}"`(上游原状)
14+
- **疑点**:上游 CinC 论文写明日志文件名匹配 `^[0-9]{8}\.log$`;若真实文件名为十进制,
15+
则第 10 个日志起(uid=10 → fid `0000000a` ≠ 文件名 `00000010`)标注 fid 匹配全断;
16+
若文件名实为十六进制,则 `LOG_PATTERN = r'[0-9]*.log'` 又会漏掉含 a-f 的文件
17+
- **验证方法**(需真实数据,如 `examples/data/real_test/`):取一个日志数 >9 的 study,
18+
查看文件名是否出现 a-f;并对照 entries 解析出的 fid 集合与文件名集合的交集
19+
- **影响**:≥10 个日志的研究,标注归属可能系统性丢失
20+
21+
### 16. 【调查】双极导联极性方向
22+
- **位置**`Channels.computed_mappings` 返回 (u−, u+) 反序 + `_mount_channels` 做 source[0]−source[1]
23+
→ 计算导联 = u− − u+,与"正极减负极"惯例相反(仅影响 `leads: "computed"` 配置)
24+
- **上游一致**:与 fork 起点逐字相同,论文作者用 12 例动物数据验证过——可能 WorkMate
25+
的 reference 语义本就如此,也可能是两个反号恰好抵消的隐性约定
26+
- **验证方法**:用真实数据转换一个双极导联,与 WorkMate 屏幕显示的同一导联波形对照极性
27+
1228
### 14. WebUI 性能优化路线图(剩余部分)
1329
- **已完成(2026-06-10)**:前端降采样管线修复(LTTB 内联实现)、downsample 因子契约、
1430
滤波向量化 + 系数缓存、time 数组改前端重建、flask-compress gzip
@@ -27,6 +43,21 @@
2743

2844
## 已解决
2945

46+
### 17. 转码逻辑三套平行实现合一(2026-06-10,治本重构)
47+
- 新建 `epycon/conversion.py` 作为转换语义唯一实现(`convert_study` + `entries_to_marks`),
48+
`__main__.py``app_gui.execute_epycon_conversion` 均改为调用它
49+
- 随平行实现消亡的 GUI 转码 bug:`e.msg` 字段名错误(单文件模式标注嵌入必崩)、
50+
merge 标注按墙钟时间差映射无间隙采样轴(有录制间隙即错位)、int() 截断亚秒、
51+
`get_raw_log_start_seconds` 固定按 x64 读时间戳(x32 全错)、错误时长公式残留、
52+
重复代码块;另删除从未被调用且调用着不存在 API 的 `_process_datalog_file`(第四套实现,
53+
bb74e5e 引入即死亡)
54+
- 附带修复:`save_prefs` 漏合并请求数据(保存偏好一直是空操作);
55+
`_tosel``timedelta.seconds`(按天回绕+丢亚秒)改为纯减法+round;
56+
CLI 此前 `pin_entries=True 但 convert=False` 时不读 entries 导致嵌入静默失效,
57+
与 GUI 语义统一为 need_entries
58+
- 新增 `tests/test_conversion.py`:标注定位单元测试 + GUI/CLI 等价性测试
59+
(两端必须产出逐采样点一致的 Marks),防止再次分叉
60+
3061
### 8. CI 双轨测试合流(2026-06-10)
3162
- `scripts/test_version.py` + `test_business_functions.py`(自写 runner,10 个测试)
3263
移植为 `tests/test_business_logic.py`(11 个 pytest 用例,纳入覆盖率统计),

0 commit comments

Comments
 (0)