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规则输出自动匹配机制的歧义导致:
- 上游规则使用
report()封装输出时,返回值是携带报告元数据的特殊对象,而非纯字符串路径。下游硬编码的字符串路径无法自动关联到该输出对象,Snakemake会将其判定为需预先存在的外部文件,不会将上游规则加入DAG依赖链路。 - 下游
expand()中使用的通配符占位符名为小写run,和上游规则定义的大写RUNS通配符名不一致,进一步提升了自动匹配的失败概率。 - 工作流中使用shell的同类规则输出为纯字符串路径,自动匹配逻辑可以正常命中,因此未出现同类错误。
解决方案
- 禁止在下游输入中硬编码上游输出路径,改为显式引用上游规则的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作为参数名。
- 若上述修改后仍存在匹配歧义,可在上游规则同级位置添加显式通配符约束,限定通配符的匹配范围,避免被其他规则的路径匹配拦截:
wildcard_constraints: RUNS = "[A-Za-z0-9_]+"
- 验证方式:修改完成后执行
snakemake --dag | dot -Tpng > dag.png生成DAG图,确认rejected_seq_table的上游依赖包含所有RUNS样本对应的rejected_seq_figures任务,即可证明依赖关系识别正确。
内容的提问来源于stack exchange,提问作者merfre
相关产品推荐
相关产品推荐

