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

Snakemake如何将列表首个BAM样本标识作为通配符传入规则

Snakemake 按家系动态传入首个先证者样本ID实现方案

该需求完全可以实现,不需要额外扩展通配符,直接利用Snakemake参数支持基于通配符动态赋值的特性即可,核心操作如下:

  • 保留原有的家系-BAM路径映射字典d,不需要修改结构
  • 在SelectVariants规则的params块中新增proband参数,通过匿名函数匹配当前运行的家系通配符,直接取对应家系BAM列表的第一个元素,解析出样本ID
  • Shell块中直接引用解析好的{params.proband}即可,不需要硬编码固定样本名

修改后的可运行核心代码如下:

d = {"FAM_194": ["path/to/NUM_194/NUM_194.bam", "path/to/NUM_195/NUM_195.bam", "path/to/NUM_196/NUM_196.bam"],
     "FAM_123": ["path/to/NUM_123/NUM_123.bam", "path/to/NUM_126/NUM_126.bam", "path/to/NUM_127/NUM_127.bam"]}
     
FAMILIES = list(d)

rule all:
    input:
        expand("{fam}/{fam}.proband.vcf", fam=FAMILIES),
        expand("{fam}/{fam}.p.avinput", fam=FAMILIES)
        
wildcard_constraints:
    # 此处原代码写的是family,和规则里的fam通配符不匹配,已统一修正避免报错
    fam = "|".join(FAMILIES)

# 其余中间规则保持原有逻辑不变

rule SelectVariants:
    input:
        invcf="{fam}/{fam}.vcf"
    params:
        ref="myref.fasta",
        # 取当前家系BAM列表第一个路径,拆分路径提取样本ID
        proband=lambda wildcards: d[wildcards.fam][0].split("/")[-1].replace(".bam", "")
    output:
        out="{fam}/{fam}.proband.vcf",
        out2="{fam}/{fam}.p.avinput"
    shell:
        """
        gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn {params.proband} -O {output.out}
        convert2annovar -format vcf4 --includeinfo {output.out} > {output.out2}
        """

补充说明:如果你的BAM路径命名规则后续调整,只需要修改lambda函数里的路径解析逻辑即可,d[wildcards.fam][0]是固定取家系对应BAM列表首位元素的核心逻辑,不需要改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:39:22