在 Nextflow 中使用输入/输出插孔进行操作

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

我是新手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
。如何获得尽可能类似于第一个图表的流程图?

input output pipeline nextflow
1个回答
0
投票

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
关键字。

© www.soinside.com 2019 - 2024. All rights reserved.