ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Prokka完全指南:从安装部署到结果解读与原核基因组注释实战

Prokka完全指南:从安装部署到结果解读与原核基因组注释实战 做微生物基因组分析这些年我手机上被问得最多的一个问题就是“拿到一个细菌全基因组序列怎么做基因组注释”。早年我会给人推荐一堆在线服务现在基本就一句话装个Prokka十几分钟出全套注释。Prokka是目前原核和病毒基因组注释里最主流的轻量级工具由Torsten Seemann开发把基因预测、功能注释、格式转换整条流水线压缩成一行命令。经常还有人在各个群里找“某物种基因组文件链接和注释文件链接”比如最近总有人问芍药基因组的注释文件去哪里下。对于已经发表染色体级别参考基因组的物种去NCBI或Ensembl Plants下载确实是最快的。但如果手头是你自己测序组装的菌株或者一个还没有参考注释的病毒基因组与其到处找现成数据不如用Prokka在本机直接生成一套完整注释这一步对后续所有分析都是基础。这篇文章我尽量不讲空话直接把Prokka从安装到结果解读、再到实战中那些文档里不会写的坑一次说清楚。适合刚开始接触基因组注释的入门者也适合已经跑通但被某些报错卡住的老手。1. 注释这项工作为什么总卡在“最后一公里”1.1 从RAST到GenBank老流程的痛点在哪里随便找个做微生物基因组的人问问早期做注释基本就是两条路要么用RAST在线服务器提交序列等结果要么自己拼一套GlimmerBLAST的本地脚本。RAST那条路最大的问题是数据要上传、排队、等邮件通知跑一个中小型基因组少说也要几个小时而且在线服务器对数据隐私几乎没有任何保障实验室自己的未发表数据传上去心里总不踏实。自己拼流水线那条路更折腾Glimmer预测完基因之后还要自己写脚本过滤重复、去伪基因、比对数据库、解析XML每一步都可能埋新bug而且不同菌种之间的阈值参数还经常不通用。等你好不容易把注释文件整理出来下游又要用GFF3、又要GenBank格式、还要蛋白序列文件——每换一个分析软件就要做一次格式转换那感觉就是刚爬出一个坑又掉进另一个坑。NCBI后来推出的PGAPProkaryotic Genome Annotation Pipeline注释质量确实不错但PGAP要么在NCBI网页端上传处理要么本地版配置复杂大批量处理并不友好。说白了真正缺的不是“能注释”的工具而是一个“能快速跑完、格式齐全、结果靠谱”的一体化方案。1.2 Prokka的设计理念给原核注释做减法Prokka的设计初衷其实特别朴素既然细菌古菌病毒的基因组相对小、基因密度高、剪接少那就可以用一套固定流程快速跑完。它做的事情用大白话讲就三步——先预测出基因组里有哪些基因再逐个比对到参考蛋白数据库猜测每个基因是干什么的最后把所有信息整理成一套标准格式输出。这三步过去分别由Prodigal、BLAST/DIAMOND、HMMER等工具完成Prokka把它们串成了一条流水线并内置了按属分类的参考数据库。为什么强调“按属分类”这算是Prokka一个很聪明的设计。比对的时候如果把整条UniProt数据库拿来搜速度慢不说还容易出现错误匹配——比如一个来自芽孢杆菌的基因片段被比对到大肠杆菌的同源序列上功能描述就会跑偏。Prokka默认用输入序列的物种信息去匹配对应的属数据库在保证速度的同时尽量提高注释的准确率。至于那些没比对上的基因它会继续用HMMER搜保守功能结构域TIGRFAM甚至用信号肽预测来补充线索。这套“先同源搜索、后结构域补充”的多级策略让最终注释结果里“unknown/hypothetical protein”的比例尽量降低。可以说Prokka帮我们把过去最繁琐、最容易被卡住的“最后一公里”直接铺平了。你需要关心的不再是流程怎么拼、格式怎么转而是参数怎么给得合理、结果怎么解读。2. 安装部署真正花时间的不是Prokka是它的依赖2.1 依赖清单及最容易翻车的RNAmmer很多人第一次安装Prokka时都会被它长长的依赖列表吓到但冷静看一下其实这些工具分成两类一类是预测基因结构的一类是做功能比对和数据库搜索的。基因结构预测工具里Prodigal负责识别编码区CDSRNAmmer负责找rRNA基因Aragorn负责找tRNA基因功能注释这边BLAST或DIAMOND负责把预测蛋白序列比对到参考蛋白库HMMER负责用profile HMM模型搜索TIGRFAM这类保守结构域数据库。另外SignalP负责预测信号肽。这里我想提醒一点绝大多数“Prokka装不上”的问题其实不是Prokka本身的问题而是某个依赖工具没装好或者版本不兼容。尤其是RNAmmer它是Perl脚本且带有一个权限管理的坑源码安装时常常卡在这里。这个工具本身需要运行一个内部脚本来配置Rnammer的HMM模型路径很多人源码编译时忘了走到这一步结果Prokka被调用时rRNA注释直接失败。另外Prokka的运行依赖NCBI的BLAST同时数据库构建还会用到makeblastdb——如果只装了DIAMOND而BLAST没装好后续加自定义数据库时也会报错。如果用Conda安装这些依赖通常会被一起处理但你仍然要知道它们存在因为后面排错时你会用得上。我在项目里遇到过的另一种典型情况是服务器上原本就装了一套旧版BLASTConda环境里的Prokka调用到了系统PATH里的blastp导致参数不兼容报错信息五花八门。所以第一个经验就是——跑Prokka之前先确认which blastp、which prodigal指向的位置是不是你期望的那个环境。2.2 Conda一条命令安装与源码编译的实测对比我个人的建议非常直接用Conda装不要折腾源码编译。Conda帮你把上面那些依赖环境都隔离好了一条命令conda install -c conda-forge -c bioconda prokka装完之后运行prokka --version能输出版本号就算成功。如果你是在一台没有外网的内网服务器上部署那才需要考虑源码编译——先手动把BLAST、HMMER、Prodigal、Aragorn、RNAmmer这些依赖分别装好再把Perl模块BioPerl装上最后从GitHub拉Prokka源码设置环境变量。这个流程对新手来说很容易中途放弃所以除非有特殊限制否则一律推荐Conda。实测下来Conda装好的Prokka至少在依赖兼容性上很少出幺蛾子后续升级也方便。不过有一个细节要留意Conda装的Prokka会自动带上它需要的Perl环境和BioPerl但它运行时是否调用SignalP取决于你在Conda环境里有没有额外装以及你有没有合法的许可证文件。SignalP是个商业许可工具很多人以为装了就能用实际没有授权文件时它不会正常工作。Prokka检测不到SignalP时通常不会报硬错误只是默默跳过信号肽预测这一步。如果你不需要信号肽信息我建议直接用--no_signalp参数把这个环节显式关掉避免流程里出现你意识不到的不确定性。3. 首次完整运行参数背后其实是一套注释哲学3.1 最小可用命令与核心参数解读第一次运行我建议从一个最小命令开始prokka --cpus 8 --kingdom Bacteria --outdir prokka_out --locustag SAMPLE --prefix SAMPLE genome.fasta这条命令会以8个线程并行处理名为genome.fasta的组装基因组注释结果输出到prokka_out目录下。里面几个参数的作用分别是--cpus控制并行线程--kingdom告诉Prokka物种类型Bacteria、Archaea、Mitochondria、Viruses--locustag是给每个基因唯一标识符的前缀--prefix是输出文件名的前缀。这里我想重点说下--kingdom和--genus这类参数背后的逻辑。--kingdom决定Prokka用哪套遗传密码表、用哪套rRNA/tRNA预测模型--genus则决定了它优先使用哪个属的参考蛋白数据库。比如你输入序列是大肠杆菌给了--genus EscherichiaProkka就会优先去搜Escherichia这个属的蛋白库命中率会比直接搜全库更高、速度也更快。如果你的物种在Prokka内置数据库里没有对应属它也会自动退回全库搜索但效果会打折扣这就是为什么后面要讲如何添加自定义参考数据库。还有几个高频参数--gcode用来指定遗传密码表编号支原体这类用变种密码子的菌一定要显式指定--mincontiglen用于过滤过短的contig避免把小片段误当成独立基因--force允许覆盖已存在的输出目录--proteins后面可以跟一个自定义蛋白FASTA文件它会优先用来做同源注释。这些参数不是每个项目都要用但搞清楚它们的作用能让你在遇到结果异常时多一个调节方向。3.2 Prokka内部的七步流水线是怎么协作的很多人以为Prokka只是一个“调用其他工具的外壳”实际上它内部有一套严谨的调度逻辑。拿到输入序列后它首先构建临时目录并做序列预处理把每条contig规范化接着调用Prodigal对基因组进行CDS预测这一步得到的是候选基因集合同时调用RNAmmer和Aragorn分别注释rRNA和tRNA。这三个预测结果汇总后Prokka把所有CDS的蛋白序列拿去跟参考蛋白库做BLASTP比对新版本也支持用DIAMOND加速速度提升非常明显。比对只是一个起点。得到BLAST命中后Prokka会做一系列“信心裁决”命中的基因直接取最高分的功能注释没有可靠命中的交给HMMER去搜TIGRFAM结构域数据库如果能找到对应结构域就用结构域信息写产物名称如果还找不到再检查信号肽有信号肽的就记为“putative secreted protein”。最终那些所有证据都用上仍然无法注释的基因才会老老实实写成hypothetical protein。这种层层递进的策略保证了速度也尽量减少了无注释基因。我特意在这里把这个流程写出来是因为后面排错的时候你会经常用到它。比如“结果里假想蛋白太多了”那问题可能出在数据库比对这一步而不在Prodigal的基因预测这一步再比如“rRNA一个都没注释出来”那就是RNAmmer那步出了问题。知道流程你才能判断该去查哪一环而不是抱着一个报错信息到处问。3.3 运行一个真实样本从输入到输出拿我手头一个5.2Mb的铜绿假单胞菌基因组来举例FASTA文件里大约有60条contig。用16线程跑Prokka整体耗时大概在10到15分钟之间取决于机器和数据库状态。跑完之后你会看到输出目录里出现了一堆文件其中最重要、也最容易被忽略的其实是那个.log日志文件——Prokka到底调用了哪些工具、每步花了多久、有没有警告全在里面。日志里如果出现“table2asn”相关报错也别慌。那只是最后一步尝试调用NCBI的table2asn生成.sqn提交文件时工具没装好或版本不匹配导致的不影响GFF、GBK等核心注释结果。很多人第一次看到这种日志吓了一跳以为注释失败了其实只要.gff和.faa正常生成注释就是成功的。这里提前打个预防针免得你到时候花半天排查一个不影响结果的小报错。4. 拿到结果之后那些文件里到底藏着什么4.1 文件清单逐个拆解Prokka默认会输出一大堆文件第一次用的人经常对着目录发呆GFF、GBK、FFN、FAA、FNA、FSA、TBL、TXT、TSV、SQN……每个都是干什么的我觉得最重要的是四个.gffGFF3格式的完整注释文件包含了基因、CDS、rRNA、tRNA等所有特征的位置信息和功能注释是下游做圈图、比较基因组、提交数据库最常用的格式。.gbkGenBank格式文件可以直接加载进Artemis、Geneious、CLC等图形化工具里查看基因组结构。.ffn所有被注释到的基因CDS和RNA的核苷酸序列FASTA文件想提取某个基因序列做PCR验证这个文件最方便。.faa所有预测蛋白的氨基酸序列FASTA文件后续做蛋白同源比对、建树、功能富集都要用到它。除了这四个核心文件之外.tsv和.txt同样有用。.tsv是一个扁平化表格一行一个CDS包含基因位置、链方向、locus_tag、产物描述、数据库比对结果等我经常把它读进Excel里快速浏览注释概况.txt则是统计报告列出各类型特征的计数。.fna是原始contig序列的备份.fsa和.tbl是给NCBI提交用的配套文件日常用不到但里面带注释的特征表可以作为第三方注释工具的信息源。4.2 如何把注释结果用于后续分析注释文件拿到手之后真正的工作才算开始。最常见的下游操作是把.gff文件跟组装序列一起喂给R包circlize或Circos画基因组圈图做泛基因组分析时Roary、Panaroo等工具直接读取Prokka的.gff文件不需要额外转换做代谢通路注释的话把.faa文件上传到KAAS或者本地跑eggNOG-mapper几分钟就能得到COG/KEGG注释结果。可以说Prokka的GFF输出就是整个微生物基因组分析生态的连接器。这里分享一个我自己常用的检查习惯每次注释完我都会先瞄一眼.txt统计报告里的CDS数量再对照同属参考基因组的典型CDS数量例如大肠杆菌通常4300到5500个CDS。如果数量明显偏少很可能是组装质量差或者过滤参数太严格如果偏多则可能是把假基因和跨片段序列也算进去了。这个习惯能帮你第一时间发现组装或者参数上的问题不用等到下游分析做完了才发现数据有毛病。5. 实战翻车记录四类最常遇见的坑及完整排查链路5.1 “Cannot find Prodigal”类依赖报错第一次跑Prokka最常见的翻车现场长这样命令行敲下去噼里啪啦滚了一堆英文然后报错“Cannot find a valid Prodigal binary”。很多人第一反应是“Prokka坏了”其实不是是Prokka启动时会对依赖做一次可用性检查某些依赖没找到就直接拒绝运行。这类问题在源码安装的环境里尤其常见因为你可能忘了把Prodigal的可执行文件路径加入PATH。排查的思路很简单在终端里逐个执行prodigal、rnammer、aragorn、hmmscan、blastp、makeblastdb看哪个命令提示command not found哪个就是缺的。用Conda安装的话这类情况很少发生但有一种变体很隐蔽你在Conda base环境里装了Prokka然后又激活了另一个含旧版BLAST的环境变量导致Prokka调用到一个不兼容的blastp版本而报奇怪错误。解决方法是把Prokka环境和其他分析环境分开跑Prokka之前先确认which blastp指向的是Prokka所属环境里的版本。5.2 菌株命名与特殊字符引发的解析失败这个坑我印象非常深。有一次用户给的文件名里有空格和中文括号Prokka在解析序列头时直接把locus_tag搞乱了后面所有基因编号全部错位。Prokka对输入的FASTA头要求其实比较严格建议你在喂序列之前就把序列头清理干净只保留字母、数字、下划线例如SAMPLE_001。同理--locustag参数里也不要出现奇怪的字符因为它会作为locus_tag的前缀写入最终注释文件如果带了非法字符后续提交NCBI会被直接打回。另外还有个容易忽略的点如果FASTA文件里有多条序列且它们的编号一模一样比如多个contig都叫contig_01Prokka虽然不会报错但最后输出的坐标信息会让人困惑。我一般会先用seqkit把序列头重命名成有序编号再交给Prokka这条习惯能省掉后面很多定位问题的时间。5.3 假想蛋白过多注释质量不佳的排查思路拿到.gff文件后如果发现高达40%的基因注释结果是hypothetical protein怎么办先别急着怀疑Prokka。这一步需要逐层排查第一步确认你的输入序列是否真的是原核生物。如果你不小心把一段真核序列或质粒混杂序列送进去比例自然高。第二步看组装质量N50太低、contig碎片化严重时Prodigal无法准确预测完整CDS就会产生大量破碎蛋白这一点在结果里表现为CDS数量异常多、平均长度偏短。第三步确认你的物种是否有对应的Prokka内置参考数据库——如果你的菌种比较冷门内置库里没有对应属Prokka就会退回全库搜索命中率下降是正常的这时候就该考虑加自定义参考库了具体见6.1。我实测过一个比较偏的海洋细菌属不加自定义数据库时假想蛋白比例接近45%加了同属参考蛋白库后直接降到15%左右对比非常明显。所以假想蛋白比例高不一定代表Prokka不好用更多时候是提示你数据或数据库准备得不够充分。5.4 病毒基因组注释的特殊flagProkka处理病毒基因组需要额外小心因为病毒的基因结构比细菌复杂——存在重叠基因、分段基因组、非常规遗传密码等。用默认的--kingdom Bacteria去注释噬菌体结果往往一塌糊涂。正确做法是显式指定--kingdom Viruses同时病毒基因组的注释通常建议关闭信号肽预测--no_signalp因为细菌的信号肽模型对病毒蛋白基本没有意义。对于某些使用特殊遗传密码的病毒还要用--gcode指定对应的密码子表。另外一个病毒注释里很常见的需求是提交到NCBI此时Prokka会尝试调用table2asn生成.sqn文件。如果table2asn没有正确安装这一步会跳过但日志里保留warning。你不需要为此紧张后续可以单独用table2asn重新生成NCBI提交文件。病毒基因组的注释有一点和细菌不同病毒数据库比较小而且病毒蛋白的保守性差异很大所以哪怕参数用对了假想蛋白比例也可能偏高这属于正常情况。6. 让Prokka又快又准的进阶经验6.1 用同属参考蛋白库提升注释准确率在前面多次提到“自定义参考库”这里展开讲。Prokka的--proteins参数允许用户提供一套蛋白序列FASTA文件也可以直接给GenBank格式的gbk/gb文件这些序列会被当作最高优先级证据库只要预测出的CDS能在里面找到同源匹配就直接采用参考序列的功能注释速度极快、准确率也高。实际操作中我通常从NCBI下载同属已完成注释的参考基因组提取其.faa蛋白序列然后通过--proteins传入。你可以把多个同属菌株的蛋白序列合并去重形成一个属级参考库。这样不光是假想蛋白比例会显著下降注释出的产物名称也更规范因为参考序列的描述文本通常已经经过人工审核。做大规模比较基因组项目时这一步几乎是必须的——我见过不少项目团队跳过这一步然后拿着45%的假想蛋白结果去交差后面审稿人一问就崩。需要注意--proteins给的蛋白序列ID最好简洁不要带奇怪的描述字符否则Prokka处理时可能产生额外警告。同时参考库的物种信息要与输入物种尽量一致拿大肠杆菌的库去注释沙门氏菌虽然也能用但个别基因的功能描述会有偏差。6.2 大批量基因组的并行处理与流程整合当你有一百个细菌基因组要注释时逐条跑Prokka显然不现实。我一般用GNU Parallel写一条简单的批量任务cat list.txt | parallel -j 10 prokka --cpus 4 --outdir prokka_{/} --locustag {/.} --prefix {/.} {}这里list.txt存放所有基因组FASTA的路径-j 10表示同时跑10个任务每个任务占用4个线程总并发线程数40。如果你的服务器内存不大记得控制总并发数不要盲目堆线程。Prokka单个任务的内存占用并不夸张但100个任务同时并发还是能把一台128G内存的机器吃满。我建议一个比较稳妥的比例是每个基因组4线程、同时10个左右任务。流程整合方面有人喜欢把Prokka放到Snakemake或Nextflow流水线里。我个人的经验是如果只是注释这一步GNU Parallel就够了但如果整个项目涉及质控、组装、注释、泛基因组分析一条龙那用Snakemake管理依赖关系更合适。Prokka对流程工具很友好输入输出都是标准文件放到哪套流程里都行。6.3 Prokka的边界什么情况不要用它最后说说Prokka的边界。Prokka从设计上就不是给真核基因组准备的它的模型、数据库、流程都围绕原核和病毒调优。如果你手里是真核物种——比如最近总有人找芍药基因组的注释文件——那Prokka就不适用了你需要的是BRAKER、MAKER、AUGUSTUS这类真核注释流程配合转录组证据来辅助基因结构预测。这一点一定要分清因为真核生物的内含子、可变剪接等问题Prokka完全没有处理能力。另外即使是在原核范围内如果你追求的是NCBI RefSeq级别的精细注释质量Prokka这类快速工具也只是一个起点最终还需要人工审编或者使用PGAP等官方管道。Prokka的价值在于“快”和“便捷”——在科研探索阶段、在批量比较阶段、在需要一个可靠又不过度复杂的注释基线时它几乎是原核基因组项目的最佳选择。最后分享一个我自己养成的习惯每次跑完Prokka我都会把.log日志文件完整保留按项目归档。注释这个环节看似基础但它决定了后续所有分析的底层坐标参数变了、版本换了、数据库更新了都可能影响结果。过两个月再回看时一份日志能帮你省掉大量复现和排查的时间。
返回列表