0

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

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

如何在蛇形制作中做到这一点?这是我的代码,但我不知道如何为 -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}
        """
4

1 回答 1

2

你是本末倒置。规则泛化需要通配符:您可以为使用通配符定义通用部分的规则定义模式。在您的示例中,没有模式:一切都由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列表气味的使用。或者:如果您已经定义了所有依赖项,您真的需要 Snakemake 吗?

于 2021-12-30T07:23:04.510 回答