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

Snakemake使用expand引用上游规则输出报文件缺失错误

Snakemake上游通配符规则输出无法被下游expand识别问题

问题描述

运行环境为Ubuntu 20.04系统conda环境下的Snakemake 7.8.2,计算集群环境可复现相同错误。故障表现为:带通配符的上游规则输出无法作为下游规则的expand扩展输入,Snakemake构建任务DAG时持续提示输入文件缺失,但对应文件实际可由上游规则正常生成。

涉及核心规则代码:

### Use R to generate figures of each run's sequencing summary
rule rejected_seq_figures:
  input:
    seq_summary = "resources/{RUNS}/guppy_outputs/sequencing_summary.txt",
    rejected_ids = "resources/{RUNS}/raw_reads/unblocked_read_ids.txt"
  output:
    rejected_pie = report("results/rejected/seq_summary/{RUNS}_pie_chart.pdf", caption="report/rejected_pie.rst", category="Rejected Reads Sequence Summary", subcategory="{RUNS}"),
    histo_read_len = report("results/rejected/seq_summary/{RUNS}_histogram.pdf", caption="report/histo_read_len.rst", category="Rejected Reads Sequence Summary", subcategory="{RUNS}"),
    barcode_boxplot = report("results/rejected/seq_summary/{RUNS}_boxplot.pdf", caption="report/barcode_boxplot.rst", category="Rejected Reads Sequence Summary", subcategory="{RUNS}")
  script:
    "scripts/rejected_seq_summary_figures.R"

### Use R to create a summary table of all runs sequencing summaries
rule rejected_seq_table:
  input:
    sum_file_list = "results/rejected/sum_file_list.tsv",
    ids_file_list = "results/rejected/ids_file_list.tsv",
    rejected_pie = expand("results/rejected/seq_summary/{run}_pie_chart.pdf", run=RUNS)
  output:
    report("results/rejected/seq_summary/rejected_seq_summary_table.tsv", caption="report/rejected_seq_summary_table.rst", category="Rejected Reads Sequence Summary", subcategory="All Runs")
  script:
    "scripts/rejected_seq_summary_table.R"

DAG构建阶段抛出的错误信息:

MissingInputException in line 39 of /home/639893/Adaptive_Sequencing_Analysis_Workflow/workflow/rules/rejected_seq_summary.smk:
Missing input files for rule rejected_seq_table:
    output: results/rejected/seq_summary/rejected_seq_summary_table.tsv
    affected files:
        results/rejected/seq_summary/ONT_skin1_adap2_pie_chart.pdf
        results/rejected/seq_summary/ONT_skin1_adap_pie_chart.pdf

已排查内容

  • 通配符匹配结果符合预期,无路径拼写错误
  • 对应R脚本单独测试运行通过,单规则的输入输出配置单独验证可正常运行,仅加入完整工作流后触发错误
  • 已尝试以下方案均未解决问题:
    • 将上游规则的3个输出全部设置为扩展输入
    • 调整下游规则的输入顺序
    • 将扩展输入加入rule all规则做单规则运行测试
    • 用touch生成的临时文本文件替代pdf输出
    • 调整路径长度
    • 更换7个不同版本的Snakemake
    • 仅保留上游规则的单个输出
    • 移除输出配置中的report()封装
  • 工作流其余部分运行正常,另一处逻辑完全相同的expand引用上游通配符输出的实现可正常运行,两处唯一差异为:报错规则调用R脚本执行,正常运行的规则通过shell命令执行。
  • 目标需求为生成对应统计图表并加入Snakemake报告。

根因说明

该问题由Snakemake规则输出自动匹配机制的歧义导致:

  1. 上游规则使用report()封装输出时,返回值是携带报告元数据的特殊对象,而非纯字符串路径。下游硬编码的字符串路径无法自动关联到该输出对象,Snakemake会将其判定为需预先存在的外部文件,不会将上游规则加入DAG依赖链路。
  2. 下游expand()中使用的通配符占位符名为小写run,和上游规则定义的大写RUNS通配符名不一致,进一步提升了自动匹配的失败概率。
  3. 工作流中使用shell的同类规则输出为纯字符串路径,自动匹配逻辑可以正常命中,因此未出现同类错误。

解决方案

  1. 禁止在下游输入中硬编码上游输出路径,改为显式引用上游规则的output对象,强制Snakemake识别依赖关系,同时适配report()封装的特殊返回值。修改rejected_seq_table规则的输入配置如下:
rule rejected_seq_table:
  input:
    sum_file_list = "results/rejected/sum_file_list.tsv",
    ids_file_list = "results/rejected/ids_file_list.tsv",
    rejected_pie = expand(rules.rejected_seq_figures.output.rejected_pie, RUNS=RUNS)
  output:
    report("results/rejected/seq_summary/rejected_seq_summary_table.tsv", caption="report/rejected_seq_summary_table.rst", category="Rejected Reads Sequence Summary", subcategory="All Runs")
  script:
    "scripts/rejected_seq_summary_table.R"

注意:expand中的通配符参数名必须和上游规则定义的通配符名完全一致,上游使用全大写{RUNS},此处传参必须为RUNS=RUNS,不能使用小写run作为参数名。

  1. 若上述修改后仍存在匹配歧义,可在上游规则同级位置添加显式通配符约束,限定通配符的匹配范围,避免被其他规则的路径匹配拦截:
wildcard_constraints:
  RUNS = "[A-Za-z0-9_]+"
  1. 验证方式:修改完成后执行snakemake --dag | dot -Tpng > dag.png生成DAG图,确认rejected_seq_table的上游依赖包含所有RUNS样本对应的rejected_seq_figures任务,即可证明依赖关系识别正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:51:41