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

Snakemake使用expand()时如何定义规则的可选输出文件

Snakemake bowtie2-build可选输出的简便实现方案

以下是三种比当前正则写法更易维护、更精准的实现方式:

  • 方案1:预判断基因组大小,生成精准输出列表(最推荐)

bowtie2的后缀切换逻辑固定:参考基因组总长度大于4GB时生成.bt21后缀索引,否则生成.bt2后缀。你可以在定义规则前先判断参考文件大小,直接生成对应需要的输出后缀列表,完全不需要模糊匹配。

import os
ref_fa = f"reference/{config['reference_genome']}.fa"
# 4GB对应字节数,未压缩fasta的文件大小和总碱基数接近,可直接用于判断
size_threshold = 4 * 1024 ** 3
if os.path.getsize(ref_fa) > size_threshold:
    suffixes = [".1.bt21", ".2.bt21", ".3.bt21", ".4.bt21", ".rev.1.bt21", ".rev.2.bt21"]
else:
    suffixes = [".1.bt2", ".2.bt2", ".3.bt2", ".4.bt2", ".rev.1.bt2", ".rev.2.bt2"]

rule bowtie2_build:
    input:
        ref_fa
    output:
        expand(f"reference/{config['reference_genome']}{{suffix}}", suffix=suffixes)
    params:
        prefix = config["reference_genome"]
    shell:
        "bowtie2-build {input} reference/{params.prefix}"

这种方式的输出完全和实际生成的文件对应,Snakemake不会做多余的文件校验,后续规则调用索引也能精准匹配。

  • 方案2:用标记文件作为核心输出(无需判断文件大小)

如果你不想提前判断基因组大小,可以定义一个运行完成标记文件作为规则的唯一输出,Snakemake只会校验这个标记文件是否存在,不会检查具体的索引文件:

rule bowtie2_build:
    input:
        "reference/"+config["reference_genome"]+".fa"
    output:
        # Snakemake内置touch函数,规则运行成功后自动生成空标记文件
        touch("reference/bowtie2_index_build.done")
    params:
        prefix = config["reference_genome"]
    shell:
        "bowtie2-build {input} reference/{params.prefix}"

后续需要用到bowtie2索引的规则,把这个标记文件作为输入即可,bowtie2比对时会自动识别对应后缀的索引文件,不需要手动指定后缀。

  • 方案3:简化正则匹配

如果你更习惯用正则匹配输出,可以把你当前的正则大幅简化,覆盖两类索引的所有后缀:

output:
    "reference/"+config["reference_genome"]+"{suffix, \.(1|2|3|4|rev\.[12])\.bt2[1]?}"

内容的提问来源于stack exchange,提问作者Egelbets

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:24:06