使用 pairwise2 进行成对比对
**请注意,Bio.pairwise2 在 1.80 版本中已弃用。**作为替代方案,请考虑使用 Bio.Align.PairwiseAligner
(在第 成对序列比对 章中描述)。
Bio.pairwise2
本质上包含与 EMBOSS 套件中的 water
(局部)和 needle
(全局)相同的算法(见上文),并且应该返回相同的结果。最近(Biopython 版本 > 1.67),pairwise2
模块在速度和内存消耗方面进行了一些优化,因此对于短序列(全局比对:~2000 个残基,局部比对 ~600 个残基),使用 pairwise2
比通过命令行工具调用 EMBOSS 的 water
或 needle
更快(或一样快)。
假设你想要对上面相同的两个血红蛋白序列(HBA_HUMAN
,HBB_HUMAN
)进行全局成对比对,它们存储在 alpha.faa
和 beta.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)
通常,通过对缺口进行惩罚可以获得更好的比对:打开缺口需要更高的成本,而扩展现有缺口需要更低的成本。对于氨基酸序列,匹配得分通常以 PAM
或 BLOSUM
等矩阵进行编码。因此,可以使用 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
。