如何为具有特定版本 shell 调用的软件编写规则? (例如 Samtools 1.3.1 和 0.1.18)
How to write rules for software with version specific shell calls? (E.g. Samtools 1.3.1 and 0.1.18)
关于如何考虑可以使用需要(稍微)不同 shell 调用的软件版本的管道的想法?
有时,在 conda 版本之间切换时, shell 调用是不同的,例如Samtools 0.1.18 和 Samtools 1.3.1。前缀需要不同的格式。
我想到了三种方法,正在寻找更多建议:
我将在我的 YAML 中添加一个配置变量,用它来设置版本号。有一个条件,只包含匹配的版本规则。类似于我使用软件选择标志 here.
的方式
我将在规则内进行版本检测,并相应地更改 shell 调用。在上面的示例中,唯一的区别是添加了“-T”参数。这很简单,但我担心最终我会遇到这样一种情况,它不仅仅是一个额外的论点。
编写完全独立的规则,在规则名称中包含版本,让用户有责任选择正确的版本。这将不可避免地引起歧义冲突,但我可以处理这些。
反思:
我不相信嵌套条件是最好的方法,因为它使维护更加困难,而且它真的不是那么优雅。在规则中进行检测并没有那么糟糕,但我不喜欢将控制流推入规则的想法(现在它已全部从我的管道规则中删除)。我想避免产生歧义冲突。
我缺少支持功能吗?一开始我以为是这个Snakemake's 'Version' directive,其实不是我想要的。要么,要么我不知道如何使用它。
想法?
支持文档
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 ---> config["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 --> config["samtools"] + 'sort -no -m' + str(config["sortMem"]) + '-' + str(log.stdErr)
区别在于 str(log.stdErr) 之前的“-T”。
我会选择选项 2,使用工具版本作为通配符:您将在输出文件路径中拥有它,这加强了文档,并且如果您希望得到与不同版本对应的结果将避免麻烦你的工具。
您可以使用通配符的功能如params
来确定部分甚至全部命令传递给shell
。如果您不生成整个命令,您也可以使用 params
中的函数来 select 正确的工具。
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"]
关于如何考虑可以使用需要(稍微)不同 shell 调用的软件版本的管道的想法?
有时,在 conda 版本之间切换时, shell 调用是不同的,例如Samtools 0.1.18 和 Samtools 1.3.1。前缀需要不同的格式。
我想到了三种方法,正在寻找更多建议:
我将在我的 YAML 中添加一个配置变量,用它来设置版本号。有一个条件,只包含匹配的版本规则。类似于我使用软件选择标志 here.
的方式我将在规则内进行版本检测,并相应地更改 shell 调用。在上面的示例中,唯一的区别是添加了“-T”参数。这很简单,但我担心最终我会遇到这样一种情况,它不仅仅是一个额外的论点。
编写完全独立的规则,在规则名称中包含版本,让用户有责任选择正确的版本。这将不可避免地引起歧义冲突,但我可以处理这些。
反思: 我不相信嵌套条件是最好的方法,因为它使维护更加困难,而且它真的不是那么优雅。在规则中进行检测并没有那么糟糕,但我不喜欢将控制流推入规则的想法(现在它已全部从我的管道规则中删除)。我想避免产生歧义冲突。
我缺少支持功能吗?一开始我以为是这个Snakemake's 'Version' directive,其实不是我想要的。要么,要么我不知道如何使用它。
想法?
支持文档
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 ---> config["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 --> config["samtools"] + 'sort -no -m' + str(config["sortMem"]) + '-' + str(log.stdErr)
区别在于 str(log.stdErr) 之前的“-T”。
我会选择选项 2,使用工具版本作为通配符:您将在输出文件路径中拥有它,这加强了文档,并且如果您希望得到与不同版本对应的结果将避免麻烦你的工具。
您可以使用通配符的功能如params
来确定部分甚至全部命令传递给shell
。如果您不生成整个命令,您也可以使用 params
中的函数来 select 正确的工具。
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"]