前言
众所周知,对于检索精确匹配,模糊匹配,以及特殊的正则匹配。
对于序列检索而言,同样也会序列匹配的要求。至于正则匹配,那就是本文的话题,专业名词叫做Motif检索。序列检索中的正则匹配,是本文的主要话题,专业名词叫做motif。详见https://en.wikipedia.org/wiki/Sequence_motif
正常情况而言,如果公司有自己的序列库,都会采用大名鼎鼎的NCBI blast来作为自己的序列搜索引擎。就功能而言本身是强大的,但是并不能完美支持motif检索,尤其是氨基酸简码X并不能匹配到任意氨基酸简码。用其他软件做自己的motif检索又得构建另一套索引文件,未免增加了服务器的存储。本文提供一种针对NCBI blast的源码修改使之支持motif检索。
重点内容
针对蛋白质序列(氨基酸序列)检索一共实现了8种打分矩阵,具体实现定义在src/util/tables目录下:
PAM 与BLOSUM,关于两者算法的定义以及区别自行谷歌,本文核心在于如何修改代码支持motif打分而已。
以PAM30算法为例,对应的源码文件是sm_pam30.c,该文件定义了序列中的氨基酸简码两两之间突变的概率,数值越大,可能性越高,可以理解为相似程度。blastp命令在匹配序列中的每个氨基酸的时候,会基于打分矩阵,算出每个序列的相似分数。从源码文件中得知,原来X匹配其他氨基酸的比分都是固定的-1,导致blastp匹配不了其他氨基酸,因此只需要修改打分矩阵即可。
原始文件定义如下:
1 | static const TNCBIScore s_Pam30PSM[25 * 25] = { |
修改后的打分矩阵,
1 | static const TNCBIScore s_Pam30PSM[25 * 25] = { |
为什么X与其他氨基酸的分值不设置成相同的正整数呢,大家可以思考下。
剩下的工作就是编译出来一个新的blastp命令即可。
详细参考另一篇博文: Compile and debug NCBI blast+ source code - NCBI blast源码编译调试教程