BWA-MEM算法记录

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  • BWA-MEM算法整体流程如下:

1 读入 bwt、options、reads;

2 利用mem_chain生成chain;

3 利用mem_chain_flt过滤掉部分chain;

4 利用mem_chain2aln生成比对结果元数据。

BWA采用seed-and-extend策略。在seed阶段,BWA取read的碱基片段在reference上进行精确匹配,并选择满足一定匹配次数和长度要求read片段作为seed,这个阶段算法的核心是基于FM-index的精确匹配;在extend阶段,BWA利用Smith-Waterman算法将seed在read和reference上向两边延伸比对(容忍gap),进而找到整个read在reference上符合条件的全局匹配。

                                                                                                                                            

  • BWT变换

BWT算法的主要流程是:首先将给定的字符串每次右移一个字符,得到的所有字符串构成一个字符串矩阵,然后对该字符串矩阵中的所有字符串执行字典排序,取该字符串矩阵的最后一列即为BWT变换字符串。下图为对字符串T=“acaacg”进行BWT变换(a)、BWT逆变换(b)、查找字符串(c)的过程。

BWA-MEM算法记录_第1张图片

  • FM-index数据结构

FM-index是基于BWT的后缀查找算法,时间复杂度为O(m),m为待查找字符串长度。基于FM-index的序列比对算法内存占用较小。

下图为字符串T(“acaacg”)构建SA(Suffix Array,后缀数组)和BWT变换的过程。

BWA-MEM算法记录_第2张图片

FM-index主要包含SA数组、OCC数组和BWT索引串三个辅助数据结构。SA数组保存了BW矩阵中后缀字符串在原始串中出现的位置坐标。OCC[c,r]标志BWT(T)中第r行之前字符c的出现次数。

sp和ep分别代表待匹配序列在SA数组中出现的起始和结束位置(BW矩阵的行号)。

查找的过程就是将待查找字符串从后向前逆序扩展,利用LF映射的性质进行匹配,延伸至待查找字符串的第一个字符时结束,此时区间值[sp,ep]就是在BW矩阵上精确匹配的区间。区间宽度ep-sp+1代表待查询序列在T中的匹配个数。

  • FM-index存储优化

当reference比较长时,FM-index的内存占用是相当可观的,仅仅OCC数组可能达到几个GB。BWA主要思想是:BWA只存储SA后缀数组和OCC数组的一部分,其他未存储部分则在需要的时候即时计算出来。

BWA的OCC[a,i]只存储i为128的整数倍元素,满足这个条件的i称为一个checkpoint。如果i不是检查点时,首先计算出离i最近的检查点j,然后从OCC数组取出OCC[a,j],最后加上A从B[j]到B[i]出现的次数,结果就是a在BWT变换的位置i之前出现的次数。

SA[i]的空间压缩:当i等于32的整数倍时,后缀数组的元素S[i]会被记录下来,当待查找的序列结束位置不被SA存储时,继续做sp和ep的查找直至找到存储在SA数组中的某一元素,此时用这个元素的值减去该查找步骤进行的步数,即可还原查找串的真实位置。

                                                                                                                                                            

  • 基于SMEM的seed生成

MEM是一段不能继续正向或逆向扩展的精确匹配,SMEM是一种MEM,不被其他MEM所包含。BWA-MEM算法要求对于查询序列的任一个位置,覆盖该位置的最长精确匹配必须是一个SMEM。使用FMD-index和与之相关的正向-逆向扩展算法,能很快地找到所有的SMEM,SMEM查找算法如下图:

BWA-MEM算法记录_第3张图片

BWA-MEM使用传统的seed-and-extend范式,算法中以SMEM作为seed来进行后续的比对。seed是read序列的一部分,用于在比对的初始阶段衡量匹配程序,有的时候,SMEM并不出现在最终的比对结果中。为了减少由于SMEM选择不当导致的误比对,有时候需要重新生成种子(re-seeding)。比如,假设我们找到一个长度l的SMEM,它在reference中共出现了k次。当l太大时,需要重新生成种子,BWA-MEM会找出覆盖原SMEM中间位置碱基的最长精确匹配作为种子,并且要求该种子在reference中至少出现k+1次,新种子的生成算法只需要对SMEM的生成算法进行少许修改。

生成的seed会被后续过程做链化处理。一组距离相近且共线的seed被称为一条链chain,所有的seed链会按照一定的规则做一次筛选。如果一条链的长度小于某一个阈值,或者该链被其他更长的链所包含,则这条链会被抛弃。(该条链的seed也被舍弃?)

算法在seed阶段对于FM-index的访问和计算开销超过总耗时的50%,主要瓶颈是对于FM-index数据结构中OCC矩阵和后缀数组SA的访问。访问OCC数组是为了计算待查找字符串在BW矩阵的匹配区间,访问SA后缀数组则为了定位精确匹配的子序列(seed)在目标序列的起始位置。

BWA-MEM算法记录_第4张图片

  • seed扩展

BWA-MEM使用带状动态规划算法对所有seed进行扩展。在对seed进行扩展前,依据链的长度和seed的长度对所有的seed进行排序。如果一条链长度较大,则属于这条链的所有seed得到的排序就比较靠前,基于链长的排序结束后,再按照seed长度从长到端对链中所有的seed做一次排序。每一个seed按照排序的先后进行扩展,首先判断它是否被之前的比对结果所包含,如果没有被包含,则使用带状动态规划算法对它进行扩展。BWA-MEM使用的带状动态规划算法通过对Smith-Waterman算法进行SSE2指令加速。

Banded DP的扩展过程中,有可能会遇到这样的一段序列:它的中间部分比对结果很差,而它的两侧部分的匹配质量很高。对于这样的区域,BWA-MEM使用了Z-dropoff的启发式思想,当比对的分数从最大值下降到低于某个阈值时,将会停止序列比对过程。

BWA-MEM算法会记录比对到query末端的最大得分,当这个分数和局部对比的分数的差小于某一个阈值时,即使局部比对的分数较高,BWA-MEM也会将它丢弃而采用比对到末端的得分。BWA-MEM的整体算法流程如下图。(???)

BWA-MEM算法记录_第5张图片

  • OCC数组

OCC数组是按照一定的间隔存储的,在BWA-MEM算法中,OCC数组每隔128bp存储一个元素。在经典的FM-index结构中,OCC数组和BWT数组是分别存储的,而BWA-MEM的FMD-index中,这两个数组被紧凑地合并到了一个数组中,OCC和BWT组成的新数组的基本单元(一个cell)是由OCC数组和reference的BWT变换数组拼成的64个字节,其中前32个字节分别存储在BWT数组的位置i*128之前ATCG四种碱基出现的总次数,即四种碱基对应的OCC数组元素,后32个字节用来存储BWT数组在位置i*128之后128bp的碱基。

转载于:https://my.oschina.net/u/3732258/blog/1579511

你可能感兴趣的:(BWA-MEM算法记录)