我尝试在能够运行自定义perl脚本的Snakefile中编写规则。有两个输入文件和一个输出文件。 inputfile和outputfile中包含通配符,因为我想为各种文件运行脚本。但是当我为了生成不同的输入和输出文件而扩展时,perl脚本将所有可能的输入文件作为输入,而我希望它们逐个进行。我该怎么做才能让perl'逐个'吃掉'输入文件?这是我的代码:
DOMAINS= ["Metallophos", "PP2C", "Y_phosphatase"]
SUPERGROUPS=["2supergroups","5supergroups"]
rule add_supergroups:
input:
newick=expand("data/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip",domain=DOMAINS, supergroup=SUPERGROUPS),
sup="data/species.v3.1.1.supergroups.txt"
output:
expand("results/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip.supergroups", domain=DOMAINS, supergroup=SUPERGROUPS)
shell:
"perl scripts/change_newick.pl {input.sup} {input.newick} {output}"
答案 0 :(得分:3)
您可以删除expand()函数并使用规则" all"定义你的目标。规则add_supergroups中的通配符值将自动从此目标文件中推断出来。
您甚至可以在规则" add_supergroups"中使用不同的通配符名称。因为Snakemake会认出并匹配这些模式。
DOMAINS= ["Metallophos", "PP2C", "Y_phosphatase"]
SUPERGROUPS=["2supergroups","5supergroups"]
rule all:
input: expand("results/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip.supergroups"
rule add_supergroups:
input:
newick="data/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip",
sup="data/species.v3.1.1.supergroups.txt"
output:
"results/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip.supergroups"
shell:
"perl scripts/change_newick.pl {input.sup} {input.newick} {output}"
理论上,它应该像这样工作:
DOMAINS= ["Metallophos", "PP2C", "Y_phosphatase"]
SUPERGROUPS=["2supergroups","5supergroups"]
rule all:
input: expand("results/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip.supergroups"
rule add_supergroups:
input:
newick="data/{foo}",
sup="data/species.v3.1.1.supergroups.txt"
output:
"results/{foo}.supergroups"
shell:
"perl scripts/change_newick.pl {input.sup} {input.newick} {output}"
答案 1 :(得分:1)
您的规则要运行所有文件的原因很简单:功能 expand()。
就像你似乎知道的那样,expand会创建一个python字符串列表,对于管理Snakemake中的文件非常有用。
但是在您的示例中,规则要在{input.newick}
中使用文件列表和{input.sup}
中的一个文件运行perl脚本以生成列表文件作为输出。
您可以通过不使用expand function on the input and output
轻松解决问题。
但Snakemake将如何认识到他必须制作所有文件?
通过在rule add_supergroups
之前创建规则目标,将rule add_supergroups
扩展为<{1}}。
让我们做一些代码:
DOMAINS= ["Metallophos", "PP2C", "Y_phosphatase"]
SUPERGROUPS=["2supergroups","5supergroups"]
rule target :
input :
expand("results/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip.supergroups",
domain=DOMAINS,
supergroup=SUPERGROUPS)
rule add_supergroups:
input:
newick="data/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip",
sup="data/species.v3.1.1.supergroups.txt"
output:
"results/{domain}/{supergroup}/RAxML_bipartitionsBranchLabels.bbhlist.txt.{domain}.fa.aligned.rp.me-25.id.phylip.supergroups"
shell:
"perl scripts/change_newick.pl {input.sup} {input.newick} {output}"
现在它应该工作了。 Snakemake需要target rule
的文件列表。他搜索所有规则以查找是否可以生成这些文件。
在这种情况下,他会识别pattern filename
output add_supergroups
。所以他会自动完成DOMAINS和SUPERGROUPS的 wilcards 。规则add_supergroups
将逐个运行。