Nextflow:缺少进程预期的输出文件

Nextflow: Missing output file(s) expected by process

我目前正在着手使用 Nextflow 开发生物信息学管道。下面,我创建了一个包含我的 FASTQ 文件的 params.files 变量,然后将其输入到 fasta_files 通道。 进程 trimming 及其脚本将此通道作为输入,然后理想情况下,我会将所有 $sample".trimmed.fq.gz 输出到输出通道 trimmed_channel。但是,当我 运行 这个脚本时,我得到以下错误:

Missing output file(s) `trimmed_files` expected by process `trimming` (1)

我正在尝试 运行 的 nextflow 脚本是:

#! /usr/bin/env nextflow

params.files = files("$baseDir/FASTQ/*.fastq.gz")
println "fastq files for trimming:$params.files"
 
fasta_files = Channel.fromPath(params.files)
println "files in the fasta channel: $fasta_files"

process trimming {

input: 
file fasta_file from fasta_files

output: 
path trimmed_files into trimmed_channel

// the shell script to be run: 
"""
#!/usr/bin/env bash
mkdir trimming_report
cd /home/usr/Nextflow

#Finding and renaming my FASTQ files
for file in FASTQ/*.fastq.gz; do
    [ -f "$file" ] || continue 
    name=$(echo "$file" | awk -F'[/]' '{ print $2 }') #renaming fastq files. 
    sample=$(echo "$name" | awk -F'[.]' '{ print $1 }') #renaming fastq files.
    echo "Found" "$name" "from:" "$sample"
    if [ ! -e FASTQ/"$sample"_trimmed.fq.gz ]; then
        trim_galore -j 8 "$file" -o FASTQ #trim the files
        mv "$file"_trimming_report.txt trimming_report #moves to the directory trimming report 
    else
      echo ""$sample".trimmed.fq.gz exists skipping trim galore"
    fi
done

trimmed_files="FASTQ/*_trimmed.fq.gz"
echo $trimmed_files
"""
}

进程中的script工作正常。但是,我想知道我是否误解或遗漏了一些明显的东西。如果我忘记包含某些内容,请告诉我,我们将不胜感激!

Nextflow 不会将变量 trimmed_files 导出到它自己的范围,除非您使用 env output qualifier 告诉它这样做,但是这样做不是很惯用。

因为您知道输出文件的模式 ("FASTQ/*_trimmed.fq.gz"),只需将该模式作为输出传递即可:

path "FASTQ/*_trimmed.fq.gz" into trimmed_channel

有些你做过但可能想避免的事情:

  • 在 NF 进程中更改目录,不要这样做,它完全破坏了 nextflow /work 文件夹设置的整个概念。
  • 在 NF 进程中编写一个 bash 循环,如果您正确设置了通道,则每个衍生进程应该只有 1 个任务。

Pallie has already provided some sound advice and, of course, the right answer, which is: environment variables must be declared using the env qualifier.

但是,鉴于您的脚本定义,我认为对于如何最好地跳过先前生成的结果的执行可能存在一些误解。 cache 指令默认启用,当使用 -resume 选项启动管道时,额外尝试使用同一组输入执行进程,将导致进程执行被跳过并产生存储的数据作为实际结果。

为了方便起见,此示例使用 Nextflow DSL 2,但并非严格要求:

nextflow.enable.dsl=2

params.fastq_files = "${baseDir}/FASTQ/*.fastq.gz"
params.publish_dir = "./results"


process trim_galore {

    tag { "${sample}:${fastq_file}" }

    publishDir "${params.publish_dir}/TrimGalore", saveAs: { fn ->
        fn.endsWith('.txt') ? "trimming_reports/${fn}" : fn
    }

    cpus 8

    input:
    tuple val(sample), path(fastq_file)

    output:
    tuple val(sample), path('*_trimmed.fq.gz'), emit: trimmed_fastq_files
    path "${fastq_file}_trimming_report.txt", emit: trimming_report

    """
    trim_galore \
        -j ${task.cpus} \
        "${fastq_file}"
    """
}

workflow {

    Channel.fromPath( params.fastq_files )
        | map { tuple( it.getSimpleName(), it ) }
        | set { sample_fastq_files }

    results = trim_galore( sample_fastq_files )

    results.trimmed_fastq_files.view()
}

运行 使用:

nextflow run script.nf \
    -ansi-log false \
    --fastq_files '/home/usr/Nextflow/FASTQ/*.fastq.gz'