使用 pairwise2 進行成對比對

請注意,Bio.pairwise2 在 1.80 版本中已被棄用。 作為替代方案,請考慮使用 Bio.Align.PairwiseAligner(在成對序列比對章節中描述)。

Bio.pairwise2 基本上包含與 EMBOSS 套件中的 water (局部) 和 needle (全域) 相同的演算法(見上文),並且應該返回相同的結果。 最近(Biopython 版本 >1.67)pairwise2 模組在速度和記憶體消耗方面進行了一些最佳化,因此對於短序列(全域比對:約 2000 個殘基,局部比對約 600 個殘基),使用 pairwise2 比透過命令列工具呼叫 EMBOSS 的 waterneedle 更快(或同樣快)。

假設您想在上面相同的兩個血紅蛋白序列之間進行全域成對比對(HBA_HUMAN, HBB_HUMAN),這些序列儲存在 alpha.faabeta.faa

>>> from Bio import pairwise2
>>> from Bio import SeqIO
>>> seq1 = SeqIO.read("alpha.faa", "fasta")
>>> seq2 = SeqIO.read("beta.faa", "fasta")
>>> alignments = pairwise2.align.globalxx(seq1.seq, seq2.seq)

如您所見,我們使用 align.globalxx 呼叫比對函式。 棘手的部分是函式名稱的最後兩個字母(這裡:xx),它們用於解碼匹配(和不匹配)和間隙的分數和懲罰。 第一個字母解碼匹配分數,例如 x 表示匹配計為 1,而不匹配沒有成本。 使用 m 可以定義匹配或不匹配的一般值(完整詳細資訊請參閱 Bio.pairwise2)。 第二個字母解碼間隙的成本;x 表示完全沒有間隙成本,使用 s 可以分配打開和延長間隙的不同懲罰。 因此,globalxx 表示只計算兩個序列之間的匹配。

我們的變數 alignments 現在包含一個比對列表(至少一個),對於給定的條件,它們具有相同的最佳分數。 在我們的例子中,這是 80 個不同的比對,分數為 72(Bio.pairwise2 最多會返回 1000 個比對)。 看一下其中一個比對

>>> len(alignments)
80
>>> print(alignments[0])  
Alignment(seqA='MV-LSPADKTNV---K-A--A-WGKVGAHAG...YR-', seqB='MVHL-----T--PEEKSAVTALWGKV----...Y-H', score=72.0, start=0, end=217)

每個比對都是一個具名元組,由兩個比對序列、分數、比對的起始和結束位置組成(在全域比對中,起始位置始終為 0,結束位置為比對的長度)。 Bio.pairwise2 有一個函式 format_alignment 用於更美觀的列印輸出

>>> print(pairwise2.format_alignment(*alignments[0]))  
MV-LSPADKTNV---K-A--A-WGKVGAHAG---EY-GA-EALE-RMFLSF----PTTK-TY--F...YR-
|| |     |     | |  | ||||        |  |  |||  |  |      |    |   |...|
MVHL-----T--PEEKSAVTALWGKV-----NVDE-VG-GEAL-GR--L--LVVYP---WT-QRF...Y-H
  Score=72

自 Biopython 1.77 以來,可以使用關鍵字提供所需的參數。 現在也可以將最後一個範例寫成

>>> alignments = pairwise2.align.globalxx(sequenceA=seq1.seq, sequenceB=seq2.seq)

通常,通過懲罰間隙可以獲得更好的比對:打開間隙的成本較高,而延長現有間隙的成本較低。 對於胺基酸序列,匹配分數通常編碼在 PAMBLOSUM 之類的矩陣中。 因此,對於我們的例子,可以使用 BLOSUM62 矩陣,以及 10 的間隙打開懲罰和 0.5 的間隙延長懲罰(使用 globalds)來獲得更有意義的比對

