Snakemake中特定于规则的通配符

问题描述

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

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个批次中的每一个提交单独的作业提供一种方法。我无法为每个批次制定单独的规则,因为批次数量会随数据集的大小而变化。如果我可以定义规则本地的通配符,这似乎很有用。是否存在这样的事情,或者有更好的方法解决此问题?

解决方法

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

因此,您想为每个rule blast调用"blast_input_{X}.fasta"吗? 然后,需要将批次通配符转入输出中。

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"