Snakemake:染色体分裂后的未知输出/输入文件

时间:2018-03-30 13:02:56

标签: bioinformatics snakemake vpython vcftools

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

  • 使用
    分割每个染色体的bamfile bamtools split -in sample.bam --reference
    这会导致名为sample.REF_{chromosome}.bam
  • 的文件
  • 执行变体调用每个导致例如sample.REF_{chromosome}.vcf
  • 使用
    使用vcf-concat(VCFtools)重新获得所获得的vcf文件 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()函数,但我无法弄明白。

我的完整snakefile位于GitHub,动态部分位于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

这表明通配符被误解了?

干杯, 沃特

1 个答案:

答案 0 :(得分:0)

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