Snakemake:名称规则而不是目标文件

时间:2016-11-10 23:08:42

标签: makefile snakemake

以下是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

2 个答案:

答案 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