【问题标题】:Is there a function that can calculate a score for aligned sequences given the alignment parameters?给定对齐参数,是否有可以计算对齐序列得分的函数?
【发布时间】:2011-04-16 11:39:53
【问题描述】:

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

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

给定参数

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

我确实看过 biopython 食谱,但我能得到的只是替换矩阵 blogsum62,但我觉得肯定有人已经实现了这种库。

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

提前谢谢

【问题讨论】:

  • 你为什么不直接爆破呢?你可以用 Biopython blastall 来做到这一点。

标签: python bioinformatics biopython


【解决方案1】:

杰萨达,

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。几乎肯定有更漂亮的方法来完成这一切,但这应该是一个好的开始。

【讨论】:

    【解决方案2】:

    blosum62 是 276 项的字典。

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

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

    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)))
    

    【讨论】:

    • 虽然我没有测试过,但这个答案的代码返回的结果是一样的,而且看起来比接受的答案要快得多
    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多