Snakemake如何基于样本名或运行名定义对应的参考序列参数
Snakemake按样本/批次动态指定参考序列解决方案
步骤1:建立映射字典
首先创建一个字典存储样本或运行批次与参考序列的对应关系,根据你的实际业务需求修改键值对即可:
# 按样本名关联参考的示例 sample_to_ref = { "sampleA": "hg38", "sampleB": "mm10", "sampleC": "tair10" } # 如果是按运行批次统一指定参考,就用批次映射字典 # run_to_ref = { # "run20240501": "hg38", # "run20240502": "mm10" # }
步骤2:修改map_reads规则,动态生成路径
使用Snakemake支持的lambda函数接收通配符参数,动态读取映射字典得到对应参考序列,修改后规则如下:
rule map_reads: input: # 按样本取参考用这个: ref_path=lambda wildcards: f"/xyz/refs/{sample_to_ref[wildcards.samp]}.fasta", # 按批次取参考就换成这个: # ref_path=lambda wildcards: f"/xyz/refs/{run_to_ref[wildcards.run]}.fasta", kr1='process/trim/{run}_{samp}_trim_kr_1.fq.gz', kr2='process/trim/{run}_{samp}_trim_kr_2.fq.gz' output: bam=lambda wildcards: f"process/bams/{wildcards.run}_{wildcards.samp}_{wildcards.mapper}_{sample_to_ref[wildcards.samp]}_rg_sorted.bam" params: mapper='{mapper}' log: lambda wildcards: f"process/bams/{wildcards.run}_{wildcards.samp}_{wildcards.mapper}_{sample_to_ref[wildcards.samp]}_map.log" threads: 8 shell: "/xyz/scripts/map_reads.sh {input.ref_path} {params.mapper} {input.kr1} {input.kr2} {output.bam} &>> {log}"
补充优化建议
- 为避免样本/批次不在映射字典中报错,可以在取值时设置默认参考:
sample_to_ref.get(wildcards.samp, "默认参考名称") - 如果需要在规则中多处使用参考名称,可以将其放在params中统一生成:
后续在shell命令、输出、日志中都可以直接调用params: mapper='{mapper}', ref=lambda wildcards: sample_to_ref[wildcards.samp]{params.ref},不需要重复写lambda逻辑。
内容的提问来源于stack exchange,提问作者ksw
相关产品推荐
相关产品推荐

