Wgatools:超速处理全基因组比对的工具包

近期,研究团队在Bioinformatics上发表了最新研究成果,团队开发了 wgatools——一款基于 Rust 语言的高效工具包,支持全基因组比对数据的格 式转换、处理分析、变异检测及可视化。该工具凭借其跨平台兼容性、超高速处理能力以及 对大规模数据的支持,已在多基因组研究项目中展现重要价值,为功能与进化基因组学研究 提供了全新的技术解决方案。

图片

本期刊文来自Wgatools软件一作(魏文杰)的亲自分享

提出需求到实现需求

有关性能、功能、优势,都写在文章中,这里可以简单分享一下开发过程中的心路历程。

2023年的夏天,我执着于这些事情:

  1. 我拿到了许多基因组之间的比对结果

  2. 很多分析流程用到了不同的文件格式

  3. 格式的转换,用Python脚本很慢

本着“宁可花3天时间改进流程,也不愿等流程花1天跑完”的臭毛病,我开始了折腾之旅。

正好当时自己正在学习Rust,于是想着能不能边学边干,做出一个完整的工具出来。

一开始在GitHub上检索,发现有个哥们其中实现了PAF到SAM格式的转换,并且也是用Rust写的,于是我就问:

兄弟,你这个工具是否支持其他格式的转换,如果你觉得可以,我可以提个PR

人家回复的也很诚恳,说你再写一个工具也很棒,于是我说干就干,花了几天时间做出了一个雏形,基本完成了格式转换的功能,然后我和那哥们说你觉得怎么样,有什么改进的地方,人家也给了我很正面的回复。

就这样我自己先用这个粗糙的实现凑合了一段时间,但是逐渐又深入学了一会Rust,觉得粗糙的实现也太粗糙了,于是:

先实现,再完美

当时我用一个非常大规模的代码重构,深入理解了Rust中的trait概念。和Python不同,Rust的理念是“组合而非继承”。拿wgatools中的实际例子而言,其实不论是PAF、Chain、MAF、SAM格式,其中一条比对记录,都能实现同一个trait,这个trait包含许多功能,比如获取序列、获取比对长度、获取插入/缺失长度,而不同的文件格式,只不过在实现这个trait上有不同的实现,因此代码其实可以写的非常优雅。

有了这个trait,后面许多函数的接受参数,甚至可以只接受该trait,因此不用为不同的文件格式重写类似的函数代码。

第二点大的重构是有关错误处理,一开始我基本都使用了unwrap()来处理错误,直到后面对Rust的错误传递机制有了一定的认识后,才定义了覆盖完全的错误类型,这样可以做到非常清晰的追踪和日志。

其他方面,包含输入输出的统一处理、多线程、更快的字符串解析器等。有了这些特性的加持,整体的代码框架基本就敲定了。

代码开源后,逐渐也确实有几个同行看到了我的工作,并开始使用,在这个过程中,他们给我提出了许多实用的建议,包括一些新功能的需求、处理特殊情况等。尽管当时我也忙着做主要的课题,但还是会在很多个深夜打磨自己的代码。

wgatools 能做什么

wgatools是用于处理基因组比对的工具套件,功能丰富:

直接一张表说明:

图片

wgatools 有哪些优势

1. 快

这个力量大部分属于 Rust,作为近年来最“网红”的语言,其实力并不是噱头。号称只要你通过编译,就能获得和C++相媲美的性能。

至于Benchmark,首先我甚至没将其和Python脚本进行比较,已经不是一个维度的了。我和别人同样用Rust写的其中paf2chain这个功能做了比较:

图片

大约可以快5倍左右。

至于真实体验,用户们都给出了不错的反馈。

2. 用户体验好

做生信的小伙伴,相信都听过 csvtk和seqkit,它们的作者曾经写过一个文档:What should perfect bioinformatic tools be like?

其中有些点我非常赞同,并将其用到了实践中:

  1. 使用命令-子命令的结构来完成不同的事情

  2. 不同的子命令之间,使用相同的flag,比如-i/-o表示输入输出,-h/-v表示显示帮助信息和verbose

  3. 参数同时实现长短形式,比如-q/--query-r/--reference

  4. 实现子命令和参数的自动补全

  5. 支持标准输入输出来实现管道操作

  6. 在执行计算前,首先检查文件是否存在

  7. 如果输出文件存在,警告是否要覆盖重写

  8. 使用magic-number检查压缩文件的类型而非后缀

3. 安装简单

作为编译语言,无需安装复杂的虚拟环境来配置依赖,只需要拉取源码并编译安装,得益于cargo的高效,这使得编译安装wgatools的过程在我的macbook上只需要1分钟。

当然也支持其他形式的安装,比如Conda、GUIX、Docker、Singularity甚至Nix。

别人的力量与开源社区

很多小伙伴(也有老伙伴)为wgatools的代码做出了贡献,看到这些PR时,我能够切切实实地体会到开源的魅力。

大约在11月份,一个在欧洲的师兄和我说Erik在社区中转发了wgatools,我一开始甚至不敢相信,这大哥毕竟是泛基因组领域的开拓者之一了,名头很大。也通过这个机会,我认识了Erik和不少圈内的小伙伴,看到了这个领域许多前沿的工作。因此,wgatools带给我的不止是一篇paper。

从第一行代码到如今,wgatools一直保持着开源。起初,每一颗star都会让我兴奋不已,似乎得到了莫大的认可,但随着时间的推移,wgatools带给我的逐渐是责任和压力,越来越多的star也说明,不能忽略每一个issue,但是时间和精力是有限的,后面有些issue的回复也拖了很久。

在这个工作中,也要感谢很多人,感谢刘海军师兄、桂松涛师兄的指导,感谢两个实验室的小伙伴成员的帮助。

借用一句作者的名言,与君共勉:Get my hands dirty! Always be a rookie and stay hungry.Enjoy contributing to the community.

最后,欢迎大家使用wgatools,欢迎+感谢star!

参考链接

  1. https://github.com/shenwei356/perfect-bioinformatic-tools

  2. https://github.com/wjwei-handsome/wgatools

posted @ 2025-04-24 21:07  生物信息与育种  阅读(269)  评论(0)    收藏  举报