Snakemake:为同一个参数创建多个通配符

Snakemake: create multiple wildcards for the same argument

我正在尝试 运行 一个 GenotypeGVCFs 许多 vcf 文件。命令行希望每个 vcf 文件都列为:

java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs \
-R my.fasta \
-V bob.vcf \
-V smith.vcf \
-V kelly.vcf \
-o {output.out}

如何在 snakemake 中执行此操作?这是我的代码,但我不知道如何为 -V 创建通配符。

workdir: "/path/to/workdir/"

SAMPLES=["bob","smith","kelly]
print (SAMPLES)

rule all:
    input:
      "all_genotyped.vcf"

rule genotype_GVCFs:
    input:
        lambda w: "-V" + expand("{sample}.vcf", sample=SAMPLES)
    params:
        ref="my.fasta"
    output:
        out="all_genotyped.vcf"
    shell:
        """
        java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs -R {params.ref} {input} -o {output.out}
        """

你本末倒置。规则泛化需要通配符:您可以为规则定义一个模式,其中通配符用于定义通用部分。在您的示例中没有模式:一切都由 SAMPLES 的值定义。这不是使用 Snakemake 的推荐方式;管道应由文件系统定义:磁盘上存在哪些文件。

顺便说一句,您的代码将不起作用,因为 input 应定义文件名列表,而在您的示例中,您(错误地)试图定义 "-V filename" 之类的字符串。

所以,你有输出:"all_genotyped.vcf"。您有输入:["bob.vcf", "smith.vcf", "kelly.vcf"]。您甚至不需要在这里使用 lambda,因为输入不依赖于任何通配符。所以,你有:

rule genotype_GVCFs:
    input:
        expand("{sample}.vcf", sample=SAMPLES)
    output:
        "all_genotyped.vcf"
    ...

实际上您甚至不需要 input 部分。如果您确定 SAMPLES 列表中的文件存在,您可以跳过它。

-V 的值可以在参数中定义:

rule genotype_GVCFs:
    #input:
    #    expand("{sample}.vcf", sample=SAMPLES)
    output:
        "all_genotyped.vcf"
    params:
        ref = "my.fasta",
        vcf = expand("-V {sample}", sample=SAMPLES)
    shell:
        """
        java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs -R {params.ref} {params.vcf} -o {output}
        """

这应该可以解决您的问题,但我建议您重新考虑您的解决方案。使用SAMPLE list smells。或者:如果你已经定义了所有依赖项,你真的需要 Snakemake 吗?