我目前有一个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)。有人有合理解决方案的建议吗?蒂亚!
您可以在输入中使用简单的 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”等...
| 归档时间: |
|
| 查看次数: |
5541 次 |
| 最近记录: |