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

Snakemake如何针对上游产生的空输出文件设计下游处理规则

Snakemake处理上游空输出文件的规范方案

下面提供2种适用不同场景的规范处理方案,比当前的|| true临时方案稳定性、可排查性更强:

方案1:上游规则提前拦截无效输出(优先推荐)

问题根源是shovill组装失败后未主动抛出错误,反而生成了无效的空文件和输出目录,导致下游规则被误触发。优先在上游规则处增加输出校验,从源头阻断无效任务向下游传递:

rule shovill:
    input:
        fw="input/{fastq}_R1.fastq.gz",
        rv="input/{fastq}_R2.fastq.gz"
    output:
        directory("results/shovill/{sample}")
    threads: 16
    shell:
        """
        shovill --cpus {threads} --R1 {input.fw} --R2 {input.rv} --outdir {output} 2> {log}
        # 校验组装结果是否有效
        if [ ! -s {output}/contigs.fa ]; then
            echo "Error: Shovill assembly failed, contigs.fa is empty" >&2
            rm -rf {output} # 清理无效输出目录,避免Snakemake判定任务成功
            exit 1
        fi
        """

使用该方案时,搭配Snakemake的--keep-going参数执行工作流,即可实现失败样本停在组装步骤、正常样本继续执行下游任务的效果,不会被个别失败样本打断整个工作流。

方案2:下游规则精准判断输入有效性

如果你确实需要为组装失败的样本生成占位结果、不中断流程,也不要不加区分地用|| true吞掉所有错误,否则prokka本身的参数错误、依赖缺失等问题都会被掩盖,很难排查。可以修改prokka规则,只针对性处理空输入的情况:

rule prokka:
    input:
        "results/shovill/{sample}/contigs.fa"
    output:
        directory("results/prokka/{sample}")
    threads: 8
    params:
        prefix="{sample}",
        gcode=config["genetic_code"],
        outdir="results/prokka/{sample}"
    shell:
        """
        mkdir -p {params.outdir}
        # 仅当输入文件非空时执行prokka
        if [ -s {input} ]; then
            prokka --cpus {threads} --prefix {params.prefix} --gcode {params.gcode} --outdir {params.outdir} --force {input} &> {log}
        else
            # 输入为空时生成跳过标记,不执行注释
            echo "Skipped: input contigs.fa is empty" > {params.outdir}/prokka_skipped.log
        fi
        """

注意:非必要场景不建议保留空输入的占位输出,会增加后续结果统计的过滤成本。

进阶可选方案

如果需要更灵活的分支逻辑,可以将shovill设置为Snakemake的checkpoint,在input函数中动态判断样本组装是否成功,自动跳过失败样本的下游注释任务,不需要手动生成占位目录,更符合工作流输出规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:15:04