我经常在向工作流程添加规则时发现需要将大型作业拆分为多个批次。这意味着我的输入/输出文件将在一些规则的临时批处理集中分支出来,然后再合并到一个输入文件中以供以后的规则使用。例如:
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
每个样本显示一个单独的作业(如预期的那样,来自rule中设置的通配符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"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句