snakemake输出中的lambda函数

问题描述 投票:0回答:1

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

Snakefile:

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

这有效,但是我不得不使用技巧来使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}"

,然后将具有扩展功能的lambda函数用作rule all的输入。但是,snakemake将不接受函数作为输出,因此我完全不知道如何执行此操作(除了我的hack之外)。有没有人提出明智的解决方案的建议? TIA!

snakemake
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.