1、BWT (Burrows–Wheeler_transform)算法介绍
bwa是目前最流行的二代测序比对工具,其中就用到了BWT算法。BWT(Burrows-Wheeler Transform)算法是一种数据转换算法,它将一个字符串中的相似字符放在相邻的位置,以便于后续的压缩
2、 BWT编码
目的:BWT编码后,原始字符串中的相似字符会处在比较相邻的位置
步骤:
(1)首先,BWT先对需要转换的文本块,进行循环右移,每次循环一位。
长度为n的文本块,循环n次后重复,这样就得到n个长度为n的字符串。如字符串 **acaacg **,图中的“循环右移”列。(其中$作为标识符,不在文本块的字符集中,这样保证n个循环移位后的字符串均相同。 并且定义$小于字符集中的任意字符)。
(2)对循环移位后的n个字符串按照字典序排序。如下图中的“排序”列。
(3)记录下“排序”列中每个字符串的最后一个字符,组成“L”列;第一个字符,组成F列。("F"列是每个字符串的前缀)
这样,原来的字符串“acaacgaaac”。“L”列就是编码的结果。
3、 BWT解码
因为进行的是循环移位,且是循环左移注意下面的性质:
L的第一个元素是字符串中的最后一个元素
对于“排序”列的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素。也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。
解码:
通过"F"列中的元素,找到他前面的字符,就是对应的同一行“L”列;
(2)通过“L”列中的元素,找到他在“F”列中的对应字符位置。但是“L”中有3个字符a,如何对应F中的3个a呢?因为L是F的前一个元素,多个具有相同前缀的字符串排序,去掉共同前缀后相对次序没有变化。所有遇到多个相同的字符,相对位置不变;
转到(1),直到结束。
因为F列是已经排序的,可以从L列获得,所有只需要保存L列就可以。从L列中的字符获取在F列中的位置时,需要:
前缀和数组,记录小于当前字符的字符数个数。
count计数,计算L中从开始位置到当前字符位置等于该字符的字符数。(保证多个相同字符下"L"到“F”的相对位置不变)。
4、 例子
字符串 acaacg 与 caa 比对,长序列如上,根据BWT编码。caa在匹配时,先用caa最后一个字符a,详细方法如下:
a在F列中有3个位置,先试F中第一个位置的a,对应L列的c (a->c),排除
F列中,第二个a,对应L列的),排除
-
F列中,第三个a,对应L列的第一个a(a->a),继续
F列中,第一个a, 对应L列中的第一个c (a->c),
F列中,第一个c, 算法停止,找到位置
基因组分析 微信公众号推出 《50篇文章深入理解NGS》系列文章, 第五篇文章 《基因组序列比对算法介绍——BWT算法》,争取每周更新一篇高质量生信干货帖子。
关注微信公众号 ,**转发 **给同学和同事,您的认可,是对我最大的支持 ,任何问题,后台可以留言。