Snakemake 输出中的 lambda 函数

Ens*_*nsa 4 snakemake

我目前有一个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}"
Run Code Online (Sandbox Code Playgroud)

配置文件:

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

refs:
    12NC29: GCA_002873275.1_ASM287327v1_genomic
    12SD80: GCA_002873125.1_ASM287312v1_genomic
Run Code Online (Sandbox Code Playgroud)

这是可行的,但我不得不使用 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}"
Run Code Online (Sandbox Code Playgroud)

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

Eri*_* C. 8

您可以在输入中使用简单的 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}"
Run Code Online (Sandbox Code Playgroud)

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