Snakemake 中特定于规则的通配符

Rule-specific wildcards in Snakemake

我经常发现在向我的工作流程添加规则时,我需要将大型作业拆分成多个批次。这意味着我的 input/output 文件将针对某些规则在临时批处理集之间分支,然后再合并到一个输入文件中以用于稍后的规则。例如:

rule all:
   input:
       expand("final_output/{sample}.counts",sample=config["samples"]) ##this final output relates to blast rule in that it will feature a column defining transcript type

...


rule batch_prep:
    input: "transcriptome.fasta"
    output:expand("blast_input_{X}.fasta",X=[1,2,3,4,5])
    script:"scripts/split_transcriptome.sh"

rule blast:
    input:"blast_input_{X}.fasta",
    output:"output_blast.txt"
    script:"scripts/blastx.sh"


...




rule rsem:
    input:
        "transcriptome.fasta",
        "{sample}.fastq"
    output:
        "final_output/{sample}.counts"
    script:
        "scripts/rsem.sh"

在这个简化的工作流程中,snakemake -n 将为每个样本显示一个单独的 rsem 作业(正如预期的那样,来自规则 all 中设置的通配符)。但是,blast 会给出 WildcardError 说明

Wildcards in input files cannot be determined from output files:
'X'

这是有道理的,但我想不出一种方法让 Snakefile 使用一个 blast 模板规则为上述 5 个批次中的每一个批次提交单独的作业。我无法为每个批次制定单独的规则,因为批次的数量会因数据集的大小而异。如果我可以定义规则的本地通配符,这似乎会很有用。是否存在这样的事情,或者有没有更好的方法来解决这个问题?

希望我对你的问题理解正确,如果不正确,请随时纠正我:

所以,您想为每个 "blast_input_{X}.fasta" 调用 rule blast? 然后,需要将批处理通配符带入输出。

rule blast:
    input:"blast_input_{X}.fasta",
    output:"output_blast_{X}.txt"
    script:"scripts/blastx.sh"

如果您稍后想在另一个规则中再次合并批次,只需在该规则的输入中使用 expand

input: expand("output_blast_{X}.txt", X=your_batches)
output: "merged_blast_output.txt"