Snakemake:染色体分裂后的未知output/input个文件

Snakemake: unknown output/input files after splitting by chromosome

为了加快某个 snakemake 步骤,我想:

问题是我事先不知道我的 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 文件。但这感觉像是一个非常尴尬的 hack,非常感谢你的建议。


编辑 20180409

正如@jeeyem 所建议的,我尝试了 dynamic() 函数,但我无法弄清楚。

我完整的 snakefile 在 GitHub, the dynamic part is at lines 99-133.

我得到的错误是: InputFunctionException in line 44 of /home/wdecoster/DR34/SV-nanopore.smk: KeyError: 'anon___snakemake_dynamic' Wildcards: sample=anon___snakemake_dynamic (使用 anon 一个匿名的 {sample} 标识符)

运行 --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

哪个表明通配符被误解了?


干杯, 沃特

您可以从 bam header 或相应的 .fai 文件中查找染色体名称以供参考。这可以在 Snakefile 的开头完成。然后,您可以使用 expand("alignment/{{sample}}.REF_{chromosome}.bam", chromosome=chromosomes) 来定义该规则的输出文件。无需使用动态。