You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:44:52