【问题标题】:lambda function in snakemake outputsnakemake 输出中的 lambda 函数
【发布时间】:2020-05-20 15:05:48
【问题描述】:

我目前有一个snakemake工作流程,需要使用lambda通配符,设置如下:

蛇文件:

configfile: "config.yaml"
workdir: config["work"]

rule all:
    input:
        expand("logs/bwa/{ref}.log", ref=config["refs"])

rule bwa_index:
    input:
        lambda wildcards: 'data/'+config["refs"][wildcards.ref]+".fna.gz"
    output:
        "logs/bwa/{ref}.log"
    log:
        "logs/bwa/{ref}.log"
    shell:
        "bwa index {input} 2&>1 {log}"

配置文件:

work: /datasets/work/AF_CROWN_RUST_WORK/2020-02-28_GWAS

refs:
    12NC29: GCA_002873275.1_ASM287327v1_genomic
    12SD80: GCA_002873125.1_ASM287312v1_genomic

这行得通,但我不得不使用 hack 来获取 bwa_index 的输出来使用 all 的输入。我的技巧是生成一个日志文件作为bwa_index 的一部分,将日志设置为bwa_index 的输出,然后将all 的输入设置为这些日志文件。正如我所说,它有效,但我不喜欢它。 问题是bwa_index 的真实输出是格式,例如GCA_002873275.1_ASM287327v1_genomic.fna.sa。因此,要指定这些输出文件,我需要使用 lambda 函数作为输出,例如:

rule bwa_index:
    input:
        lambda wildcards: 'data/'+config["refs"][wildcards.ref]+".fna.gz"
    output:
        lambda wildcards: 'data/'+config["refs"][wildcards.ref]+".fna.sa"
    log:
        "logs/bwa/{ref}.log"
    shell:
        "bwa index {input} 2&>1 {log}"

然后使用带有 expand 的 lambda 函数作为 rule all 的输入。但是,snakemake 不接受函数作为输出,所以我完全不知道如何做到这一点(除了我的 hack)。有没有人有一个明智的解决方案的建议?蒂亚!

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    您可以在输入中使用一个简单的 python 函数(作为 lambda 函数),所以我建议您将它用于规则 all

    configfile: "config.yaml"
    workdir: config["work"]
    
    def getTargetFiles():
        targets = list()
        for r in config["refs"]:
            targets.append("data/"+config["refs"][r]+".fna.sa")
    
        return targets
    
    rule all:
        input:
            getTargetFiles()
    
    rule bwa_index:
        input:
            "data/{ref}.fna.gz"
        output:
            "data/{ref}.fna.sa"
        log:
            "logs/bwa/{ref}.log"
        shell:
            "bwa index {input} 2&>1 {log}"
    

    注意,通配符{ref} 是字典的值而不是键,因此您的日志文件最终将命名为“logs/bwa/GCA_002873275.1_ASM287327v1_genomic.log”等...

    【讨论】:

    • 谢谢你,这是一种享受。但是,我意识到我不太了解蛇类如何将通配符映射到值。为什么{ref} 是值而不是bwa_index 中的键?如果需要,您将如何访问密钥?再次感谢您的帮助。
    • @Ensa 通配符基本上是任何东西。 Snakemake 的工作原理是尝试制作您在 rule all 中要求的文件。因此,您必须在此规则中定义具体名称。在规则的其余部分,您可以使用通配符替换任何字符串。我说{ref} 是值,但这只是因为我要求所有规则中的值。 {ref} 是一个可以被任何东西替换的通配符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多