使用 pairwise2 进行成对比对

**请注意,Bio.pairwise2 在 1.80 版本中已弃用。**作为替代方案,请考虑使用 Bio.Align.PairwiseAligner(在第 成对序列比对 章中描述)。

Bio.pairwise2 本质上包含与 EMBOSS 套件中的 water(局部)和 needle(全局)相同的算法(见上文),并且应该返回相同的结果。最近(Biopython 版本 > 1.67),pairwise2 模块在速度和内存消耗方面进行了一些优化,因此对于短序列(全局比对:~2000 个残基,局部比对 ~600 个残基),使用 pairwise2 比通过命令行工具调用 EMBOSS 的 waterneedle 更快(或一样快)。

假设你想要对上面相同的两个血红蛋白序列(HBA_HUMANHBB_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