BWT转换对字符串进行编码
今天看了下bowtie 的论文, 里面描述了BWT转换的过程和bowtie的比对算法;
NGS测序数据的数据量非常大, 为了更快的处理, 通常需要对数据进行压缩;而BWT实际上就是一种数据转换方法,
将原始序列经过BWT转换后, 可以更方便的进行压缩;而且BWT转换是一个可逆的转换,能够根据转换后的序列还原出原始序列;
BWT转换首先将序列进行在序列的末尾插入一个字符,并且规定按照字典序的排序的话, 这个字符小于序列中的任意字符:
比如原始序列:
acaacg
首先在末尾添加一个$符号,变成 acaacg$;
对这个序列进行循环右移,形成一组序列,;
1) acaacg$
2) $acaacg
3) g$acaac
4) cg$acaa
5) acg$aca
6) aacg$ac
7) caacg$a
然后对这7个序列按照字典序进行排序:
First Last
1) $acaacg
2) aacg$ac
3) acaacg$
4) acg$aca
5) caacg$a
6) cg$acaa
7) g$acaac
对于上面的这个序列矩阵,有以下几个性质:
1)last列的第一个字母就是原始序列的最后一个字符;(因为$小于任意字符)
2)first 列的每一个字母是对应的Last列的后一个字符; (因为循环右移)
3)字符x在last列中出现的第i次对应first 列中的第i个字符;比如last列中第5行的a是第2次出现的a,它对应的就是First列中的第3行的a;
利用上面的这3个性质就可以根据First 列和Last 列中的内容,推测出原始序列, 下面是bowtie论文中给出的示意图:
利用这个性质进行精确匹配:
比如查询字符串为aac, 参考字符串为acaacg;
1)首先从查询字符串的最后一个字符 c 开始,c 在First 列中出现了两次;这两个c 对应的Last 列中的字符都为a , 与查询序列相同;
2)检测这两个a 对应的前一个字符, 一个对应$; 一个对应a, 很明显对应a的就是我们想要找到的, 这样查询序列与参考序列就精确匹配上了;
非精确匹配(允许错配):
在实际的分析中, 由于测序错误或者snp等;要求匹配是必须允许错配和gap;
1) 测序错误
参考基因组序列为ATCCG, 而我们测出来的为AACCG, 由于测序错误, 将第二个碱基T测成了A, 在mapping的过程中,程序应该可以校正这种错误, 事先规定错配的最大碱基数, 这样可以有效的校正一些个别的测序错误;
2) snp
基因组中经常会发生snp,即单核苷酸多态性,对应的碱基发生了突变,可能是A变成了T(转换), 或者A变成了C(颠换),这样的位点在比对的过程中,如果不允许错配,就导致这样的序列比对不到参考基因组上, 这也是不合理的;广义上的snp还包括插入和缺失,这样在比对的过程中,必须允许出现gap,这样才能将序列正确的比对到参考基因组上, 在下游的call snp的分析过程中才可以正确的识别snp位点, 只有bowtie2 支持gappe d 比对, bowtie1 不支持;
bowtie也能够进行非精确的匹配:
在实际比对过程中, 要能够给定比对上的序列在参考基因组上的位置, 这样需要我们存储位置信息,
以上面的BWT转换形成的矩阵为例,需要建立一个数组, 这个数组保存的是对应的字符在First 中第一次出现的位置和该字符在Last列中是第几次出现;
a[0] = (5,1); (g 在 First 列中第一次出现在第5行, 在Last列中是第一次出现的g, 5+ 1得到其在参考序列上的位置为6,)
a[1] = (4,1);
a[2] = (0,1);
a[3] = (1,1);
a[4] = (1,2);
a[5] = ();
a[6] = ();
BWT转换对字符串进行编码的更多相关文章
- 中文字符串的编码转换(c实现)
中文字符串在c/c++中表示为字节序列,在分词的时候需要根据不同的编码方式进行分词,一般分词器需要转换成统一的编码方式再进行转换,有些分词器如ICTCLAS在分词的时候可以不显示定义编码方式,可以检测 ...
- java转换字符串的编码(转)
package com.Alex.base; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class C ...
- 字符串js编码转换成实体html编码的方法(防范XSS攻击)
js代码在html页面中转换成实体html编码的方法一: <!DOCTYPE html><html> <head> <title>js代码转换成实 ...
- Python3中字符串的编码与解码以及编码之间转换(decode、encode)
一.编码 二.编码与解码 Python3中对py文件的默认编码是urf-8.但是字符串的编码是Unicode. 由于Unicode采用32位4个字节来表示一个字符,存储和传输太浪费资源,所以传输和存储 ...
- C#字节数组转换成字符串
C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Enc ...
- Python字符串的编码与解码(encode与decode)
首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...
- 基于Visual C++2013拆解世界五百强面试题--题4-double转换成字符串
请用C语言实现将double类型数据转换成字符串,再转换成double类型的数据.int类型的数据 想要完成题目中的功能,首先我们的先对系统存储double的格式有所了解. 浮点数编码转换使用的是IE ...
- python入门(9)字符串和编码
python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...
- python基础——字符串、编码、格式化
1.三种编码:ascii Unicode utf8 2.字符串和编码数字的两个函数:ord(字符转数字ord(‘A’)=65)和 chr(数字转字符chr(65)=A) 3.bytes存储编码,记住两 ...
随机推荐
- SQL中的LIKE中用参数化查询
今天终于学会怎么在like中用参数化查询啦..哈哈..再也不用担心sql注入了...
- Oracle 12C 在 Oracle Linux 6.5 64Bit 安装手冊
Oracle 12C 在 Oracle Linux 6.5 64Bit 安装手冊.step by step 下载地址: http://download.csdn.net/detail/rlhua/7 ...
- jvisualvm工具使用
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe). https:// ...
- angular学习笔记(十四)-$watch(4)
如果需要同时监测多个属性或者对象,并且执行的是同样的回调,可以有两种选择: 1. 监测这些属性连接起来之后的值: $scope.$watch('objOne.a+objTwo.b+...', watc ...
- ny14 会场安排问题
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...
- 孙鑫VC++视频教程笔记
写在前面的话:在学习孙鑫老师的VC++视频时,为了加深自己对知识的深入理解,就做了下面的笔记. 第一讲: 第二讲: 第三讲: 第四讲: 第五讲: 第六讲: 第七讲: 第八讲: 第九讲: 第十讲: 第十 ...
- LeetCode: Populating Next Right Pointers in Each Node 解题报告
Populating Next Right Pointers in Each Node TotalGiven a binary tree struct TreeLinkNode { Tree ...
- Linux作为路由器(一)
前言:Linux主机可以作为路由器使用,利用路由转发功能实现不同网络内的主机能够相互通信,利用iptables的SNAT功能来实现企业内网主机访问互联网,下面做个小的实验. 实验环境:VM (1)路由 ...
- docker centos7 dbus error解决方法
在centos7 上使用centos7的docker镜像结果不能使用systemd,提示 Failed to get D-Bus connection: No connection to servic ...
- I/O限制异步操作
CLR非异步操作读取文件的过程图 非异步操作主要是因为每次请求硬件如(硬盘,网卡等)的线程都处于阻塞状态,导致以后的请求都需要重新创建新的线程.导致线程上下文的切换频繁. 异步IO操作主要是通过每次的 ...