初识Nextflow (系列之一)
写在前面
每个人的时间都是有限的。
昨夜反思,当我发现博士生活已经过了一年半,而我也需要耗费一定量的时间在实验上的时候,我开始有顾虑。我认知中的
成长是需要时间的,浮沙筑高楼是不可能持久的。
这类观点,与现实格格不入。
我也突然发现,我所认为的打好基础的生信学习方式,只适合我自己。
所以我选择放弃一些想做的事情,切换模式开展。希望这会是一个能够在短时间内极大提升整体工作效率的方式。
我开始发现,很多不错的东西,我会推荐给少数的师弟师妹,而其中有极少数在最后用起来,也用的很好,包括python,docker和Nextflow。但是事实上,我都是在推荐给他们后一两年才开始真正地使用这些工具。主要原因是,我认为这些必然是好东西,他们必火,但是我没有时间也不想改变。
不愿意改变的,自然是会被淘汰的。正如我现在的窘境。你不应该其期望有人能够跟你一样,有充足的时间,精力和机遇,冲进去,杀出来。所以,你应该造一门大炮,然后来者,只需要点火就可以完成你所不能完成事情。
回到主题
NextFlow,知道的人知道,不知道的人或许以后会知道。我终于还是要用起来。毕竟从流程搭建上,我个人的直观感受比make,snakmake都会更优秀。
NextFlow 调试 与 使用
环境需要
Linux Mac等,如果是windows,那么可能推荐从虚拟机
软件配置
确保java1.7 及以上的版本
java -version下载
curl -s https://get.nextflow.io | bash
下载完成之后,会在当前目录生成一个nextflow可执行文件,文件可移动到 环境变量可访问的目录。事实上,这是一个明显的过程,下载一个bash文件,并执行他
运行示例
./nextflow run hello
对docker有所了解的朋友,应是马上get到。即下载并运行他。
实践操作
从本地创建的流程并运行
vim tutorial.nf
文件中输入以下内容
#!/usr/bin/env nextflowparams.str = 'Hello world!'process splitLetters { output: file 'chunk_*' into letters mode flatten """ printf '${params.str}' | split -b 6 - chunk_ """} process convertToUpper { input: file x from letters output: stdout result """ cat $x | tr '[a-z]' '[A-Z]' """} result.subscribe { println it.trim() }
运行
nextflow run tutorial.nf
定义了两个步骤,一个步骤串一个步骤,其中splitLetters运行了一次,将字符串分隔并输出到两个文件,而convertToUpper运行了两次,而且还是并行运行的。
注意,在当前文件夹下会产生work文件夹,这个文件夹,记录了已经运行完成的步骤。当.nf脚本某个部分发生改变,而这个改变不影响该步骤时,该步骤会直接使用之前的结果(可能极大地提升时间)。
修改流程并查看使用缓存的已运行步骤
修改.nf文件中的convertToUpper
的处理函数为rev $x
,即
process convertToUpper { input: file x from letters output: stdout result """ rev $x """}
重新运行时,如果加上-resume
参数,那么就可以使用缓存
nextflow run tutorial.nf -resume
当然,如果没加-resume,那么就会不使用缓存
使用命令行参数
上述.nf脚本中的params.str 事实上是设置默认参数。这个参数可以通过命令行直接给予,如
nextflow run tutorial.nf --str 'Hola mundo'