首页 > 解决方案 > 使用snakemake将文件复制到多个目录,其中通配符用于目标名称的一部分

问题描述

我正在尝试使用 snakemake 将文件复制到多个目录,并且我需要能够使用通配符作为目标名称的一部分。以前我尝试过在 Snakefile 中指定“dirs”(这是一个示例,实际应用程序有 15 个目录)。

dirs=['k_1','k2_10']
rule all:
        input:
                expand("{f}/practice_phased_reversed.vcf",f=dirs)
rule r1:
        input:
                "practice_phased_reversed.vcf"
        output:
                "{f}/{input}"
        shell:
               "cp {input} {output}"

这会根据需要复制文件。但是文件名必须在规则 all 中给出。如何更改此设置,以便可以在命令行上使用通配符作为名称的一部分指定目标?

然后我尝试了这个(如下),使用命令“snakemake practice_phased_reversed.vcf”,但它给出了一个错误:“MissingRuleException:没有规则产生 practice_phased_reversed.vcf”

dirs=['k_1','k2_10']
rule all:
        input:
                expand("{f}/{{base}}_phased_reversed.vcf",f=dirs)
rule r1:
        input:
                "{base}_phased_reversed.vcf"
        output:
                "{f}/{input}"
        shell:
               "cp {input} {output}"

有没有办法解决这个问题,所以我可以使用命令行和通配符。谢谢你的帮助。

标签: snakemake

解决方案


我建议进行一些更改。您的第二个蛇文件将无法全部解析规则,因为它仍然包含通配符base。您需要在配置文件中或通过命令行提供。

但是,如果你只是想通过命令行来表达目标,你不需要担心所有的规则。在规则 r1 中,您可能想要扩展输出;我认为引用不起作用input,我很惊讶这不是一个错误......

所以:

rule r1:
        input:
                "{base}_phased_reversed.vcf"
        output:
                "{f}/{base}_phased_reversed.vcf"
        shell:
               "cp {input} {output}"

snakemake ./test_phased_reversed.vcf仍然会是一个错误,因为它试图将一个文件作为同一规则的输入和输出。我同意这个错误信息不是很丰富,因为输入文件确实存在。也许在引擎盖下,由于匹配的输入/输出,snakemake 将规则 r1 排除在考虑之外? snakemake test/test_phased_reversed.vcf在子目录中给出一个副本。

希望这很清楚。我不太明白你想要完成的事情!


推荐阅读