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'
我目前正在着手使用 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'