如何用不同参数重复运行同一规则?bcftools单倍型提取场景
优化Snakemake规则提取单倍型
你现在写了两条重复的规则,其实可以用Snakemake的通配符把它们合并成一条更简洁易维护的版本,不用再写几乎一样的重复代码啦!下面是优化后的完整代码:
rule consensus_hap: input: vcf="variants/phased.vcf.gz", tbi="variants/phased.vcf.gz.tbi", bam="alignments/{sample}.sorted.bam", ref="reference.fasta" # 注意:bcftools consensus必须依赖参考序列,这里替换成你的参考文件路径 output: "haplotypes/{sample}.hap{hap}.fna" params: sample="{sample}", haplotype="{hap}" shell: """ bcftools consensus -H {params.haplotype} -s {params.sample} -f {input.ref} {input.vcf} > {output} """ # 可以加一个rule all来明确指定要生成的所有目标文件 rule all: input: expand("haplotypes/{sample}.hap{hap}.fna", sample=["A", "B"], hap=[1, 2])
关键细节说明:
- 用
{sample}和{hap}两个通配符,直接覆盖你需要的样本(A、B)和单倍型(1、2),一条规则就能处理所有组合 - 补上了参考序列作为输入,因为
bcftools consensus必须依赖参考序列才能生成完整的单倍型序列,记得替换成你实际的参考文件路径 rule all里的expand函数会自动生成所有需要的输出文件列表,Snakemake会根据这个列表自动触发对应的任务- 要确保你的VCF文件是**已经定相(phased)**的,否则
-H参数无法正确提取出两个独立的单倍型
这样修改后,后续如果要调整bcftools consensus的参数,只需要在一处修改即可,不用再同步修改两条规则,维护起来方便很多。
内容的提问来源于stack exchange,提问作者Kelly Sovacool
相关产品推荐
相关产品推荐

