Snakemake: создать несколько подстановочных знаков для одного и того же аргумента

Я пытаюсь запустить 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}
        """

1 ответ

Вы ставите телегу впереди лошади. Подстановочные знаки необходимы для обобщения правил: вы можете определить шаблон для правила, в котором подстановочные знаки используются для определения общих частей. В вашем примере нет шаблонов: все определяется значением . Это не рекомендуемый способ использования Snakemake; конвейер должен определяться файловой системой: какие файлы присутствуют на вашем диске.

Кстати, ваш код не будет работать, так как должен определять список имен файлов, в то время как в вашем примере вы (неправильно) пытаетесь определить строки типа "-V filename".

Итак, у вас есть вывод: "all_genotyped.vcf". У вас есть вход: ["bob.vcf", "smith.vcf", "kelly.vcf"]. Вам даже не нужно использовать здесь лямбду, так как ввод не зависит ни от какого подстановочного знака. Так что у тебя есть:

      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, если у вас уже определены все зависимости?

Другие вопросы по тегам