7

我尝试对已经对齐的序列进行评分。让我们说

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE'
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE'

给定参数

substitution matrix : blosum62
gap open penalty : -5
gap extension penalty : -1

我确实浏览了 biopython 食谱,但我能得到的只是替换矩阵 blogsum62,但我觉得它必须有人已经实现了这种库。

那么任何人都可以建议任何可以解决我的问题的库或最短的代码吗?

提前谢谢

4

2 回答 2

11

杰萨达

Blosum62 矩阵(注意拼写;)在 Bio.SubsMat.MatrixInfo 中,是一个字典,元组解析为分数(因此('A', 'A')值得 4 分)。它没有间隙,它只是矩阵的一个三角形(所以它可能是('T','A')但不是('A','T')。Biopython中有一些辅助函数,包括Bio.Pairwise中的一些,但这是我想出的答案:

from Bio.SubsMat import MatrixInfo

def score_match(pair, matrix):
    if pair not in matrix:
        return matrix[(tuple(reversed(pair)))]
    else:
        return matrix[pair]

def score_pairwise(seq1, seq2, matrix, gap_s, gap_e):
    score = 0
    gap = False
    for i in range(len(seq1)):
        pair = (seq1[i], seq2[i])
        if not gap:
            if '-' in pair:
                gap = True
                score += gap_s
            else:
                score += score_match(pair, matrix)
        else:
            if '-' not in pair:
                gap = False
                score += score_match(pair, matrix)
            else:
                score += gap_e
    return score

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE'
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE'

blosum = MatrixInfo.blosum62

score_pairwise(seq1, seq2, blosum, -5, -1)

为您的对齐返回 82。几乎肯定有更漂亮的方法来完成所有这些,但这应该是一个好的开始。

于 2011-04-18T05:38:56.207 回答
9

blosum62 是 276 个项目的字典。

我更喜欢用缺少的项目来完成,因为它代表了只有 276 轮的迭代,而要分析的序列可能有超过 276 个元素。因此,如果您在函数 score_match() 的帮助下找到每对的分数,则该函数必须对 if pair not in matrix序列的每个元素执行测试,也就是说肯定远远超过 276 次。

另一件需要花费大量时间的事情:每个都score += something创建一个新整数并将名称分数绑定到这个新对象。每个绑定花费的时间量是由生成器立即添加到当前数量的整数流所不存在的。

from Bio.SubsMat.MatrixInfo import blosum62 as blosum
from itertools import izip

blosum.update(((b,a),val) for (a,b),val in blosum.items())

def score_pairwise(seq1, seq2, matrix, gap_s, gap_e, gap = True):
    for A,B in izip(seq1, seq2):
        diag = ('-'==A) or ('-'==B)
        yield (gap_e if gap else gap_s) if diag else matrix[(A,B)]
        gap = diag

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE'
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE'

print sum(score_pairwise(seq1, seq2, blosum, -5, -1))

这个 score_pairwise() 是一个生成器函数,因为有yield而不是return

编辑:Python 3 的更新代码:

from Bio.SubsMat.MatrixInfo import blosum62 as blosum

blosum.update(((b,a),val) for (a,b),val in list(blosum.items()))

def score_pairwise(seq1, seq2, matrix, gap_s, gap_e, gap = True):
    for A,B in zip(seq1, seq2):
        diag = ('-'==A) or ('-'==B)
        yield (gap_e if gap else gap_s) if diag else matrix[(A,B)]
        gap = diag

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE'
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE'

print(sum(score_pairwise(seq1, seq2, blosum, -5, -1)))
于 2011-04-18T20:49:38.640 回答