如何在 nextflow dsl2 的同一模块中重复使用同一进程两次,但以不同的名称保存输出?

问题描述 投票:0回答:2

我正在构建一个 nextflow 工作流程(DSL2),在同一个模块中,我需要重复使用相同的流程两次,但我使用的语法似乎冒犯了 nextflow,因为它抱怨该流程已被使用,并且我需要正确地别名它,问题是我不知道如何。

这是错误

Process 'ReUsable' has been already used -- If you need to reuse the same component, include it with a different name or include it in a different workflow context

这是一个有意义的例子:

process ReUsable {
    publishDir "${params.publish_dir}/VF/SZ/${meta}", mode: 'copy', pattern: '*.out'
    container 'bla.1'
    input:
        tuple val(meta), path(input)
    output:
        tuple val(meta), path('one.out'), emit: out1
    script:
        """
        cat ${input} > one.out
        """
}
process ScndStep {
         publishDir "${params.publish_dir}/VF/${meta}", mode: 'copy', pattern: '*sub.out'
    container 'bla.2'
    input:
        tuple val(meta), path(out1)
    output:
        tuple val(meta), path('two.out'), emit: out2
    script:
        """
        sed -i "s/i/o/g" ${out1} > two.out
        """
}
workflow Unite {
      take:
               input
      main:
               out1 = ReUsable(input)
               out2 = ScndStep(out1)
               out3 = ReUsable(out2)
               .SaveAs{three.out}
      emit:
               out1
               out2
               out3

}

显然这不是正确的方法,当我环顾四周时,建议设置一个新模块,然后每次使用不同的名称两次包含可重用模块。然而,在我看来,事情过于复杂化了。这里的重点是让它变得简单,并在同一工作流程中重用相同的流程,已经不必重写 ReUsable2 流程了。 有任何想法吗? 非常感谢

module process dsl nextflow
2个回答
2
投票

是的 - 最简单的方法是使用

include
关键字。使用
module aliases
可以让您重复使用同名的组件,例如:

main.nf
的内容:

include { ReUsable as ReUsable1 } from './modules/reusable'
include { ReUsable as ReUsable2 } from './modules/reusable'
include { ScndStep } from './modules/secondstep'


workflow Unite {

      take:
      input_ch

      main:
      input_ch | ReUsable1 | ScndStep | ReUsable2

      emit:
      ReUsable1.out
      ScndStep.out
      ReUsable2.out
}

modules/reusable/main.nf
的内容:

process ReUsable {

    input:
    tuple val(meta), path(input)

    output:
    tuple val(meta), path('one.out'), emit: out1

    script:
    """
    cat ${input} > one.out
    """
}

modules/secondstep/main.nf
的内容:

process ScndStep {

    input:
    tuple val(meta), path(out1)

    output:
    tuple val(meta), path('two.out'), emit: out2

    script:
    """
    sed "s/i/o/g" ${out1} > two.out
    """
}

nextflow.config
的内容:

params {

    publish_dir = './results'
}

process {

    withName: ReUsable1 {

        publishDir = [
            path: "${params.publish_dir}/ReUsable1",
            mode: 'copy',
        ]
    }

    withName: ScndStep {

        publishDir = [
            path: "${params.publish_dir}/ScndStep",
            mode: 'copy',
        ]
    }

    withName: ReUsable2 {

        publishDir = [
            path: "${params.publish_dir}/ReUsable2",
            mode: 'copy',
        ]
    }
}

0
投票

在 DSL2 中,您可以通过在另一个进程中使用它来为进程添加别名

worfklow

这是一个可以独立运行的示例:

process reusable {
    publishDir "results/", mode: "copy"
    input:
        tuple val(meta), val(word)
    output:
        tuple val(meta), path("${meta.run}.txt")
    script:
        meta.run += 1
        """
        echo ${word} World > ${meta.run}.txt
        """
}

process intermediate_step {
    input:
        tuple val(meta), path(input)
    output:
        tuple val(meta), val('Going again')
    script:
        """
        """
}

workflow RerunReusable {
    take:
        reusable_out
    main:
        intermediate_step(reusable_out)
        reusable(intermediate_step.out)
    emit:
        final_out = reusable.out
}

workflow {
    main:
        meta = ["run": 0]
        reusable([meta, "Hello"])
        RerunReusable(reusable.out)
}

nextflow run
之后:

❯ for fname in results/*; do echo $fname; cat $fname; done
results/1.txt
Hello World
results/2.txt
Going again World
© www.soinside.com 2019 - 2024. All rights reserved.