Snakemake: неизвестные файлы вывода / ввода после расщепления по хромосоме

Чтобы ускорить определенный шаг змеиного мастерства, я бы хотел:

  • разделить мой bamfile на хромосому, используя
    bamtools split -in sample.bam --reference
    это приводит к файлам с именем sample.REF_{chromosome}.bam
  • выполнить вариант вызова на каждом в результате, например, sample.REF_{chromosome}.vcf
  • рекомбинировать полученные файлы vcf, используя vcf-concat (VCFtools), используя
    vcf-concat file1.vcf file2.vcf file3.vcf > sample.vcf

Проблема в том, что я априори не знаю, какие хромосомы могут быть в моем файле bam. Поэтому я не могу точно указать вывод bamtools split, Кроме того, я не уверен, как сделать вклад vcf-concat взять все файлы VCF.

Я думал об использовании samples.fofn и сделать что-то вроде

rule split_bam:
    input:
        bam = "alignment/{sample}.bam",
        pattern = "alignment/{sample}.REF_"
    output:
        alignment/anon.splitbams.fofn
    log:
        "logs/bamtools_split/{sample}.log"
    shell:
        "bamtools split -in {input.bam} -reference && \
         ls alignment/{input.pattern}*.bam | sed 's/.bam/.vcf/' > {output}"

И использовать то же самое fofn для объединения полученных файлов VCF. Но это похоже на очень неловкий взлом, и я буду признателен за ваши предложения.


РЕДАКТИРОВАТЬ 20180409

По предложению @jeeyem я попробовал dynamic() функции, но я не могу понять это.

Мой полный файл змеи находится на GitHub, динамическая часть находится в строках 99-133.

Я получаю ошибку: InputFunctionException in line 44 of /home/wdecoster/DR34/SV-nanopore.smk: KeyError: 'anon___snakemake_dynamic' Wildcards: sample=anon___snakemake_dynamic anon анонимный {образец} идентификатора)

Запуск с --debug-dag дает (последние части перед ошибкой): candidate job cat_vcfs wildcards: sample=anon candidate job nanosv wildcards: sample=anon___snakemake_dynamic, chromosome=_ candidate job samtools_index wildcards: aligner=split_ngmlr, sample=anon___snakemake_dynamic.REF__ candidate job split_bam wildcards: sample=anon___snakemake_dynamic, chromosome=_ InputFunctionException in line 44 of /home/wdecoster/DR34/SV-nanopore.smk: KeyError: 'anon___snakemake_dynamic' Wildcards: sample=anon___snakemake_dynamic

Что показывает, что подстановочный знак неверно истолкован?


Ура, Ваутер

1 ответ

Решение

Вы можете искать имена хромосом из заголовка BAM или соответствующего .fai файл для использованной ссылки. Это можно сделать в начале вашего Snakefile. Затем вы можете использовать expand("alignment/{{sample}}.REF_{chromosome}.bam", chromosome=chromosomes) определить выходные файлы этого правила. Не нужно использовать динамический.

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