如何分层收集频道?

How to collect channels hierarchically?

如何 运行 一个进程,每个实例对应两个列表中的每对值,然后一次只收集其中一个列表中这些实例的输出?

例如,如果您 运行 这个 Nextflow 脚本:

numbers = Channel
    .from(1..2)
    .into{numbers1; numbers2}

letters = Channel
    .from('A'..'B')

process p1 {
    input:
    each number from numbers1
    each letter from letters

    output:
    path "${number}${letter}.txt" into foo

    """
    echo "$number $letter" > ${number}${letter}.txt
    """
}

process p2 {
    input:
    path numberletters from foo.collect()
    each number from numbers2

    """
    for file in $numberletters; do
        cat $file >> $baseDir/${number}.out
    done
    """
}

你得到两个输出文件(如预期的那样):1.out2.out。其中每一个都包含相同的一组行:

1 A
1 B
2 A
2 B

如何才能让1.out只包含1 A1 B,而2.out只包含2 A2 B? 即,.collect()ing foo 通道仅根据其 letter 输入收集 p1 输出,并保留具有不同的单独实例number 输入?

一个解决方案是让您的第一个进程输出一个包含 'number' 作为第一个元素的元组,然后调用 groupTuple() 将共享相同键的文件组合在一起:

numbers = Channel.of(1..2)
letters = Channel.of('A'..'B')


process p1 {

    input:
    tuple val(number), val(letter) from numbers.combine(letters)

    output:
    tuple val(number), path("${number}${letter}.txt") into foo

    """
    echo "${number} ${letter}" > "${number}${letter}.txt"
    """
}

process p2 {

    publishDir baseDir, mode: 'copy'

    input:
    tuple val(number), path(numberletters) from foo.groupTuple()

    output:
    path "${number}.out"

    """
    cat $numberletters > "${number}.out"
    """
}

如果您知道每个组中预期有多少元素,则可以设置 'size' 属性以允许 groupTuple 运算符尽快流式传输收集的值。