Snakemake merge_clean_reads规则Wildcards无sample属性报错求助
Snakemake merge_clean_reads规则AttributeError问题解决
运行preprocess_reads.smk时出现以下错误:
InputFunctionException in line 226 of /users/troger50/projects/Rogers_SidersViralAnalysis_XXXX_20XX/preprocess_reads.smk: Error: AttributeError: 'Wildcards' object has no attribute 'sample' Wildcards: organism=0 Traceback: File "/users/troger50/projects/Rogers_SidersViralAnalysis_XXXX_20XX/preprocess_reads.smk", line 228, in <lambda>
问题原因
merge_clean_reads规则的输入lambda函数依赖sample和organism两个通配符,但输出路径仅包含organism。Snakemake无法从输出推断出sample的取值,导致找不到该通配符属性而报错。你的目标是生成跨所有样本的合并文件:merged_0_r1.fq.gz、merged_0_r2.fq.gz、merged_viral_r1.fq.gz、merged_viral_r2.fq.gz,即合并所有样本中同一organism对应的所有fraction文件。
解决方案
1. 修改merge_clean_reads规则
调整输入的lambda函数,直接遍历配置文件中所有样本,收集对应organism的文件,不再依赖sample通配符:
rule merge_clean_reads: input: r1 = lambda wildcards: [ f"data/processed/clean_reads/demultiplexed_{sample}-{wildcards.organism}_{fraction}_r1.fq.gz" for sample, organisms in config["Samples"].items() for fraction in organisms[wildcards.organism] ], r2 = lambda wildcards: [ f"data/processed/clean_reads/demultiplexed_{sample}-{wildcards.organism}_{fraction}_r2.fq.gz" for sample, organisms in config["Samples"].items() for fraction in organisms[wildcards.organism] ] output: r1="data/processed/clean_reads/merged/merged_{organism}_r1.fq.gz", r2="data/processed/clean_reads/merged/merged_{organism}_r2.fq.gz" shell: """ cat {input.r1} > {output.r1} cat {input.r2} > {output.r2} # 修正原代码中误用input.r1的笔误 """
2. 确保最终目标触发合并文件生成
修改rule all_run,明确指定需要生成的4个合并文件,让Snakemake能正确推断任务依赖:
# 先从配置文件中提取所有organism类型 ORGANISMS = list(next(iter(config["Samples"].values())).keys()) rule all_run: input: multiqc = "quality_checks/multiqc/multiqc_report.html", merged_r1 = expand("data/processed/clean_reads/merged/merged_{organism}_r1.fq.gz", organism=ORGANISMS), merged_r2 = expand("data/processed/clean_reads/merged/merged_{organism}_r2.fq.gz", organism=ORGANISMS)
3. 优化multiqc规则(可选)
原multiqc规则的input存在变量名重复问题,用提取的ORGANISMS列表简化:
rule multiqc: input: fastqc= expand( ["quality_checks/fastqc/{organism}_r1_fastqc.html", "quality_checks/fastqc/{organism}_r2_fastqc.html"], organism=ORGANISMS ), output: "quality_checks/multiqc/multiqc_report.html" params: in_put="quality_checks/" shell: """ multiqc -d -dd 1 {params.in_put} -o quality_checks/multiqc/ --export """
说明
- 修改后的merge_clean_reads规则不再依赖
sample通配符,通过遍历配置文件自动收集所有对应organism的输入文件,匹配输出的organism通配符,解决了属性缺失问题。 - 修正了shell命令中的笔误,避免将R1文件错误合并到R2输出中。
内容的提问来源于stack exchange,提问作者TJ Rogers
相关产品推荐
相关产品推荐

