snakemake:有没有办法为每个规则指定输出目录?

时间:2016-12-02 21:40:19

标签: snakemake

我使用的脚本都将输出文件放到调用脚本的当前目录中,所以在我的shell脚本管道中我会有cd命令转到特定目录运行命令和输出文件只会保存在相关的目录。我的脚本没有输出目录的参数,大多数都获得从输入中推导出的输出文件名。这对我来说非常好。

现在我一直在遇到这个输出目录问题,因为snakemake似乎将文件输出到Snakefile所在的目录。我可以修改所有脚本以获取输出目录的附加参数,但这对于修改许多脚本来说已经很痛苦了。我想知道是否有任何方法可以指定每个特定规则的输出位置?

4 个答案:

答案 0 :(得分:3)

这是我在我的一个snakefiles中使用的示例规则:

rule link_raw_data:
    output:
        OPJ(data_dir, "{lib}_{rep}.fastq.gz"),
    params:
        directory = data_dir,
        shell_command = lib2data,
    message:
        "Making link to raw data {output}."
    shell:
        """
        (
        cd {params.directory}
        {params.shell_command}
        )
        """

这可能与您的情况略有不同,但希望有些技术可以提供帮助。请特别注意shell部分中的括号以及params部分的用法来定义输出目录。

我不确定我是以最优雅的方式做到这一点,但它确实有效。

data_dir是从配置文件中读取的参数。

lib2data是一个根据某些通配符的值生成命令的函数。我必须确保这些命令当然使用正确的输入文件路径(在这种情况下,输出也与output部分所说的内容一致)。在您的情况下,您可能只需要一个“硬编码”shell命令,可能使用一些规则的输入。

更精简的例子

rule run_script1:
    input:
        path/to/initial/input
    output:
        script1_out/output1
    shell:
        """"
        cd script1_out
        script1 {input}
        """"

rule run_script2:
    input:
        script1/output1
    output:
        script2/output2
    shell:
        """
        cd script2_out
        script2 {input}
        """

从这些示例开始,您可以根据需要在输入或输出中使用通配符的函数。

答案 1 :(得分:2)

一个hack将首先进入输出目录,即“cd $(dirname {output [0]})”。这需要是shell命令中的第一个。

话虽如此,最好将脚本更改为接受输出目录作为参数。

安德烈亚斯

答案 2 :(得分:1)

您可以尝试使用YAML或JSON中的配置文件。然后在扩展或规则的输入/输出中将目录用作参数。

请参阅文档here

答案 3 :(得分:1)

在snakemake文档中:

" snakefile中的所有路径都是相对于执行snakemake的目录进行解释的。可以通过在snakefile中指定workdir来覆盖此行为:"

workdir: "path/to/workdir"

因此,只需将其放在snakefile的开头,所有输入和输出都将相对于此路径进行解释。