在Snakemake中处理等效文件扩展名

时间:2019-05-30 01:33:48

标签: python shell snakemake

从本质上讲,我想知道在蛇形设计中处理等效文件扩展名的推荐方法。例如,假设我有一个规则来计算fasta文件中的条目数。该规则可能类似于...。

rule count_entries:
    input:
        ["{some}.fasta"]
    output:
        ["{some}.entry_count"]
    shell:
        'grep -c ">" {input[0]} > {output[0]}'

这很好。但是,如果我希望该规则也允许“ {some} .fa”作为输入?

有什么干净的方法吗?

编辑:

这是我对第一个建议的解决方案的最佳猜测。可以将其转换成更高阶的函数以达到更通用的目的,但这是我所理解的基本思想。我不认为此想法真的适合任何一般用例,因为它在“构建DAG”阶段不与其他规则配合使用。

import os

def handle_ext(wcs):
    base = wcs["base"]
    for file_ext in [".fasta", ".fa"]:
        if(os.path.exists(base + file_ext)):
            return [base + file_ext]

rule count_entries:
    input:
        handle_ext
    output:
        ["{base}.entry_count"]
    shell:
        'grep -c ">" {input[0]} > {output[0]}'

2 个答案:

答案 0 :(得分:1)

我注意到的一件事是,您正在尝试在输入和输出部分中都指定文件列表,但实际上您的规则仅使用一个文件并生成另一个文件。 我为您提出了一个简单的解决方案,为不同的扩展名指定两个单独的规则:

rule count_entries_fasta:
    input:
        "{some}.fasta"
    output:
        "{some}.entry_count"
    shell:
        'grep -c ">" {input} > {output}'

rule count_entries_fa:
    input:
        "{some}.fa"
    output:
        "{some}.entry_count"
    shell:
        'grep -c ">" {input} > {output}'

除非您将具有相同{some}名称和不同扩展名的文件保存在同一文件夹中(希望您不要这样做),否则这些规则并不明确。

答案 1 :(得分:0)

一种可能的解决方案是仅允许原始规则将.fasta个文件作为输入,但允许将.fa个文件重命名为该文件。例如,

rule fa_to_fasta:
    input:
        "{some}.fa"
    output:
        temp("{some}.fasta")
    shell:
        """
        cp {input} {output}
        """

很明显,这样做的缺点是需要临时复制文件。另外,如果同时提供了foo.fafoo.fasta(不是通过复制),则foo.fasta会默默地遮盖foo.fa,即使它们不同。