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

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中统一生成:
    params:
      mapper='{mapper}',
      ref=lambda wildcards: sample_to_ref[wildcards.samp]
    
    后续在shell命令、输出、日志中都可以直接调用{params.ref},不需要重复写lambda逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:09