NextFlow-进程(二):输出
1 输出
输出声明块允许定义所使用的过程中发出所产生的结果的通道(Channels)。
最多可以定义一个输出块,并且可以包含一个或多个输出声明。输出块遵循以下语法:
output:
<output qualifier> <output name> [into <target channel>[,channel,..]] [attribute [,..]]
输出定义以输出限定符和输出名称开头,后跟关键字into
和一个或多个通过其发送输出的通道。最后,可以指定一些可选属性。
下表中列出了可以在输出声明块中使用的限定符:
限定符 | 语义 |
---|---|
val | 发送在输出通道上指定名称的变量。 |
file | 发送在输出通道上指定名称的由进程生成的文件。 |
path | 发送在输出通道上指定名称的由进程生成的文件(替换file )。 |
stdout | 通过输出通道发送已执行的进程标准输出。 |
tuple | 可以在同一输出通道上发送多个值。 |
1.1 输出值
val
限定符允许输出一个值在脚本上下文中定义。在常见的使用场景中,这是在输入声明块中定义的值,如以下示例所示:
methods = ['prot','dna', 'rna']
process foo {
input:
val x from methods
output:
val x into receiver
""" echo $x > file """
}
receiver.println { "Received: $it" }
有效的输出值是值文字,输入值标识符,过程范围中可访问的变量和值表达式。例如:
process foo {
input:
file fasta from 'dummy'
output:
val x into var_channel
val 'BB11' into str_channel
val "${fasta.baseName}.out" into exp_channel
script:
x = fasta.name
""" cat $x > file """
}
1.2 输出文件
file
限定符允许输出一个或多个文件,通过所述方法生产的,在指定的信道。例如:
process randomNum {
output:
file 'result.txt' into numbers
''' echo $RANDOM > result.txt '''
}
numbers.subscribe { println "Received: " + it.text }
在上面的示例中,该过程在执行时会创建一个名为的文件,result.txt
其中包含一个随机数。由于在输出之间声明了使用相同名称的文件参数,因此当任务完成时,该文件将通过numbers
通道发送。声明与输入相同的通道的下游进程将能够接收它。
1.3 多个输出文件
当输出文件名包含*
或?
通配符时,它将被解释为全局路径匹配器。这样可以将多个文件捕获到一个列表对象中,并将其作为唯一的输出输出。例如:
process splitLetters {
output:
file 'chunk_*' into letters
''' printf 'Hola' | split -b 1 - chunk_ '''
}
letters
.flatMap()
.subscribe { println "File: ${it.name} => ${it.text}" }
打印:
File: chunk_aa => H
File: chunk_ab => o
File: chunk_ac => l
File: chunk_ad => a
1.4 动态输出文件名
当需要动态表示输出文件名时,可以使用动态评估字符串来定义它,该字符串引用在输入声明块或脚本全局上下文中定义的值。例如:
process align {
input:
val x from species
file seq from sequences
output:
file "${x}.aln" into genomes
""" t_coffee -in $seq > ${x}.aln """
}
在上面的示例中,每次执行该过程时,都会生成一个对齐文件,其名称取决于x
输入的实际值。
1.5 输出路径
path
输出限定符被Nextflow版本19.10.0引入,这是一个简易替换为file
输出限定符,因此它是后向兼容的语法和用于输入语义file
如上所述。
path
相对于file
限定符的主要优点是,它允许指定多个输出来精细控制输出文件。
名称 | 描述 |
---|---|
glob | true 指定的名称被解释为glob模式(默认值:true ) |
hidden | true 隐藏的文件包含在配套的输出文件(默认:false ) |
followLinks | true 目标文件放在任何匹配的符号链接的回报(默认值:true ) |
type | 返回的路径类型 ,或者file ,dir 或者any (默认值:any,或者file如果指定的文件名模式包含** -双星-符号) |
maxDepth | 要访问的最大目录级别数(默认:not limit ) |
1.6 输出“stdout”特殊文件
stdout
限定符允许捕获的标准输出的执行的处理的输出,并发送过来的输出参数声明中指定的信道。例如:
process echoSomething {
output:
stdout channel
"echo Hello world!"
}
channel.subscribe { print "I say.. $it" }
1.7 输出值的“元组”
tuple
限定符允许多个值发送到一个单一的频道。当需要将同一流程的多次执行的结果分组在一起时,此功能很有用,如以下示例所示:
query_ch = Channel.fromPath '*.fa'
species_ch = Channel.from 'human', 'cow', 'horse'
process blast {
input:
val species from query_ch
file query from species_ch
output:
tuple val(species), file('result') into blastOuts
script:
""" blast -db nr -query $query > result """
}
在上面的示例中,对B 和B的每对执行BLAST任务。任务完成后,一个新元组将包含的值,并且文件将被发送到通道。
1.8 可选输出
在大多数情况下,进程将生成添加到输出通道的输出。但是,在某些情况下,对于进程来说,它是有效的。不产生输出。在这些情况下optional true
可以将其添加到Output声明中,该声明告诉Nextflow,如果未创建声明的输出,则不要使进程失败。
output:
file("output.txt") optional true into outChannel
在本例中,通常期望流程生成一个output.txt
文件,但在文件合法丢失的情况下,进程不会失败。outChannel
仅由那些确实生成output.txt