我目前有一个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)。有人有合理解决方案的建议吗?蒂亚!
您可以在输入中使用一个简单的 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”,等等...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)