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

Snakemake工作流:部分Wildcard需额外步骤及动态输出处理

解决方案:Snakemake 分种群处理差异化流程步骤

核心思路

通过种群分组定义+规则拆分/条件输出实现:先让所有种群完成基础系谱评估步骤,仅基因组类种群触发后续基因组相关流程,同时避免非基因组种群生成不存在的gen_file,全程避开有bug的dynamic命令。


具体实现步骤

1. 明确种群分组

在Snakefile开头定义两类种群的列表,作为后续规则判断的依据:

# 定义两类种群集合
PEDIGREE_POPS = ["BEL", ...]  # 共8个仅需系谱评估的种群
GENOMIC_POPS = ["CHA", ...]   # 共6个需额外基因组评估的种群
ALL_POPS = PEDIGREE_POPS + GENOMIC_POPS

2. 拆分extract_phenotype_data规则

将原规则拆分为基础版和基因组扩展版,避免强制要求所有种群输出gen_file:

  • 基础规则:为所有种群生成通用的dlistAnim和phen_file
  • 扩展规则:仅为基因组种群生成专属的gen_file
# 基础表型提取:所有种群都执行
rule extract_phenotype_base:
    input:
        "raw_data/{pop}.csv"
    output:
        dlistAnim = "output/{pop}/dlistAnim.txt",
        phen_file = "output/{pop}/phenotypes.csv"
    script:
        "scripts/extract_phenotypes_base.py"

# 基因组基因型提取:仅基因组种群执行
rule extract_genotype:
    input:
        dlistAnim = rules.extract_phenotype_base.output.dlistAnim,
        phen_file = rules.extract_phenotype_base.output.phen_file
    output:
        gen_file = "output/{pop}/genotypes.vcf"
    script:
        "scripts/extract_genotypes.py"

3. 控制流程触发逻辑

通过顶层目标规则指定不同种群的执行路径:

# 系谱评估流程:所有种群必须完成
rule pedigree_analysis:
    input:
        dlistAnim = rules.extract_phenotype_base.output.dlistAnim,
        phen_file = rules.extract_phenotype_base.output.phen_file
    output:
        result = "output/{pop}/pedigree_result.txt"
    script:
        "scripts/pedigree_analysis.py"

# 基因组评估流程:仅基因组种群执行,依赖系谱结果+基因型文件
rule genomic_analysis:
    input:
        pedigree_res = rules.pedigree_analysis.output.result,
        gen_file = rules.extract_genotype.output.gen_file
    output:
        result = "output/{pop}/genomic_result.txt"
    script:
        "scripts/genomic_analysis.py"

# 总目标规则:整合所有需生成的结果
rule all:
    input:
        # 所有种群的系谱评估结果
        expand(rules.pedigree_analysis.output.result, pop=ALL_POPS),
        # 仅基因组种群的基因组评估结果
        expand(rules.genomic_analysis.output.result, pop=GENOMIC_POPS)

4. 脚本适配调整

修改Python脚本逻辑:extract_genotypes.py仅处理基因组种群的输入,确保只有目标种群生成gen_file,避免无效执行。


替代方案:单规则条件输出

如果不想拆分规则,可在原规则中用条件判断控制输出文件列表,适配Snakemake 7.25.0版本:

def get_extract_output(wildcards):
    outputs = ["output/{pop}/dlistAnim.txt", "output/{pop}/phenotypes.csv"]
    if wildcards.pop in GENOMIC_POPS:
        outputs.append("output/{pop}/genotypes.vcf")
    return outputs

rule extract_phenotype_data:
    input:
        "raw_data/{pop}.csv"
    output:
        get_extract_output
    script:
        "scripts/extract_phenotypes.py"

此时脚本内部需同步判断种群类型,仅在基因组种群时生成gen_file。


关键注意事项

  • 确保GENOMIC_POPS是ALL_POPS的子集,避免种群遗漏
  • 脚本需严格匹配种群类型生成文件,防止非基因组种群产生空文件
  • 全程避开dynamic相关命令,规避已知bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:35:28