Metabolite Web工具整改与交付计划

来自OmicsWiki
跳到导航 跳到搜索

1. 目标与验收标准

本轮目标是把 omicscloud 中 metabolite web 工具收敛到可完整运行、可交付、可技术审核的状态。当前已暴露的两个问题作为 P0 修复项,同时覆盖代谢模块的主要路线、关键参数组合、报告生成链路和异常输入边界。

  1. 单离子/单样本 demo3 split 路线的差异结果与参考网站对齐。
  2. merge 纯鉴定项目不再因分组/KEGG 列识别导致报错。
  3. split、merge 三条路线至少完成一轮代表性项目回归。
  4. 定量分析、纯鉴定分析、正负离子/单离子输入、常用预处理参数和报告输出均完成自查。

最终交付衡量标准:

  • 分析任务运行成功,日志中无 Error 等级报错、无 Execution halted、无未处理的 REPORT_RENDER_ERROR
  • 生成文件完整,包括 result.rdareport.htmlreport_server.htmlreport.docxreport.zip 以及关键结果表和图片。
  • 报告内容完整,字体、格式、排版在全文保持一致。
  • 差异数量、Venn/UpSet、鉴定信息、纯鉴定结果和参考网站或需求口径一致。
  • 文档、交付说明和自查 Checklist 通过技术部门审核。

2. 当前已知问题

2.1 单离子 demo3 split 结果口径不一致

项目:

project_id=1782216367szeKmg89zLqr
project_root=/home/saitoasuka/mnt/omicscloud/data/13/1782216367szeKmg89zLqr

参考网站 预期差异信息:

CKPG_vs_DMPG  diff_feature=234  up=38   down=196  diff_feature_name=226

DMQG_vs_DMPG diff_feature=370 up=255 down=115 diff_feature_name=341

DMPG_vs_DMQG diff_feature=370 up=115 down=255 diff_feature_name=341

当前风险点:

  • 1.3 差异信息 不能使用拆分并按 name 去冗余后的表覆盖 summary。
  • 参考网站 的 summary 口径是 raw diff,即 results_mode_diffcmp_nameresults_mode_diff_namecmp_name
  • 表格拆分/去冗余仍可用于后续展示、功能分析或去冗余明细,但不能改变 1.3 摘要统计。

2.2 merge 纯鉴定报错

项目:

project_id=1782440463xwSjhqb1O1JX

已定位问题:

  • 前端在纯鉴定开关之前强制要求分组比较,单组/空 comparison 无法继续。
  • 后端把缺失或误识别的 KEGG 列当作真实 KEGG 列,导致 5 个列名赋给 4 列数据:
Error in names(x) <- value :
  'names' attribute [5] must be the same length as the vector [4]

修复方向:

  • 单个非 QC 分组允许 comparison 为空。
  • KEGG 列必须真实存在且不能与 peak/mz/rt/name 列重复;否则走自动注释补 KEGG 逻辑。

2.3 报告渲染 pandoc 137

现象:

Killed
REPORT_RENDER_ERROR report_server.html: pandoc document conversion failed with error 137

判断:

  • 137 是 SIGKILL,通常是 pandoc 转换 HTML 时峰值资源被系统杀掉。
  • 不是分析结果失败,也不是 docx 失败。

处理策略:

  • 优先使用原 pandoc HTML。
  • pandoc 失败时,用 .knit.md 生成轻量静态 HTML 兜底,避免网页报告完全缺失。

3. 任务拆分

阶段 A:基线冻结与输入确认

任务明细:

  1. 固定 VM 路径和项目 ID。
  2. 备份当前 Report 目录。
  3. 记录当前脚本版本和关键 grep 结果。
  4. 保存重跑前的 result.rda差异数量统计.xlsx、Venn/UpSet 图片时间戳。

命令示例:

cd /home/saitoasuka/shiny-server/omicscloud

