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