以下是snakemake教程高级部分的简短示例:
rule bwa_map:
input:
"data/genome.fa",
lambda wildcards: config["samples"][wildcards.sample]
output:
"mapped_reads/{sample}.bam"
threads: 8
shell:
"bwa mem -t {threads} {input} | samtools view -Sb - > {output}"
现在让我们说几个月前我写了这条规则,我不记得输出文件名。 我的理解是我不能通过调用规则名来运行snakemake,因为这会导致错误:
$ snakemake bwa_map
InputFunctionException in line 9 of Snakefile:
AttributeError: 'Wildcards' object has no attribute 'sample'
Wildcards:
$
首先,我不明白为什么snakemake不能使用lambda函数从配置文件中推导出输入文件,因为很明显我引用了“samples”部分。
第二,有解决方法吗? 因为使用旧的Makefile非常容易,只需使用旧的Makefile并通过输入类似
的内容来运行相同的bwa_map规则$ make bwa_map INPUT=data/samples/A.fastq
提前感谢您的帮助。 Benoist
答案 0 :(得分:2)
如果将规则名称指定为目标且该规则包含通配符,则Snakemake无法知道要用于通配符的值。在这种情况下,这只能从具体的输出文件中确定。 该输出文件可以来自下游规则,例如, Snakefile顶部的一个真正的'all'目标,或者直接在命令行提供它。
但是,如果您在Snakefile的顶部有一个正确的目标规则,则会有--until标志,它允许您仅在给定规则之前执行工作流。
关于你的make示例,我不知道这个功能。你能指点我的文件吗?我也可以添加类似于Snakemake的东西。
请注意,我刚刚在Snakemake的开发版本中改进了此案例的错误消息。它现在提供更多信息并解释了这个问题。
答案 1 :(得分:0)
感谢您的回答。
我无法提供官方文档页面的链接。但是,我正在谈论一个非常受欢迎的make
功能,所以即使它现在没有响铃,我想你也知道它。
考虑名为Makefile
的{{1}}:
/path/to/workflows/variant_calling.make
显然,在写完这个Makefile一周后,你仍然无法记住输出文件名。 但这并不重要,因为您只需键入
即可创建输出文件FASTQ = foo
GENOME = genome.fa
OUTPUT = some_complicated_output_file_name_$(FASTQ).txt
help:
@echo 'This is a dummy example'
@echo ''
@echo 'Usage: make <command>'
@echo ''
@echo 'Available commands:'
@echo ' help - display this help and exit'
@echo ' mapping - map a fastq file to a reference genome'
mapping: $(OUTPUT)
$(OUTPUT):
bwa mem $(GENOME) $(FASTQ) > $@
我可以在这个Makefile中有很多其他规则,我仍然可以使用上面的命令只运行映射步骤。
我希望能够对snakemake执行完全相同的操作,这会导致命令行看起来像这样:
$ make -f /path/to/workflows/variant_calling.make mapping FASTQ=bar.fastq
我能说清楚吗?
你现在确认这是不可能的吗? 如果是这样,在Snakemake很快就有这个功能吗?
感谢。
Benoist