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

Snakemake规则执行顺序异常:salmon_quant_reads提前运行报错

问题

使用Snakemake进行RNA-seq分析时,设置salmon_quant_reads为最后执行规则,但它提前运行,因salmon_index未完成报错。报错信息如下:

Error in rule salmon_quant_reads:
jobid: 173
output: salmon/WT_Veh_11/quant.sf, salmon/WT_Veh_11/lib_format_counts.json
log: logs/salmon/WT_Veh_11.log (check log file(s) for error message)
conda-env: /home/baelab2/LEEJUNEYOUNG/7.Colesevelam/RNA-seq/.snakemake/conda/ff908de630224c1a4118f5dc69c8a761

RuleException:
CalledProcessError in line 111 of /home/baelab2/LEEJUNEYOUNG/7.Colesevelam/RNA-seq/Snakefile_2:
Command 'source /home/baelab2/miniconda3/bin/activate '/home/baelab2/LEEJUNEYOUNG/7.Colesevelam/RNA-seq/.snakemake/conda/ff908de630224c1a4118f5dc69c8a761'; set -euo pipefail; /home/baelab2/miniconda3/envs/snakemake/bin/python3.10 /home/baelab2/LEEJUNEYOUNG/7.Colesevelam/RNA-seq/.snakemake/scripts/tmpr6r8ryk9.wrapper.py' returned non-zero exit status 1.
File "/home/baelab2/LEEJUNEYOUNG/7.Colesevelam/RNA-seq/Snakefile_2", line 111, in __rule_salmon_quant_reads
File "/home/baelab2/miniconda3/envs/snakemake/lib/python3.10/concurrent/futures/thread.py", line 58, in run

对应的Snakefile内容:

SAMPLES = ["KO_Col_5", "KO_Col_6", "KO_Col_7", "KO_Col_8", "KO_Col_9", "KO_Col_10", "KO_Col_11", "KO_Col_15", "KO_Veh_3", "KO_Veh_4", "KO_Veh_5", "KO_Veh_9", "KO_Veh_11", "KO_Veh_13", "KO_Veh_14", "WT_Col_1", "WT_Col_2", "WT_Col_3", "WT_Col_6", "WT_Col_8", "WT_Col_10", "WT_Col_12", "WT_Veh_1", "WT_Veh_2", "WT_Veh_4", "WT_Veh_7", "WT_Veh_8", "WT_Veh_11", "WT_Veh_14"]

rule all:
    input:
        expand("raw/{sample}_1.fastq.gz", sample=SAMPLES),
        expand("raw/{sample}_2.fastq.gz", sample=SAMPLES),
        expand("qc/fastqc/{sample}_1.before.trim_fastqc.zip", sample=SAMPLES),
        expand("qc/fastqc/{sample}_2.before.trim_fastqc.zip", sample=SAMPLES),
        expand("trimmed/{sample}_1.fastq.gz", sample=SAMPLES),
        expand("trimmed/{sample}_2.fastq.gz", sample=SAMPLES),
        expand("qc/fastqc/{sample}_1.after.trim_fastqc.zip", sample=SAMPLES),
        expand("qc/fastqc/{sample}_2.after.trim_fastqc.zip", sample=SAMPLES),
        expand("salmon/{sample}/quant.sf", sample=SAMPLES),
        expand("salmon/{sample}/lib_format_counts.json", sample=SAMPLES)

rule fastqc_before_trim_1:
    input:
        "raw/{sample}.fastq.gz",
    output:
        html="qc/fastqc/{sample}.before.trim.html",
        zip="qc/fastqc/{sample}.before.trim_fastqc.zip",
    log:
        "logs/fastqc/{sample}.before.log"
    threads: 10    
    priority: 1
    wrapper:
        "v1.7.0/bio/fastqc"

rule cutadapt:
    input:
        r1 = "raw/{sample}_1.fastq.gz",
        r2 = "raw/{sample}_2.fastq.gz"
    output:
        fastq1="trimmed/{sample}_1.fastq.gz",
        fastq2="trimmed/{sample}_2.fastq.gz",
        qc="trimmed/{sample}.qc.txt"
    params:
        adapters = "-a AGATCGGAAGAGCACACGTCTGAACTCCAGTCA -A AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT",
        extra = "--minimum-length 1 -q 20"    
    log:
        "logs/cutadapt/{sample}.log"
    threads: 10    
    priority: 2
    wrapper:
        "v1.7.0/bio/cutadapt/pe"

