4 Channels

Channels

通道是 Nextflow 在工作流中发送数据的方式。通道通过它们的输入和输出连接进程。
通道可以存储多个项,比如文件(例如 fastq 文件)或值。通道存储的项数决定了使用该通道作为输入的进程将运行多少次。
注意: 当进程使用输入通道的一项运行时,我们将其称为任务

为什么使用Channels

通道是 Nextflow 处理文件管理的方式,它允许将复杂的任务分解、并行运行。

通道是异步的,这意味着一组进程的输出不一定按照相应输入的顺序输出。通道队列遵循先入先出FIFO的规则。通道只向一个方向发送数据,从生产者(进程/操作者)发送到消费者(另一个进程/操作者)。

Channels类型

Nextflow 区分了两种不同的通道: 队列(queue)通道和值(value)通道。

队列通道

队列通道是一种消耗型的通道。其可以以如下方式创建:

  1. 作为进程的输出。
  2. 显式地使用通道工厂方法,例如 Channel.ofChannel.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也有其他可选参数,如下:

namedescription
globtrue:表示将*,?,[],{}视为通配符,否则将它们视为普通字符,默认为true
type字符串匹配的文件路径类型,可以是 file、 dir 或 any (default: file)
hidden如果为 true,则在结果路径中包含隐藏文件(默认值为 false)
maxDepth要访问的目录级别的最大数量(缺省值: 没有限制)
followLinks如果为 true,则在目录树遍历期间遵循符号链接,否则将它们作为普通文件(默认值为 true)
relative是否返回相对路径,默认false
checkIfExiststrue表示在文件系统中不存在指定路径时引发异常(默认值: 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组读取对。

样本组read1read2
ref1data/yeast/reads/ref1_1.fq.gzdata/yeast/reads/ref1_2.fq.gz
ref2data/yeast/reads/ref2_1.fq.gzdata/yeast/reads/ref2_2.fq.gz
temp33_1data/yeast/reads/temp33_1_1.fq.gzdata/yeast/reads/temp33_1_2.fq.gz
temp33_2data/yeast/reads/temp33_2_1.fq.gzdata/yeast/reads/temp33_2_2.fq.gz
etoh60_1data/yeast/reads/etoh60_1_1.fq.gzdata/yeast/reads/etoh60_1_2.fq.gz
etoh60_2data/yeast/reads/etoh60_2_1.fq.gzdata/yeast/reads/etoh60_2_2.fq.gz

Nextflow 为这种常见的生物信息学用例提供了一种方便的工厂方法。fromFilePairs 方法为每组匹配特定的 glob 模式的文件创建一个包含元组的队列通道(例如:/path/to/*_{1,2}.fq.gz)。

  1. fromFilePairs 返回元祖的第一个元素是一个基于文件名共享部分的字符串(即 glob 模式的 * 部分)。
  2. 第二个元素是与 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,可用于改变通道的创建和行为。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值