使用Snakemake通配器重命名测序文件时trim任务无法按样本拆分问题
问题原因
你在trim规则的输入输出中直接使用expand将所有样本的路径全部展开,相当于告诉Snakemake「这个规则需要一次性处理所有样本、生成所有修剪后的文件」,所以只会生成1个trim任务。
修改方案
你需要用通配符匹配单个样本的公共前缀(即你config里的stemName),再通过lambda函数根据通配符动态拉取对应样本的输入路径,这样Snakemake就会自动为每个样本生成独立的trim任务。
修改后的完整Snakefile
configfile: "refs/config.json" # 直接取所有样本的公共前缀列表 sample_stems = config["allSamples"] rule all: input: # 一次性展开所有需要生成的修剪后文件路径 expand("trimmedReads/{stem}_R{read}_trim.fastq.gz", stem=sample_stems, read=[1,2]) rule trim: input: R1 = lambda wildcards: f"rawReads/{config[wildcards.stem]['sampleName1']}", R2 = lambda wildcards: f"rawReads/{config[wildcards.stem]['sampleName2']}" output: trim1 = "trimmedReads/{stem}_R1_trim.fastq.gz", trim2 = "trimmedReads/{stem}_R2_trim.fastq.gz" shell: """ bbduk.sh in1={input.R1} in2={input.R2} out1={output.trim1} out2={output.trim2} ref=ref/adapters.fa ktrim=r k=23 mink=11 hdist=1 tpe tbo """
改动说明
- 去掉了提前提取所有样本文件名、短名的冗余代码,直接通过通配符
{stem}匹配每个样本的公共前缀 trim规则的输入用lambda函数根据当前任务的通配符stem动态读取对应样本的原始文件路径,不会一次性加载所有样本- 调整后dry run会生成114个独立的trim任务,正好对应你的114个样本,每个任务单独处理一对R1/R2文件
内容的提问来源于stack exchange,提问作者Kenn
相关产品推荐
相关产品推荐

