Snakemake使用checkpoint条件执行规则时报IndexError列表越界问题
问题根因
- multiqc规则的输入通过
expand硬编码了所有初始样本的fastqc预处理结果作为必须输入,导致Snakemake强制为每个样本调度fastqc_pretrim任务,完全不考虑样本是否通过basecall质控生成了有效fastq文件。 - 对于未通过质控的样本,
aggregate_input函数会返回空列表,而fastqc的wrapper会默认尝试提取输入列表的第一个元素作为输入文件,空列表取值直接触发IndexError: list index out of range报错。 - 你日志中提示的
The flag 'directory' used in rule guppy_basecall_persample is only valid for outputs, not inputs.属于额外的配置告警,因为directory()装饰器仅对output字段生效,不能用来修饰input。
修改方案
第一步:修复guppy_basecall_persample规则的输入告警
去掉input字段多余的directory()装饰器:
checkpoint guppy_basecall_persample: input: directory=inputdirectory, samplelist="lists/{sample}.txt", # 其余配置保持不变
第二步:新增动态收集有效fastqc输入的函数
等所有basecall任务执行完成后,仅收集有合格fastq的样本对应的fastqc结果路径:
import os import glob def get_valid_fastqc_zips(wildcards): valid_outputs = [] for sample in SAMPLES: # 获取该样本basecall后的输出目录 bc_output_dir = checkpoints.guppy_basecall_persample.get(sample=sample).output[1] # 检查pass目录下是否有生成的fastq.gz文件 if glob.glob(os.path.join(bc_output_dir, "pass", "*.fastq.gz")): valid_outputs.append(f"qc/fastqc_pretrim/{sample}_fastqc.zip") return valid_outputs
第三步:修改multiqc规则的输入
把原来硬展开所有样本的expand语句替换为上面的动态函数:
rule multiqc: input: get_valid_fastqc_zips output: "qc/multiqc.html" params: "" log: "logs/multiqc.log" wrapper: "0.77.0/bio/multiqc"
修改后逻辑说明
Snakemake会先跑完所有样本的basecall任务,再根据basecall的结果动态判断哪些样本需要执行fastqc预处理,仅合格样本会触发对应任务,不会再为空样本调度fastqc任务,自然不会出现空列表索引报错的问题。
内容的提问来源于stack exchange,提问作者HansVG
相关产品推荐
相关产品推荐

