在Nextflow中运行BLAST时数据库未检测及变量db不存在的问题
解决Nextflow运行BLAST时的数据库未检测错误
问题根源
报错"No such variable: db"的直接原因是extractTopHits流程没有定义db这个输入参数,也没从其他地方获取数据库路径,导致流程模板里的$db变量无法解析。另外原代码里还有两处命令行语法错误,也得一起修正。
修复后的完整代码
#!/usr/bin/env nextflow nextflow.enable.dsl=2 params.query = "/home/galaxy/Vivian/16s.fasta" params.db = "/home/galaxy/Vivian/blastdb" process blastSearch { input: path query path db output: path "top_hits.txt" // 把数据库路径传递到下游,保证两个流程用同一份路径 val db """ # 修正blastn的输出重定向,先把结果存到blast_result文件 /home/galaxy/Vivian/ncbi-blast-2.13.0+/bin/blastn -db $db/16S_ribosomal_RNA -query $query -outfmt 6 > blast_result # 提取前10条结果的第2列到top_hits.txt cat blast_result | head -n 10 | cut -f 2 > top_hits.txt """ } process extractTopHits { input: path "top_hits.txt" // 新增db输入,接收上游传过来的数据库路径 val db output: path "sequences.txt" """ # 修正命令行截断问题,正确输出到sequences.txt /home/galaxy/Vivian/ncbi-blast-2.13.0+/bin/blastdbcmd -db $db/16S_ribosomal_RNA -entry_batch top_hits.txt > sequences.txt """ } workflow { def query_ch = Channel.fromPath(params.query) // 把blastSearch的两个输出(top_hits.txt和db)传给extractTopHits blastSearch(query_ch, params.db) | extractTopHits | view }
关键修改说明
- 给extractTopHits加db输入:在流程的
input块里添加val db,这样模板里的$db就能对应到上游传过来的数据库路径,不会再报错。 - 修复blastSearch的命令语法:原代码里
blastn的-outfmt 6>后面缺少空格和输出文件,导致命令执行失败,改成-outfmt 6 > blast_result才能正确保存BLAST结果。 - 传递db到下游:在blastSearch的输出里添加
val db,把数据库路径传给extractTopHits,避免在多个流程里重复写路径,也能保证参数一致性。 - 修正extractTopHits的命令截断:原代码末尾的
> sequence>是明显的语法错误,改成> sequences.txt才能正确生成结果文件。
更简单的替代方案(直接用全局参数)
如果你的数据库路径固定不变,也可以不用在流程间传递db,直接在extractTopHits里用全局的params.db,这样代码更简洁:
process extractTopHits { input: path "top_hits.txt" output: path "sequences.txt" """ /home/galaxy/Vivian/ncbi-blast-2.13.0+/bin/blastdbcmd -db ${params.db}/16S_ribosomal_RNA -entry_batch top_hits.txt > sequences.txt """ }
这种方式不需要修改blastSearch的输出和workflow的传递逻辑,但灵活性稍差,适合数据库路径不会变动的场景。
内容的提问来源于stack exchange,提问作者Terra
相关产品推荐
相关产品推荐

