利用de Bruijn graph組裝基因組的時候,Kmer為什麼必須是奇數?
根本原因就是為了避免導致正反鏈混淆。
如果kmer是偶數,我們會發現基因組上有些序列(如,CGCGCGCG,kmer=4)的Kmer在反向互補後得到的序列仍然是它自身!這是不能允許發生的。因為這將導致你無法區分某段序列的kmer到底是屬於它自身還是說只是來自於它的互補鏈!!這會給解de Bruijn graph帶來極大的混淆和困難!
或許你會覺得 「為什麼我需要糾結於序列是不是來自互補鏈呢?畢竟雙鏈DNA的正反鏈是嚴格反向互補的啊,基因組組裝技術不也是把它們合併裝在一起的嗎?!」。你若是這樣來理解其實是非常難得的,但前提卻是基因組必須能夠被一次性完整地(至少是非常接近完整)測出來,這時的測序深度甚至只需是1就可以了。但是你回頭想想,既然都已經把基因組完整測序出來了,那還要組裝幹嘛呢?
並且,目前的NGS測序技術也做不到通測基因組。一般來說都是測出上百萬千萬億萬個小小的片段(read,長度一般是100bp-300bp)。而且,為了確保準確性,基因組都會被反覆測很多層。組裝時構建的kmer單位,實際上是對這些read進行的。具體的操作就是按照kmer的長度把這些read切割成更小的、存在重疊關係的片段。那麼,此刻當我們構建de Bruijn graph時,如何能夠保證正確地把同屬於一條read上的Kmer連接起來,就顯得極為重要了!我們不能一會兒把A kmer正確地連到它自己所在的read,一會兒又連到它互補鏈的read上去!
這就是為何Kmer不能是偶數的原因了,因為只有奇數,才能保證每個kmer序列的反向互補kmer與自身也是不同的,而這個不同的真正意義就是為了避免正反鏈混淆。比如 :5-mer的 CGCGC,反向互補後是 GCGCG, 它們是不同的;這就不會像 4-mer,CGCG發現它反向互補後仍然是CGCG,這個時候就就會在後續連接kmer的過程中發生正負鏈混淆,裝出一個嵌合體基因組!
最後,放一張發表在Genome Research有關組裝的圖,大家可以大致感受一下這一段重複序列的組裝過程。
我的微信公眾號:解螺旋的礦工 歡迎關注更及時了解更多信息。
推薦閱讀:
※九章演算法 | Google 面經:找出dictionary里含某車牌號碼的所有英文字母的最短單詞
※九章演算法 | Google 面試題 : 重複子字元串模式
※SMO演算法是幹什麼的?有什麼作用?不要純概念
※平面圖的演算法有什麼用
※計算機體系結構是一種低級的複雜工作嗎 ?