BLOSUM62(或45)用JavaScript评分

时间:2016-07-28 21:49:03

标签: javascript python alignment bioinformatics

我在处理多个基于Web的API时使用多个序列比对,因此我在JavaScript中进行了大部分轻量级分析。我目前正试图弄清楚如何计算JavaScript中的BLOSUM62分数。有许多Python函数,如Github中的以下内容:

math::vec3

使用Blosum62矩阵:

#!/usr/bin/env python
# Usage: python blosum.py blosum62.txt
#        Then, enter input in "row col" format -- e..g, "s f".
import sys

class InvalidPairException(Exception):
  pass

class Matrix:
  def __init__(self, matrix_filename):
    self._load_matrix(matrix_filename)

  def _load_matrix(self, matrix_filename):
    with open(matrix_filename) as matrix_file:
      matrix = matrix_file.read()
    lines = matrix.strip().split('\n')

    header = lines.pop(0)
    columns = header.split()
    matrix = {}

    for row in lines:
      entries = row.split()
      row_name = entries.pop(0)
      matrix[row_name] = {}

      if len(entries) != len(columns):
        raise Exception('Improper entry number in row')
      for column_name in columns:
        matrix[row_name][column_name] = entries.pop(0)

    self._matrix = matrix

  def lookup_score(self, a, b):
    a = a.upper()
    b = b.upper()

    if a not in self._matrix or b not in self._matrix[a]:
      raise InvalidPairException('[%s, %s]' % (a, b))
    return self._matrix[a][b]


def run_repl(matrix):
  while True:
    try:
      user_input = input('>>> ').strip()
    except (EOFError, KeyboardInterrupt) as e:
      print()
      return
    if user_input.lower() in ['q', 'exit', 'quit']:
      return

    components = user_input.split()
    if len(components) != 2:
      continue
    try:
      print(matrix.lookup_score(components[0], components[1]))
    except InvalidPairException:
      continue

def main():
  if len(sys.argv) != 2:
    sys.exit('Usage: %s [matrix filename]')
  matrix_filename = sys.argv[1]
  matrix = Matrix(matrix_filename)
  run_repl(matrix)

if __name__ == '__main__':
  main()

但是我绝对不确定(作为Python新手)如何将其转换为JavaScript。这有什么JavaScript功能吗?或者有人建议如何处理这个问题吗?

1 个答案:

答案 0 :(得分:2)

这不是一个完整的答案,但我将blossum62矩阵变成了javascript友好的东西,所以希望你能自己编写得分(我不明白在上面的示例代码中如何完成得分)

