Snakemake调用Bowtie2时索引路径传递失败问题求助
解决Snakemake中Bowtie2索引传递的问题
问题根源
- 使用
multiext定义input.idx后,{input.idx}会展开所有索引文件路径,而Bowtie2的-x参数只需要索引前缀,不需要列出所有文件,导致命令格式错误。 - 直接将前缀作为输入时,Snakemake会验证该路径对应的文件是否存在,但前缀本身不是实际文件,因此触发
MissingInputException。
正确实现方式
核心思路:用input声明所有索引文件(让Snakemake验证文件存在),用params传递索引前缀(供Bowtie2命令使用)。
修改后的规则:
rule test_bowtie2: input: idx=multiext( "/home/databases/genomes/Homo_sapiens/rCRS/bowtieindex/rCRS", ".1.bt2", ".2.bt2", ".3.bt2", ".4.bt2", ".rev.1.bt2", ".rev.2.bt2" ), fastq="sample.fq.gz" params: idx_prefix="/home/databases/genomes/Homo_sapiens/rCRS/bowtieindex/rCRS" output: "sample_bt.bam" shell: """ nice -19 /home/ctools/bowtie2-2.4.4/bowtie2 -x {params.idx_prefix} --interleaved {input.fastq} | /home/ctools/bin/samtools view -bS -F4 - > {output} """
解释
input.idx:通过multiext列出所有Bowtie2索引文件,Snakemake会提前检查这些文件是否存在,避免运行时找不到索引的问题。params.idx_prefix:直接传递索引前缀,Bowtie2会自动根据前缀找到对应的所有索引文件,符合命令行的正确用法。- 这样既满足了Snakemake的输入文件验证要求,又保证了Bowtie2命令的格式正确。
另一种简化写法(避免重复写前缀)
可以利用Python字符串处理从input.idx中提取前缀,减少重复代码:
rule test_bowtie2: input: idx=multiext( "/home/databases/genomes/Homo_sapiens/rCRS/bowtieindex/rCRS", ".1.bt2", ".2.bt2", ".3.bt2", ".4.bt2", ".rev.1.bt2", ".rev.2.bt2" ), fastq="sample.fq.gz" params: idx_prefix=lambda wildcards, input: input.idx[0].rsplit('.', 2)[0] output: "sample_bt.bam" shell: """ nice -19 /home/ctools/bowtie2-2.4.4/bowtie2 -x {params.idx_prefix} --interleaved {input.fastq} | /home/ctools/bin/samtools view -bS -F4 - > {output} """
这里通过lambda函数从第一个索引文件路径(比如rCRS.1.bt2)中分割出前缀rCRS,适合索引路径较长的场景,避免手动重复输入前缀。
内容的提问来源于stack exchange,提问作者MONI
相关产品推荐
相关产品推荐

