關(guān)于BWA-MEM算法中關(guān)于O表的壓縮算法

假設(shè)當(dāng)前的堿基序列為 ref=ATTCCAGTCGGGTATCCAAGGACT,根據(jù)Burrows-Wheeler Transform(short read)文中的建立O表的方法,建立O表如下:

                                        (Table O)
   ref   |A |T |T |C |C |A |G |T |C |G |G |G |T |A |T |C |C |A |A |G |G |A |C |T |
   pos   |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|16|17|18|19|20|21|22|23|
   ---------------------------------------------------------------------------------
    A    |1 |1 |1 |1 |1 |2 |2 |2 |2 |2 |2 |2 |2 |3 |3 |3 |3 |4 |5 |5 |5 |6 |6 |6 |
    T    |0 |1 |2 |2 |2 |2 |2 |3 |3 |3 |3 |3 |4 |4 |5 |5 |5 |5 |5 |5 |5 |5 |5 |6 |
    C    |0 |0 |0 |1 |2 |2 |2 |2 |3 |3 |3 |3 |3 |3 |3 |4 |5 |5 |5 |5 |5 |5 |6 |6 |
    G    |0 |0 |0 |0 |0 |0 |1 |1 |1 |2 |3 |4 |4 |4 |4 |4 |4 |4 |4 |5 |6 |6 |6 |6 |

當(dāng)堿基序列很長(zhǎng)時(shí)(如序列數(shù)據(jù)量大小達(dá)到G級(jí)別),對(duì)于表中的0,1,2……這些數(shù)據(jù)在RAM中以32bits存儲(chǔ),這樣要存儲(chǔ)一個(gè)ref的O表需要4x24x32/8 byte = 384 byte.

實(shí)際中,我們采用如下方法對(duì)O表進(jìn)行壓縮:

1.將ref拆分成8bits一組

拆分之后如下:
ref = ATTCCAGT | CGGGTATC | CAAGGACT
對(duì)于每一組,我們需要存儲(chǔ)的信息如下:
1.每組中的元素;
2.每組中最后一個(gè)元素對(duì)應(yīng)的O表中的內(nèi)容;

2.建立壓縮表

表頭數(shù)據(jù)為:

[|0|0|0|0|]

將第一組內(nèi)容放入壓縮表:

----表頭------A---T---T---C---C---A---G---T---O表在pos=7處的ATCG表中數(shù)據(jù)
[|0|0|0|0|][|100|111|111|101|101|100|110|111|][|2|3|2|1|]

note:

parameter Symbol sym_A= 3'b100;
parameter Symbol sym_C= 3'b101;
parameter Symbol sym_G= 3'b110;
parameter Symbol sym_T = 3'b111;

建立的完整壓縮表:

[|0|0|0|0|][|100|111|111|101|101|100|110|111|][|2|3|2|1|][|101|110|110|110|111|100|111|101|]\
[|3|5|4|4|][|101|100|100|110|110|100|110|101|][|6|6|6|6|]

這樣要存儲(chǔ)一個(gè)ref的O表需要4x4x32/8 + 3x24/8 byte = 73 byte.

對(duì)于長(zhǎng)度為8N的ref序列的O表,其壓縮比為:

origin:    4x8xNx32/8 byte = 128N byte
compress:  3x8xN/8 + (N+1)x4x32/8 byte = 19N + 16 byte 

當(dāng)N-->+∞時(shí),壓縮比為19/128=14.84%

3.解壓

將壓縮表分塊,每塊大小為32x4+3x8=152bits.
分塊之后示意圖如下:

[|0|0|0|0|][|100|111|111|101|101|100|110|111|]
[|2|3|2|1|][|101|110|110|110|111|100|111|101|]
[|3|5|4|4|][|101|100|100|110|110|100|110|101|]
[|6|6|6|6|]

舉第一塊為例,解壓時(shí)根據(jù)[|0|0|0|0|]確定當(dāng)前O表中的A,T,C,G起始個(gè)數(shù)都為0,
再根據(jù)[|100|111|111|101|101|100|110|111|]可知當(dāng)前塊的元素為ATTCCAGT。
如第一個(gè)元素為A,即在O表的A部分設(shè)置值為base+1,即0+1=1,其余的T,C,G表中的值保持不變。
如第二個(gè)元素為T,即在O表的T部分設(shè)置值為base+1,即0+1=1,其余的A,C,G表中的值保持不變(A表中的值仍為1)。
……
從而將O表解壓出來(lái)。

Note:

在壓縮時(shí)引入這些塊頭數(shù)據(jù)([|0|0|0|0|],[|2|3|2|1|]……)是為了可以將壓縮后的O表分塊并行解壓,互不干擾,只要最后將解壓的數(shù)據(jù)再拼湊回來(lái)即可,提高了程序的并行性,可以加快解壓的計(jì)算速度。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容