为了加快某个蛇形步骤,我想:
bamtools split -in sample.bam --reference
sample.REF_{chromosome}.bam
sample.REF_{chromosome}.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
这表明通配符被误解了?
干杯, 沃特
答案 0 :(得分:0)
您可以从bam标头中查找染色体名称,或者使用相应的.fai
文件查找所使用的参考文献。这可以在Snakefile的开头完成。然后,您可以使用expand("alignment/{{sample}}.REF_{chromosome}.bam", chromosome=chromosomes)
来定义该规则的输出文件。无需使用动态。