在 Nextflow DSL2 中将通道转换为字符串

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

我想知道如何在工作流程块内提取 Nextflow Channel 的内容并将其设为字符串。

我需要这个来:

  • 使用 Groovy 映射定义开关系统,其中映射键是根据进程的输出选择的
  • 使用 watchPath 方法来观察前一个进程的输出路径
  • 需要字符串但字符串的值是动态且不固定的任何其他情况

我已经尝试过 .toString()、.map{}、.view() 以及我在文档中可以找到的所有内容

groovy bioinformatics nextflow
2个回答
1
投票

我想知道如何提取 Nextflow Channel 的内容并 使其成为字符串

最好避免尝试这样做。如果您只想根据流程的输出选择映射键,则只需在工作流块中声明映射并根据需要使用它即可。例如:

process test {

    input:
    val myval

    output:
    path "${myval}.txt"

    """
    touch "${myval}.txt"
    """
}

workflow {

    def foobarbaz = ['foo': 1, 'bar': 2, 'baz': 3]

    Channel.of('foo', 'bar', 'baz')
        | test
        | map { tuple( foobarbaz[ it.baseName ], it ) }
        | view()
}

结果:

$ nextflow run main.nf 
N E X T F L O W  ~  version 22.10.0
Launching `main.nf` [high_faggin] DSL2 - revision: 43aaa56eee
executor >  local (3)
[0e/0fd6dc] process > test (3) [100%] 3 of 3 ✔
[1, /path/to/work/a7/d501cb2a8426c5639117d14e8fb7fe/foo.txt]
[2, /path/to/work/22/df9cc4f1d34b9cca0d0331fac5c150/bar.txt]
[3, /path/to/work/0e/0fd6dc0519a34c52903b990755f450/baz.txt]

请注意,您不需要 watchPath 工厂方法来监视先前进程的输出路径。只需在 output 块中定义前一个流程的输出,并在下游流程的 input 块中将它们声明为 inputs 即可。例如:

process foo {

    input:
    val myval

    output:
    path "${myval}.txt"

    """
    echo "value: ${myval}" > "${myval}.txt"
    """
}

process bar {

    input:
    path myfile

    output:
    stdout

    """
    echo "Contents of ${myfile}:" 
    cat "${myfile}"
    """
}

workflow {

    Channel.of('foo', 'bar', 'baz')
        | foo 
        | bar
        | view()
}

结果:

$ nextflow run main.nf 
N E X T F L O W  ~  version 22.10.0
Launching `main.nf` [clever_lovelace] DSL2 - revision: c388bd26af
executor >  local (6)
[ac/1be228] process > foo (2) [100%] 3 of 3 ✔
[11/7b3c6e] process > bar (1) [100%] 3 of 3 ✔
Contents of foo.txt:
value: foo

Contents of bar.txt:
value: bar

Contents of baz.txt:
value: baz


0
投票

我正在研究从通道获取值,并在尝试打印标准输出通道时得到

DataFlowVariable(null)
,尽管当我使用
view
时我可以看到该值。然后我查看了 DataFlowVariable 的 api 文档,并意识到
then
函数可以等待在异步通道中设置值。

我没有在 Nextflow 文档中看到这一点,因此这可能不是最佳实践,但在某些情况下可能很有用。

process output_json {
    output:
    stdout

    script:
    """
    echo '{"a": true}'
    """
}

workflow {
    json = output_json | collect
    json.then { print json.val[0] }
}
© www.soinside.com 2019 - 2024. All rights reserved.