PROJECT_ID=1782216367szeKmg89zLqr
USER_UID=13
APP_ROOT=/home/saitoasuka/shiny-server/omicscloud
PROJECT_ROOT=/home/saitoasuka/mnt/omicscloud/data/${USER_UID}/${PROJECT_ID}

cp -a "$PROJECT_ROOT/Report" "$PROJECT_ROOT/Report.baseline_$(date +%Y%m%d_%H%M%S)"
grep -n "results_mode_summary_diff_merged" "$APP_ROOT/etc/dep/metabolite_script.r"
grep -n "sample_cols <- intersect(sample_cols, colnames(results_mode_merged))" "$APP_ROOT/etc/dep/metabolite_script.r"

交付物:

  • baseline 备份目录。
  • 一份重跑前日志摘要。

预计时间:

  • 0.5 天。

阶段 B:单离子 demo3 split 结果对齐

任务明细:

  1. 确认 metabolite_script.r 已同步到 VM。
  2. 修正 summary 统计口径:
    • results_mode_summary_diff_merged <- bind_result_list(results_mode_diffcmp_name)
    • results_mode_summary_diff_name_merged <- bind_result_list(results_mode_diff_namecmp_name)
  3. 保留表格拆分/去冗余逻辑,但不用于覆盖 1.3 差异信息
  4. 完整重跑项目。
  5. 核对 1.3 差异信息 是否恢复为 234/370/370
  6. 核对 Venn/UpSet 与参考网站。

重跑命令:

mv "$PROJECT_ROOT/Report" "$PROJECT_ROOT/Report.before_raw_summary_$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true

Rscript --vanilla "$APP_ROOT/etc/dep/metabolite_script.r" \
  "$PROJECT_ID" "$USER_UID" "$APP_ROOT" "$APP_ROOT" \
  > "$PROJECT_ROOT/${PROJECT_ID}_raw_summary_align.log" 2>&1

grep -n "Error in\|Execution halted\|REPORT_RENDER_ERROR\|已保存差异数量统计结果\|Report render status" \
  "$PROJECT_ROOT/${PROJECT_ID}_raw_summary_align.log" | tail -120

交付物:

  • 更新后的 Report/result.rda
  • 更新后的 Report/report.htmlreport_server.htmlreport.docxreport.zip
  • 1.3 差异信息 截图或导出表。
  • Venn/UpSet 截图或图片文件。
  • 重跑日志。

预计时间:

  • 1 天。

阶段 C:merge 纯鉴定报错修复验证

任务明细:

  1. 同步 metabolite_func.rmetabolite_script.r 到 VM。
  2. 重启 Shiny 服务或重新加载应用,确保前端校验生效。
  3. 新建或复跑 merge 纯鉴定项目。
  4. 验证同一组/单组分组时允许下一步。
  5. 验证无比较组时后端进入纯鉴定流程。
  6. 验证无 KEGG 列或 KEGG 列自动识别错误时不会触发 5 列命名错误。

交付物:

  • 纯鉴定项目运行日志。
  • 成功生成的 Report 目录。
  • 前端分组页通过截图。
  • 报告 HTML/docx/zip。

预计时间:

  • 1 天。

阶段 D:报告渲染与格式一致性验证

任务明细:

  1. HTML 正常 pandoc 渲染时检查无 fallback warning。
  2. pandoc 被 kill 时检查 fallback HTML 是否生成。
  3. 检查 report.htmlreport_server.html 是否存在且非错误页。
  4. 检查 docx 字体、标题层级、表格宽度、图片比例、分页。
  5. 检查 zip 包是否包含完整结果目录和报告。

关键日志检查:

grep -n "REPORT_RENDER_ERROR\|Execution halted\|Error in" "$LOG" | tail -120
ls -lh "$PROJECT_ROOT/Report"/report.html \
       "$PROJECT_ROOT/Report"/report_server.html \
       "$PROJECT_ROOT/Report"/report.docx \
       "$PROJECT_ROOT/Report"/report.zip \
       "$PROJECT_ROOT/Report"/result.rda

