我正在构建一个 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 流程了。 有任何想法吗? 非常感谢
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',
]
}
}
在 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