You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:01:47