Files
bttoxin-pipeline/docs/shotter_workflow_zh.md
2025-11-21 20:23:15 +08:00

6.7 KiB
Raw Permalink Blame History

Bttoxin_Shoter v1 工作流(中文)

本文档说明 Shotter 如何将 BtToxin_Digger 的识别结果转换为“靶标目”的预测与打分,并给出变量定义与计算理由。

输入与输出

  • 输入(来自 Digger
    • tests/output/Results/Toxins/All_Toxins.txt必须
    • 说明该文件包含每条蛋白命中的毒素条目、Identity、比对长度、HMM 标记等。
  • 输入(来自 BPPRC
    • Data/toxicity-data.csv正向活性记录
  • 输出(由 Shotter 生成)
    • toxin_support.tsv逐命中的“命中×目”贡献矩阵per-hit
    • strain_target_scores.tsv每个菌株的“菌株×目”分数矩阵per-strain
    • strain_scores.json同上 JSON 版
    • 若 CSV 含 target_species
      • strain_target_species_scores.tsv每个菌株的“菌株×物种”分数矩阵
      • strain_species_scores.json同上 JSON 版

总体流程

flowchart TD
  A[Genome .fna] --> B0[ORF/CDS 预测]
  B0 --> B1[CDS 翻译为蛋白]
  B1 --> B2[毒素识别 (BLAST/HMM/SVM)]
  B2 --> AT[All_Toxins.txt]
  C[BPPRC specificity CSV] --> D[构建靶标分布索引]
  AT --> E[逐命中解析]
  D --> F[逐命中打分]
  E --> F
  F --> G[菌株层合成]
  G --> H[toxin_support.tsv / strain_target_scores.tsv / strain_scores.json]

变量与符号说明

  • idIdentityDigger 的 Identity 字段/100范围 [0,1]
  • Aln_length比对长度Hit_length参考长度
  • covCoveragecov = Aln_length / Hit_length范围 [0,1]
  • hmmDigger HMM 列YES→1/NO→0
  • base基于 id 与阈值的分段线性权重
  • w_hit单命中的相似性权重结合了 base、coverage、HMM
  • P(order | name/subfamily/family):从 CSV 学得的“蛋白名/亚家族/家族 → 目标目分布”
  • c(order):单命中对某“目”的贡献
  • Score(strain, order)某菌株对“目”的综合分数noisy-OR 合成)

CSV→靶标分布P(order | ·) 的构建

  1. 仅保留阳性记录activity==Yes
  2. 为每条记录计算“证据强度”potency
    • 若含 lc50在单位桶内按反分位归一potency = 1 - rank_percentile(lc50)。理由LC50 越低毒力越强,反分位能将不同条目在同单位下归一到 [0,1]。
    • 若含 percentage_mortality文本→分数
      • ≥80% 或“greater than 80%”→0.90
      • 5080%(含 6080%、60100%→0.65
      • 060%/050%/“25%”/“some”/“stunting”→0.25
    • 否则仅“有活性”→0.55
  3. 单位合并与理由:饮食掺喂实验中 ppm≈µg/g故将 ppm/µg/g/ug/g/μg/g 合并到同一桶做归一;其它单位各自成桶,避免不合理跨单位比较。
  4. 以“蛋白名 name”“亚家族如 Cry1A”“家族如 Cry1”三个层级分别聚合至各 target_order 的 potency 和,并在每层归一化为分布 P(order | ·)。

相似性权重 w_hit为什么这样算

  • 分段阈值来源Bt 命名规范广泛使用 ~0.45/0.78 作为家族/亚家族划界。
  • 覆盖度约束≥0.8 能抑制“碎片/部分结构域”的误判。
  • HMM 加分HMM 表明结构域级别的支持,但不应压倒序列一致性,因此只 +0.1 尾数,且上限 1。
  • 具体公式:
    • 若 id ≥ 0.78 且 cov ≥ 0.80base = 1.0
    • elif 0.45 ≤ id < 0.78base = (id - 0.45) / (0.78 - 0.45)
    • elsebase = 0.0
    • w_hit = min(1, base × cov + 0.1 × hmm)
  • 配对家族(如 Vip1/Vip2、Vpa/Vpb若同菌株内未检测到配对家族且其权重≥0.3则下调w_hit := 0.2 × w_hit保留弱证据

单命中→各“目”的贡献 c(order)

  • 回退顺序name → subfamily → family若能解析到家族但无证据贡献计入 other若无法解析家族前缀贡献计入 unknown。
  • c(order) = w_hit × P(order | name/subfamily/family)

菌株层合成noisy-OR

  • Score(strain, order) = 1 Π_hits (1 c(order))
  • 理由:在 01 范围内自然累积多条独立证据,避免简单相加的“溢出/重复计数”。

特殊列

  • other可解析出家族但 CSV 无证据的命中所汇总的贡献。
  • unknown无法解析家族前缀的命中所汇总的贡献。

结果解读

  • per-hittoxin_support.tsv检查具体哪条毒蛋白对哪些“目”贡献较大Weightw_hit综合反映一致性、覆盖与 HMMPartnerFulfilled=NO 时仅做弱证据。
  • per-strainstrain_target_scores.tsv看每个菌株对哪些“目”分数高可取 Top-N 或设阈值(如 ≥0.5)标注高置信目标。

可视化与热力图

  • 建议用热力图查看:
    • 菌株ד目”分数热力图per-strain 矩阵)
    • 单菌株命中ד目”贡献热力图per-hit 矩阵)
  • 我们提供了独立脚本 scripts/plot_shotter.py 以生成 PNG
    • 避免将绘图依赖耦合到核心打分脚本;
    • 也便于以后替换成别的可视化方案。

物种维度热图与报告

  • 若生成了 strain_target_species_scores.tsv,绘图脚本会输出菌株×物种热图。
  • 绘图脚本还支持论文式报告(--report_mode paper--lang zh|en),自动汇总 Top 列与热图。

展示开关

  • --merge_unresolved:仅在可视化层面合并 other+unknownunresolved(不改变计算)。
  • --per_hit_strain <Strain>:选择一个菌株绘制“每命中×目标目”的贡献热图,用于解释该菌株的 TopOrder/TopScore 来源。

Top 列与未解析桶

  • TopOrder/TopScore命中与菌株在“目标目”维度下的最高分及其数值。
  • 若存在真实“目”Top 排名会优先在真实“目”中选择,不以 other/unknown 决定 Top。
  • other家族可解析但索引无证据unknown家族不可解析。

命令行参数(评分脚本 bttoxin_shoter.py

  • 基本输入:--toxicity_csv--all_toxins--output_dir
  • 过滤与阈值:
    • --min_identity [0-1]--min_coverage [0-1]
    • --allow_unknown_families(默认) / --disallow_unknown_families
    • --require_index_hit:仅保留可在索引中回退到 name/亚家族/家族之一的命中。

物种维度(可选)

  • toxicity-data.csvtarget_species,将构建 P(species | name/subfamily/family) 并用与“目标目”相同的公式合成菌株层分数:
    • 命中贡献:c(species) = w_hit × P(species | ·)
    • 菌株层合成:Score(strain, species) = 1 Π_hits(1 c(species))

常见问答

  • 是否需要再做 BLAST不需要直接使用 Digger 的相似性结果。
  • 为什么只用阳性记录?与“无活性/阴性”混用容易引入语义歧义v1 选择保守做法:阳性证据做加权统计。
  • 为什么 noisy-OR它能够把多条独立证据以概率意义进行合成避免简单相加导致的>1或重复计数。