【问题标题】:Snakemake: name rule instead of target fileSnakemake:命名规则而不是目标文件
【发布时间】:2016-11-16 18:26:29
【问题描述】:

这是一个来自蛇形教程高级部分的简短示例:

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

提前感谢您的帮助。 拜诺主义者

【问题讨论】:

    标签: makefile snakemake


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我承认 Snakemake 无法知道用于通配符的值,因为您这么说,但我不明白为什么它必须这样。我的看法。正如在配置文件中我以A: /path/to/foo.txt, B: /path/to/bar.txt 格式定义样本一样,工作流程序说“好的,这是我的输入文件,我应该将输出文件命名为......让我们开始吧”就足够了。因此,该程序有其输入、输出和指令,因此它可以生成输出文件,而用户不必从一开始就知道输出文件名
    【解决方案2】:

    感谢您的回答。

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

    考虑这个名为/path/to/workflows/variant_calling.makeMakefile

    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 中拥有此功能?

    谢谢。

    拜诺主义者

    【讨论】:

    • 嗯,你可以在 Snakemake 中做同样的事情。只需在纯 Python(在 Snakefile 的顶部)或配置文件中定义相同的变量,然后在命令行使用 --config 或使用环境变量覆盖它们。这不是在 Snakemake 中工作的规范方式(而且它也不是在 Make 中)。为此,我想将您指向官方Snakemake tutorial
    • 对不起,我不清楚。实际上我给出的例子并没有反映我最初的问题。我如何对 Snakemake 说“将此规则应用于配置文件的此特定部分中给出的任何文件名”,而不命名输出文件?
    • 一般而言,Snakemake 会自上而下地工作。你说你想得到什么,它会找到一组规则来应用。使用内置的 expand 函数和一些 python 逻辑仍然可以实现您想要的。然而,这并不是 Snakemake 和 Make 的设计目的。
    • 请看教程。如果您不指定文件而是指定文件,那么您的模式非常好。该配置文件中的样本或数据集名称,并使用它们来确定目标。
    猜你喜欢
    • 2021-12-10
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多