首页 > 解决方案 > 没有明显原因的 Snakemake 中的通配符语法错误

问题描述

我不断收到有关其输出规则中没有相同通配符的规则的错误,并且我无法弄清楚错误的来源可能是什么:

SyntaxError:
Not all output, log and benchmark files of rule bcftools_filter contain the same wildcards. This is crucial though, in order to avoid that two or more jobs write to the same file.

...

rule merge_YRI_GTEx:
    input:
        kg=expand("kg_vcf/1kg_yri_chr{q}.vcf.gz", q=range(1,23)),
        gtex=expand("gtex_vcf/gtex_chr{v}.snps.recode.vcf.gz", v=range(1, 23))
    output:
        "merged/merged_chr{i}.vcf.gz"
    shell:
        "bcftools merge \
            -0 \
            -O z \
            -o {output} \
            {input.kg} \
            {input.gtex}"


rule bcftools_filter:
    input:
        expand("merged/merged_chr{i}.vcf.gz", i=range(1,23))
    output:
        filt="filtered_vcf/merged_filtered_chr{i}.vcf.gz",
        chk=touch(".bcftools_filter.chkpnt")
    threads:
        4
    shell:
        "bcftools filter \
            --include 'AN=1890 && AC > 0' \
            --threads {threads} \
            -O z \
            -o {output.filt} \
            {input}"
...
rule list_merged_filtered_vcfs:
    input:
        ".bcftools_filter.chkpnt"
    output:
        "processed_vcf_list.txt"
    shell:
        "for i in {{1..22}}; do \ "
        "echo \"{config[sprime_dir]}/filtered_vcf/merged_filtered_chr${{i}}.vcf.gz\" >> \
        {output}; done"

它所抱怨的具体线路正是"bcftools filter \让我更加目瞪口呆的线路。我尝试为输入通配符命名,甚至仔细检查调用bcftools_filter'soutput的规则以及产生bcftools_filter's的规则input都无济于事。不知道是什么给了我这个错误。

标签: snakemake

解决方案


我认为错误来自chk=touch(".bcftools_filter.chkpnt")不包含通配符{i}

除此之外,我不确定您的规则是否非常明智。您正在传递到bcftools filter输入文件列表(来自expand(...)),但我认为 bcftools 过滤器不接受多个输入文件。此外,您的规则将使用相同的输入文件列表创建输出文件filtered_vcf/merged_filtered_chr{i}.vcf.gz(每个 i 值一个)。你确定你想要expand("merged/merged_chr{i}.vcf.gz", i=range(1,23))而不是 just "merged/merged_chr{i}.vcf.gz",在上游某处给出 i 的值吗?


推荐阅读