Wagtail Wagtail - 4 months ago 14
Python Question

BLOSUM62 (or 45) Scoring in JavaScript

I'm working with multiple sequence alignments while interfacing with several web-based APIs, so I have been doing most of my lightweight analysis in JavaScript. I'm currently trying to figure out how to calculate a BLOSUM62 score in JavaScript. There are lots of Python functions, like the following from Github:

#!/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()


Which uses the Blosum62 matrix:

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


However I am absolutely not sure (as a Python novice) how to translate this into JavaScript. Is there any JavaScript function for this? Or does anyone have a suggestion how to approach this?

Answer

This is not a full answer, but I made the blossum62 matrix into something javascript friendly so that hopefully you can write the scoring yourself (I don't understand how the scoring is done in the example code above)

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

Then you can do simple lookups using two indices like:

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

the matrix is symmetric, so the order of indexing doesn't matter

Edit for easier to read format:

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