>>> from Bio import pairwise2
>>> from Bio import SeqIO
>>> from Bio.Align import substitution_matrices
>>> blosum62 = substitution_matrices.load("BLOSUM62")
>>> seq1 = SeqIO.read("alpha.faa", "fasta")
>>> seq2 = SeqIO.read("beta.faa", "fasta")
>>> alignments = pairwise2.align.globalds(seq1.seq, seq2.seq, blosum62, -10, -0.5)
>>> len(alignments)
2
>>> print(pairwise2.format_alignment(*alignments[0]))
MV-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTY...KYR
|| |.|..|..|.|.|||| ......|............|.......||.
MVHLTPEEKSAVTALWGKV-NVDEVGGEALGRLLVVYPWTQRFF...KYH
  Score=292.5

此比對的分數與我們之前使用相同的序列和相同的參數透過 EMBOSS needle 獲得的分數相同。

局部比對使用函式 align.localXX 以類似的方式呼叫,其中 XX 再次表示匹配和間隙函式的雙字母代碼

>>> from Bio import pairwise2
>>> from Bio.Align import substitution_matrices
>>> blosum62 = substitution_matrices.load("BLOSUM62")
>>> alignments = pairwise2.align.localds("LSPADKTNVKAA", "PEEKSAV", blosum62, -10, -1)
>>> print(pairwise2.format_alignment(*alignments[0]))
3 PADKTNV
  |..|..|
1 PEEKSAV
  Score=16

在最近的 Biopython 版本中,format_alignment 只會列印局部比對的比對部分(連同以上範例中顯示的基於 1 的起始位置)。 如果您也對序列的非比對部分感興趣,請使用關鍵字參數 full_sequences=True

>>> from Bio import pairwise2
>>> from Bio.Align import substitution_matrices
>>> blosum62 = substitution_matrices.load("BLOSUM62")
>>> alignments = pairwise2.align.localds("LSPADKTNVKAA", "PEEKSAV", blosum62, -10, -1)
>>> print(pairwise2.format_alignment(*alignments[0], full_sequences=True))
LSPADKTNVKAA
  |..|..|
--PEEKSAV---
  Score=16

請注意,根據 Smith & Waterman 的定義,局部比對必須具有正分數(>0)。 因此,如果沒有獲得 >0 的分數,pairwise2 可能會返回沒有比對。 此外,pairwise2 不會報告由於在任一位置上添加零分延伸而導致的比對。 在下一個範例中,絲氨酸/天門冬胺酸 (S/D) 和賴氨酸/天冬醯胺 (K/N) 這兩對的匹配分數都為 0。 如您所見,比對部分沒有延伸

>>> from Bio import pairwise2
>>> from Bio.Align import substitution_matrices
>>> blosum62 = substitution_matrices.load("BLOSUM62")
>>> alignments = pairwise2.align.localds("LSSPADKTNVKKAA", "DDPEEKSAVNN", blosum62, -10, -1)
>>> print(pairwise2.format_alignment(*alignments[0]))
4 PADKTNV
  |..|..|
3 PEEKSAV
  Score=16

除了提供完整的匹配/不匹配矩陣之外,匹配碼 m 還可以輕鬆定義一般匹配/不匹配值。 下一個範例使用 5/-4 的匹配/不匹配分數和 2/0.5 的間隙懲罰(打開/延長),使用 localms

>>> alignments = pairwise2.align.localms("AGAACT", "GAC", 5, -4, -2, -0.5)
>>> print(pairwise2.format_alignment(*alignments[0]))
2 GAAC
  | ||
1 G-AC
  Score=13

Bio.pairwise2.align 函式的一個有用的關鍵字引數是 score_only。 當設定為 True 時,它只會返回最佳比對的分數,但時間會明顯縮短。 它還可以讓較長的序列在引發記憶體錯誤之前進行比對。 另一個有用的關鍵字引數是 one_alignment_only=True,這也會帶來一些速度提升。

不幸的是,Bio.pairwise2 無法與 Biopython 的多重序列比對物件一起使用(但尚未)。 然而,該模組有一些有趣的高級功能:您可以定義自己的匹配和間隙函式(對測試仿射對數間隙成本感興趣嗎?),間隙懲罰和末端間隙懲罰對於兩個序列可以不同,序列可以作為列表提供(如果您有由多個字元編碼的殘基,這很有用)等等。這些功能很難(如果有的話)透過其他比對工具實現。 有關更多詳細資訊,請參閱模組的 API 文件 Bio.pairwise2