【发布时间】:2019-06-04 02:35:06
【问题描述】:
基本上,我想知道在snakemake 中推荐的处理等效文件扩展名的方法是什么。例如,假设我有一个规则来计算 fasta 文件中的条目数。该规则可能看起来像....
rule count_entries:
input:
["{some}.fasta"]
output:
["{some}.entry_count"]
shell:
'grep -c ">" {input[0]} > {output[0]}'
这很好用。但是如果我希望这条规则也允许“{some}.fa”作为输入呢?
有什么干净的方法可以做到这一点吗?
编辑:
这是我对第一个建议解决方案的最佳猜测。这可能可以转换为更高阶的函数以更通用,但这是我理解的基本思想。我认为这个想法并不真正适合任何一般用例,因为它在“构建 DAG”阶段不与其他规则合作。
import os
def handle_ext(wcs):
base = wcs["base"]
for file_ext in [".fasta", ".fa"]:
if(os.path.exists(base + file_ext)):
return [base + file_ext]
rule count_entries:
input:
handle_ext
output:
["{base}.entry_count"]
shell:
'grep -c ">" {input[0]} > {output[0]}'
EDIT2:这是我认为目前最好的解决方案...
count_entries_cmd = 'grep -c ">" {input} > {output}'
count_entries_output = "{some}.entry_count"
rule count_entries_fasta:
input:
"{some}.fasta"
output:
count_entries_output
shell:
count_entries_cmd
rule count_entries_fa:
input:
"{some}.fa"
output:
count_entries_output
shell:
count_entries_cmd
【问题讨论】:
-
只使用 python 函数可能是最好的解决方案。我不相信snakemake对此有任何内置解决方案。
-
使用function as input files查看此内容。
-
查看我在 OP 中的编辑以获取适合此用例的示例。它仍然看起来很丑陋和尴尬。此外,它并不能很好地与其他规则一起使用,或者根本不能真正使用,因为它只知道文件存在后 .fasta 是否是正确的输入。