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
相关产品推荐
相关产品推荐