交付物:

  • 报告文件清单。
  • 日志检查结果。

预计时间:

  • 0.5 天。

阶段 F:完整运行参数矩阵回归

任务明细:

  1. 建立 metabolite web 的最小回归集和扩展回归集。
  2. 覆盖 split、merge路线。
  3. 覆盖定量项目和纯鉴定项目。
  4. 覆盖有 comparison、无 comparison、单组、两组、多组、多比较组合。
  5. 覆盖关键预处理参数和差异筛选参数组合。
  6. 每个组合记录输入配置、项目 ID、日志路径、报告路径、通过/失败结论。
  7. 对失败组合归类为代码问题、输入问题、资源问题、第三方依赖问题或已知非阻断问题。

交付物:

  • 参数矩阵测试记录表。
  • 每条路线至少 1 个完整成功项目。
  • P0/P1 失败项修复记录。
  • 未覆盖项和延期项说明。

预计时间:

  • 1-2 天,取决于 VM 运行速度和失败项数量。

4. 完整运行测试范围与参数矩阵

本节用于补足“只验证当前两个 bug”之外的完整运行计划。最终交付不能只看 demo3 和纯鉴定报错,需要证明 omicscloud 代谢模块在主要使用路径下可以稳定跑完。

4.1 最小必测回归集

编号 路线 数据类型 目标 验收重点
M1 split 定量,demo3 单离子 对齐参考网站 1.3 差异信息=234/370/370,Venn/UpSet 对齐,报告完整
M2 merge 纯鉴定,单组 验证无 comparison 可运行 names attribute [5] 报错,报告/zip/docx 完整
M3 merge 定量,两组或多组 验证常规 merge 定量 差异筛选、PCA/PLS-DA、KEGG/MSEA、报告完整
M4 sjtu 定量代表项目 验证 sjtu 路线未被 split/merge 修复影响 运行成功,报告章节完整
M5 report-only 已有 result.rda 项目 验证报告重渲染 HTML/docx/zip 可生成,格式一致

最小回归集全部通过后,才能进入技术审核。

4.2 扩展参数矩阵

参数域 必测组合 目的 通过标准
路线 split、merge、sjtu 覆盖三条后端分支 均可生成完整 Report
分析类型 定量、纯鉴定 覆盖差异分析和仅鉴定流程 对应章节正确出现或正确跳过
离子模式 POS、NEG、单离子、正负离子合并 覆盖 ion_type 分支 鉴定信息、差异信息、图表不串模式
分组 单组、两组、多组 覆盖 comparison 生成和空 comparison 单组纯鉴定允许运行,多组比较正确生成
比较组 0 个、1 个、多个、互为反向比较 覆盖 up/down 方向和 Venn/UpSet 方向一致,数量稳定,无重复覆盖 summary
缺失值过滤 默认阈值、较严格阈值、关闭/宽松阈值 验证特征数量变化合理 raw/remove/preprocess 数量单调合理
归一化 默认、无归一化、可选归一化方法 验证 PCA/QC/差异链路 无 NA/Inf 导致图表失败
批次校正 无 batch、有 batch 验证 batch 列处理 批次校正章节和后续图表正常
差异筛选 p 值阈值、FC 阈值、VIP 阈值默认和边界 验证差异数量和图表 差异数量可解释,空差异时报告不崩
鉴定列 有 name、有 KEGG、无 KEGG、KEGG 与其他列重复 验证列识别健壮性 无列名长度错误,自动注释逻辑正确
富集 有 KEGG 结果、无 KEGG 结果、MSEA 为空 验证空结果处理 空结果以表格/提示处理,不报 Error
报告输出 html、server html、docx、zip 覆盖报告链路 文件存在、非错误页、zip 可解压

4.3 建议测试项目清单

