在Snakemake中拆分文件



我有一个简单的问题,但我自己无法解决。

我有一个输入列表(a,b,c(。对于每个输入,我需要提取一些数据(1到23(:

bcftools view -H a.vcf.gz -r 1 > a_chr1.txt
...
bcftools view -H a.vcf.gz -r 23 > a_chr23.txt

我可以在Snakemake规则中使用FOR循环:

IDS=['a','b','c']
chrs=range(1,23)
rule:
input:
expand("{id}.vcf.gz", id=IDS)
output:
expand("{id}_{chr}.txt", chr=chrs, id=IDS)
run:
for i in IDS:
for c in chrs:
shell("bcftools view -H {i}.vcf.gz -r {c} > {i}_chr{c}.txt")

,但FOR循环无法将其并行化。我需要一种合适的Snakemake方式,如下所示,但它不起作用。

IDS=['a','b','c']
chrs=range(1,23)
rule:
input:
expand("{id}.vcf.gz", id=IDS)
output:
expand("{id}_{chr}.txt", chr=chrs, id=IDS)
params:
c=expand("{chr}", chr=chrs)
shell:
"bcftools view -H {input} -r {params.c} > {output}"

你能帮忙吗?

您没有利用这里的snakemake通配符。如果在输入和输出中指定expand,那么snakemake将只运行该规则一次。它告诉snakemake运行规则需要所有vcf文件,并且此规则将生成所有拆分的文件。您需要的是一个可以应用于任何vcf文件的规则,并且只会产生一个拆分(通过chr(的输出。

IDS=['a','b','c']
chrs=range(1,23)
rule all:
input: expand("{id}_{chr}.txt", chr=chrs, id=IDS)
rule splitByChr:
input:
"{id}.vcf.gz"
output:
"{id}_{chr}.txt"
shell:
"bcftools view -H {input} -r {wildcards.chr} > {output}"

这里的rule all将根据需要多次触发rule splitByChr
还要注意,expand函数中的{id}{chr}不是通配符。它们是定义的展开参数的占位符。

相关内容

  • 没有找到相关文章

最新更新