2

我有一个像这样(简化)的 Nextflow 工作流程:

params.filter_pass = true
// ... more stuff

process concatenate_vcf {

cpus 6

input:
file(vcf_files) from source_vcf.collect()
file(tabix_files) from source_vcf_tbi.collect()

output:
file("assembled.vcf.gz") into decompose_ch

script:
"""
echo ${vcf_files} | tr " " "\n" > vcflist

bcftools merge  \
    -l vcflist \
    -m none \
    -f PASS,. \
    --threads ${task.cpus} \
    -O z \
    -o assembled.vcf.gz

rm -f vcflist
"""

}

现在,我只想在调用中的脚本中添加命令的一部分,-f PASS,.前提为真。bcftools mergeparams.filter_pass

换句话说,如果params.filter_pass为真(为清楚起见,删除了其他行),脚本将像这样执行:

bcftools merge  \
    -l vcflist \
    -m none \
    -f PASS,. \
    --threads ${task.cpus} \
    -O z \
    -o assembled.vcf.gz

如果它params.filter_pass是假的:

bcftools merge  \
    -l vcflist \
    -m none \
    --threads ${task.cpus} \
    -O z \
    -o assembled.vcf.gz

我知道我可以使用条件脚本,但这意味着复制整个脚本节只是为了更改一个参数。

Nextflow 是否可以使用此用例?

4

1 回答 1

3

一般模式是在“脚本”块中使用局部变量和三元运算符在为 true时添加-f PASS,.过滤器选项:params.filter_pass

process concatenate_vcf {

    ...

    script:
    def filter_pass = params.filter_pass ? '-f PASS,.' : ''

    """
    echo "${vcf_files.join('\n')}" > vcf.list

    bcftools merge  \\
        -l vcf.list \\
        -m none \\
        ${filter_pass} \\
        --threads ${task.cpus} \\
        -O z \\
        -o assembled.vcf.gz
    """
}

如果愿意,也可以使用 if/else 语句代替三元运算符。

于 2021-07-19T14:56:07.130 回答