如何使用特定于版本的shell调用编写软件规则? (例如Samtools 1.3.1和0.1.18)

时间:2017-08-03 02:20:26

标签: snakemake

关于如何考虑可以使用需要(略微)不同shell调用的软件版本的管道的想法?

有时,在conda版本之间切换,shell调用是不同的,例如。 Samtools 0.1.18和Samtools 1.3.1。需要不同的前缀格式。

我想到了三种方法,我正在寻找其他建议:

  1. 我将在我的YAML中添加一个配置变量,用它来设置版本号。有一个条件,只包括匹配的版本规则。与我使用软件选择标志here.

  2. 的方式类似
  3. 我将在规则中进行版本检测,并相应地更改shell调用。在上面的例子中,唯一的区别是添加了'-T'参数。这很简单,但我担心最终我会遇到的情况不仅仅是一个额外的争论。

  4. 使用规则名称中的版本编写完全独立的规则,将责任放在用户上以选择正确的版本。这将不可避免地引起歧义冲突,但我可以处理这些。

  5. 反射: 我不相信嵌套条件是最好的方法,因为它使维护更加困难,而且它真的不那么优雅。在规则中进行检测并不是那么糟糕,但我不喜欢将控制流推入规则的想法(现在它已全部从管道规则中删除)。我想避免产生歧义冲突。

    我是否缺少支持功能?起初我以为是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 - &gt; config [“samtools”] +'sort -no -m'+ str(config [“sortMem”])+' - '+ str(log.stdErr)

    区别在于str之前的'-T'(log.stdErr)。

1 个答案:

答案 0 :(得分:1)

我将使用工具版本作为通配符来选择选项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"]