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/ff908de630224c1a4118f5dc69c8a761RuleException:
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不会自动检测目录内的文件是否全部生成,导致它认为索引已存在,提前启动定量任务。
修复步骤
建立正确的依赖关联
修改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" ]) # 其余参数和输出保持不变移除冗余的
priority参数(可选)
依赖关系正确建立后,Snakemake会自动按顺序执行任务,priority参数不再需要,可以删除所有规则中的priority配置。验证依赖关系
运行以下命令生成依赖图,确认salmon_quant_reads的所有任务都依赖于salmon_index:snakemake --dag | dot -Tpng > dag.png
额外检查
- 查看
logs/salmon/WT_Veh_11.log的具体内容,确认报错确实是索引文件缺失导致,而非Salmon运行的其他错误。 - 确保
salmon_index规则的multiext路径正确,输出文件会生成在指定目录下。
内容的提问来源于stack exchange,提问作者Juneyoung

