简单来说,可以将process理解为流程图中的节点,而channel理解为流程图中的箭头。
用于存放在process之间传递的数据。可分为队列(queue)和值(value)两种类型。
channel | 特点 | 创建方法 |
---|---|---|
queue | 异步、单向、消耗内容(只能读取一次) | of , fromPath |
value | 异步、单向、不消耗内容(可多次读取) | value |
构成流程的基本单元,可以包括directives, inputs, outputs, when clause, script等五部分,语法如下:
process < name > {
[ directives ]
input:
<input qualifier> <input name> [from <source channel>] [attributes]
output:
< process outputs >
when:
< condition >
[script|shell|exec]:
< user script to be executed >
}
input 定义了process从哪个channel接收数据。①只能包含1个输入块,输入块中可以包含1或多个输入声明。②输入限定符(qualifier)声明了待接收数据的类型,包括value
, file
, path
, env
, stdin
, tuple
, each
等。③直接影响产生的任务数量,process会逐项消耗channel中的数据,并依次产生新任务,直到数据被完全消耗。Nextflow会为每个任务创建一个运行目录,存放相关的文件、日志、输出等。
output 定义了哪些process结果数据传输到哪个channel。①只能包含1个输出块,输出块中可以包含1或多个输出声明。②输出限定符包括val
, file
, path
, env
, stdout
, tuple
等。
directives 影响process执行的可选设置,如输出相关publishDir
;调度和资源相关executor
,queue
, cpus
, memory
, time
;异常重试相关errorStrategy
, maxErrors
, maxRetries
等。
script 以字符串的形式定义了需要执行的命令。①只能包含1个脚本块,脚本块中可以包含1或多行字符串。②字符串可以通过使用单或双引号定义,而多行字符串是由三个单或双引号定义。除了直接定义,还可以通过关键字script
,shell
,exec
实现更加灵活的定义。③脚本块作为bash脚本运行。
用于处理channel数据,并将处理后的数据传递到新channel。可分为以下七个大类。
filtering operators 用于选择符合特定规则的数据项。
filter
: 仅保留满足条件(字面值、正则表达式、限定符)的数据项。first
: 返回满足条件的第一个数据项。last
: 返回满足条件的最后一个数据项。randomSample
: 返回指定数量、且随机选取的数据项。take
: 仅过滤前n个数据项。unique
: 去除重复项。distinct
: 去除连续重复项。until
: 返回数据项直到满足特定条件时。Transforming operators 用于转换数据项。
buffer
:collate
:collect
:flatten
:flatMap
:groupBy
:groupTuple
:map
: 对各数据项依次应用函数(mapping function, 表现为closure形式),返回函数处理后的数据项。reduce
:toList
:toSortedList
:transpose
:Splitting operators
splitCsv
splitFasta
splitFastq
splitText
Combining operators
cross
collectFile
combine
concat
join
merge
mix
phase
spread
tap
Forking operators
branch
choice
multiMap
into
separate
tap
Maths operators
count
countBy
min
max
sum
toInteger
Other operators
close
dump
ifEmpty
print
println
set
view
用于指定process运行在何种底层执行系统的组件。底层执行系统包括local; SGE, PBS/Torque, K8S; AWS batch, Azure batch, SLURM等。
通过该组件,Nextflow实现了流程和计算平台的分离,使得用户仅需要通过修改executors的定义,就可以让流程运行在本地、集群或者云上。
executors | describe | directive-general | directive-clusterOptions |
---|---|---|---|
local | 运行在本地*,常用于流程的开发和测试 | - | - |
PBS/Torque | 运行在PBS集群,通过qsub**将process提交 | cpus,memory,queue,time | … |
… | … | … | … |
* 本地指启动Nextflow的计算机j节点。
**需要运行在qsub可用的节点,通常为登录节点。
Q: 将同一channel作为多个process的输入?
A: 使用into
操作符创建源channel的拷贝。
Q: 全局匹配到每个文件分别运行一个process?
A: 使用Channel.fromPath
方法。
Q: 一次处理所有结果?
A: 使用collect
操作符收集上游任务产生的所有输出,传出为一个单独输出。
Q: 分组处理所有结果
A: map
+ groupTuple
Q: 将一或多个process的输出储存到指定的目录结构
A: publishDir
Nextflow’s documentation
Nextflow Patterns