1 简介

Nextflow是由Barcelona Center for Genomic Regulation (CRG)的比较生物信息学小组研发的,在2014年开源,基于GPL3软件许可发布,在github上可以下载到源代码。由于其敏捷、灵活、兼容性强等特点,迅速成为生物信息学研究领域内广受欢迎的开发工具。

​​在科学计算领域,Linux系统可以说是一个所有科研人员的通用平台,提供了许多简单的命令行和脚本工具,这些程序非常精简强大,如果能够按照一定的规则连接起来,就能够处理更加复杂庞大的数据。而Nextflow的设计正是基于这种目标实现的,它是一种工作流框架,包括了独立的编程语法,能够大大简化复杂计算流程的编排工作。Nextflow实现的核心在于为各个独立的分析工具提供了复杂的程序交互标准,以及基于数据变成模型的并行计算环境配置。

1.1 什么是pipeline(管道)

来自于pipeline是什么?

pipeline,中文意为管道、管线,意义等同于流水线。最典型的就是Gpu渲染管线,它指明渲染一个画面需要经过多少到工序。还有就是应用于爬虫框架里面。它就是指某个项目或者框架里面需要用到流水线的设计来简化设计,降低复杂度并提高性能。是一种设计方法,是我们将现实中的社会分工借鉴并运用到计算机编程的例子。

类似的还有分层思想,设计模式。这些东西本身是没有专门的学科和书籍去讲解的,多数得靠个人理解与运用。还有些设计模式比较通用,能达成共识,因此就诞生了设计模式(这里是特指)比如pipeline,比如分层思想,比如设计模式,这是编程中最具魅力的地方,能让你有一种居高临下,指点江山的感觉。一个框架如果使用了好的设计模式,好的分层会使得学习与使用的成本都会降低。许多编程新手都忘记或者忽视这方面的经验积累,这就可能导致写不出代码,写不出好代码。

1.2 什么是DSL(Domain Specified Language)

来自于DSL简介

DSL(Domain Specified Language)意为:领域专用语言

在需求收集的过程中,如果要成功构建模型,则需要一种领域专家和构建者(也就是通常的领域分析师/业务分析师)都能理解的“共同语言”。但是这种共同语言的创建过程没有保证,不能够保证在收集过程中得到的信息完整的描述了领域活动中所有的业务规则和活动。

如果能够让领域专家通过简单的编程方式描述领域中的所有活动和规则,那么就能在一定程度上保证描述的完整性。

DSL 就是为了解决这个问题而提出的。

常见的 DSL

  • 软件构建领域 Ant
  • UI 设计师 HTML
  • 硬件设计师 VHDL

DSL 的特点

  • 用于专门领域,不能用于其他领域
  • 表现力有限
  • 不描述解答域,仅描述问题域

DSL 与通用编程语言的区别

  • DSL 供非程序员使用,供领域专家使用
  • DSL 有更高级的抽象,不涉及类似数据结构的细节
  • DSL 表现力有限,其只能描述该领域的模型,而通用编程语言能够描述任意的模型

2 安装

2.1 环境依赖:

Nextflow可以在任何POSIX兼容系统(Linux,OS X等)上使用。它需要安***ash 3.2(或更高版本)和Java 8(或更高版本,最多11个)。

可以使用POSIX兼容层(例如Cygwin(未验证))来支持Windows系统,或者使用诸如VirtualBox 或VMware的虚拟化软件将其安装到Linux VM中。

2.2 环境配置

在NextFlow官网中找到下载命令如下:

在CentOS 6 下,本人通过curl -s https://get.nextflow.io | bash未能成功,然后尝试了GitHub也失败了。最后使用了Bioconda

2.2.1 conda与bioconda的关系

来自于conda与bioconda解决生信软件安装困扰

conda原本是为了解决Python模块安装的依赖问题,然而可能是无心栽柳柳成荫,conda目前已经超越了其最初目的而存在,可以解决大多数软件的安装和配置,包括各种本身与python毫无关系的包,也就涵盖了,我们大多数的生物信息学软件。而为此conda的软件源有多种,其中专门收录了生物信息学软件的软件源,亦即bioconda。所以bioconda仅仅是conda的软件源之一,与bioconductor之于CRAN,bioperl之于CPAN是类似的。所以掌握bioconda,事实上也就是掌握conda,反之亦然。


2.2.2 conda的安装

可以安装Anaconda,也可以安装miniconda,具体如果没有root权限,建议安装后者,安装过程类似,简单。

安装conda的详情请查看Cento6.5环境下安装Anaconda31 安装

2.2.3 配置Bioconda