var blossum62 = {'*': {'*': 1, 'A': -4, 'C': -4, 'B': -4, 'E': -4, 'D': -4, 'G': -4, 'F': -4, 'I': -4, 'H': -4, 'K': -4, 'M': -4, 'L': -4, 'N': -4, 'Q': -4, 'P': -4, 'S': -4, 'R': -4, 'T': -4, 'W': -4, 'V': -4, 'Y': -4, 'X': -4, 'Z': -4}, 'A': {'*': -4, 'A': 4, 'C': 0, 'B': -2, 'E': -1, 'D': -2, 'G': 0, 'F': -2, 'I': -1, 'H': -2, 'K': -1, 'M': -1, 'L': -1, 'N': -2, 'Q': -1, 'P': -1, 'S': 1, 'R': -1, 'T': 0, 'W': -3, 'V': 0, 'Y': -2, 'X': 0, 'Z': -1}, 'C': {'*': -4, 'A': 0, 'C': 9, 'B': -3, 'E': -4, 'D': -3, 'G': -3, 'F': -2, 'I': -1, 'H': -3, 'K': -3, 'M': -1, 'L': -1, 'N': -3, 'Q': -3, 'P': -3, 'S': -1, 'R': -3, 'T': -1, 'W': -2, 'V': -1, 'Y': -2, 'X': -2, 'Z': -3}, 'B': {'*': -4, 'A': -2, 'C': -3, 'B': 4, 'E': 1, 'D': 4, 'G': -1, 'F': -3, 'I': -3, 'H': 0, 'K': 0, 'M': -3, 'L': -4, 'N': 3, 'Q': 0, 'P': -2, 'S': 0, 'R': -1, 'T': -1, 'W': -4, 'V': -3, 'Y': -3, 'X': -1, 'Z': 1}, 'E': {'*': -4, 'A': -1, 'C': -4, 'B': 1, 'E': 5, 'D': 2, 'G': -2, 'F': -3, 'I': -3, 'H': 0, 'K': 1, 'M': -2, 'L': -3, 'N': 0, 'Q': 2, 'P': -1, 'S': 0, 'R': 0, 'T': -1, 'W': -3, 'V': -2, 'Y': -2, 'X': -1, 'Z': 4}, 'D': {'*': -4, 'A': -2, 'C': -3, 'B': 4, 'E': 2, 'D': 6, 'G': -1, 'F': -3, 'I': -3, 'H': -1, 'K': -1, 'M': -3, 'L': -4, 'N': 1, 'Q': 0, 'P': -1, 'S': 0, 'R': -2, 'T': -1, 'W': -4, 'V': -3, 'Y': -3, 'X': -1, 'Z': 1}, 'G': {'*': -4, 'A': 0, 'C': -3, 'B': -1, 'E': -2, 'D': -1, 'G': 6, 'F': -3, 'I': -4, 'H': -2, 'K': -2, 'M': -3, 'L': -4, 'N': 0, 'Q': -2, 'P': -2, 'S': 0, 'R': -2, 'T': -2, 'W': -2, 'V': -3, 'Y': -3, 'X': -1, 'Z': -2}, 'F': {'*': -4, 'A': -2, 'C': -2, 'B': -3, 'E': -3, 'D': -3, 'G': -3, 'F': 6, 'I': 0, 'H': -1, 'K': -3, 'M': 0, 'L': 0, 'N': -3, 'Q': -3, 'P': -4, 'S': -2, 'R': -3, 'T': -2, 'W': 1, 'V': -1, 'Y': 3, 'X': -1, 'Z': -3}, 'I': {'*': -4, 'A': -1, 'C': -1, 'B': -3, 'E': -3, 'D': -3, 'G': -4, 'F': 0, 'I': 4, 'H': -3, 'K': -3, 'M': 1, 'L': 2, 'N': -3, 'Q': -3, 'P': -3, 'S': -2, 'R': -3, 'T': -1, 'W': -3, 'V': 3, 'Y': -1, 'X': -1, 'Z': -3}, 'H': {'*': -4, 'A': -2, 'C': -3, 'B': 0, 'E': 0, 'D': -1, 'G': -2, 'F': -1, 'I': -3, 'H': 8, 'K': -1, 'M': -2, 'L': -3, 'N': 1, 'Q': 0, 'P': -2, 'S': -1, 'R': 0, 'T': -2, 'W': -2, 'V': -3, 'Y': 2, 'X': -1, 'Z': 0}, 'K': {'*': -4, 'A': -1, 'C': -3, 'B': 0, 'E': 1, 'D': -1, 'G': -2, 'F': -3, 'I': -3, 'H': -1, 'K': 5, 'M': -1, 'L': -2, 'N': 0, 'Q': 1, 'P': -1, 'S': 0, 'R': 2, 'T': -1, 'W': -3, 'V': -2, 'Y': -2, 'X': -1, 'Z': 1}, 'M': {'*': -4, 'A': -1, 'C': -1, 'B': -3, 'E': -2, 'D': -3, 'G': -3, 'F': 0, 'I': 1, 'H': -2, 'K': -1, 'M': 5, 'L': 2, 'N': -2, 'Q': 0, 'P': -2, 'S': -1, 'R': -1, 'T': -1, 'W': -1, 'V': 1, 'Y': -1, 'X': -1, 'Z': -1}, 'L': {'*': -4, 'A': -1, 'C': -1, 'B': -4, 'E': -3, 'D': -4, 'G': -4, 'F': 0, 'I': 2, 'H': -3, 'K': -2, 'M': 2, 'L': 4, 'N': -3, 'Q': -2, 'P': -3, 'S': -2, 'R': -2, 'T': -1, 'W': -2, 'V': 1, 'Y': -1, 'X': -1, 'Z': -3}, 'N': {'*': -4, 'A': -2, 'C': -3, 'B': 3, 'E': 0, 'D': 1, 'G': 0, 'F': -3, 'I': -3, 'H': 1, 'K': 0, 'M': -2, 'L': -3, 'N': 6, 'Q': 0, 'P': -2, 'S': 1, 'R': 0, 'T': 0, 'W': -4, 'V': -3, 'Y': -2, 'X': -1, 'Z': 0}, 'Q': {'*': -4, 'A': -1, 'C': -3, 'B': 0, 'E': 2, 'D': 0, 'G': -2, 'F': -3, 'I': -3, 'H': 0, 'K': 1, 'M': 0, 'L': -2, 'N': 0, 'Q': 5, 'P': -1, 'S': 0, 'R': 1, 'T': -1, 'W': -2, 'V': -2, 'Y': -1, 'X': -1, 'Z': 3}, 'P': {'*': -4, 'A': -1, 'C': -3, 'B': -2, 'E': -1, 'D': -1, 'G': -2, 'F': -4, 'I': -3, 'H': -2, 'K': -1, 'M': -2, 'L': -3, 'N': -2, 'Q': -1, 'P': 7, 'S': -1, 'R': -2, 'T': -1, 'W': -4, 'V': -2, 'Y': -3, 'X': -2, 'Z': -1}, 'S': {'*': -4, 'A': 1, 'C': -1, 'B': 0, 'E': 0, 'D': 0, 'G': 0, 'F': -2, 'I': -2, 'H': -1, 'K': 0, 'M': -1, 'L': -2, 'N': 1, 'Q': 0, 'P': -1, 'S': 4, 'R': -1, 'T': 1, 'W': -3, 'V': -2, 'Y': -2, 'X': 0, 'Z': 0}, 'R': {'*': -4, 'A': -1, 'C': -3, 'B': -1, 'E': 0, 'D': -2, 'G': -2, 'F': -3, 'I': -3, 'H': 0, 'K': 2, 'M': -1, 'L': -2, 'N': 0, 'Q': 1, 'P': -2, 'S': -1, 'R': 5, 'T': -1, 'W': -3, 'V': -3, 'Y': -2, 'X': -1, 'Z': 0}, 'T': {'*': -4, 'A': 0, 'C': -1, 'B': -1, 'E': -1, 'D': -1, 'G': -2, 'F': -2, 'I': -1, 'H': -2, 'K': -1, 'M': -1, 'L': -1, 'N': 0, 'Q': -1, 'P': -1, 'S': 1, 'R': -1, 'T': 5, 'W': -2, 'V': 0, 'Y': -2, 'X': 0, 'Z': -1}, 'W': {'*': -4, 'A': -3, 'C': -2, 'B': -4, 'E': -3, 'D': -4, 'G': -2, 'F': 1, 'I': -3, 'H': -2, 'K': -3, 'M': -1, 'L': -2, 'N': -4, 'Q': -2, 'P': -4, 'S': -3, 'R': -3, 'T': -2, 'W': 11, 'V': -3, 'Y': 2, 'X': -2, 'Z': -3}, 'V': {'*': -4, 'A': 0, 'C': -1, 'B': -3, 'E': -2, 'D': -3, 'G': -3, 'F': -1, 'I': 3, 'H': -3, 'K': -2, 'M': 1, 'L': 1, 'N': -3, 'Q': -2, 'P': -2, 'S': -2, 'R': -3, 'T': 0, 'W': -3, 'V': 4, 'Y': -1, 'X': -1, 'Z': -2}, 'Y': {'*': -4, 'A': -2, 'C': -2, 'B': -3, 'E': -2, 'D': -3, 'G': -3, 'F': 3, 'I': -1, 'H': 2, 'K': -2, 'M': -1, 'L': -1, 'N': -2, 'Q': -1, 'P': -3, 'S': -2, 'R': -2, 'T': -2, 'W': 2, 'V': -1, 'Y': 7, 'X': -1, 'Z': -2}, 'X': {'*': -4, 'A': 0, 'C': -2, 'B': -1, 'E': -1, 'D': -1, 'G': -1, 'F': -1, 'I': -1, 'H': -1, 'K': -1, 'M': -1, 'L': -1, 'N': -1, 'Q': -1, 'P': -2, 'S': 0, 'R': -1, 'T': 0, 'W': -2, 'V': -1, 'Y': -1, 'X': -1, 'Z': -1}, 'Z': {'*': -4, 'A': -1, 'C': -3, 'B': 1, 'E': 4, 'D': 1, 'G': -2, 'F': -3, 'I': -3, 'H': 0, 'K': 1, 'M': -1, 'L': -3, 'N': 0, 'Q': 3, 'P': -1, 'S': 0, 'R': 0, 'T': -1, 'W': -3, 'V': -2, 'Y': -2, 'X': -1, 'Z': 4}}

