我是新手Nexflow用户。我正在努力熟悉 Nexflow 中的输入/输出插孔。我知道 Nextflow 有 DAG 可视化,这是绘制流的有向图的有用功能。
我想为上层流水线写一个Nextflow文件。特别是,我希望进程 A 的输出可以以特定方式被加载到进程 B 和 C 上。输出名称在输出流程图中显示(当使用标签
-with-dag
运行时)。
如果有人帮助我,我将不胜感激。谢谢。
补充
这是我的剧本。以我的水平,我只能使用
path
作为我的输出。由于文件的路径,这导致我的脚本更加冗长。最重要的是,当使用绘制图表功能时,输出并不像我最初的流程图那样清晰。
#!/usr/bin/env nextflow
params.input_text = "abc"
process A{
input:
val text
output:
path A_folder
"""
mkdir A_folder
string=$text
for element in \$(seq 0 \$((\${#string}-1)))
do
echo \${string:\$element:1} > A_folder/\$element.txt
done
"""
}
process B{
input:
path A_folder
output:
path B_folder
"""
mkdir B_folder
echo \$(cat $A_folder/0.txt)\$(cat $A_folder/1.txt) > B_folder/glue1.txt
"""
}
process C{
input:
path A_folder
output:
path C_folder
"""
mkdir C_folder
echo \$(cat $A_folder/2.txt | sed 's/c/3/g') > C_folder/tras.txt
"""
}
process D{
input:
path B_folder
path C_folder
output:
path D_folder
"""
mkdir D_folder
echo \$(cat $C_folder/tras.txt)\$(cat $B_folder/glue1.txt) > D_folder/glue2.txt
"""
}
workflow{
process_A = A(params.input_text)
process_B = B(process_A)
process_C = C(process_A)
process_D = D(process_B, process_C)
}
总而言之,我的问题是“编写代码并运行脚本后(
nextflow run script.nf -with-dag flow.png
)。如何获得尽可能类似于第一个图表的流程图?”
从 22.04.0 版本开始,Nextflow 可以使用 Mermaid 渲染器进行 DAG 可视化。您需要做的就是将输出文件扩展名更改为
mmd
,例如:
nextflow run main.nf -with-dag flow.mmd
我们可以通过使用 native-execution 来简化工作流程,并接近期望的结果:
params.input_text = "abc"
process process_A {
input:
val text
output:
val a, emit: foo
val b, emit: bar
val c, emit: baz
exec:
(a, b, c) = text.collect()
}
process process_B {
input:
val x
val y
output:
val z
exec:
z = x + y
}
process process_C {
input:
val a
output:
val b
exec:
b = a.replaceAll('c', '3')
}
process process_D {
input:
val one
val two
output:
val three
exec:
three = two + one
}
workflow {
entry_input = Channel.of( params.input_text )
(output_1, output_2, output_3) = process_A(entry_input)
(output_4) = process_B( output_1, output_2 )
(output_5) = process_C( output_3 )
(final_output) = process_D( output_4, output_5 )
final_output.view()
}
结果:
$ nextflow run main.nf -with-dag flow.mmd
N E X T F L O W ~ version 23.04.1
Launching `main.nf` [distraught_lorenz] DSL2 - revision: a1f4411ded
executor > local (4)
[a7/e97d7c] process > process_A (1) [100%] 1 of 1 ✔
[53/317d41] process > process_B (1) [100%] 1 of 1 ✔
[b2/88be6d] process > process_C (1) [100%] 1 of 1 ✔
[39/38f318] process > process_D (1) [100%] 1 of 1 ✔
3ab
$ cat flow.mmd
flowchart TD
p0((Channel.of))
p1[process_A]
p2[process_B]
p3[process_C]
p4[process_D]
p5([view])
p6(( ))
p0 -->|entry_input| p1
p1 -->|output_1| p2
p1 -->|output_2| p2
p1 -->|output_3| p3
p2 -->|output_4| p4
p3 -->|output_5| p4
p4 -->|final_output| p5
p5 --> p6
然后我们可以使用 Mermaid Live Editor 和“默认”主题制作图像:
额外的想法:
在工作流块中的通道声明周围使用括号似乎可以防止它使用过程块中定义的输出通道名称。在旧的 DSL 下,process_D (
val three
) 的输出只是 val three into three
的简写。在 DSL2 下,输出通道似乎仍然以相同的方式命名,但当然我们不再需要 into
关键字。