该项目通过实现核谱向量点积
打分算法对肽段-谱图
(映射为:查询记录-数据库文档
)进行打分匹配,主要利用碎片离子(映射为:查询记录的特征
)之间存在的相关性进行非线性打分,以避免传统的谱向量点积
打分算法忽略对碎片离子之间可能存在的正相关性考虑。同时以“发车模式”
(一种搜索策略,目的在于在线打分
和节剩内存
)进行查询,实现考虑固定修饰
和可变修饰
(映射为:词条存在同语义变种
,会导致词条组合爆炸
式增长)都存在下的搜索功能,对结果进行基于径向基的KSDP扩展
打分,并将其结果与pFind 2.8
搜索引擎的结果进行对比统计,输出对比结果。并利用对比结果的具体异同情况分析本文实现的搜索引擎与之存在的一致性与差异性原因。
在利用搜索引擎
对蛋白质进行鉴定的问题中,如何减少鉴定肽段的假阳率,是一个重要的研究问题。而其中,肽打分算法作为搜索引擎的核心部分,是影响鉴定结果假阳率的重要因素。现有的肽打分算法通常假设串联质谱中出现的碎片离子相互独立,从而采用线性的打分函数。其中属常用的谱向量点积(SDP)
方法最为典型,即利用“共有峰计数”(映射为:查询记录
与数据库文档
间存在相同特征,则计数,计数算法可以多种)作为打分基础,忽略碎片离子之间可能存在的相关性。
实际上,在串联质谱中,一些碎片离子往往趋于同时出现(特征往往具有正相关性质
)。比如,连续离子、互补离子及中性丢失离子等等都可能是正相关的离子。直观上讲,当正相关的离子同时被匹配时,这些匹配作为整体应该比它们作为个体具有更高的可信性,应得到更高的打分。如何考虑碎片离子之间的正相关性,设计一种新的非线性打分算法,以降低肽谱匹配的假阳率,则是该项目重点研究的对象。
编写一个蛋白质搜索引擎,对串联质谱图和蛋白质进行匹配打分,实现核谱向量点积(KSDP)
打分函数,与pFind 2.8
的搜索结果进行对比,并分析结果的一致性与不一致性原因,找出原因,改进打分流程,提升鉴定结果的假阳率。
应用程序命名为search.exe,当用户双击该可执行软件时,程序应该实现自动加载同目录下的search.param参数文件(如图1所示),并开始运行。
程序中使用的氨基酸质量等基本信息需与pFind 2.8一致(参见pFind2.8安装目录下的aa.ini),同时固定修饰和可变修饰的基本信息也应与pFind 2.8一致(参见pFind 2.8安装目录下的modification.ini或modify.ini)。
图1参数列表中,input_path_index一项,表示倒排搜索程序建立的索引文件,其中关于酶切的一切设置,应该在建立索引时确定下来,本文不需要专门配置。而input_path_pFind参数则是在同等的酶切参数和搜索参数下得到的pFind 2.8搜索结果,通过该路径可以读取pFind2.8结果并与之进行对比输出。
输出结果中,要给出搜索引擎的搜索结果,并已和pFind 2.8对比过,对应search.param参数文件中的input_path_pFind路径下的结果文件。结果文件中每个谱图的搜索结果仅占一行,包括谱图全称、肽段序列、修饰(形如“1|9,Carbamidomethyl[C]|”,表示有1个修饰,在第9位上,是Carbamidomethyl[C],各修饰间以竖线分隔)、是pFind 2.8搜索结果的top几,值之间以“\t”隔开。
该ReadMe
的一个重要内容就是训练“对比”能力,这里对比的对象为pFind 2.8的搜索结果,在该报告的最后,应该详细讨论说明两个搜索引擎结果的异同,争取每个“异”都能讲清楚为什么。
在报告中需要讨论以下问题:
(1)如果串联谱图不是几百张,而是几百万张,程序是否还能运行?
(2)如果蛋白质序列不是几千个,而是几十万个,你的程序是否还能运行?
(3)如果考虑多个“可变修饰”和“非特异酶切”,你的程序是否还能运行?
(4)这些谱图有什么特点?
(5)如何对你的搜索结果进行可信度排序?
(6)如何估计你的结果的假阳率?
(7)如何由“句子”推断“段落”?
(8)在相同假阳率下,如何得到更多可信的鉴定结果?
(9)怎么评价不同的蛋白质搜索引擎,比如存在竞品引擎,哪个更好?流程中哪个环节最重要?
通过独立开发该搜索引擎,充分了解并熟悉了整一个搜索与打分的流程和实现的细节。掌握了利用碎片离子之间的相关性进行打分的非线性打分函数——核谱向量点积方法,以及了解到以谱图或肽段为中心的查询方式之间的差异性。
同时,对一些逻辑实现方面需要注意的细节印象较为深刻,例如
(1)3电荷以下的母离子其碎片离子多为1价的存在,因此实现的时候应该不考虑2价及以上的碎片离子;
(2)以及考虑固定修饰时将氨基酸进行变换,简单修改氨基酸质量表即可实现固定修饰功能,而考虑可变修饰时即使对每条候选肽在线分配一个新的氨基酸质量表,也不能只单单修改发生可变修饰的氨基酸质量,因为存在另一个位点上的该氨基酸未发生可变修饰的情况,正确的做法应该是在计算碎片离子的时候,就在线判断其是否遇到了发生可变修饰的氨基酸;
(3)还有在进行肽谱碎片离子匹配的时候,会出现一根谱峰匹配多次的情况,这时候应该只考虑强度累加1次即可,也即意味着这根谱峰其出现的贡献来自于匹配到的碎片离子群,这样子的解释和做法比较合理。
以上这些问题都会影响到搜索结果与pFind 2.8搜索引擎结果的一致性。
最后,发现了一个问题,即pFind 2.8在计算碎片离子误差窗口时存在精度丢失的情况,具体表现为碎片离子窗口外附近的碎片被纳入匹配,造成匹配谱峰增多而超过原本的第一名,本文在实验中将20ppm的碎片离子误差范围改成20.5ppm后,即可匹配到那根谱峰。这种情况的数目在本文测试的数据结果上占2%左右,同时打分都是较靠后和不可信的肽谱匹配,这是本文与pFind 2.8剩余肽谱匹配结果对不齐的主要类型。主要原因可能在于pFind 2.8在计算碎片离子误差窗口时将浮点数转整数过程中造成的精度丢失。
最后,回答刚开始思考的几个问题。
(1)如果串联谱图不是几百张,而是几百万张,程序是否还能运行?
目前本文对谱图文件都是一次性读入内存处理,还未考虑谱图数据超过几个G而进行分批读取进行打分的情况。解决方法,读取谱图数据时,将其分块并逐一读取即可。
(2)如果蛋白质序列不是几千个,而是几十万个,你的程序是否还能运行?
蛋白质序列增多,意味着本文读取肽段数增多,和上一个问题相同,分块读取肽段信息即可,目前本文采用一次性读取肽段文件的方法。
(3)如果考虑多个“可变修饰”和“非特异酶切”,你的程序是否还能运行?
可以,本文程序实现上可以考虑多固定修饰和可变修饰。
(4)这些谱图(数据库中的文档
)有什么特点?
谱图是高精度的谱图,噪音峰的存在对结果影响挺大,即不去噪音峰的话,和pFind 2.8
的对齐结果会降低。
(5)如何对搜索结果进行可信度排序?
目前是直接按得分降序输出,假设得分高的可信度高。
(6)如何估计你的结果的假阳率?
利用其它搜索引擎的结果来对比计算,比如假设pFind 2.8的结果都是对的,与pFind 2.8结果对不齐的结果比率则可以看作假阳率;或者引入反库进行测试。
(7)如何由“句子”推断“段落”(如何从段落
推断原始文档
)?
利用获得的肽段在倒排索引软件中查询,输出“句子”对应的“段落”。
(8)在相同假阳率下,如何得到更多可信的鉴定结果?
设计一个更好的打分算法,该算法对反库中的肽段打分会低。
(9)怎么评价不同的蛋白质搜索引擎,比如存在竞品引擎,哪个更好?流程中哪个环节最重要?
站在一个用户使用软件的角度上看这个问题,精度首先是最重要的,即假阳率要低,在这个搜索引擎中则是看谁与pFind 2.8对齐数更多,主要是针对打分靠前的肽段对齐数,因为靠后的不可信结果谁对谁错都不好说,前提是它们都是不可信的结果。
第二个是稳定性,即可以支持大库和大谱图数据文件查询,以及考虑任意多修饰的存在,适用性要强。本项目则是要求起码要可以跑通无修饰、仅固定修饰、仅可变修饰和两者都有的4种情况。软件准了和稳定了,再来考虑速度,作为用户,跑一个数据用太久的时间,也是不太可以容忍的,速度方面可以对比一下。