617_基因组注释Prokka_Bakta¶
一句话概述: Prokka和Bakta是细菌基因组快速注释的两大工具——Prokka是经典老将(已停止维护),Bakta是推荐继任者(更准确、更多交叉引用),能在几分钟内完成从序列到基因功能的全自动注释。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| Genome annotation | 找出基因组上所有基因的位置和功能 |
| CDS | 编码序列——能翻译成蛋白质的基因 |
| tRNA/rRNA | 转运RNA和核糖体RNA的位置 |
| Hypothetical protein | 假定蛋白——预测到了基因但不知道功能 |
| GFF3 | 基因注释的标准格式文件 |
| GenBank (.gbk) | 包含序列+注释的综合格式 |
| Prodigal | 原核基因预测工具(Prokka和Bakta都用) |
| sORF | 小开放阅读框——短于100个氨基酸的小蛋白 |
一、Prokka——经典注释工具¶
1.1 安装¶
conda create -n annotation python=3.8 # 创建环境
conda activate annotation
conda install -c bioconda prokka # 安装Prokka
prokka --version # 查看版本
1.2 基本用法¶
# === 最简单用法 ===
prokka genome.fasta # 默认参数注释
# === 标准用法 ===
prokka \
--kingdom Bacteria \ # 原核生物(Bacteria/Archaea)
--genus Escherichia \ # 属名
--species coli \ # 种名
--strain K12 \ # 菌株名
--outdir prokka_output \ # 输出目录
--prefix ecoli_K12 \ # 输出文件前缀
--locustag ECOLI \ # 基因座位标签
--cpus 8 \ # CPU数
--rfam \ # 启用Rfam搜索ncRNA(较慢但更全)
--addgenes \ # 在GFF中添加基因特征
--compliant \ # 生成GenBank兼容的输出
genome.fasta # 输入文件
# === 使用自定义蛋白数据库 ===
prokka \
--proteins custom_db.fasta \ # 优先用这个数据库注释
--outdir prokka_custom \
--cpus 8 \
genome.fasta
1.3 Prokka输出文件¶
ls prokka_output/
# .gff — GFF3格式注释文件(最常用,Roary等需要)
# .gbk — GenBank格式(含序列+注释)
# .fna — 核苷酸序列(与输入相同,但重命名了)
# .faa — 蛋白序列
# .ffn — 基因核苷酸序列
# .fsa — GenBank提交格式的序列
# .tbl — GenBank提交格式的特征表
# .sqn — GenBank提交用的ASN.1格式
# .log — 日志文件
# .txt — 统计摘要
# .tsv — 基因信息表格
# 查看统计摘要
cat prokka_output/ecoli_K12.txt
# 输出类似:
# organism: Escherichia coli K12
# contigs: 1
# bases: 4641652
# CDS: 4319
# rRNA: 22
# tRNA: 86
# tmRNA: 1
二、Bakta——推荐的新一代工具¶
2.1 安装¶
# === conda安装 ===
conda install -c bioconda bakta # 安装Bakta
# === 下载数据库(必须!约53GB)===
bakta_db download --output /path/to/bakta_db # 下载完整数据库
# 或下载轻量版数据库(约1.6GB,功能注释较少)
bakta_db download --output /path/to/bakta_db --type light
# 验证
bakta --version # 查看版本
bakta_db info --db /path/to/bakta_db # 查看数据库信息
2.2 基本用法¶
# === 标准注释 ===
bakta \
--db /path/to/bakta_db \ # 数据库路径
--output bakta_output \ # 输出目录
--prefix ecoli \ # 输出文件前缀
--genus Escherichia \ # 属名
--species coli \ # 种名
--strain K12 \ # 菌株名
--threads 8 \ # 线程数
--locus-tag ECOLI \ # 基因座位标签
--compliant \ # GenBank兼容输出
genome.fasta # 输入文件
# === 注释MAG(宏基因组组装基因组)===
bakta \
--db /path/to/bakta_db \
--output bakta_mag \
--prefix mag_bin1 \
--threads 8 \
--meta \ # MAG/宏基因组模式
bin1.fasta
# === 使用Bakta Web(在线版,无需安装数据库)===
# 访问 https://bakta.computational.bio
# 上传FASTA文件即可
2.3 Bakta输出文件¶
ls bakta_output/
# .gff3 — GFF3注释文件
# .gbff — GenBank格式
# .fna — 核苷酸序列
# .faa — 蛋白序列
# .ffn — 基因核苷酸序列
# .tsv — 基因信息表格
# .json — 机器可读的JSON格式(Bakta独有)
# .embl — EMBL格式
# .txt — 统计摘要
# .hypotheticals.tsv — 假定蛋白信息
# .hypotheticals.faa — 假定蛋白序列
三、Prokka vs Bakta详细对比¶
| 特性 | Prokka | Bakta |
|---|---|---|
| 状态 | 已停止维护 | 活跃开发中 |
| 数据库大小 | 0.6 GB | 53 GB |
| 运行时间 | ~4分钟 | ~7-10分钟 |
| 假定蛋白比例 | ~41% | ~11%(大大优于Prokka) |
| sORF检测 | 不支持 | 支持 |
| GO注释 | 不支持 | 支持 |
| EC号注释数 | ~1,042 | ~1,562 |
| JSON输出 | 不支持 | 支持 |
| Web界面 | 无 | 有(bakta.computational.bio) |
| FAIR引用 | 有限 | 丰富(UniRef/RefSeq/UniParc) |
| 推荐场景 | 老流程兼容 | 新项目首选 |
四、批量注释流程¶
#!/bin/bash
# 批量注释多个细菌基因组
GENOMES_DIR="genomes" # 基因组文件目录
OUTPUT_DIR="annotations" # 输出目录
DB="/path/to/bakta_db" # Bakta数据库路径
THREADS=8 # 线程数
mkdir -p ${OUTPUT_DIR}
# === 用Bakta批量注释 ===
for genome in ${GENOMES_DIR}/*.fasta; do
name=$(basename "$genome" .fasta) # 提取文件名
echo "正在注释: ${name}"
bakta \
--db ${DB} \
--output ${OUTPUT_DIR}/${name} \
--prefix ${name} \
--threads ${THREADS} \
--locus-tag ${name} \
${genome}
# 打印统计
echo "--- ${name} 统计 ---"
grep -E "CDS|tRNA|rRNA|sORF" ${OUTPUT_DIR}/${name}/${name}.txt
echo ""
done
# === 汇总统计 ===
echo "========== 注释统计汇总 =========="
for dir in ${OUTPUT_DIR}/*/; do
name=$(basename "$dir")
cds=$(grep "CDS" ${dir}/${name}.txt | awk '{print $2}')
hypo=$(grep -c "hypothetical" ${dir}/${name}.tsv 2>/dev/null || echo 0)
echo "${name}: CDS=${cds}, 假定蛋白=${hypo}"
done
五、注释结果的下游使用¶
# === Python解析Bakta的JSON输出 ===
import json # 导入json模块
# 读取JSON结果
with open("bakta_output/ecoli.json", 'r') as f:
data = json.load(f)
# 统计基因类型
feature_types = {}
for feature in data.get("features", []):
ftype = feature.get("type", "unknown")
feature_types[ftype] = feature_types.get(ftype, 0) + 1
print("基因类型统计:")
for ftype, count in sorted(feature_types.items(), key=lambda x: -x[1]):
print(f" {ftype}: {count}")
# 提取所有有功能注释的基因
annotated = [f for f in data["features"]
if f.get("type") == "cds" and "hypothetical" not in f.get("product", "").lower()]
print(f"\n有功能注释的CDS: {len(annotated)}/{len([f for f in data['features'] if f.get('type')=='cds'])}")
六、常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Database not found (Bakta) | 数据库路径错误或未下载 | bakta_db download下载数据库 |
tbl2asn not found (Prokka) | GenBank工具缺失 | conda install -c bioconda tbl2asn |
Disk space insufficient (Bakta) | 磁盘空间不足 | Bakta需要53GB,用light数据库 |
Prodigal error | 输入序列太短 | 过滤掉<200bp的contig |
Encoding error | 序列包含非法字符 | 检查FASTA文件格式 |
| Prokka GFF缺少序列 | 版本问题 | 确认GFF末尾有##FASTA段 |
七、面试高频题¶
Q1:细菌基因组注释的主要步骤是什么?¶
答: 分四步:(1) 基因预测——用Prodigal找CDS(编码序列),用Aragorn/tRNAscan-SE找tRNA,用Barrnap找rRNA;(2) 功能注释——把预测的蛋白与数据库(UniProt/COG/Pfam)比对确定功能;(3) 信号序列预测——SignalP检测分泌信号肽;(4) 其他特征——CRISPR阵列、ncRNA等。Prokka和Bakta都把这些步骤自动化了。
Q2:Prokka已经停止维护了,现在推荐什么工具?¶
答: 推荐Bakta。Prokka的作者Torsten Seemann已正式推荐Bakta作为继任者。Bakta的优势:(1) 假定蛋白比例从41%降到11%,功能注释更全;(2) 支持GO注释和小蛋白(sORF)检测;(3) 输出JSON格式方便程序化处理;(4) 有Web版可在线使用。缺点是数据库较大(53GB)且运行稍慢。
Q3:为什么有些基因被注释为"hypothetical protein"?¶
答: Prodigal能预测到一段序列是基因(有合理的起始密码子、终止密码子、长度等特征),但在蛋白数据库中找不到相似的已知蛋白,所以只能标记为"假定蛋白"。这可能是因为:(1) 这个基因确实是新发现的、功能未知的基因;(2) 数据库不够大(Prokka的数据库比Bakta小80倍,所以假定蛋白更多);(3) 可能是假阳性基因预测。
Q4:基因组注释中GFF和GenBank格式有什么区别?¶
答: GFF3是通用的基因注释格式,9列制表符分隔,简洁高效,适合计算分析(如Roary泛基因组分析需要GFF)。GenBank格式(.gbk)更详细,包含序列+注释+参考文献,适合数据库提交和手动查看。实际项目中两种格式都要生成:GFF用于下游分析,GenBank用于数据提交和存档。
参考资料:Prokka: Seemann, Bioinformatics 2014 | Bakta: Schwengers et al., Microbial Genomics 2021 | Bakta Web: Schwengers et al., NAR 2025 | bakta.computational.bio