思考如何解释一个管道,它可以使用需要(稍微)不同的shell调用的软件版本?
有时,使用康达在不同版本之间切换时,shell调用是不同的,例如Samtools 0.1.18和Samtools 1.3.1。对前缀需要不同的格式设置。
我想了三种方法,并正在寻找更多的建议:
反射:我不相信嵌套条件是最好的方法,因为它使维护变得更加困难,而且它实际上也没有那么优雅。在规则中进行检测并没有那么糟糕,但我不喜欢将控制流推入规则的想法(现在它已经从我的管道规则中删除了)。我想避免制造歧义冲突。
我缺少支持功能吗?起初我以为是这个Snakemake“版本”指令,但实际上不是我想要的。要么就是我错过了如何利用它。
有什么想法?
辅助文件
Samtools 1.3.1
(CentOS5-Compatible) [tboyarski@login3 bin]$ ./samtools sort
Usage: samtools sort [options...] [in.bam]
Options:
-l INT Set compression level, from 0 (uncompressed) to 9 (best)
-m INT Set maximum memory per thread; suffix K/M/G recognized [768M]
-n Sort by read name
-o FILE Write final output to FILE rather than standard output
-T PREFIX Write temporary files to PREFIX.nnnn.bam
-@, --threads INT
Set number of sorting and compression threads [1]
--input-fmt-option OPT[=VAL]
Specify a single input file format option in the form
of OPTION or OPTION=VALUE
-O, --output-fmt FORMAT[,OPT[=VAL]]...
Specify output format (SAM, BAM, CRAM)
--output-fmt-option OPT[=VAL]
Specify a single output file format option in the form
of OPTION or OPTION=VALUE
--reference FILE
Reference sequence FASTA FILE [null]1.3.1 ->配置“samtools”+‘sort -no -m’+ str(config"sortMem") +‘- -T’+ str(log.stdErr)
Samtools 0.1.18
(CentOS5-Compatible) [tboyarski@login3 condaENV]$ samtools sort
Usage: samtools sort [-on] [-m <maxMem>] <in.bam> <out.prefix>0.1.18 ->配置“samtools”+‘sort -no -m’+ str(config"sortMem") +‘-’+ str(log.stdErr)
区别就在str(log.stdErr)之前的'-T‘。
发布于 2017-08-04 09:10:42
我将选择选项2,使用工具版本作为通配符:您将在输出文件路径中使用它,这将增强文档,并且如果您希望获得与不同版本的工具对应的结果,将避免麻烦。
您可以使用通配符函数作为params来确定要传递给shell的部分甚至所有命令。如果没有生成整个命令,还可以使用params中的一个函数来选择正确的工具。
TOOL_VERSIONS = config["tool_versions"]
rule all:
expand("tool_results/{tool_version}/tool_output", tool_version=TOOL_VERSIONS)
rule previous_rule: # I skip this part
def version2tool(wildcards):
if float(wildcards.tool_version) <= 0.1.18:
return "/usr/bin/tool"
else:
return "/usr/local/bin/tool"
def tool_version2options(wildcards):
if float(wildcards.tool_version) <= 0.1.18:
return "-"
else:
return "--T"
rule apply_tool:
input:
rules.previous_rule.output
output:
"tool_results/{tool_version}/tool_output"
params:
tool = version2tool,
tool_options = tool_version2options
shell:
"""
{params.tool} {params.tool_options} {input} > {output}
"""以上假设您的配置文件中有所需的版本:
tool_versions : ["0.1.18", "1.3.1"]https://stackoverflow.com/questions/45473767
复制相似问题