Snakemake搭建AMRFinder数据库更新查询流程无检查点文件实现问询
可行实现方案
完全可以不用额外的update_finished.txt检查点文件,以下是两种常用的实现方式:
方案1:直接跟踪AMRFinder实际数据库目录(最推荐)
你可以显式指定AMRFinder的数据库存储路径,将数据库目录直接作为更新规则的输出,不需要额外生成空标记文件,逻辑更直观,也能真实反映数据库文件的状态:
# 统一定义数据库存储路径,方便后续修改 AMRFINDER_DB = "amrfinder_db" rule update_amrfinder: output: # 直接输出数据库目录,无需单独的检查点文件 directory(AMRFINDER_DB) conda: "../envs/amrfinder.yaml" shell: """ # 显式指定数据库下载路径,更新到对应目录 amrfinder -u --database_dir {output} """ rule amrfinder_query: input: fasta="{sample}.fasta", # 直接依赖数据库目录即可 db=AMRFINDER_DB output: "{sample}_amrfinder.tsv" conda: "../envs/amrfinder.yaml" shell: """ # 查询时指定同一个数据库目录 amrfinder -n {input.fasta} --database_dir {input.db} 1> {output} """
该方案优势是如果数据库目录被意外删除或修改,Snakemake会自动触发重新更新,可靠性远高于自定义的txt检查点。
方案2:用临时标记文件自动清理(无残留文件)
如果你不想在工作目录保留任何额外的标记文件,也不想显式管理数据库路径,可以将更新规则的输出设置为临时标记,Snakemake执行完后会自动清理该文件,不会留下冗余文件:
rule update_amrfinder: output: # 标记为临时文件,执行完后自动删除 temp("amrfinder_updated") conda: "../envs/amrfinder.yaml" shell: """ amrfinder -u # 生成临时标记用于任务状态校验 touch {output} """ rule amrfinder_query: input: fasta="{sample}.fasta", db="amrfinder_updated" output: "{sample}_amrfinder.tsv" conda: "../envs/amrfinder.yaml" shell: "amrfinder -n {input.fasta} 1> {output}"
该方案适合不需要复用数据库、每次运行都要更新的场景,缺点是无法感知数据库本身的损坏,只要临时标记曾经生成过,就不会重新执行更新操作。
内容的提问来源于stack exchange,提问作者Peter Pisher
相关产品推荐
相关产品推荐

