Лучший способ запустить одно и то же правило дважды с разными параметрами

Я использую bcftools consensus для извлечения гаплотипов из файла vcf. Учитывая входные файлы:

A.sorted.bam
B.sorted.bam

Создаются следующие выходные файлы:

A.hap1.fna
A.hap2.fna
B.hap1.fna
B.hap2.fna

В настоящее время у меня есть два правила для этого. Они отличаются только номерами 1 и 2 в выходных файлах и команде оболочки. Код:

rule consensus1:
    input:
        vcf="variants/phased.vcf.gz",
        tbi="variants/phased.vcf.gz.tbi",
        bam="alignments/{sample}.sorted.bam"
    output:
        "haplotypes/{sample}.hap1.fna"
    params:
        sample="{sample}"
    shell:
        "bcftools consensus -i -s {params.sample} -H 1 -f {reference_file} {input.vcf} > {output}"

rule consensus2:
    input:
        vcf="variants/phased.vcf.gz",
        tbi="variants/phased.vcf.gz.tbi",
        bam="alignments/{sample}.sorted.bam"
    output:
        "haplotypes/{sample}.hap2.fna"
    params:
        sample="{sample}"
    shell:
        "bcftools consensus -i -s {params.sample} -H 2 -f {reference_file} {input.vcf} > {output}"

Хотя этот код работает, кажется, что должен быть лучший, более питонический способ сделать это, используя только одно правило. Можно ли свернуть это в одно правило, или мой текущий метод лучше всего?


person Kelly Sovacool    schedule 02.04.2018    source источник


Ответы (1)


Используйте подстановочные знаки для гаплотипов 1 и 2 в rule all. Подробнее о добавлении целей через rule all см. здесь.

reference_file = "ref.txt"

rule all:
    input:
        expand("haplotypes/{sample}.hap{hap_no}.fna",
                   sample=["A", "B"], hap_no=["1", "2"])

rule consensus1:
    input:
        vcf="variants/phased.vcf.gz",
        tbi="variants/phased.vcf.gz.tbi",
        bam="alignments/{sample}.sorted.bam"
    output:
        "haplotypes/{sample}.hap{hap_no}.fna"
    params:
        sample="{sample}",
        hap_no="{hap_no}"
    shell:
        "bcftools consensus -i -s {params.sample} -H {params.hap_no} \
               -f {reference_file} {input.vcf} > {output}"
person Manavalan Gajapathy    schedule 02.04.2018
comment
Отлично, это именно то, что мне было нужно. Использование подстановочных знаков с целевым правилом очень эффективно. Спасибо вам за помощь! - person Kelly Sovacool; 02.04.2018
comment
Вам даже не нужно переназначать hap_no на param. Подстановочные знаки доступны непосредственно из тела правила, в данном случае как wildcards.hap_no. - person Unknown artist; 17.05.2018
comment
@KirillG Верно. Но у меня есть привычка хранить все параметры, которые я использую, в одном месте для удобства чтения. - person Manavalan Gajapathy; 17.05.2018