4 static int Blosum62[23][23] =
\r
6 // A B C D E F G H I K L M N P Q R S T V W X Y Z
\r
7 +4, -2, +0, -2, -1, -2, +0, -2, -1, -1, -1, -1, -2, -1, -1, -1, +1, +0, +0, -3, -1, -2, -1, // A
\r
8 -2, +6, -3, +6, +2, -3, -1, -1, -3, -1, -4, -3, +1, -1, +0, -2, +0, -1, -3, -4, -1, -3, +2, // B
\r
9 +0, -3, +9, -3, -4, -2, -3, -3, -1, -3, -1, -1, -3, -3, -3, -3, -1, -1, -1, -2, -1, -2, -4, // C
\r
10 -2, +6, -3, +6, +2, -3, -1, -1, -3, -1, -4, -3, +1, -1, +0, -2, +0, -1, -3, -4, -1, -3, +2, // D
\r
11 -1, +2, -4, +2, +5, -3, -2, +0, -3, +1, -3, -2, +0, -1, +2, +0, +0, -1, -2, -3, -1, -2, +5, // E
\r
13 -2, -3, -2, -3, -3, +6, -3, -1, +0, -3, +0, +0, -3, -4, -3, -3, -2, -2, -1, +1, -1, +3, -3, // F
\r
14 +0, -1, -3, -1, -2, -3, +6, -2, -4, -2, -4, -3, +0, -2, -2, -2, +0, -2, -3, -2, -1, -3, -2, // G
\r
15 -2, -1, -3, -1, +0, -1, -2, +8, -3, -1, -3, -2, +1, -2, +0, +0, -1, -2, -3, -2, -1, +2, +0, // H
\r
16 -1, -3, -1, -3, -3, +0, -4, -3, +4, -3, +2, +1, -3, -3, -3, -3, -2, -1, +3, -3, -1, -1, -3, // I
\r
17 -1, -1, -3, -1, +1, -3, -2, -1, -3, +5, -2, -1, +0, -1, +1, +2, +0, -1, -2, -3, -1, -2, +1, // K
\r
19 -1, -4, -1, -4, -3, +0, -4, -3, +2, -2, +4, +2, -3, -3, -2, -2, -2, -1, +1, -2, -1, -1, -3, // L
\r
20 -1, -3, -1, -3, -2, +0, -3, -2, +1, -1, +2, +5, -2, -2, +0, -1, -1, -1, +1, -1, -1, -1, -2, // M
\r
21 -2, +1, -3, +1, +0, -3, +0, +1, -3, +0, -3, -2, +6, -2, +0, +0, +1, +0, -3, -4, -1, -2, +0, // N
\r
22 -1, -1, -3, -1, -1, -4, -2, -2, -3, -1, -3, -2, -2, +7, -1, -2, -1, -1, -2, -4, -1, -3, -1, // P
\r
23 -1, +0, -3, +0, +2, -3, -2, +0, -3, +1, -2, +0, +0, -1, +5, +1, +0, -1, -2, -2, -1, -1, +2, // Q
\r
25 -1, -2, -3, -2, +0, -3, -2, +0, -3, +2, -2, -1, +0, -2, +1, +5, -1, -1, -3, -3, -1, -2, +0, // R
\r
26 +1, +0, -1, +0, +0, -2, +0, -1, -2, +0, -2, -1, +1, -1, +0, -1, +4, +1, -2, -3, -1, -2, +0, // S
\r
27 +0, -1, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, +0, -1, -1, -1, +1, +5, +0, -2, -1, -2, -1, // T
\r
28 +0, -3, -1, -3, -2, -1, -3, -3, +3, -2, +1, +1, -3, -2, -2, -3, -2, +0, +4, -3, -1, -1, -2, // V
\r
29 -3, -4, -2, -4, -3, +1, -2, -2, -3, -3, -2, -1, -4, -4, -2, -3, -3, -2, -3,+11, -1, +2, -3, // W
\r
31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // X
\r
32 -2, -3, -2, -3, -2, +3, -3, +2, -1, -2, -1, -1, -2, -3, -1, -2, -2, -2, -1, +2, -1, +7, -2, // Y
\r
33 -1, +2, -4, +2, +5, -3, -2, +0, -3, +1, -3, -2, +0, -1, +2, +0, +0, -1, -2, -3, -1, -2, +5, // Z
\r
36 static int toi_tab[26] =
\r
66 static int toi(char c)
\r
69 return toi_tab[c - 'A'];
\r
72 static int BlosumScore(char c1, char c2)
\r
76 return Blosum62[i1][i2];
\r
80 Consider a column with 5 As and 3 Bs.
\r
85 8x7 = 5x4 + 3x2 + 5x3x2 pairs of letters
\r
87 static double BlosumScoreCol(const MSA &a, unsigned uColIndex)
\r
90 memset(iCounts, 0, sizeof(iCounts));
\r
91 const unsigned uSeqCount = a.GetSeqCount();
\r
92 unsigned uCharCount = 0;
\r
93 for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCount; ++uSeqIndex)
\r
95 char c = a.GetChar(uSeqIndex, uColIndex);
\r
102 if (uCharCount < 2)
\r
104 int iTotalScore = 0;
\r
105 for (int i1 = 0; i1 < 23; ++i1)
\r
107 int iCounts1 = iCounts[i1];
\r
108 iTotalScore += iCounts1*(iCounts1 - 1)*Blosum62[i1][i1];
\r
109 for (int i2 = i1 + 1; i2 < 23; ++i2)
\r
110 iTotalScore += iCounts[i2]*iCounts1*2*Blosum62[i1][i2];
\r
112 int iPairCount = uCharCount*(uCharCount - 1);
\r
113 return (double) iTotalScore / (double) iPairCount;
\r
117 Consider a column with 5 As and 3 Bs.
\r
118 A residue of type Q scores:
\r
121 static void AssignColorsCol(const MSA &a, unsigned uColIndex, int **Colors)
\r
124 memset(iCounts, 0, sizeof(iCounts));
\r
125 const unsigned uSeqCount = a.GetSeqCount();
\r
126 unsigned uCharCount = 0;
\r
127 for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCount; ++uSeqIndex)
\r
129 char c = a.GetChar(uSeqIndex, uColIndex);
\r
132 int iChar = toi(c);
\r
136 int iMostConservedType = -1;
\r
137 int iMostConservedCount = -1;
\r
138 for (unsigned i = 0; i < 23; ++i)
\r
140 if (iCounts[i] > iMostConservedCount)
\r
142 iMostConservedType = i;
\r
143 iMostConservedCount = iCounts[i];
\r
147 double dColScore = BlosumScoreCol(a, uColIndex);
\r
149 if (dColScore >= 3.0)
\r
151 //else if (dColScore >= 1.0)
\r
153 else if (dColScore >= 0.2)
\r
159 for (unsigned uLetter = 0; uLetter < 23; ++uLetter)
\r
161 double dScore = Blosum62[uLetter][iMostConservedType];
\r
162 if (dScore >= dColScore)
\r
163 Color[uLetter] = c;
\r
165 Color[uLetter] = 0;
\r
168 for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCount; ++uSeqIndex)
\r
170 char c = a.GetChar(uSeqIndex, uColIndex);
\r
173 Colors[uSeqIndex][uColIndex] = 0;
\r
176 int iLetter = toi(c);
\r
177 if (iLetter >= 0 && iLetter < 23)
\r
178 Colors[uSeqIndex][uColIndex] = Color[iLetter];
\r
180 Colors[uSeqIndex][uColIndex] = 0;
\r
184 void AssignColors(const MSA &a, int **Colors)
\r
186 const unsigned uColCount = a.GetColCount();
\r
187 for (unsigned uColIndex = 0; uColIndex < uColCount; ++uColIndex)
\r
188 AssignColorsCol(a, uColIndex, Colors);
\r