Snakemake:染色体分裂后的未知output/input个文件
Snakemake: unknown output/input files after splitting by chromosome
为了加快某个 snakemake 步骤,我想:
- 使用
按染色体拆分我的 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 文件。但这感觉像是一个非常尴尬的 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)
来定义该规则的输出文件。无需使用动态。
为了加快某个 snakemake 步骤,我想:
- 使用
按染色体拆分我的 bamfilebamtools 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 文件。但这感觉像是一个非常尴尬的 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)
来定义该规则的输出文件。无需使用动态。