安装完了conda,剩下的其实就只配置bioconda(其实就只是添加软件源

如果root身份运行则添加到全局,如果是用户身份运行则会修改用户主目录下的.condarc文件,与bashrc, bashprofile等类似

.condarc文件覆盖以下内容。

channels:
  - bioconda
  - conda-forge
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
ssl_verify: true
show_channel_urls: true
custom_channels:
  conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

2.3 conda/Bioconda的使用

使用conda/bioconda的过程其实也就是使用conda进行软件的安装和配置过程

主要的使用方法有两种

  • 直接配置到默认环境(适合root用户安装)
  • 创建虚拟环境(适合所有用户,有root和没有root都有OK)(推荐

2.3.1 直接配置到默认环境(适合root用户安装)

对于root,,有时候其他用户需要一些软件,安装起来还是比较麻烦的,此时直接使用conda安装,可能会非常方便,举例,安***wa

conda install bwa

如此,bwa的安装就完成了,可以直接在所有客户的默认环境中使用。

在当前环境下直接使用conda进行软件的安装,事实上就与yum apt-get dnf类似,安装软件,同时将软件配置到当前环境变量,对于anoconda而言,可能是 PATH/anaconda3/bin/bwa, 其中,在安装anoconda的时候,PATH/anoconda/bin已经被添到环境变量中 - 如果没有,请自行添加

2.3.2 创建虚拟环境(适合所有用户,有root和没有root都有OK)

对于非root用户而言,如果直接运行conda install bwa,那么可能会受到写入权限的限制,此时可以使用conda最灵活的操作,创建虚拟环境

# 创建环境
conda create -n bioinfoSpace
# 加载环境--事实上,就是将这个环境中安装了的软件路径添加到$PATH中
conda activate  bioinfoSpace
# 安装各种自己需要的软件,以供使用 
conda install bwa bowtie
# 此时可以使用这些软件了
# 使用结束,可以退出环境
conda deactivate bioinfoSpace

2.4 安装NextFlow

配置好Bioconda后,执行命令

conda install nextflow

查看版本号

nextflow -v


即可下载成功!!!


3 NextFlow初体验

将以下示例复制到您喜欢的文本编辑器中,并将其保存到名为 tutorial.nf

#!/usr/bin/env nextflow

params.str = 'Hello world!'

process splitLetters {

    output:
    file 'chunk_*' into letters

    """ printf '${params.str}' | split -b 6 - chunk_ """
}


process convertToUpper {

    input:
    file x from letters.flatten()

    output:
    stdout result

    """ cat $x | tr '[a-z]' '[A-Z]' """
}

result.view { it.trim() }

该脚本定义了两个过程。第一个将字符串分割成6个字符的块,然后将每个字符串写入带有前缀的文件,chunk_第二个接收这些文件并将其内容转换为大写字母。结果字符串在result通道(channel )上发出,最终输出由view操作员打印 。

通过在终端中输入以下命令来执行脚本:

nextflow run tutorial.nf

它将输出类似于以下文本的内容:

N E X T F L O W  ~  version 19.04.0
executor >  local (3)
[69/c8ea4a] process > splitLetters   [100%] 1 of 1 ✔
[84/c8b7f1] process > convertToUpper [100%] 2 of 2 ✔
HELLO
WORLD!

您可以看到第一个过程执行了一次,第二个过程执行了两次。最后,结果字符串被打印出来。

值得注意的是,该过程convertToUpper是并行执行的,因此不能保证处理第一个拆分的实例(the chunk Hello)将在执行第二个拆分的实例之前执行(the chunk world!)。

因此,很有可能您将以不同的顺序打印出最终结果:

WORLD!
HELLO

3.1 修改并恢复

Nextflow跟踪管道中执行的所有进程。如果您修改了脚本的某些部分,则仅重新执行实际更改的进程。不会更改未更改的进程的执行,而是使用缓存的结果。

在测试或修改管道的一部分而不必从头开始执行时,这很有帮助。

为了本教程的缘故,请修改convertToUpper上一个示例中的流程,将流程脚本替换为字符串,使流程如下所示:rev $x

process convertToUpper {

    input:
    file x from letters

    output:
    stdout result

    """ rev $x """
}

然后以相同的名称保存文件,并通过-resume在命令行中添加选项来执行该文件:

nextflow run tutorial.nf -resume

它将输出类似于以下内容的输出:

N E X T F L O W  ~  version 19.10.0
Launching `tutorial.nf` [happy_jang] - revision: 5ffc840364
executor >  local (2)
[d7/46634f] process > splitLetters   [100%] 1 of 1 ✔
[68/5af178] process > convertToUpper [100%] 1 of 1 ✔
olleH
!dlrow

您将看到splitLetters实际上跳过了流程的执行(流程ID相同),并且从缓存中检索了其结果。第二个过程按预期执行,打印反转的字符串。

3.2 管道参数

管道参数可以通过在变量名前添加前缀params(用点字符分隔)来简单声明。可以在命令行上通过在参数名称前添加双破折号来指定其值,即--paramName

为了本教程的缘故,您可以尝试执行前面的示例,指定另一个输入字符串参数,如下所示:

nextflow run tutorial.nf --str 'Bonjour le monde'

在命令行上指定的字符串将覆盖参数的默认值。输出将如下所示:

N E X T F L O W  ~  version 19.10.0
Launching `tutorial.nf` [berserk_ekeblad] - revision: 5ffc840364
executor >  local (2)
[8f/b87b18] process > splitLetters   [100%] 1 of 1 ✔
[d0/add931] process > convertToUpper [100%] 1 of 1 ✔
uojnoB
m el r
edno