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 语句代替三元运算符。
我有一个类似这样的 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 语句代替三元运算符。