然后你可以使用两个索引进行简单的查找:

blossum62["A"]["R"]
-1

矩阵是对称的,因此索引的顺序并不重要

编辑以便于阅读格式:

var blossum62 = {
            '*':{'*':  1, 'A': -4, 'C': -4, 'B': -4, 'E': -4,
                  'D': -4, 'G': -4, 'F': -4, 'I': -4, 'H': -4,
                  'K': -4, 'M': -4, 'L': -4, 'N': -4, 'Q': -4,
                  'P': -4, 'S': -4, 'R': -4, 'T': -4, 'W': -4,
                  'V': -4, 'Y': -4, 'X': -4, 'Z': -4},

             'A':{'*': -4, 'A':  4, 'C':  0, 'B': -2, 'E': -1,
                  'D': -2, 'G':  0, 'F': -2, 'I': -1, 'H': -2,
                  'K': -1, 'M': -1, 'L': -1, 'N': -2, 'Q': -1,
                  'P': -1, 'S':  1, 'R': -1, 'T':  0, 'W': -3,
                  'V':  0, 'Y': -2, 'X':  0, 'Z': -1},

             'C':{'*': -4, 'A':  0, 'C':  9, 'B': -3, 'E': -4,
                  'D': -3, 'G': -3, 'F': -2, 'I': -1, 'H': -3,
                  'K': -3, 'M': -1, 'L': -1, 'N': -3, 'Q': -3,
                  'P': -3, 'S': -1, 'R': -3, 'T': -1, 'W': -2,
                  'V': -1, 'Y': -2, 'X': -2, 'Z': -3},

             'B':{'*': -4, 'A': -2, 'C': -3, 'B':  4, 'E':  1,
                  'D':  4, 'G': -1, 'F': -3, 'I': -3, 'H':  0,
                  'K':  0, 'M': -3, 'L': -4, 'N':  3, 'Q':  0,
                  'P': -2, 'S':  0, 'R': -1, 'T': -1, 'W': -4,
                  'V': -3, 'Y': -3, 'X': -1, 'Z':  1},

             'E':{'*': -4, 'A': -1, 'C': -4, 'B':  1, 'E':  5,
                  'D':  2, 'G': -2, 'F': -3, 'I': -3, 'H':  0,
                  'K':  1, 'M': -2, 'L': -3, 'N':  0, 'Q':  2,
                  'P': -1, 'S':  0, 'R':  0, 'T': -1, 'W': -3,
                  'V': -2, 'Y': -2, 'X': -1, 'Z':  4},

             'D':{'*': -4, 'A': -2, 'C': -3, 'B':  4, 'E':  2,
                  'D':  6, 'G': -1, 'F': -3, 'I': -3, 'H': -1,
                  'K': -1, 'M': -3, 'L': -4, 'N':  1, 'Q':  0,
                  'P': -1, 'S':  0, 'R': -2, 'T': -1, 'W': -4,
                  'V': -3, 'Y': -3, 'X': -1, 'Z':  1},

             'G':{'*': -4, 'A':  0, 'C': -3, 'B': -1, 'E': -2,
                  'D': -1, 'G':  6, 'F': -3, 'I': -4, 'H': -2,
                  'K': -2, 'M': -3, 'L': -4, 'N':  0, 'Q': -2,
                  'P': -2, 'S':  0, 'R': -2, 'T': -2, 'W': -2,
                  'V': -3, 'Y': -3, 'X': -1, 'Z': -2},

             'F':{'*': -4, 'A': -2, 'C': -2, 'B': -3, 'E': -3,
                  'D': -3, 'G': -3, 'F':  6, 'I':  0, 'H': -1,
                  'K': -3, 'M':  0, 'L':  0, 'N': -3, 'Q': -3,
                  'P': -4, 'S': -2, 'R': -3, 'T': -2, 'W':  1,
                  'V': -1, 'Y':  3, 'X': -1, 'Z': -3},

             'I':{'*': -4, 'A': -1, 'C': -1, 'B': -3, 'E': -3,
                  'D': -3, 'G': -4, 'F':  0, 'I':  4, 'H': -3,
                  'K': -3, 'M':  1, 'L':  2, 'N': -3, 'Q': -3,
                  'P': -3, 'S': -2, 'R': -3, 'T': -1, 'W': -3,
                  'V':  3, 'Y': -1, 'X': -1, 'Z': -3},

             'H':{'*': -4, 'A': -2, 'C': -3, 'B':  0, 'E':  0,
                  'D': -1, 'G': -2, 'F': -1, 'I': -3, 'H':  8,
                  'K': -1, 'M': -2, 'L': -3, 'N':  1, 'Q':  0,
                  'P': -2, 'S': -1, 'R':  0, 'T': -2, 'W': -2,
                  'V': -3, 'Y':  2, 'X': -1, 'Z':  0},

             'K':{'*': -4, 'A': -1, 'C': -3, 'B':  0, 'E':  1,
                  'D': -1, 'G': -2, 'F': -3, 'I': -3, 'H': -1,
                  'K':  5, 'M': -1, 'L': -2, 'N':  0, 'Q':  1,
                  'P': -1, 'S':  0, 'R':  2, 'T': -1, 'W': -3,
                  'V': -2, 'Y': -2, 'X': -1, 'Z':  1},

             'M':{'*': -4, 'A': -1, 'C': -1, 'B': -3, 'E': -2,
                  'D': -3, 'G': -3, 'F':  0, 'I':  1, 'H': -2,
                  'K': -1, 'M':  5, 'L':  2, 'N': -2, 'Q':  0,
                  'P': -2, 'S': -1, 'R': -1, 'T': -1, 'W': -1,
                  'V':  1, 'Y': -1, 'X': -1, 'Z': -1},

             'L':{'*': -4, 'A': -1, 'C': -1, 'B': -4, 'E': -3,
                  'D': -4, 'G': -4, 'F':  0, 'I':  2, 'H': -3,
                  'K': -2, 'M':  2, 'L':  4, 'N': -3, 'Q': -2,
                  'P': -3, 'S': -2, 'R': -2, 'T': -1, 'W': -2,
                  'V':  1, 'Y': -1, 'X': -1, 'Z': -3},

             'N':{'*': -4, 'A': -2, 'C': -3, 'B':  3, 'E':  0,
                  'D':  1, 'G':  0, 'F': -3, 'I': -3, 'H':  1,
                  'K':  0, 'M': -2, 'L': -3, 'N':  6, 'Q':  0,
                  'P': -2, 'S':  1, 'R':  0, 'T':  0, 'W': -4,
                  'V': -3, 'Y': -2, 'X': -1, 'Z':  0},

             'Q':{'*': -4, 'A': -1, 'C': -3, 'B':  0, 'E':  2,
                  'D':  0, 'G': -2, 'F': -3, 'I': -3, 'H':  0,
                  'K':  1, 'M':  0, 'L': -2, 'N':  0, 'Q':  5,
                  'P': -1, 'S':  0, 'R':  1, 'T': -1, 'W': -2,
                  'V': -2, 'Y': -1, 'X': -1, 'Z':  3},

             'P':{'*': -4, 'A': -1, 'C': -3, 'B': -2, 'E': -1,
                  'D': -1, 'G': -2, 'F': -4, 'I': -3, 'H': -2,
                  'K': -1, 'M': -2, 'L': -3, 'N': -2, 'Q': -1,
                  'P':  7, 'S': -1, 'R': -2, 'T': -1, 'W': -4,
                  'V': -2, 'Y': -3, 'X': -2, 'Z': -1},

             'S':{'*': -4, 'A':  1, 'C': -1, 'B':  0, 'E':  0,
                  'D':  0, 'G':  0, 'F': -2, 'I': -2, 'H': -1,
                  'K':  0, 'M': -1, 'L': -2, 'N':  1, 'Q':  0,
                  'P': -1, 'S':  4, 'R': -1, 'T':  1, 'W': -3,
                  'V': -2, 'Y': -2, 'X':  0, 'Z':  0},

             'R':{'*': -4, 'A': -1, 'C': -3, 'B': -1, 'E':  0,
                  'D': -2, 'G': -2, 'F': -3, 'I': -3, 'H':  0,
                  'K':  2, 'M': -1, 'L': -2, 'N':  0, 'Q':  1,
                  'P': -2, 'S': -1, 'R':  5, 'T': -1, 'W': -3,
                  'V': -3, 'Y': -2, 'X': -1, 'Z':  0},

             'T':{'*': -4, 'A':  0, 'C': -1, 'B': -1, 'E': -1,
                  'D': -1, 'G': -2, 'F': -2, 'I': -1, 'H': -2,
                  'K': -1, 'M': -1, 'L': -1, 'N':  0, 'Q': -1,
                  'P': -1, 'S':  1, 'R': -1, 'T':  5, 'W': -2,
                  'V':  0, 'Y': -2, 'X':  0, 'Z': -1},

             'W':{'*': -4, 'A': -3, 'C': -2, 'B': -4, 'E': -3,
                  'D': -4, 'G': -2, 'F':  1, 'I': -3, 'H': -2,
                  'K': -3, 'M': -1, 'L': -2, 'N': -4, 'Q': -2,
                  'P': -4, 'S': -3, 'R': -3, 'T': -2, 'W': 11,
                  'V': -3, 'Y':  2, 'X': -2, 'Z': -3},

             'V':{'*': -4, 'A':  0, 'C': -1, 'B': -3, 'E': -2,
                  'D': -3, 'G': -3, 'F': -1, 'I':  3, 'H': -3,
                  'K': -2, 'M':  1, 'L':  1, 'N': -3, 'Q': -2,
                  'P': -2, 'S': -2, 'R': -3, 'T':  0, 'W': -3,
                  'V':  4, 'Y': -1, 'X': -1, 'Z': -2},

             'Y':{'*': -4, 'A': -2, 'C': -2, 'B': -3, 'E': -2,
                  'D': -3, 'G': -3, 'F':  3, 'I': -1, 'H':  2,
                  'K': -2, 'M': -1, 'L': -1, 'N': -2, 'Q': -1,
                  'P': -3, 'S': -2, 'R': -2, 'T': -2, 'W':  2,
                  'V': -1, 'Y':  7, 'X': -1, 'Z': -2},

             'X':{'*': -4, 'A':  0, 'C': -2, 'B': -1, 'E': -1,
                  'D': -1, 'G': -1, 'F': -1, 'I': -1, 'H': -1,
                  'K': -1, 'M': -1, 'L': -1, 'N': -1, 'Q': -1,
                  'P': -2, 'S':  0, 'R': -1, 'T':  0, 'W': -2,
                  'V': -1, 'Y': -1, 'X': -1, 'Z': -1},

             'Z':{'*': -4, 'A': -1, 'C': -3, 'B':  1, 'E':  4,
                  'D':  1, 'G': -2, 'F': -3, 'I': -3, 'H':  0,
                  'K':  1, 'M': -1, 'L': -3, 'N':  0, 'Q':  3,
                  'P': -1, 'S':  0, 'R':  0, 'T': -1, 'W': -3,
                  'V': -2, 'Y': -2, 'X': -1, 'Z': 4}}