在说基因组的拼接之前,可以考虑如下的一个问题:
假设有一摞报纸被炸成了碎片,如何利用这些碎片拼接成一份完整的信息了解那天发生的大事?
这个问题的难点在于:必定有一部分的信息因为爆炸而消失不见,也不能简单的把报纸粘起来,因为报纸不止一份,所以我们必须从大量包含了重复内容的碎片来重构一份完整的报纸。
传统的基因租测序流程大致如下:
取目标样本的一些组织(其中包含了数百万的细胞,具有相同的基因组) -> 将这些dna打断成一定长度的碎片(获得的片段成为read) -> 使用测序仪测得read的碱基序列
所以,在我们要进行后续的分析前,我们需要先要将这些 reads 拼接以还原我们需要的基因组信息。
与刚才的报纸问题相似,但是基因组拼接的增加了以下难点:
- DNA是双链,所以对于一个给定的read 我们无法知道他是来于DNA的其中一链,还是来自于它的互补链
- 测序仪测序错误
- 获得的reads中可能没有覆盖到基因组的所有片段,所以无法重构该片段
这个问题看起来很复杂,显得无从入手,我们可以将其分解为一个个的小问题,并且将其抽象成一个可以明确表达的问题,逐个解决。
从k-mers重构字符串
我们假设测序获得的read长度相等,而且没有测序错误,也不用考虑重复问题,就简单的考虑如何将 k-mers (k为read长度,)拼接成一个原始的字符串
模拟k-mer的生成
输入:整数k,字符串
输出:k-mers(经过排序)
在了解了k-mer是什么后,我们反过来利用k-mers来还原一个字符串
很明显这个字符串应该以TAA开头,因为没有3-mers以TA结尾
以AA开头的3-mers只有AAT
而以AT开头的 3-mers只有ATG
重复以上过程,我们还原了原始的字符串
下面考虑一个更复杂的例子
我们还是从TAA开始
到此为止一切顺利,但是以ATG后面以TG开头的 3-mers 共有3个 TGC, TGG, TGT
换成TGC后似乎已经还原了原始字符串,但是到此为止只使用了14个 3-mers,忽略了GGG,使得这个字符串比原始字符串少了一个字符G
上面的例子中ATG重复了3次,导致了我们有三个选择TGC,TGG,TGT来延续ATG。当有数百万个reads时,因为重复带来的计算困难将更为严重。
可以将基因组的拼接类比为Triazzle(Triazzle是一种拼图游戏,虽然只有16块拼图,但是并没有看起来那么容易)
回到刚才的问题