2016-11-10 66 views
3

这里是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函数从配置推断输入文件因为它很清楚我指的是“样本”部分。

其次,有没有解决方法呢? 因为它是很容易用好老的Makefile做的只是使用旧的Makefile和您的帮助提前像

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

由于输入一些运行相同bwa_map规则。 Benoist

回答

2

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

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

关于你的例子,我不知道这个功能。你能指点我关于这个的文档吗?我可能会添加类似Snakemake的东西。

另外请注意,我只是改进了错误消息,这种情况在Snakemake的开发版本。它现在更具信息性并解释了这个问题。

+1

我承认Snakemake无法知道,因为你说的那么值使用通配符,但我不明白为什么它必须是这样。我看到它的方式。在配置文件中,我以“A:/path/to/foo.txt,B:/ path/to/bar.txt”的格式定义样本,对于工作流程程序来说应该足以说“好吧,那就是我的输入文件,我应该把输出文件命名为...让我们去吧“。因此,程序有它的输入,输出和指令,所以它可以产生输出文件,而用户不必从头开始知道输出文件名 – blaurent

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) > [email protected] 

显然,写这个Makefile后一周,也没有办法,你还记得输出文件的名称。 但是,这并不重要,因为你可以简单地输入

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

我可以有许多其他的规则在这个Makefile创建输出文件,我仍然可以运行只使用上述命令映射步骤。


我想能够做到准确地与snakemake一样,这将导致命令行可能看起来像这样的:

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

难道我讲得清楚吗?

您确认这不可能吗? 如果是这样,Snakemake很快就有这个功能吗?

谢谢。

Benoist

+0

那么你可以在Snakemake中完全一样。只需在普通Python(在Snakefile的顶部)或配置文件中定义相同的变量,并使用--config或使用环境变量在命令行覆盖它们。这不是在Snakemake中工作的规范方式(也不在Make中)。我想为你指出官方的[Snakemake教程](http://snakemake.bitbucket.org/snakemake-tutorial.html)。 –

+0

对不起,我不清楚。其实我给的例子并不反映我最初的问题。对于Snakemake,我怎么能说“在配置文件的这个特定部分给出的任何文件名应用这个规则”,而不用命名输出文件? – blaurent

+1

一般而言,Snakemake宁可自上而下。你说你想得到什么,并找到一组适用的规则。你想要的内容仍然可以使用内置扩展函数和一些Python逻辑。但是,这不是Snakemake和Make设计的目的。 –