优先级 项目来源 建议项目 用途
P0 当前问题项目 1782216367szeKmg89zLqr split/demo3/单离子/参考网站 对齐
P0 当前问题项目 1782440463xwSjhqb1O1JX merge/纯鉴定/单组/KEGG 列边界
P1 历史成功项目 选择 1 个 merge 定量项目 防止纯鉴定修复影响常规定量
P1 历史成功项目 选择 1 个正负离子合并项目 验证 ion_type 合并输出
P2 人工构造项目 空差异结果项目 验证差异为空时报告不崩
P2 人工构造项目 无 KEGG/无 HMDB/无 name 边界项目 验证鉴定列缺失时兜底

4.4 参数矩阵记录格式

每个测试组合必须记录以下字段,避免只凭截图判断:

测试编号:
项目 ID:
路线:split/merge
分析类型:定量/纯鉴定
离子模式:
分组数量:
比较组数量:
关键参数:
开始时间:
结束时间:
日志路径:
Report 路径:
核心输出文件是否完整:
Error 等级报错:无/有
报告格式:通过/不通过
业务数值核对:通过/不通过/不适用
结论:通过/失败/阻塞
失败原因分类:
处理人:
复测时间:

4.5 完整运行通过门槛

完整运行交付必须同时满足:

  1. P0 测试全部通过。
  2. P1 测试全部通过,或失败项有明确修复计划且不影响本次交付范围。
  3. 任一报告输出中不得出现未处理的 ErrorExecution halted、错误页。
  4. 空结果、无 KEGG、无 comparison 等边界场景不能导致后端崩溃。
  5. 报告章节缺省必须是业务上可解释的“无结果/不适用”,不能是缺文件或 R 报错。
  6. docx、HTML、zip 三类交付文件至少在 P0/P1 项目中全部验证。

5. 潜在风险与备选方案

风险 影响 预防措施 备选方案
VM 脚本未同步 重跑结果仍是旧逻辑 grep 检查关键代码行 重新复制脚本并记录 md5sum
只重跑 report-only 差异数量不更新 明确必须完整重跑主脚本 移走旧 Report 后重跑完整分析
pandoc 137 HTML 缺失 保留 fallback HTML 若需完整 HTML,增加 VM 内存或拆分报告
前端缓存 页面显示旧报告 清浏览器缓存、确认报告文件时间 直接下载新 report.html 验证
单组纯鉴定被误判为差异分析 后端报错或无结果 前端允许空 comparison,后端自动识别单组 强制设置 ident_only_judge=TRUE 后重跑
KEGG 列误识别 5 列/4 列命名错误或 KEGG 结果异常 KEGG 列有效性判断 设置 key_column_kegg=NA,走自动注释
docx 格式不一致 技术审核不通过 按模板统一标题、表格、图片 用 Rmd 模板修复后 report-only 重渲染
Venn 与数量口径不一致 审核口径不清 明确 Venn 使用 raw diff 还是去冗余 diff 按参考网站 raw diff 口径统一
参数矩阵覆盖不足 技术审核认为只修了局部 bug 按 P0/P1/P2 分层列出覆盖范围 P0/P1 作为交付门槛,P2 作为后续增强
空结果参数组合触发报错 报告中断或章节缺失 加入空差异、空富集、无 KEGG 测试 空结果统一输出空表和说明
split 修复影响 sjtu 或 merge 其他路线回归失败 三条路线分别跑代表项目 分支逻辑隔离,按路线回滚或补丁修复
参数组合过多导致排期失控 交付延期 区分最小必测和扩展测试 P0/P1 先交付,P2 进入后续版本

6. 自查计划

6.1 代码自查

  • Rscript --vanilla -e "parse('etc/dep/metabolite_script.r')" 通过。
  • Rscript --vanilla -e "parse('etc/dep/metabolite_func.r')" 通过。
  • Rscript --vanilla -e "parse('etc/dep/rerun_metabolite_report_only.R')" 通过。
  • git diff --check 无空白错误。
  • grep 确认关键逻辑存在:
