Snakemake中配置与通配符生成指定格式索引文件的问题
问题:Snakemake生成BWA索引时输出文件名不符合预期
背景
我有一批可能用到的FASTA文件,计划通过Snakemake按需生成BWA索引,部分文件可能无需处理。
配置文件(config.yaml)
# config.yaml reference_genome: fa1: "path/to/genome_1.fa" fa2: "path/to/genome_2.fa" fa3: "path/to/genome_3.fa" ...
初始Snakemake脚本
configfile: "config.yaml" rule all: input: expand('{reference_genome}.{type}', reference_genome=['fa1', 'fa2', 'fa3'], type=['amb', 'ann', 'pac']) rule index: input: ref_genome=lambda wildcards:config['reference_genome'][wildcards.reference_genome] output: expand('{reference_genome}.{type}', reference_genome={reference_genome}, type=['amb', 'ann', 'pac']) log: 'log/rule_index_{reference_genome}.log' shell: "bwa index -a bwtsw {input.ref_genome} > {log} 2>&1"
初始运行错误
执行脚本时抛出错误:
name 'reference_genome' is not defined File "/public/...", line ..., in <module>
修改后的脚本(参考@dariober方案)
调整后脚本如下:
configfile: "config.yaml" rule all: input: expand('{reference_genome}.{type}', reference_genome=['fa1', 'fa2', 'fa3'], type=['amb', 'ann', 'pac']) rule index: input: ref_genome=lambda wildcards:config['reference_genome'][wildcards.reference_genome] output: expand('{{reference_genome}}.{type}', type=['amb', 'ann', 'pac']) log: 'log/rule_index_{reference_genome}.log' shell: "bwa index -a bwtsw {input.ref_genome} > {log} 2>&1"
新问题
修改后运行生成的索引文件为fa1.amb、fa1.ann等,但预期应该是对应原始FASTA文件名的genome_1.fa.amb、genome_1.fa.ann格式。
解决方案
问题根源在于rule all使用了配置文件的键名(fa1/fa2/fa3)而非实际FASTA路径,且rule index的输出未关联到原始文件名。以下是修正后的脚本:
修正后的Snakemake脚本
configfile: "config.yaml" # 获取配置文件中所有参考基因组的实际路径 REF_GENOMES = config['reference_genome'].values() rule all: input: # 基于实际FASTA路径生成目标索引文件路径 expand('{ref}.{type}', ref=REF_GENOMES, type=['amb', 'ann', 'pac']) rule index: input: ref_genome='{ref}' output: expand('{ref}.{type}', type=['amb', 'ann', 'pac']) log: # 提取FASTA文件名作为日志标识,避免路径斜杠导致目录出错 'log/rule_index_{wildcards.ref.split("/")[-1]}.log' shell: "bwa index -a bwtsw {input.ref_genome} > {log} 2>&1"
关键说明
- 直接使用配置文件中存储的实际FASTA路径作为wildcard,替代原有的fa1/fa2等别名,确保输出文件名与原始FASTA对应
rule all的输入目标直接基于实际FASTA路径生成,明确告诉Snakemake需要生成的索引文件- 日志文件名处理:通过
wildcards.ref.split("/")[-1]提取FASTA文件名(去掉路径),避免路径中的斜杠导致日志目录结构混乱 - 按需处理:如果只想处理部分基因组,可手动指定目标路径,例如:
# 仅处理fa1和fa3对应的基因组 TARGET_REFS = [config['reference_genome']['fa1'], config['reference_genome']['fa3']] rule all: input: expand('{ref}.{type}', ref=TARGET_REFS, type=['amb', 'ann', 'pac'])
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

