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

Snakemake配置样本组合问题:指定特定样本配对合并

解决Snakemake样本配对合并的非笛卡尔积需求

问题场景

配置文件中样本按分组和SRA编号组织:

samples:
    group1:
        sra1: 
            sample: "SRR14724462"
            cell_line: "NA24385"
            exome_bedfile: "/bedfiles/truseq.sorted.bed"
        sra2: 
            sample: "SRR14724472"
            cell_line: "NA24385"
            exome_bedfile: "/bedfiles/idt.sorted.bed"
    group2:
        sra1: 
            sample: "SRR14724463"
            cell_line: "NA12878"
            exome_bedfile: "/bedfiles/truseq.sorted.bed"
        sra2:
            sample: "SRR14724473"
            cell_line: "NA12878"
            exome_bedfile: "/bedfiles/idt.sorted.bed"

需求是按SRA编号配对合并:

  • group1的sra1 ↔ group2的sra1(SRR14724462 和 SRR14724463)
  • group1的sra2 ↔ group2的sra2(SRR14724472 和 SRR14724473)

但当前rule all使用expand时,默认生成样本列表的笛卡尔积,导致出现不需要的组合。

现有代码问题

当前规则生成了所有样本的笛卡尔积:

rule combine:       
    output:
        r1 = TRIMMED_DIR + "/{sample1}_{sample2}_R1.fastq",
        r2 = TRIMMED_DIR + "/{sample1}_{sample2}_R2.fastq"
    params:
        trimmed_dir = TRIMMED_DIR,
        a = "{sample1}", 
        b = "{sample2}"
    shell: 
        cd {params.trimmed_dir}
        /combine.sh {params.a}_R1_trimmed.fastq {params.a}_R2_trimmed.fastq {params.b}_R1_trimmed.fastq {params.b}_R2_trimmed.fastq

rule all:
     expand(TRIMMED_DIR + "/{sample1}_{sample2}_R1.fastq", sample1=list_a, sample2=list_b),
     expand(TRIMMED_DIR + "/{sample1}_{sample2}_R2.fastq", sample1=list_a, sample2=list_b)

解决方案

方法1:直接指定配对组合

如果配对关系固定,可直接构造配对元组列表,再生成目标文件路径:

# 定义需要的配对
PAIRS = [("SRR14724462", "SRR14724463"), ("SRR14724472", "SRR14724473")]

rule all:
    input:
        [TRIMMED_DIR + f"/{s1}_{s2}_R1.fastq" for s1, s2 in PAIRS],
        [TRIMMED_DIR + f"/{s1}_{s2}_R2.fastq" for s1, s2 in PAIRS]

或者利用expand的zip参数,按列表顺序配对:

rule all:
    input:
        expand(TRIMMED_DIR + "/{sample1}_{sample2}_R1.fastq", zip, sample1=list_a, sample2=list_b),
        expand(TRIMMED_DIR + "/{sample1}_{sample2}_R2.fastq", zip, sample1=list_a, sample2=list_b)

注:zip参数要求sample1和sample2对应的列表长度一致,会按索引一一配对。

方法2:从配置文件动态提取配对(推荐)

如果配置文件结构固定,可通过遍历SRA键动态生成配对,避免硬编码样本ID:

# 从config中自动提取配对
PAIRS = []
for sra_key in config["samples"]["group1"].keys():
    sample1 = config["samples"]["group1"][sra_key]["sample"]
    sample2 = config["samples"]["group2"][sra_key]["sample"]
    PAIRS.append( (sample1, sample2) )

rule all:
    input:
        [TRIMMED_DIR + f"/{s1}_{s2}_R1.fastq" for s1, s2 in PAIRS],
        [TRIMMED_DIR + f"/{s1}_{s2}_R2.fastq" for s1, s2 in PAIRS]

这种方式的优势是:后续新增SRA样本(如sra3)时,无需修改代码,只要配置文件保持对应结构,就能自动生成正确配对。

内容的提问来源于stack exchange,提问作者Hannele Padre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:31:11