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

10 KiB
Raw Blame History

Bttoxin_Shoter 结果文件说明与可视化建议

本页介绍 Shotter 的输出文件结构、字段含义、解读建议,以及如何快速画热力图等可视化。

文件一览(默认写入 tests/output/Results/Toxins 或可写回退目录)

  • toxin_support.tsv
    • 逐命中per-hit对各目标“目”的贡献矩阵。
  • strain_target_scores.tsv
    • 每个菌株strain对各“目”的综合分数矩阵01
  • strain_scores.json
    • 与上表相同信息的 JSON 版。

All_Toxins.txt 是 BtToxin_Digger 的输出Shotter 的输入toxin_support.tsv/strain_target_scores.tsv/strain_scores.json 是 Shotter 的新输出文件。

若默认目录不可写(如容器生成目录归 root 所有Shotter 会自动回退到:

  1. tests/output/Results/Toxins/Shotter 子目录;若仍不可写,
  2. 当前工作目录下的 ./shotter_outputs。 命令行也可用 --output_dir 指定任意可写目录。

字段与含义

toxin_support.tsvper-hit 矩阵)

  • Strain菌株名来自 All_Toxins.txt 的第一列)
  • Protein_idDigger 报告的蛋白/ORF 标识
  • Hit_idDigger 命中名(去掉 “-other” 尾巴后的标准名)
  • Identity序列一致性01由 Digger 的 Identity 除以 100 后得到
  • Aln_length / Hit_length比对长度与参考长度
  • Coverage覆盖度Aln_length/Hit_length01
  • HMMDigger 的 HMM 列YES/NO
  • Family解析到的家族键如 Cry1、Vip3无法解析则为 unknown
  • NameKey用于回退检索的名称键通常等于 Hit_id
  • PartnerFulfilled是否满足配对家族如 Vip1/Vip2、Vpa/Vpb
  • Weight该命中的相似性权重 w_hit公式
    • 若 id≥0.78 且 cov≥0.80base=1.0elif 0.45≤id<0.78base=(id-0.45)/(0.78-0.45)else base=0
    • w_hit = min(1, base×coverage + 0.1×HMM)
    • 若需配对但未满足w_hit×=0.2
  • 后续每一列:一个 target_order如 Lepidoptera、Coleoptera… 以及 other、unknown值为该命中对该“目”的贡献
    • 贡献 c(order)=w_hit×P(order|name/subfamily/family)
    • 若能解析出家族但 CSV 无证据 → 计入 other
    • 若无法解析家族 → 计入 unknown

strain_target_scores.tsvper-strain 矩阵)

  • Strain菌株名
  • 每个 target_order 一列(含 other、unknown
    • Score(strain, order)=1∏(1c(order))noisy-OR 合成)
    • 落在 01。值越大综合证据越强。可自定阈值作“高置信”标记例如 ≥0.5)。

strain_scores.json

  • 与 strain_target_scores.tsv 等价的 JSON便于程序消费。

如何解读

  • per-hit适合审查具体哪条毒蛋白命中贡献了哪些“目”。Weight 与 Coverage/Identity/HMM 协同体现可信度PartnerFulfilled=NO 时表示该家族可能需要配对,单独命中仅做弱证据。
  • per-strain纵览一个菌株对哪些“目”潜在活性更强。可以取 Top-N order 查看最可能靶标,也可设置阈值筛“高置信”目标。
  • 列 other/unknown
    • other可解析到家族但 CSV 中无对应靶标证据(回退失败)
    • unknown无法从命中名中解析出家族前缀

热力图可视化示例

1) 菌株×目标“目”分数热力图

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("tests/output/Results/Toxins/strain_target_scores.tsv", sep="\t")
# 如果程序回退到 ./shotter_outputs请改成相应路径

orders = [c for c in df.columns if c != "Strain"]
mat = df.set_index("Strain")[orders]

plt.figure(figsize=(0.6*len(orders)+3, 0.4*len(mat)+2))
sns.heatmap(mat, cmap="viridis", vmin=0, vmax=1, cbar_kws={"label": "score"})
plt.title("Strain vs Target Orders (Shotter)")
plt.tight_layout()
plt.show()

2) 单个菌株:命中×目标“目”贡献热图

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

hits = pd.read_csv("tests/output/Results/Toxins/toxin_support.tsv", sep="\t")
# 选择一个菌株
s = "97-27"
sub = hits.query("Strain == @s").copy()
orders = [c for c in sub.columns if c not in [
    "Strain","Protein_id","Hit_id","Identity","Aln_length","Hit_length","Coverage",
    "HMM","Family","NameKey","PartnerFulfilled","Weight"
]]
mat = sub.set_index("Hit_id")[orders]

plt.figure(figsize=(0.6*len(orders)+3, 0.4*len(mat)+2))
sns.heatmap(mat, cmap="magma", vmin=0, vmax=1, cbar_kws={"label": "contrib"})
plt.title(f"Per-hit contributions for {s}")
plt.tight_layout()
plt.show()

常见问题

  • 为什么不再做 BLAST
    • Shotter 直接使用 Digger 的相似性结果与 HMM 标记;避免重复计算,提高速度与可复现性。
  • 为什么会有 PermissionError
    • 某些 Digger 输出目录可能由容器创建root 所有),普通用户不可写。可传入 --output_dir 指向可写目录或使用程序的自动回退Shotter 子目录或 ./shotter_outputs
  • 是否只看 Top1
    • 矩阵保留了所有“目”的得分,更利于发现“次 high”的潜在靶标。若需要我可以在输出中追加 TopOrder/TopScore 两列。

复现命令

