每年总有一批做微生物基因组的朋友,拿到一株新菌的完整基因组序列后,第一件事就是问:怎么把这些A/C/G/T变成一个个有名字、有坐标、有功能的基因?答案基本都是同一个——基因组注释。而在原核和病毒基因组这个领域里,Prokka是我这些年用得最多、也最愿意推荐给别人的工具,没有之一。它把CDS预测、tRNA/rRNA识别、CRISPR查找、功能注释全部整合进一条命令,输入一个FASTA,输出一整套GFF/GenBank/蛋白序列文件,干净利落。这篇文章围绕Prokka展开,既适合准备入坑微生物基因组注释的新手,也适合想把自己那套手动流程换成标准流水线的老手。另外也给一部分朋友提个醒:如果你手上是一份芍药这类真核基因组文件,也想拿Prokka来注释一遍,请先停一下,后文我会专门把这个边界问题讲清楚。
1. Prokka是什么:原核注释界的“老熟人”
1.1 它的定位和边界
Prokka是澳大利亚生信科学家Torsten Seemann开发的开源命令行工具,2014年发表在Bioinformatics上,最初的定位非常明确:对细菌、古菌和病毒这类“没有内含子”的原核类基因组做快速、标准化的注释。所谓注释,是把一条输入基因组FASTA里编码蛋白质的CDS(编码区)、核糖体RNA、转运RNA、CRISPR结构等找出来,并尽可能给每个CDS一个product名称(比如“ABC transporter ATP-binding protein”),如果有同源证据,再补上EC编号、COG功能分类等信息。
它最吸引人的地方是“开箱即用”:不需要你分别去跑Prodigal、Aragorn、BLAST+、HMMER这些独立软件,也不需要你自己写一堆脚本来拼装结果。你只需要准备好一个干净的基因组FASTA,运行prokka命令,等一会儿就能拿到一份排版规整、命名统一、可以交差或直接进入下游分析的注释结果。
但Prokka的适用边界同样严格:它只面向原核生物和部分简单病毒。做真核基因组(比如植物、动物、真菌)的朋友千万别看到“注释”两个字就往上冲。真核基因有内含子,存在可变剪接,基因组里有大量需要屏蔽的重复序列和转座子,这些都不是Prokka的Prodigal预测器能处理的范畴。举个最近的例子,我身边有做园艺基因组的朋友发来一份芍药(Paeonia lactiflora)的基因组文件链接和注释文件链接,问我能不能顺手用Prokka重新注释一版。我说这活儿Prokka真干不了,芍药这种好几GB、高重复、高杂合的真核大基因组,要用的是RepeatMasker加BRAKER/MAKER这一整套真核注释流水线。所以定位先摆正,后文才有得聊。
1.2 为什么大家不选RAST/NCBI而选Prokka
很多人刚接触注释时,最早听说的其实是RAST或者NCBI的PGAP。这两个也是很好的原核注释方案,但我在实际项目里最终还是把Prokka当成了主力,原因很现实:
第一是批量场景下的可控性。RAST是在线服务,需要逐个上传基因组,数据一旦涉及未发表的项目或者客户的私有菌株,往第三方服务器上传本身就让人不放心,而且批量注释几十上百个基因组时,在线排队和人工干预的成本非常高。NCBI的PGAP虽然权威,同样有联网、队列和正式提交的问题,自己本地想随时批量跑完全不可行。Prokka是纯本地运行,只要装好环境和数据库,断网也能跑,多少份输入都可以用脚本并发控制。
第二是结果的标准化程度。Prokka会对所有基因统一生成locus_tag前缀、统一的GFF3/GenBank格式,还能用--compliant参数按照NCBI提交的要求来命名。这意味着你做比较基因组或者泛基因组分析时,所有样本的注释风格是一致的,不会出现A样本用RAST、B样本用PGAP导致字段对不齐的尴尬。
第三是速度。单条5 Mbp左右的细菌基因组完成图,在8线程的普通工作站上跑Prokka通常5到10分钟就能出结果。这个速度虽然比纯预测(只跑Prodigal)要慢,但比在线注释快得多,而且信息量完整,适合反复迭代参数。
当然,Prokka不是万能的,它的功能注释深度不如人工校对,更不如NCBI PGAP综合了大量实验证据和模型。所以我习惯的说法是:日常研究和批量项目用Prokka做标准处理,真正要投稿或者提交公共数据库时,再用PGAP或tbl2asn那套正式流程去精修。先用Prokka把生物学问题给出轮廓,再用更权威的流程去收尾,这个分工是最高效的。
1.3 一条命令背后的注释流水线
别看Prokka表面上只是一条命令,它内部其实串起了一个完整的三级流水线。搞清楚这条流水线对后续排查报错非常关键。
第一级是结构注释,也就是“找出基因的位置”。CDS核心预测器是Prodigal,它对细菌、古菌的基因结构做了针对性训练,基于起始密码子偏好、核糖体结合位点、编码区GC偏移等特征来判断基因边界。tRNA由Aragorn负责,rRNA通常由RNAmmer或Infernal里的cmscan负责,CRISPR则由CRT或minced识别。这一级输出的是一堆“候选特征”。
第二级是功能注释,也就是“给候选基因起名字”。Prokka会把预测出来的蛋白序列,用BLAST+比对到它自带的非冗余蛋白数据库上,数据库中每条序列都带有来源物种和功能描述。比对命中后,Prokka会继承参考序列的product名称、EC编号等信息。如果你提供了--proteins自定义蛋白库,它会优先比对你给的库,这在实际项目中是提升准确率的杀手锏,后面细说。
第三级是格式化输出。Prokka把所有结构注释和功能注释整合起来,生成GFF3、GenBank、蛋白FASTA、CDS核酸FASTA、统计表等文件,并统一修改locus_tag。很多初学者不知道这一点,以为Prokka是个单一程序,结果依赖缺了某个组件时报错完全摸不着头脑,所以下一节先把环境讲清楚。
2. 装好环境,比想象中更省事
2.1 用conda一条命令搞定安装
Prokka有源码安装方式,但我强烈建议直接走conda,尤其是在Linux服务器上。源码安装最大的坑在于依赖太多:BLAST+、Prodigal、Aragorn、HMMER、Infernal、minced、BioPerl等等,版本稍微不对就会出现“能装上但一跑就报错”的悲剧。conda的bioconda频道把这些依赖都打包好了。
conda create -n prokka -c conda-forge -c bioconda prokka=1.14.6 conda activate prokka prokka --version prokka --listdb我建议把它单独放进一个专用环境,不要直接装到base环境里。原因很简单:Prokka对Perl模块比较敏感,后续你要装其他生信软件,比如用不同版本BLAST的工具,很可能把环境搞乱。单独环境隔离,出现问题直接删掉重建,非常省心。
装完以后建议先跑一下prokka --listdb,确认数据库索引文件完整。如果输出正常列出了Bacteria、Archaea、Viruses等数据库,说明安装基本没问题。
2.2 它到底调用了哪些“外援”
Prokka本质是一个指挥家,真正演奏的是下面这些软件:
| 工具 | 作用 | 常见报错表现 |
|---|---|---|
| Prodigal | 预测CDS | 找不到prodigal可执行文件 |
| BLAST+ | 蛋白同源比对,用于功能注释 | blastp/makeblastdb报错 |
| HMMER | 搜索核糖体RNA等保守RNA家族 | hmmsearch报错 |
| Infernal | 搜索非编码RNA和rRNA,使用cmscan | cmscan找不到或运行极慢 |
| Aragorn | 预测tRNA | aragorn报错 |
| CRT/minced | 预测CRISPR | 找不到对应命令 |
很多网上教程默认你已经装好了这些软件,但新手最容易卡在这一步。如果你用conda安装Prokka,conda会自动拉取这些依赖;但如果是源码安装,漏掉任何一个,Prokka都会在运行到对应阶段才突然报错,非常恼人。这里有个排查技巧:报错信息里如果提到“Can't locate ... in @INC”这种字样,一般是Perl模块缺失;提到“sh: xxx: command not found”,则是对应软件没安装或没进PATH。两者解决思路完全不一样,先分清再动手。
2.3 数据库文件里藏着的门道
Prokka安装目录下有个db文件夹,里面保存了按物种分类整理好的BLAST蛋白库,Prokka会根据--kingdom参数自动选择对应的库:Bacteria用细菌库,Archaea用古菌库,Viruses用病毒库。这个设计让它既能控制注释速度,又能提高功能注释的特异性。
实际使用中遇到过几个和数据库有关的坑,值得记下来:
第一个是数据库路径问题。如果你通过符号链接的方式把Prokka软链到别的目录,或者把db目录移动了位置,Prokka可能找不到数据库,运行时会报“Can't find database”之类的错误。解决办法很简单:不要动db目录,用locate或find先确认安装路径,再用绝对路径调用prokka。
第二个是权限问题。服务器上如果Prokka是管理员装的,普通用户运行BLAST写临时索引时可能会因为目录无写权限而失败。这时可以用--dbdir参数指定一个有写权限的目录,把数据库索引放过去。
第三个是自定义数据库的高级用法。虽然--listdb已经列出了内置库,但如果你的研究对象是某个独特属,比如乳杆菌属或链霉菌属,内置库的注释精度其实不够。我的建议是不要尝试去改内置库,而是用后面会讲到的--proteins参数,传一个高质量的同属参考蛋白FASTA,这样既不动系统目录,又对结果有实质提升。
3. 实战:给一株细菌基因组做完整注释
3.1 最常用参数组合与含义
实战就从最简单的场景开始:你手里有一个contig级别的细菌基因组FASTA,想用Prokka给它注释。
prokka genome.fasta \ --outdir annotation \ --prefix mygenome \ --kingdom Bacteria \ --cpus 8 \ --locustag MYG \ --addgenes \ --compliant逐个说下参数的意义:
--outdir指定输出目录,--prefix指定输出文件的前缀,这个前缀会出现在所有输出文件名的开头,建议用菌株名或样本编号,比如Saureus_MRSA01。--kingdom是这个命令里最关键的参数之一,它决定了遗传密码表、数据库选择和部分预测逻辑。细菌默认就是Bacteria,但如果你注释的是古菌或者噬菌体,一定要改成对应的Archaea或Viruses,否则功能注释结果会偏差很大。--cpus控制并行线程数,如果机器内存够,8到16都可以,实测Prokka对CPU的利用效率还不错。--locustag给所有基因加一个统一前缀,NCBI要求locus_tag以字母开头,由字母和数字组成,建议用3到4个字符,比如M001。--addgenes会在GFF3中额外生成gene行,很多下游工具(比如Roary、Artemis查看器)会更友好。--compliant是给准备提交NCBI用的,它会把所有输出整理成符合NCBI表格格式的版本,同时会额外生成.sqn等提交辅助文件。
一个典型的运行过程往往会输出类似下面的日志:
Running Prokka on genome.fasta Using Kingdoms: Bacteria tRNA: 62 genes predicted by Aragorn rRNA: 9 genes predicted by RNAmmer CDS: 5287 genes predicted by Prodigal CRISPR: 2 arrays predicted by CRT ... Annotation finished successfully看到这段话基本就成功了大半。注意Prokka的--cpus对单个细菌基因组而言,主要影响的是BLAST比对阶段的并行效率,基因组越小,启动各子工具的固定开销占比越大,所以病毒基因组即使给了--cpus 16,也不会快多少,这不奇怪。
3.2 输出文件逐个拆解
Prokka最让人满意的就是“交付物完整”,运行完会在输出目录里生成一堆文件,但很多人根本不看每个文件是什么,直接抓起GFF就用,结果后面遇到问题才回头找。这里把重要输出整理成一张表:
| 文件 | 内容 | 常用场景 |
|---|---|---|
| .gff | 最主要的结果文件,包含所有CDS/RNA/CRISPR的坐标、类型和功能注释 | 泛基因组、比较基因组、可视化 |
| .gbk | GenBank格式,适合在Artemis/IGV里直观查看 | 人工检查单个基因结构 |
| .faa | 所有预测蛋白的FASTA | OrthoFinder、eggNOG-mapper、BLAST |
| .ffn | 所有CDS对应的核酸序列FASTA | 提取基因序列做PCR或系统发育 |
| .fna | 输入基因组的草稿序列副本 | 下游比对或重注释 |
| .tsv | 每行一个基因的注释汇总表,包含坐标、方向、locus_tag、product等 | Excel打开快速浏览统计 |
| .txt | 纯文本统计报告,记录各类型特征的数量 | 快速汇报结果 |
| .log | 完整运行日志 | 排查报错时第一件事就是看它 |
我最常被问的问题是:GFF和GBK哪个是“最终结果”?严格来说GFF3是通用交换格式,FASTA是序列,GBK是可视化友好版,它们描述的是同一批基因的不同视角。实际分析时,跑泛基因组用GFF,跑同源基因用FAA,人工审阅用GBK,没有“只用哪个”的说法,要按场景灵活取用。
还有一个容易被忽略的细节:Prokka会自己洗一遍输入序列名。原始FASTA里如果contig名特别长或者包含特殊符号,Prokka会改成类似“contig_1”“contig_2”这种干净标识。所以下游做序列提取时,一定以Prokka输出的.fna和GFF里的坐标为准,不要拿着原始FASTA的contig名去找坐标,否则永远对不上。
3.3 用--proteins让注释又快又准
这是Prokka用得好不好的一道分水岭。默认情况下,Prokka用内置库做BLAST功能注释,内置库虽然覆盖面广,但跟你目标物种的亲缘关系不一定近,很多基因只能注释成“hypothetical protein”。这时候,--proteins参数就派上大用场了。
假设我在注释一批同属的乳酸菌基因组,我会先去NCBI下载一个高质量的模式株蛋白集(通常是RefSeq里注释最完善的representative genome),文件名类似Lactobacillus_reference.faa。然后这样运行:
prokka genome.fasta \ --outdir annotation \ --prefix Lb_isolate01 \ --kingdom Bacteria \ --proteins Lactobacillus_reference.faa \ --cpus 8 \ --locustag Lb01 \ --addgenes这里的原理是:Prokka会优先把预测蛋白比对到你提供的参考蛋白集上,如果命中,就直接继承参考序列的product、基因名和EC编号;没有比中的部分才退回内置库搜索。这样做有三个好处:
一是注释一致性大幅提高。同一个项目里的50个菌株都用同一份参考蛋白集注释,“同一个基因在不同基因组里叫同一个名字”的概率会提升不少,这对后面的泛基因组聚类和群体分析太重要了。
二是速度变快。自定义参考集通常比内置库小得多,BLAST比对时间明显缩短,尤其是你跑几十个基因组的时候,省出来的时间非常可观。
三是hypothetical protein的比例会下降。因为参考蛋白集是高质量人工审阅的,很多基因都能拿到明确的名称。
需要注意,参考蛋白FASTA的header格式会影响Prokka提取注释信息。建议格式是:>序列ID 空格 product描述,比如:
>WP_123456789.1 ATP-binding cassette transporter ATP-binding protein >WP_987654321.0 hypothetical protein如果header里只有序列ID没有描述,Prokka就只能在GFF里写一个generic的product,等于白传。另外,参考蛋白集必须是“可信的高质量注释”,如果参考集本身就乱七八糟,那注释结果只会更乱,这不是Prokka能替你解决的。
3.4 芍药这类真核大基因组,为什么Prokka帮不上忙
把热词里的“芍药”单独拎出来说,是因为这个误解太常见了:既然Prokka能注释细菌基因组,能不能顺手注释植物、动物、真菌?答案是明确的不行。
以芍药为例,首先基因组大小不是一个量级。细菌基因组通常几百万碱基,芍药这类植物基因组动辄几十亿碱基,且包含极高比例的重复序列和转座子。Prokka没有repeat masking步骤,不屏蔽重复序列直接预测CDS,结果会被转座子衍生的假基因淹没。其次,真核基因普遍有内含子,Prodigal是在原核和病毒基因结构上训练的,它根本不识别剪接位点,更谈不上对不同转录本的剪接异构体做区分。可变剪接的注释必须依赖RNA-seq证据,这显然超出了Prokka的设计范围。
如果你的场景真的是“拿到一份芍药基因组文件链接和注释文件链接”,并且只是想做下游分析,那正确姿势是直接用官方发布的GFF3注释文件和蛋白FASTA文件,它们本身已经经过了真核注释流水线的处理。用AGAT或者gffread验证一下GFF与FASTA的序列ID、坐标范围是否一致,然后把CDS和蛋白提取出来用于后续的基因家族分析或KEGG注释即可,完全不需要重新跑Prokka。真的想从头重新注释真核基因组,请出门左转 RepeatMasker + BRAKER/MAKER + PASA这套流程,那才是专业工具。
4. 常见问题与排查技巧实录
4.1 依赖缺失和“假死”型报错
新手最常遇到的第一类问题,就是装好Prokka后运行到一半突然报错退出。有一次我帮同事排查,日志里只有一行“sh: 1: aragorn: not found”,其实就是Aragorn这个tRNA预测程序没有安装。遇到这类报错,先用which命令逐个确认依赖是否在PATH里:
which prodigal blastp makeblastdb aragorn hmmsearch cmscan minced哪个没输出,就说明哪个没装好。conda安装的话,直接执行conda install -c bioconda aragorn就能补齐。另外还有个容易被忽略的坑:Prokka是用Perl写的,某些源码安装方式会缺少BioPerl等模块,运行时报“Can't locate Bio::Perl”之类的错。这种情况下最省事的解决办法是退回conda安装,不要再和模块依赖死磕。
还有一类“假死”型问题:Prokka运行很久没有输出,看起来像卡死了。这通常是Infernal的cmscan在预测rRNA时因为数据库大而变慢,尤其是高GC或contig很多的基因组。遇到这种情况,可以先确认CPU占用,如果确实在跑,就耐心等;如果想快速拿到CDS注释,可以直接加--norrna跳过rRNA搜索,或者用--fast模式,只做CDS预测和功能注释,跳过tRNA/rRNA/CRISPR这些耗时步骤。
4.2 基因数量多到离谱,或者少得可怜
注释完成后,第一件事应该是看TSV或TXT里的基因总数,这一步能筛掉大量低级问题。如果你的物种是常见的5 Mbp左右细菌,CDS数量正常应该在4500到6000之间。如果注释出八九千甚至一万多个CDS,大概率是基因组本身有问题。
最常见的成因是contig碎片化。当基因组被拼成几千条小contig,Prodigal会把本来是一条完整基因、但横跨contig断点的序列,在两侧分别预测成两个不完整的“假基因”。这种情况最简单的对策是用--mincontiglen参数过滤短contig:
prokka genome.fasta --mincontiglen 200 --outdir annotation --prefix mygenome这个参数可以筛掉小于指定长度的contig,默认值我记得是1,实际批量处理时建议至少设成200到500,能显著减少碎片化造成的假基因数量。当然,过滤短期contig会丢失一部分真实序列信息,但相对于注释污染,这个代价通常可以接受。
反过来,如果CDS数量少得离奇,比如只有几百个,先检查输入FASTA是否真的是目标物种的基因组,是不是把线粒体基因组、质粒或者污染序列误当成了主基因组。另外也要看--kingdom设置对不对,如果拿一个古菌基因组默认用Bacteria跑,虽然Prodigal也能预测,但功能注释时BLAST数据库选的不是古菌库,大量基因会因为亲缘太远而变成hypothetical。
4.3 RNA预测太慢怎么办
只做CDS功能注释的话,很多人并不需要每一条rRNA的确切坐标,但Prokka默认会把rRNA搜索跑完。这里要理解原理:Prokka对rRNA默认使用RNAmmer或cmscan这类基于HMM/协方差模型的方法,准确但慢;如果你的基因组是几万条contig的拼接草稿,每个contig都要搜索,时间会成倍增加。
我自己的习惯是:如果只是快速评估一批样本,直接用--fast模式跑,它会跳过tRNA/rRNA/CRISPR预测,只保留CDS注释,速度能提升好几倍。如果项目对rRNA有硬性要求,比如做16S系统发育,那我通常也不会依赖Prokka的输出,而是用barrnap单独跑一遍,再结合Prokka的GFF手动整合。因为barrnap对rRNA的边界预测更可控,而且相比Prokka内置流程更容易用脚本批量处理。记住一句话:Prokka是流水线,不是唯一工具,哪一步慢就单独拆出来用专用工具补位,这是老手的常规操作。
4.4 批量注释100个基因组的正确姿势
批量注释是Prokka真正发光发热的场景,但如果直接写个for循环一次性把所有基因组丢进去,很容易把服务器跑崩。原因很简单:每个prokka进程都会申请BLAST索引和内存,100个进程同时跑,IO和内存直接爆掉。
我建议用GNU parallel控制并发数,同时给每个任务分配合理线程。假设服务器有32核,可以这样分配:
ls *.fasta | parallel -j 4 'prokka {} --outdir anno_{.} --prefix {.} --cpus 8 --locustag {.} --addgenes'这里的-j 4表示同时跑4个基因组任务,每个任务用--cpus 8,正好吃满32核。实际运行中还要留意磁盘IO,Prokka会频繁读写BLAST数据库,机械硬盘上跑会明显拖慢,有条件的话把输入输出放到SSD上,速度差距十分明显。
批量注释还有一个必须提前规划的问题:locus_tag不能重复。如果40个菌株都用同一个locustag,下游分析时基因ID会撞车,后续查都查不清。我的习惯是直接用菌株ID的前缀作为locustag,比如菌株名为Lb01就设--locustag LB01。保持全项目唯一命名,是批量注释的底线纪律。
4.5 和NCBI官方注释对不上的心理准备
很多人在一个基因组的某个CDS上发现Prokka预测的起止坐标和NCBI RefSeq官方注释不一样,就开始怀疑自己是不是用错了参数。这里想认真说一句:这其实是常态,不是Bug。
Prokka的CDS预测核心是Prodigal,它靠的是密码子偏好和序列统计特征;NCBI的PGAP则融合了更多同源比对证据、保守结构域线索和人工规则。这两套逻辑在基因边界判断上天然会有差异,尤其是基因密度极高、或者存在重叠基因的原核基因组里,一个基因的起始密码子差几十个碱基完全可能。Prokka给出的product名称也可能因为BLAST命中的参考序列不同,和NCBI注释在叫法上存在差异。
所以不要指望Prokka和RefSeq一一对应。如果你要做的是跨样本比较,统一用Prokka注释即可,标准一致比“接近绝对真理”更重要;如果你是投稿或提交公共数据库,那就老老实实用NCBI官方流程或tbl2asn处理,不要把Prokka结果直接当最终提交版本。
5. 注释结果不是终点,而是起点
5.1 从GFF里快速提炼统计信息
拿到Prokka结果后,很多人的第一个问题是:怎么从GFF里快速知道这个基因组有多少个CDS,有哪些重要功能基因?用简单命令就能搞定。先统计CDS数量:
grep -c $'\tCDS\t' mygenome.gff想看看数量最多的功能注释(product)是什么,可以这样:
awk -F '\t' '$3=="CDS"{print $9}' mygenome.gff \ | grep -oP 'product=\K[^;]+' \ | sort | uniq -c | sort -rn | head -20这里用到的思路是:GFF3最后一列是attributes,以key=value;key=value的格式组织,所以直接抓product字段即可。如果你用了--addgenes,还能单独看gene行的基因名分布:
awk -F '\t' '$3=="gene"{print $9}' mygenome.gff \ | grep -oP 'gene=\K[^;]+' | sort | uniq -c | sort -rn | head -30这些命令看着零碎,但实际分析时特别顺手。比如你想快速确认某个抗生素耐药基因、某个毒力因子是否存在于这批菌株中,先这样搜索GFF,再做序列比对验证,效率比对着Excel表格找高很多。
5.2 接进泛基因组分析(Roary/Panaroo)
Prokka在比较基因组学里最重要的应用场景,就是给Roary、Panaroo这些泛基因组分析工具提供输入。这些工具本身不做注释,它们需要你提供一套标准化的GFF文件,然后从中提取所有CDS做同源聚类。
一个标准的流程是这样:
# 1. 批量注释每个基因组 for f in $(ls *.fasta); do n=$(basename "$f" .fasta) prokka "$f" --outdir "anno_$n" --prefix "$n" --kingdom Bacteria \ --cpus 4 --locustag "${n:0:4}" --addgenes done # 2. 把所有GFF集中到一个目录 mkdir -p gffs cp anno_*/*.gff gffs/ # 3. 跑Roary或Panaroo roary -f roary_out -p 8 gffs/*.gff # 或者 panaroo -i gffs/*.gff -o panaroo_out --core_threshold 0.95在这个流程里最容易被忽略的是参数一致性。如果你A样品用了--proteins,B样品没用,那么A和B的同一个基因可能一个叫“ABC transporter ATP-binding protein”,另一个叫“hypothetical protein”,聚类时可能因为注释名不同而影响结果的可读性。所以批量泛基因组项目一定要用同一套参数、同一份参考蛋白库,甚至建议同一天、同一次环境跑完,最大限度减少批次效应。
5.3 产物文件如何对接其他注释工具
Prokka不是功能注释的终点。它给你的蛋白FASTA(.faa)完全可以继续喂给eggNOG-mapper、InterProScan、KAAS/KEGG等工具做更深入的功能分类。一个常见的组合是:
# 先用Prokka得到蛋白序列 # 再用eggNOG-mapper做COG/KEGG/GO注释 emapper.py -i mygenome.faa --cpu 8 -o mygenome_eggnog这里要注意,Prokka生成的是“预测蛋白”,蛋白序列FASTA的header格式是类似“>MYG_00001 ABC transporter ATP-binding protein”。eggNOG-mapper这类工具通常会自动截取第一个空格前的部分作为序列ID,所以不会有问题。但如果你的下游工具对序列ID格式有严格要求,建议提前用sed统一改写一下header。
另一方面,如果你想把Prokka的GFF转换成GTF供其他流程使用,可以用gffread:
gffread mygenome.gff -T -o mygenome.gtf转换完记得检查坐标是否和原GFF一致,特别是跨工具传递时,序列ID、坐标起止、正负链信息一个都不能错。顺便提一句,AGAT这个工具用来校验和修复GFF非常好用,遇到“格式不对”“gene和mRNA对应不上”的报错时,它可以帮你把GFF收拾得服服帖帖。
6. 一点写在最后的个人体会
用Prokka几年下来,我最大的体会是:工具越方便,越要保持对结果的警惕。它帮你把重复劳动省下来,但功能注释本质上是“同源推断”,命中的参考序列错了,注释结果就会错。所以我现在每次拿到Prokka结果,都会先做三件事:第一,抽查10个随机基因,挑几个看起来重要的product,手工BLAST确认名字对不对;第二,用CheckM或BUSCO评估基因组完整度,避免在污染或碎片化严重的输入上浪费感情;第三,如果项目后期与NCBI注释做比较,提前把Prokka与PGAP的差异记录下来,免得下游分析被打个措手不及。Prokka是一把好用的瑞士军刀,但它不是权威本身。把它当成标准化流水线稳定的一环,而不是“答案生成器”,你的分析结果会可靠得多。