使用Snakemake 7.32.4运行process_radtags遇输出文件缺失错误求排查
Snakemake脚本输出文件缺失问题排查与修正
你的脚本存在几个关键问题,导致Snakemake无法正确追踪输出文件:
问题分析
- 输入文件匹配错误:规则
demultiplex的输入用expand直接生成了所有runpool和pool的组合文件,这会导致每个{runpool}对应的规则尝试处理所有池的fastq,而不是当前runpool下的文件,进而导致输出文件生成路径或内容不符合预期。 - 输出语法错误:输出部分的缩进混乱,
directory定义后后续输出没有正确缩进,属于语法错误,Snakemake无法正确解析输出列表。 - 日志重复定义:同时在
output和log字段中定义了日志文件,会导致Snakemake重复校验该文件,且process_radtags的重定向已经会生成日志,无需在output中额外声明。 - 通配符关联错误:
glob_wildcards获取的RUNPOOLS和POOLS是一一对应的,但原脚本的expand会生成全量组合,破坏了这种对应关系。
修正后的脚本
# 正确获取每个runpool对应的pool,确保一一对应 RUNPOOLS, POOLS = glob_wildcards('/mnt/lz01/mel/cld1061/AScott_Data/raw_data/{runpool}/{pool}_R1_001.fastq.gz') # 创建runpool到pool的映射,确保每个runpool只处理自己的pool runpool_to_pool = dict(zip(RUNPOOLS, POOLS)) rule all: input: expand('02demulti_output/{runpool}/{runpool}.1.fq.gz', runpool=RUNPOOLS), expand('02demulti_output/{runpool}/{runpool}.2.fq.gz', runpool=RUNPOOLS), expand('10-logs/process_radtags/{runpool}.log', runpool=RUNPOOLS) ### demultiplexing rule demultiplex: input: fastq_r1='/mnt/lz01/mel/cld1061/AScott_Data/raw_data/{runpool}/{pool}_R1_001.fastq.gz', fastq_r2='/mnt/lz01/mel/cld1061/AScott_Data/raw_data/{runpool}/{pool}_R2_001.fastq.gz', # 使用映射获取当前runpool对应的pool pool=lambda wildcards: runpool_to_pool[wildcards.runpool] output: directory('02demulti_output/{runpool}'), '02demulti_output/{runpool}/{runpool}.1.fq.gz', '02demulti_output/{runpool}/{runpool}.2.fq.gz' log: '10-logs/process_radtags/{runpool}.log' shell: '''mkdir -p {output[0]} module load anaconda/colsa conda activate stacks-2.5 process_radtags -P -i gzfastq -1 {input.fastq_r1} -2 {input.fastq_r2} -o {output[0]} -b ../01-info_files/barcodes.txt -r -D --index_null --disable_rad_check --retain_header --barcode_dist_1 1 2> {log}'''
关键修正点说明
- 输入匹配:去掉
expand,改用通配符{runpool}和{pool},通过lambda函数从映射中获取当前runpool对应的pool,确保每个规则实例只处理对应runpool下的fastq文件。 - 输出语法:统一输出列表的缩进,确保所有输出项都在
output字段的列表中,directory用于声明输出目录,Snakemake会自动检查目录是否存在且包含预期文件。 - 日志处理:仅保留
log字段定义日志文件,shell命令中通过2> {log}将错误输出重定向到日志,符合Snakemake的日志追踪逻辑。 - 映射关联:创建
runpool_to_pool字典,确保每个runpool对应正确的pool,避免全量组合的错误。
内容的提问来源于stack exchange,提问作者cdietz97
相关产品推荐
相关产品推荐