python scripts/bttoxin_shoter.py \
  --toxicity_csv Data/toxicity-data.csv \
  --all_toxins tests/output/Results/Toxins/All_Toxins.txt \
  --output_dir tests/output/Results/Toxins
# 若目录不可写可改为: --output_dir tests/output/Results/Toxins/Shotter

绘图脚本用法CLI与图像解读

  • 生成“菌株×目标目”热力图:

    python scripts/plot_shotter.py \
      --strain_scores shotter_outputs/strain_target_scores.tsv \
      --out_dir shotter_outputs
    
    • 行=菌株Strain
    • 列=目标“目”(含 other/unknown
    • 颜色=综合分数 Score(strain, order) ∈ [0,1]。分数越大综合证据越强。非“能杀”而是“潜在活性支持度”。建议论文中给出阈值如≥0.5或标注Top-N order。
  • 生成指定菌株的“命中×目标目贡献”热力图:

    python scripts/plot_shotter.py \
      --strain_scores shotter_outputs/strain_target_scores.tsv \
      --toxin_support shotter_outputs/toxin_support.tsv \
      --out_dir shotter_outputs \
      --per_hit_strain 97-27
    
    • 行=命中蛋白Hit_id可在图注中标注对应 Family
    • 列=目标“目”。
    • 颜色=贡献 c(order)=w_hit×P(order|·)。可直观看到“哪个命中倾向于哪个‘目’”。

提示:若想在图中暂时不展示 other/unknown可在绘图前用 pandas 过滤掉相应列。

命中识别与打分算法(适合论文引用)

记:

  • id ∈ [0,1]Identity/100cov ∈ [0,1]Coverage=Aln_length/Hit_lengthhmm∈{0,1}HMM 标记。
  • P(order | name/subfamily/family):由 BPPRC 阳性数据聚合归一得到的“靶标目”分布。
  • 伙伴家族(如 Vip1/Vip2、Vpa/Vpb需成对出现否则降权。
  1. 单命中相似性权重 w_hit

若 id ≥ 0.78 且 cov ≥ 0.80base = 1.0 否则若 0.45 ≤ id < 0.78base = (id 0.45) / (0.78 0.45) 否则 base = 0。

w_hit = min(1, base × cov + 0.1 × hmm)。

若命中所属家族需配对但菌株内未检测到配对家族且其权重≥0.3),则 w_hit := 0.2 × w_hit。

  1. 单命中对各“目”的贡献 c(order)

c(order) = w_hit × P(order | name/subfamily/family)。

回退顺序name → subfamily → family。仍无证据时

  • 若能解析到家族但无证据 → 贡献计入 other
  • 若无法解析家族前缀 → 贡献计入 unknown。
  1. 菌株层合成noisy-OR

Score(strain, order) = 1 ∏_hits (1 c(order))。

理由与阈值说明0.45/0.78 阈值源于 Bt 命名规范(家族/亚家族cov≥0.8 保护部分匹配HMM 加0.1为结构域级支持noisy-OR 可在[0,1]内自然合成多条证据、避免重复计数。论文中可将 Score 视作“相对支持度/潜在概率分数”,并配置信心阈值或校准方案。

other/unknown 的来源与处理

  • other
    • 能解析到家族(如 Cry1但在特异性索引BPPRC CSV中没有该 name/subfamily/family 的靶标证据条目,于是回退失败,贡献计入 other。
    • 也可能该命名属于非经典 Bt 杀虫蛋白分支、或尚无公开的活性证据。
  • unknown
    • 无法从 Hit_id 解析出家族前缀(例如 InhA2-other、Bmp1-other、Zwa6-other 等不在 Cry/Cyt/Vip/Tpp/Mpp…前缀集合中。此类命中多为其他功能蛋白或未纳入本索引体系的类别。
  • 为什么不能仅用命名系统直接映射靶标?
    • 命名主要反映系统发育/结构域类型;同一(亚)家族中不同变体对受体/虫阶的谱系可能显著不同,且跨“目”的活性也常见。以经验规则硬编码会产生系统性偏差,因此我们采用从文献/专利汇总的阳性证据构建 P(order|·) 的统计方法,更稳健、可更新。
  • 绘图实践:若 other/unknown 占比高,表示大量命中缺乏到“目”级证据或无法解析;可在展示时隐藏这两列,或在方法学中单独说明其来源与占比。

两类热力图在科研中的用途建议

  • 菌株ד目”热力图per-strain适合横向比较多个菌株展示总体“靶标目”潜在谱系可配 Top-N 或阈值标注。
  • 命中ד目”热力图per-hit适合阐释某一菌株的组成性证据与机制依据说明哪些命中推动了特定“目”的得分。
  • 论文建议:两者结合使用——正文给出 per-strain 总览、补充材料给出关键样本的 per-hit 解析图。

示例图解读(常见疑问)

  • 非零表示“有一定证据支持潜在活性”并非确证致死。建议报告高于阈值如≥0.5)的“高置信目标目”,并在方法中给出阈值与依据。

  • “per-hit 图纵坐标是什么?”

    • 纵轴是命中蛋白的 Hit_id可在图注中标注对应 Family
    • 行=命中蛋白Hit_id可在图注中标注对应 Family
    • 列=目标“目”。
    • 颜色=贡献 c(order)=w_hit×P(order|·)。可直观看到“哪个命中倾向于哪个‘目’”。
  • “why other 很多?”

    • 多因命中属于未纳入家族前缀集合或 CSV 无证据(例如 InhA2/Bmp1/Zwa6 等),因此贡献汇入 other/unknown。可在展示时隐藏这两列或单列占比说明。