Snakemake expand结合zip使用时通配符解析异常问题
问题根因
你遇到的通配符错配问题和expand()的zip参数无关,zip已经正确生成了一一配对的目标路径,核心错误是将两个通配符直接相邻拼接、中间没有任何固定分隔符。
Snakemake解析通配符时基于正则匹配,当两个通配符之间没有固定字符串作为边界时,程序无法自动判定两个通配符的分割位置,只要拆分结果能拼出完整目标路径就会被判定为合法匹配,因此会出现你看到的截断错配:比如对路径rnaquast/TMW3250_15German_ale/short_report.txt,程序可以将{sample}匹配为TMW3250_15German_al、{reference}匹配为e,完全符合无分隔符的路径模式,但和你预期的取值完全不符。
修复方法
在{sample}和{reference}两个通配符之间添加一个不会出现在两组取值中的固定分隔符(如下划线、短横线),给Snakemake明确的匹配边界即可,修改点涉及三处逻辑:
rule all中expand()的路径模板rule rnaQUAST中output的路径模板- 对应shell命令中输出目录的拼接逻辑也要同步修改
修正后的核心代码如下:
samples_rnaQUAST = ["TMW3250_15","TMW3250_20","TMW3256_15","TMW3256_20","TMW3261_15","TMW3261_20", "TMW3673_15","TMW3673_20","TMW3285_15","TMW3285_20","TMW3275_15","TMW3275_20", "TMW3681_15","TMW3681_20","TMW3287_15","TMW3287_20"] references_rnaQUAST = ["German_ale","German_ale","German_ale","German_ale", "English_ale","English_ale","American_ale","American_ale", "Frohberg","Frohberg","Frohberg","Frohberg","Saaz", "Saaz","Saaz","Saaz"] rule all: input: # 两个通配符间添加下划线作为固定分隔符 expand("rnaquast/{sample}_{reference}/short_report.txt", zip, sample=samples_rnaQUAST, reference=references_rnaQUAST) rule rnaQUAST: input: transcriptome="trinity/{sample}/default_by_condition_trinity/Trinity.fasta", reference="genomes/{reference}_genome.fasta", gtf="genomes/AUGUSTUS_annotations/{reference}.gtf" output: # 输出路径和rule all模板保持一致,添加相同分隔符 report="rnaquast/{sample}_{reference}/short_report.txt" threads: 16 shell:""" /home/user/miniconda3/envs/rnaquast/share/rnaquast-1.5.1-0/rnaQUAST.py \ --transcripts {input.transcriptome} \ --reference {input.reference} \ --gtf {input.gtf} \ -t {threads} \ -o rnaquast/{wildcards.sample}_{wildcards.reference} """
如果你坚持不在路径中添加分隔符,也可以通过wildcard_constraints给两个通配符添加严格的正则匹配约束,限定每个通配符只能取你预设列表里的值,但这种方式维护成本更高,远不如添加固定分隔符简单可靠。
内容的提问来源于stack exchange,提问作者Snail Shaman
相关产品推荐
相关产品推荐

