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

