一步到位-生信分析流程构建框架介绍

我们都知道生物信息学(Bioinfomatics)包含两个部分:bioinformatics,即利用生物数据通过计算机学或统计学或数学的方法发现这些数据背后所具有的生物学意义。而随着高通量测序技术的不断发展,各种组学大数据正形成井喷的局面,我们越来越多地将目光聚焦在怎么才能准确、高效、低耗利用好这些数据。好在时至今日,已经有很多科学家开发了非常多优秀的算法及软件,很多时候我们要做的是怎么将这些软件串联起来并构建成生信分析流程,而这项技能通常是各大公司考核应聘者的项目之一。一个好的分析流程在减轻使用者负担的同时,还能够让别人也能够重复你的分析过程,从而保证结论可靠性。

bioinfoPipeline

一切都要从Scripts以及Make说起

生物信息学分析流程可以根据其设计理念的不同分为多个框架,但是追本溯源他们都源于Scripts以及Make的使用[1]。

Scripts即脚本语言,就是利用Unix shell语言或者其他的编程语言如Python、Perl等,将所需要的分析各部分串联起来,最后达到自己想要的结果。这种理念是我们最直观的分析逻辑,也是最常用的流程框架。通常,生信刚入门的同学们会选择这种方式,简单而暴力;段位较高的同学,则会选择将分析内容进行包装,然后提供多个参数选择,增加流程灵活性。大部分时候,这样都会满足我们分析需求,但是其作为一个生信流程有着严重的缺点就是缺乏重入性(reentrancy),即当流程在运行过程中,很容易因为某些不知名的原因而发生中断,而普通的脚本流程只能是从头来过了,就造成了运行时间和运算资源的浪费。

你可能不知道Make是干嘛的,但是聪明的你们如果编译过软件,那么你应该见过Makefile这个文件吧。是的,现在我们就来说它。Make是最常用的软件编译器,作为一个1977年诞生的工具,其存在的年代确实有点久远了,但是其依然在科学计算流程管理文件转化中焕发了新生。这是因为Make引入了“隐式通配符规则”(implicit wildcard rules)的概念,通过文件的后缀以及特定的符号(@,$.等)对输入和输出文件进行描述,从而对其进行特定的转换,解决了编译是存在的各种依赖关系,尤其是部分文件更新后,Make依然能够对下游的文件进行更新。如下利用bwa mem进行序列比对的Make规则:


REF:=GRCh38.fa

%.sam : %_1.fq %_2.fq

    bwa mem $(REF) $^ > $@

由于Make原本就不是为科学流程而设计的,自然也会有它的缺点:

  • Make不能够在集群上的多个节点上分派任务进行平行话的运算,这就对于大型任务而言增加了用户的等待时间;

  • Make的语法是限制一个通配符只能在一个规则里面使用,不同规则里面通配符不能互相识别,不然就只能直接输入文件名进行匹配;

  • 尽管Make能够使用简单的Shell脚本,却难以实现更加复杂的逻辑。

虽然Scripts和Make流程满足了我们的基本需求,但是他们都缺乏可扩展性,多任务平行化处理等能力,导致它们都难以面对现在大数据量的分析需求。

现代的流程框架

