nextflow:根据参数更改脚本的一部分

nextflow: change part of the script basing on a parameter

我有一个类似这样的 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
"""

}

现在,我想在 bcftools merge 调用的脚本中添加命令的 -f PASS,. 部分 只有 如果 params.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

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

Nextflow 可以使用这个用例吗?

一般模式是在 'script' 块中使用局部变量,并在 params.filter_pass 为真时使用 ternary operator 添加 -f 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 语句代替三元运算符。