4

这是蛇制作教程高级部分的一个简短示例:

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 函数从配置文件中推断输入文件,因为很明显我指的是“示例”部分。

其次,是否有解决方法?因为使用旧的 Makefile 非常容易,只需使用旧的 Makefile 并通过键入类似的内容运行相同的 bwa_map 规则

$ make bwa_map INPUT=data/samples/A.fastq

在此先感谢您的帮助。拜诺伊斯特

4

2 回答 2

2

如果您将规则名称指定为目标并且该规则包含通配符,则 Snakemake 无法知道要为通配符使用什么值。在这种情况下,这只能从具体的输出文件中确定。此输出文件可以来自下游规则,例如 Snakefile 顶部的真正“所有”目标,或者直接在命令行中提供它。

但是,如果您在 Snakefile 的顶部有适当的目标规则,则有 --until 标志,它允许您仅在给定规则之前执行工作流。

关于您的 make 示例,我不知道此功能。你能指出我关于这个的文档吗?我也可能会添加类似于 Snakemake 的内容。

另请注意,我只是在 Snakemake 的开发版本中改进了此案例的错误消息。它现在提供更多信息并解释了该问题。

于 2016-11-11T11:04:02.970 回答
0

感谢您的回答。

我无法提供官方文档页面的链接。但是,我说的是一个非常受欢迎的make功能,所以我想你知道它,即使它现在没有响铃。

考虑这个Makefile命名/path/to/workflows/variant_calling.make

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 一周后,你不可能还记得输出文件名。但这并不重要,因为您只需键入即可创建输出文件

$ make -f /path/to/workflows/variant_calling.make mapping FASTQ=bar.fastq

我可以在这个 Makefile 中有许多其他规则,我仍然可以使用上面的命令只运行映射步骤。


我希望能够对 snakemake 做同样的事情,这将导致命令行看起来像这样:

$ snakemake -s `path/to/myworkflow.snakefile` bwa_mem

我说清楚了吗?

你确认现在不可能吗?如果是这样,有没有可能很快在 Snakemake 中拥有此功能?

谢谢。

拜诺伊斯特

于 2016-11-16T10:26:29.953 回答