grep -n "results_mode_summary_diff_merged <- bind_result_list(results_mode_diff\\[\\[cmp_name\\]\\])" etc/dep/metabolite_script.r
grep -n "length(sample_groups) <= 1" etc/dep/metabolite_func.r
grep -n "write_minimal_html_report" etc/dep/metabolite_script.r etc/dep/rerun_metabolite_report_only.R

6.2 运行自查

  • demo3 完整重跑成功。
  • merge 纯鉴定完整重跑成功。
  • split、merge 至少各有 1 个代表项目完整重跑成功。
  • 定量和纯鉴定至少各有 1 个代表项目完整重跑成功。
  • 参数矩阵 P0 项全部通过,P1 项无阻断失败。
  • 日志无 Execution halted
  • 日志无未处理 REPORT_RENDER_ERROR
  • 输出文件时间戳晚于重跑开始时间。

6.3 报告自查

  • 1.2 鉴定信息 与参考一致。
  • 1.3 差异信息 与参考一致。
  • Venn/UpSet 与参考一致。
  • KEGG/MSEA/物质分类章节存在且图片不缺失。
  • HTML 无明显错位、乱码、错误页。
  • docx 标题、字体、表格、图片、分页一致。
  • zip 解压后文件完整。

6.4 参数矩阵自查

  • 每个测试项目都有项目 ID、日志路径和 Report 路径。
  • 每个测试项目都有参数配置记录。
  • 每个失败项都有失败原因分类和复测结论。
  • P0/P1 测试结论可追溯到日志和报告文件。
  • 未覆盖参数有原因说明和后续计划。

7. 交付验收形式

7.1 文件交付

交付路径:

/home/saitoasuka/mnt/omicscloud/data/13/<project_id>/Report

必须包含:

result.rda

report.html report_server.html report.docx report.zip 差异数量统计.xlsx Venn/UpSet 图片

关键结果表 xlsx/csv

7.2 证据交付

  • 运行日志。
  • grep 检查记录。
  • 参数矩阵测试记录表。
  • 报告截图:
    • 1.2 鉴定信息
    • 1.3 差异信息
    • Venn/UpSet
    • 纯鉴定报告关键章节
  • 技术审核用自查 Checklist。

7.3 验收结论格式

项目 ID:
运行时间:
脚本版本:
运行状态:成功/失败
报告文件:完整/缺失
差异数量:通过/不通过
Venn/UpSet:通过/不通过
纯鉴定流程:通过/不通过
参数矩阵:通过/不通过/有非阻断遗留
字体排版:通过/不通过
技术审核结论:通过/需整改

8. 时间节点

时间 任务 输出
1天 基线冻结、脚本同步、grep 检查 baseline 备份、同步确认、关键代码定位
1天 P0-1 demo3 split 完整重跑与差异/Venn 核对 demo3 报告、日志、截图、参考网站 对照
1天 P0-2 merge 纯鉴定前后端验证 纯鉴定报告、日志、截图
1天 P1 merge 定量、正负离子代表项目回归 P1 参数矩阵记录、报告包
2-3天 扩展参数测试:空差异、无 KEGG、无 comparison、batch 参数 扩展问题清单、失败分类
0.5天 报告格式、zip、docx、HTML 全文检查 自查记录、排版问题清单
0.5天 修复残留问题并复测 P0/P1 最终报告包、复测日志
0.5天 技术部门审核材料整理 计划、Checklist、handoff、Excel 记录、参数矩阵

9. 当前优先级

  1. 先修正并验证 demo3 的 1.3 差异信息 回到参考网站 的 234/370/370
  2. 再验证 Venn/UpSet 与参考网站。
  3. 再验证 merge 纯鉴定不报错。
  4. 再跑 merge 定量、正负离子代表项目,确认修复没有影响其他路线。
  5. 再做空差异、无 KEGG、无 comparison、batch 等边界参数测试。
  6. 最后做报告全文格式、zip 完整性和技术审核文档。