rule fastqc_after_trim_2:
    input:
        "trimmed/{sample}.fastq.gz"
    output:
        html="qc/fastqc/{sample}.after.trim.html",
        zip="qc/fastqc/{sample}.after.trim_fastqc.zip"
    log:
        "logs/fastqc/{sample}.after.log"
    threads: 10
    priority: 3
    wrapper:
        "v1.7.0/bio/fastqc"

rule salmon_index:
    input:
        sequences="raw/Mus_musculus.GRCm39.cdna.all.fasta"
    output:
        multiext(
            "salmon/transcriptome_index/",
            "complete_ref_lens.bin",
            "ctable.bin",
            "ctg_offsets.bin",
            "duplicate_clusters.tsv",
            "info.json",
            "mphf.bin",
            "pos.bin",
            "pre_indexing.log",
            "rank.bin",
            "refAccumLengths.bin",
            "ref_indexing.log",
            "reflengths.bin",
            "refseq.bin",
            "seq.bin",
            "versionInfo.json",
        ),
    log:
        "logs/salmon/transcriptome_index.log",
    threads: 10
    priority: 10
    params:
        # optional parameters
        extra="",
    wrapper:
        "v1.7.0/bio/salmon/index"

rule salmon_quant_reads:
    input:
        # If you have multiple fastq files for a single sample (e.g. technical replicates)
        # use a list for r1 and r2.
        r1 = "trimmed/{sample}_1.fastq.gz",
        r2 = "trimmed/{sample}_2.fastq.gz",
        index = "salmon/transcriptome_index"
    output:
        quant = "salmon/{sample}/quant.sf",
        lib = "salmon/{sample}/lib_format_counts.json"
    log:
        "logs/salmon/{sample}.log"
    params:
        # optional parameters
        libtype ="A",
        extra="--validateMappings"
    threads: 10
    priority: 20
    wrapper:
        "v1.7.0/bio/salmon/quant"
解决方案

问题根源

Snakemake的规则执行顺序由输入输出文件的依赖关联决定,而非priority参数。priority仅用于并行任务的调度优先级调整,无法强制控制依赖顺序。当前salmon_quant_reads仅依赖目录salmon/transcriptome_index,但Snakemake不会自动检测目录内的文件是否全部生成,导致它认为索引已存在,提前启动定量任务。

修复步骤

  1. 建立正确的依赖关联
    修改salmon_quant_reads的输入,直接关联salmon_index生成的所有输出文件,确保Snakemake等待索引完全生成后再执行定量任务:

    rule salmon_quant_reads:
        input:
            r1 = "trimmed/{sample}_1.fastq.gz",
            r2 = "trimmed/{sample}_2.fastq.gz",
            # 直接引用salmon_index的输出,建立强依赖
            index = rules.salmon_index.output
        # 其余参数和输出保持不变
    

    或者手动指定索引文件列表:

    rule salmon_quant_reads:
        input:
            r1 = "trimmed/{sample}_1.fastq.gz",
            r2 = "trimmed/{sample}_2.fastq.gz",
            index = expand("salmon/transcriptome_index/{ext}", ext=[
                "complete_ref_lens.bin", "ctable.bin", "ctg_offsets.bin",
                "duplicate_clusters.tsv", "info.json", "mphf.bin", "pos.bin",
                "pre_indexing.log", "rank.bin", "refAccumLengths.bin",
                "ref_indexing.log", "reflengths.bin", "refseq.bin", "seq.bin",
                "versionInfo.json"
            ])
        # 其余参数和输出保持不变
    
  2. 移除冗余的priority参数(可选)
    依赖关系正确建立后,Snakemake会自动按顺序执行任务,priority参数不再需要,可以删除所有规则中的priority配置。

  3. 验证依赖关系
    运行以下命令生成依赖图,确认salmon_quant_reads的所有任务都依赖于salmon_index:

    snakemake --dag | dot -Tpng > dag.png
    

额外检查

  • 查看logs/salmon/WT_Veh_11.log的具体内容,确认报错确实是索引文件缺失导致,而非Salmon运行的其他错误。
  • 确保salmon_index规则的multiext路径正确,输出文件会生成在指定目录下。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:01:08