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
相关产品推荐
相关产品推荐

