Channels
通道是 Nextflow 在工作流中发送数据的方式。通道通过它们的输入和输出连接进程。
通道可以存储多个项,比如文件(例如 fastq 文件)或值。通道存储的项数决定了使用该通道作为输入的进程将运行多少次。
注意: 当进程使用输入通道的一项运行时,我们将其称为任务
。
为什么使用Channels
通道是 Nextflow 处理文件管理的方式,它允许将复杂的任务分解、并行运行。
通道是异步的,这意味着一组进程的输出不一定按照相应输入的顺序输出。通道队列遵循先入先出FIFO的规则。通道只向一个方向发送数据,从生产者(进程/操作者)发送到消费者(另一个进程/操作者)。
Channels类型
Nextflow 区分了两种不同的通道: 队列(queue
)通道和值(value
)通道。
队列通道
队列通道是一种消耗型的通道。其可以以如下方式创建:
- 作为进程的输出。
- 显式地使用通道工厂方法,例如 Channel.of 或 Channel.fromPath。
值通道
第二种类型的 Nextflow 通道是值通道。值通道绑定到单个值。
值通道可以无限次地使用,这对于需要重用来自通道的输入的进程也很有用,例如,一个参考基因组序列文件是由一个进程中的多个步骤所需要的,或者是由多个进程所需要的。
使用通道工厂方法创建通道
通道工厂用于显式创建通道。在编程中,工厂方法(函数)是一种编程设计模式,用于创建不同类型的对象(在本例中是不同类型的通道)。
使用 Channel.<method> 语法调用 Channel 工厂,并返回 Channel 的特定实例。
值通道工厂
使用value
方法:
ch1 = Channel.value( 'GRCh38' )
ch2 = Channel.value( ['chr1', 'chr2', 'chr3', 'chr4', 'chr5'] )
ch3 = Channel.value( ['chr1' : 248956422, 'chr2' : 242193529, 'chr3' : 198295559] )
队列通道工厂
可以使用下列通道工厂方法创建队列通道:
Channel.of
Channel.fromList
Channel.fromPath
Channel.fromFilePairs
Channel.fromSRA
of 通道工厂
当创建包含多个值的通道时,可以使用通道工厂 Channel.of
chromosome_ch = Channel.of( 'chr1', 'chr3', 'chr5', 'chr7' )
chromosome_ch.view()
/*
chr1
chr3
chr5
chr7
*/
可以使用 Groovy range 操作符指定一个数值范围作为一个参数..
,这将在通道中创建范围内的每个值(包括开始和结束值)作为一个列表。
chromosome_ch = Channel.of(1..22, 'X', 'Y')
chromosome_ch.view()
of 方法中可以传递不同类型的数据。
可能在旧的 nextflow 脚本中会看到 Channel.from 方法。这个函数执行类似的功能,但现在被废弃(不再使用) ,因此应该使用 Channel.of。
fromList 通道工厂
可以使用 Channel.fromList
方法从列表对象创建队列通道。
aligner_list = ['salmon', 'kallisto']
aligner_ch = Channel.fromList(aligner_list)
aligner_ch.view()
fromPath 通道工厂
当需要传递文件时,使用一个特殊的通道工厂方法 fromPath。
fromPath工厂方法创建一个队列通道,其中包含一个或多个与文件路径匹配的文件。
文件路径(带引号的字符串)可以是单个文件的位置,也可以是匹配多个文件或目录的“ glob 模式”。
文件路径可以是相对路径(从工作目录到文件的路径) ,也可以是绝对路径(从系统根目录到文件的路径-以/开头)。
read_ch = Channel.fromPath( 'data/yeast/reads/ref1_2.fq.gz' )
read_ch.view()
// data/yeast/reads/ref1_2.fq.gz
也可以使用通配符:
*
匹配任意数量的字符(包括无字符)。**
工作原理与 * 类似,但也会搜索子目录。这种语法通常用于匹配完整路径。- 大括号
{}
指定子模式的集合。例如: { bam,bai }匹配“ bam”或“ bai”。
// 匹配相应目录下所有的.fq.gz文件
read_ch = Channel.fromPath( 'data/yeast/reads/*.fq.gz' )
read_ch.view()
fromPath
也有其他可选参数,如下:
name | description |
---|---|
glob | true:表示将* ,? ,[] ,{} 视为通配符,否则将它们视为普通字符,默认为true |
type | 字符串匹配的文件路径类型,可以是 file、 dir 或 any (default: file) |
hidden | 如果为 true,则在结果路径中包含隐藏文件(默认值为 false) |
maxDepth | 要访问的目录级别的最大数量(缺省值: 没有限制) |
followLinks | 如果为 true,则在目录树遍历期间遵循符号链接,否则将它们作为普通文件(默认值为 true) |
relative | 是否返回相对路径,默认false |
checkIfExists | true表示在文件系统中不存在指定路径时引发异常(默认值: false) |
read_ch = Channel.fromPath( 'data/chicken/reads/*.fq.gz', checkIfExists: true )
read_ch.view()
目录不存在时会报错:
N E X T F L O W ~ version 20.10.0
Launching `hello.nf` [intergalactic_mcclintock] - revision: d2c138894b
No files match pattern `*.fq.gz` at path: data/chicken/reads/
fromFilePairs 工厂方法
我们已经看到了如何使用 fromPath 单独处理文件。在生物信息学中,我们经常希望以成对或更大的组来处理文件,例如在测序中读取对。
例如,data/royal/reads 目录中有6组读取对。
样本组 | read1 | read2 |
---|---|---|
ref1 | data/yeast/reads/ref1_1.fq.gz | data/yeast/reads/ref1_2.fq.gz |
ref2 | data/yeast/reads/ref2_1.fq.gz | data/yeast/reads/ref2_2.fq.gz |
temp33_1 | data/yeast/reads/temp33_1_1.fq.gz | data/yeast/reads/temp33_1_2.fq.gz |
temp33_2 | data/yeast/reads/temp33_2_1.fq.gz | data/yeast/reads/temp33_2_2.fq.gz |
etoh60_1 | data/yeast/reads/etoh60_1_1.fq.gz | data/yeast/reads/etoh60_1_2.fq.gz |
etoh60_2 | data/yeast/reads/etoh60_2_1.fq.gz | data/yeast/reads/etoh60_2_2.fq.gz |
Nextflow 为这种常见的生物信息学用例提供了一种方便的工厂方法。fromFilePairs
方法为每组匹配特定的 glob 模式的文件创建一个包含元组的队列通道(例如:/path/to/*_{1,2}.fq.gz)。
fromFilePairs
返回元祖的第一个元素是一个基于文件名共享部分的字符串(即 glob 模式的 * 部分)。- 第二个元素是与 glob 模式的其余部分匹配的文件列表(例如:xxx_{1,2}.fq.gz)。这将会包含以
_1.fq.gz
和_2.fq.gz
结尾的文件。
read_pair_ch = Channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
read_pair_ch.view()
输出:
[temp33_1, [data/yeast/reads/temp33_1_1.fq.gz, data/yeast/reads/temp33_1_2.fq.gz]]
[ref1, [data/yeast/reads/ref1_1.fq.gz, data/yeast/reads/ref1_2.fq.gz]]
[ref2, [data/yeast/reads/ref2_1.fq.gz, data/yeast/reads/ref2_2.fq.gz]]
[temp33_2, [data/yeast/reads/temp33_2_1.fq.gz, data/yeast/reads/temp33_2_2.fq.gz]]
[etoh60_1, [data/yeast/reads/etoh60_1_1.fq.gz, data/yeast/reads/etoh60_1_2.fq.gz]]
[etoh60_2, [data/yeast/reads/etoh60_2_1.fq.gz, data/yeast/reads/etoh60_2_2.fq.gz]]
总结
- Nextflow 有两种不同的通道: 队列通道和值通道。
- 值通道中的数据可以在工作流中多次使用。
- 队列通道中的数据在进程或运算符使用时会被消耗(不能像value通道多次使用)。
- 可以使用通道工厂方法来创建通道。
- 通道工厂方法有可选参数,例如 checkIfExists,可用于改变通道的创建和行为。