Snakemake规则中基于样本信息动态生成基因组索引输出路径问题
动态生成Snakemake基因组索引输出路径的解决方案
你的问题出在输出路径的写法上:直接用"{sample}"字符串无法触发Snakemake的wildcards替换,必须像输入那样通过lambda函数结合wildcards参数来动态获取样本对应的物种信息。
修正后的规则代码
rule index: input: lambda wildcards: config["genome"][samples.loc[wildcards.sample, "organism"]]["fasta"] output: lambda wildcards: config["genome"][samples.loc[wildcards.sample, "organism"]]["index"] shell: """ bowtie2-build {input} {output} """
关键说明
- 规范获取物种信息:用
samples.loc[wildcards.sample, "organism"]替代原来的链式索引,既符合Pandas最佳实践,也能避免潜在的索引警告。 - 输出路径动态化:输出必须通过lambda函数接收
wildcards参数,这样才能根据当前样本的sampleName匹配到对应的物种,再从config中提取对应的索引路径。 - 修正Shell命令:原命令存在语法错误,比如
{output未闭合,且bowtie2构建索引的正确命令是bowtie2-build,而非bowtie2。
额外验证与优化建议
- 路径测试:在流程初始化代码后添加打印语句,验证路径是否正确生成:
# 测试sampleA对应的索引路径 print("SampleA索引路径:", config["genome"][samples.loc["sampleA", "organism"]]["index"]) - 多文件索引处理:如果bowtie2索引是多个
.bt2文件,可通过通配符或列表定义输出,确保所有索引文件都被流程追踪:output: expand( "{prefix}.{suffix}.bt2", prefix=lambda wc: config["genome"][samples.loc[wc.sample, "organism"]]["index"], suffix=["1", "2", "3", "4", "rev.1", "rev.2"] )
内容的提问来源于stack exchange,提问作者Guillaume Corre
相关产品推荐
相关产品推荐