既然说完了“流程奠基者”的缺点,那么相应会有很多流程框架的出现来克服以上出现的局限性。

  1. Implicit convention frameworks(基于Make的框架):这类框架最典型的例子是Nextflow、Snakemake,它们在保留了make一贯的隐式通配符的风格(即用rule中定义的通配符来实现上下游文件的依赖关系)的基础上扩展了断点重入、平行化处理、文件名管理等功能,突破了Make的限制,使得他们的使用更加灵活且可控。下面是Snakemake的例子:

    
    rule align_with_bwa:
    
        input:
    
            pair1 = "{sample}_1.fq",
    
            pair2 = "{sample}_2.fq",
    
            bwa = config["bwa"]["path"],
    
            ref = config["references"]["human"]
    
        output:
    
            temp("{sample}.sam")
    
        threads:
    
            config["bwa"]["threads"]
    
        shell:
    
        "{input.bwa} -t {threads} {input.ref} {input.pair1} {input.pair2} > {output}"
    
    

    然后通过执行snakemake -np {A,B,C}.bam就可以依次比对带有A、B、C的A_{1,2}.fq、B_{1,2}.fq、C_{1,2}.fq,这样是不是很方便呢?

  1. Explicit framworks:这一类代表的流程有Ruffus和bpipe,它们的特点与Implicit convention frameworks不同的是,它们的执行不依赖于文件名规则,而是类似Scripts依赖于别的任务是否完成。以bpipe进行比对(align)和排序(sort)为例:

    
    align = {
    
        exec "bwa aln -I -t 8 reference.fa s_1.fq > out.sai"
    
        exec "bwa samse reference.fa out.sai s_1.fq > out.sam"
    
    }
    
    sort = {
    
        exec "samtools view -bSu out.sam  | samtools sort -  out.sorted"
    
    }
    
    Bpipe.run {
    
        align + sort
    
    }
    
    

    这样只需在原有的shell脚本的基础上,将每个分析部分进行包装,然后利用Bpipe的语法进行串联,就能高效地利用计算机资源以及进行断点重新运行。(对Shell高度依赖的童鞋们可以值得一试)

  1. Configuration-based frameworks:在这个框架中,任务之间的连接既不依赖于上下游的代码,也不依赖于文件命名规则,只仅仅需要配置文件的输入,通常这个配置文件的格式是XML、YAML、TOML等,然后用对应的格式解释器以及执行步骤就能完成流程的分析。常见的流程有Galaxy等。这种基于配置的流程通常也以在线网站的形式提供服务,它们能够让用户以简单的拖拽、连接的方法构建流程,极大减轻了研究者的负担。下面是Galaxy在线编辑WES分析流程界面:
Galaxy

此外,有些功能较多的生物信息学工具(如:SpliceGrapher)也会提供一个配置文件来管理参数,这样的好处是使得参数的浏览和修改更加直观,减少命令行参数的动态修改,增加流程可重复性!

  1. Class-based frameworks: 前面说到的流程基本上都是将多种软件进行组合,说到底就是用别人的软件来做自己的东西,但是要实现高性能就要用自己的代码来进行特定的分析需求,在小编看来就是在“造轮子”,但是“轮子”造的好能够极大提高数据的处理速度。这一类的典型代表是GATK,其利用JAVA实现了基因检测、SNP calling,用其高性能、高准确性赢得了大家的认可。(PS:Broad Institute是真厉害啊)
GATK

选择适合你的流程

说了那么多流程,你可能要问,到底哪个适合我呢?小编认为:

  1. 如果是完全湿实验且没有时间去学习编程语言的生物研究者,那么我建议可以使用Galaxy这类纯图形界面操作的框架,在完成分析的逻辑构建后就可以高效地进行分析了;

  2. 如果实验室要的是概念证明类的工作,那么就可以使用Implicit/Explicit类的流程,如:Snakemake、Nextflow等,而这一类的流程也比较适合刚入门生信的小伙伴们去尝试;

  3. 如果是需要进行高性能流程开发,致力于解决特定的生物学问题,且有一定的计算机编程基础的话,那么我建议使用Class-based流程。

当然,小编罗列这些框架和流程都只是现阶段比较完善的几种类型。科学是不断发展和变化的,不断会有新的理念来打破原有的思想惯性,希望大家保持一颗不断学习、进取的心,在生信学习的道路上越走越远!!

Reference

[1]Jeremy Leipzig, A review of bioinformatic pipeline frameworks, Briefings in Bioinformatics, Volume 18, Issue 3, May 2017, Pages 530–536, https://doi.org/10.1093/bib/bbw020

欢迎关注公众号:"生物信息学"

你可能感兴趣的:(一步到位-生信分析流程构建框架介绍)