关于基因结构注释的一些感悟

我在2018年,写过一篇《如何对基因组序列进行注释》,简书上有4万多人阅读,CSDN上有8万多人阅读,说明确实有不少人有相关的需求。我自己也琢磨了一段时间,刚好过年回家,简单的梳理一下。

最初的时候,我的思路就是EvidenceModeler(后面简称EVM)的思路,训练不同从头预测软件,例如AUGUSTUS,组装RNA-seq数据,比对同源蛋白,最后交给EVM整合。这个思路挺好的,唯一的问题就是要要自己的动手的地方比较多,那个时候我自己写了一套流程做了串联,但是代码质量很差,所以我在找寻其他工具。

我找到一些替代工具,比如说MAKER, BRAKER, Mikado。这些工具各有不同,MAKER可以整合不同来源的证据, BRAKER会先利用已有同源蛋白或者RNA-seq训练AUGUSTUS模型然后预测结果,Mikado则是直接使用转录组作为唯一证据,最后我选择了MAKER。因为BRAKER,是一个perl串联的脚本,没有完善重跑工具,也就是失败了,就可能得从头开始。mikado只用转录本,那么就可能有一些基因会因为表达量低别遗漏,或者结构不完整。

使用MAKER也有问题,就是官方提供SNAP的训练流程,但是AUGUSTUS的模型训练方法则没有,这很让我头疼。一开始,我想的是找现有的解决方案,发现Transdecoder有一个工具,似乎可以直接把预测的ORF结果导出为AUGUSTUS的输入,但是AUGUSTUS的教程说并不需要那么多,大概1000左右就饱和了。由于我水平有限,一下子卡壳了,不得不去找其他的方案。于是我就想着能不能用BRAKER的输出的模型作为AUGUSTUS的输入呢?这当然没问题,就是我觉得不够优雅,于是我就去看BRAKER的源代码, 确定了他的关键几步。就自己用python实现了,得到自己的AUGUSTUS训练流程,简单的说就是,先用MAKER基于转录组或者同源蛋白数据直接得到基因的结构,然后基于MAKER提供的各个基因的AED值,筛选其中AED=0,并且蛋白相似性低于90%的基因的GFF文件。这样子AUGUSTUS就提供了脚本将gff转换成训练用的genbank,这样子就能用AUGUSTUS提供的脚本进行模型训练了。

为了让这些步骤更加的一致性,我基于snakemake开发了一个套流程wgap,缩写自whole genome annotation pipeline。为了能够其他一些rule可以被反复使用,从而实现AUGUSTUS和SNAP的迭代训练,我还废了不少心思。后面输出的基因结构,缺少UTR,所以我还加上了PASApipeline.然而这套方案还是被我给废弃了,因为MAKER的运行太不稳定了。

我发现MAKER的并行跟硬盘的关系很大,在一些硬盘上,可能半天跑完的程序,在我的NFS文件系统上,就需要2-3天,甚至都不一定结束。并且在后者上,经常有几十个maker进程傻愣愣在后台sleep,我还看了很久的源代码, 确定这些进程是啥,后来发现都是携带数据的任务。

我虽然用了snakemake 做流程的管理,但是最限速的步骤是maker,然而它就是在一些系统上跑不快,能怎么办?那么,我就想着,能不能自己实现一个MAKER。在我看完一些代码之后,发现,MAKER也没有我当初想的那么厉害吧,毕竟它基于已有hint优化AUGUSTUS和SNAP的能力,是这两个程序自己提供的,它更多是根据证据选择适当的模型。想通了这一点,我于是就开自己造轮子,走的是BRAER的路子,先用转录本回帖基因组,然后自己写了一套预测ORF的简单代码,得到ORF之后,筛选用于AUGUSTUS的模型的训练。最后用AUGUSTUS在非重复序列进行预测基因。

思路很合理,但是在我放弃使用PASApipeline为基因模型添加UTR,选择ingenannot时出了问题。因为ingenannot要求基因模型要跟对应的转录本的intron部分对应的上,才能为这个基因增加UTR,而AUGUSTUS预测的结果,虽然从基因水平上没问题,但是仔细看里面的intron还是存在一部分不全的,那怎么办呢?最简单的思路,就是使用PASAPipeline调整基因模型,但是,我觉得PASAPipeline太笨重了,一定要把基因结构存在SQL的数据表中,如果用mysql,那需要管理员才能安装,如果用SQLite,这玩意的读写又太慢了。

于是,我兜兜转转回到了老法子,EVM。当然,EVM相比于我最初使用的状态有很大的不同,那就是它的使用更加简单了,不再需要我们自己拆分任务,他可以自己搞定这些事情。这就比我最初用EVM好多了,而且调整后的模型也算是对了,能够用ingenannot添加UTR了。

当然,在我找轮子的过程中,我还看到了其他一些工具,比如说LoreAN,RECT,FINDER,但是都有一些我觉得不舒服的地方,也导致了最终我自己想着造轮子。希望我能造好一个轮子,或者至少写好一个教程吧。

# 随笔 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×