1

我有一个进程生成我感兴趣的两个文件,hitsort.cls 和 contigs.fasta。我使用publishdir输出这些:

process RUN_RE {
    publishDir "$baseDir/RE_output", mode: 'copy'
  
    input:
    file 'interleaved.fq'

    output:
    file "${params.RE_run}/seqclust/clustering/hitsort.cls"
    file "${params.RE_run}/contigs.fasta"

    script:
    """
    some_code

    """

  }

现在,我需要这两个文件作为另一个进程的输入,但我不知道该怎么做。

我试过用

NEXT_PROCESS(params.hitsort, params.contigs)

同时将输入指定为:

process NEXT_PROCESS {
  
    input:
    path hitsort
    path contigs

但它不起作用,因为只使用基本名称而不是完整路径。基本上我想要的是等待 RUN_RE 完成,然后将它输出的两个文件用于下一个过程。

4

1 回答 1

4

最好避免访问publishDir中的文件,因为:

文件以异步方式复制到指定目录中,因此在流程执行结束时它们可能不会立即在已发布目录中可用。由于这个原因,一个进程发布的文件不能被其他下游进程访问。

因此,建议确保您的进程仅访问工作目录(即./work)中的文件。这意味着:最好避免在输入和输出声明中使用绝对路径之类的东西。这也将有助于确保您的工作流程是可移植的。

nextflow.enable.dsl=2

params.interleaved_fq = './path/to/interleaved.fq'
params.publish_dir = './results'
process RUN_RE {

    publishDir "${params.publish_dir}/RE_output", mode: 'copy'

    input:
    path interleaved

    output:
    path "./seqclust/clustering/hitsort.cls", emit: hitsort_cls
    path "./contigs.fasta", emit: contigs_fasta

    """
    # do something with ${interleaved}...
    ls -l "${interleaved}"

    # create some outputs...
    mkdir -p ./seqclust/clustering
    touch ./seqclust/clustering/hitsort.cls
    touch ./contigs.fasta
    """
}
process NEXT_PROCESS {

    input:
    path hitsort
    path contigs

    """
    ls -l
    """
}
workflow {

    interleaved_fq = file( params.interleaved_fq )

    NEXT_PROCESS( RUN_RE( interleaved_fq ) )
}

上面的工作流块实际上与:

workflow {

    interleaved_fq = file( params.interleaved_fq )

    RUN_RE( interleaved_fq )

    NEXT_PROCESS( RUN_RE.out.hitsort_cls, RUN_RE.out.contigs_fasta )
}
于 2021-07-09T15:04:24.070 回答