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"
我经常发现在向我的工作流程添加规则时,我需要将大型作业拆分成多个批次。这意味着我的 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"