Next version of JABA
[jabaws.git] / binaries / src / muscle / scorepp.cpp
1 #include "muscle.h"\r
2 #include "profile.h"\r
3 \r
4 char ConsensusChar(const ProfPos &PP)\r
5         {\r
6         unsigned uMostCommonLetter = 0;\r
7         FCOUNT fcMostCommon = PP.m_fcCounts[0];\r
8         bool bMoreThanOneLetter = false;\r
9         bool bAnyLetter = false;\r
10         for (unsigned uLetter = 0; uLetter < g_AlphaSize; ++uLetter)\r
11                 {\r
12                 const FCOUNT fc = PP.m_fcCounts[uLetter];\r
13                 if (fc > 0)\r
14                         {\r
15                         if (bAnyLetter)\r
16                                 bMoreThanOneLetter = true;\r
17                         bAnyLetter = true;\r
18                         }\r
19                 if (fc > fcMostCommon)\r
20                         {\r
21                         uMostCommonLetter = uLetter;\r
22                         fcMostCommon = fc;\r
23                         }\r
24                 }\r
25         if (!bAnyLetter)\r
26                 return '-';\r
27         char c = LetterToChar(uMostCommonLetter);\r
28         if (bMoreThanOneLetter)\r
29                 return UnalignChar(c);\r
30         return c;\r
31         }\r
32 \r
33 SCORE ScoreProfPos2LA(const ProfPos &PPA, const ProfPos &PPB)\r
34         {\r
35         SCORE Score = 0;\r
36         for (unsigned n = 0; n < 20; ++n)\r
37                 {\r
38                 const unsigned uLetter = PPA.m_uSortOrder[n];\r
39                 const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
40                 if (0 == fcLetter)\r
41                         break;\r
42                 Score += fcLetter*PPB.m_AAScores[uLetter];\r
43                 }\r
44         if (0 == Score)\r
45                 return -2.5;\r
46         SCORE logScore = logf(Score);\r
47         return (SCORE) ((logScore - g_scoreCenter)*(PPA.m_fOcc * PPB.m_fOcc));\r
48         }\r
49 \r
50 SCORE ScoreProfPos2NS(const ProfPos &PPA, const ProfPos &PPB)\r
51         {\r
52         SCORE Score = 0;\r
53         for (unsigned n = 0; n < 20; ++n)\r
54                 {\r
55                 const unsigned uLetter = PPA.m_uSortOrder[n];\r
56                 const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
57                 if (0 == fcLetter)\r
58                         break;\r
59                 Score += fcLetter*PPB.m_AAScores[uLetter];\r
60                 }\r
61         return Score - g_scoreCenter;\r
62         }\r
63 \r
64 SCORE ScoreProfPos2SP(const ProfPos &PPA, const ProfPos &PPB)\r
65         {\r
66         SCORE Score = 0;\r
67         for (unsigned n = 0; n < 20; ++n)\r
68                 {\r
69                 const unsigned uLetter = PPA.m_uSortOrder[n];\r
70                 const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
71                 if (0 == fcLetter)\r
72                         break;\r
73                 Score += fcLetter*PPB.m_AAScores[uLetter];\r
74                 }\r
75         return Score - g_scoreCenter;\r
76         }\r
77 \r
78 SCORE ScoreProfPos2SPN(const ProfPos &PPA, const ProfPos &PPB)\r
79         {\r
80         SCORE Score = 0;\r
81         for (unsigned n = 0; n < 4; ++n)\r
82                 {\r
83                 const unsigned uLetter = PPA.m_uSortOrder[n];\r
84                 const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
85                 if (0 == fcLetter)\r
86                         break;\r
87                 Score += fcLetter*PPB.m_AAScores[uLetter];\r
88                 }\r
89         return Score - g_scoreCenter;\r
90         }\r
91 \r
92 SCORE ScoreProfPos2(const ProfPos &PPA, const ProfPos &PPB)\r
93         {\r
94         if (PPSCORE_SP == g_PPScore)\r
95                 return ScoreProfPos2NS(PPA, PPB);\r
96         else if (PPSCORE_LE == g_PPScore)\r
97                 return ScoreProfPos2LA(PPA, PPB);\r
98         else if (PPSCORE_SV == g_PPScore)\r
99                 return ScoreProfPos2SP(PPA, PPB);\r
100         else if (PPSCORE_SPN == g_PPScore)\r
101                 return ScoreProfPos2SPN(PPA, PPB);\r
102         Quit("Invalid g_PPScore");\r
103         return 0;\r
104         }\r