--- /dev/null
+#include "muscle.h"\r
+#include "profile.h"\r
+\r
+char ConsensusChar(const ProfPos &PP)\r
+ {\r
+ unsigned uMostCommonLetter = 0;\r
+ FCOUNT fcMostCommon = PP.m_fcCounts[0];\r
+ bool bMoreThanOneLetter = false;\r
+ bool bAnyLetter = false;\r
+ for (unsigned uLetter = 0; uLetter < g_AlphaSize; ++uLetter)\r
+ {\r
+ const FCOUNT fc = PP.m_fcCounts[uLetter];\r
+ if (fc > 0)\r
+ {\r
+ if (bAnyLetter)\r
+ bMoreThanOneLetter = true;\r
+ bAnyLetter = true;\r
+ }\r
+ if (fc > fcMostCommon)\r
+ {\r
+ uMostCommonLetter = uLetter;\r
+ fcMostCommon = fc;\r
+ }\r
+ }\r
+ if (!bAnyLetter)\r
+ return '-';\r
+ char c = LetterToChar(uMostCommonLetter);\r
+ if (bMoreThanOneLetter)\r
+ return UnalignChar(c);\r
+ return c;\r
+ }\r
+\r
+SCORE ScoreProfPos2LA(const ProfPos &PPA, const ProfPos &PPB)\r
+ {\r
+ SCORE Score = 0;\r
+ for (unsigned n = 0; n < 20; ++n)\r
+ {\r
+ const unsigned uLetter = PPA.m_uSortOrder[n];\r
+ const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
+ if (0 == fcLetter)\r
+ break;\r
+ Score += fcLetter*PPB.m_AAScores[uLetter];\r
+ }\r
+ if (0 == Score)\r
+ return -2.5;\r
+ SCORE logScore = logf(Score);\r
+ return (SCORE) ((logScore - g_scoreCenter)*(PPA.m_fOcc * PPB.m_fOcc));\r
+ }\r
+\r
+SCORE ScoreProfPos2NS(const ProfPos &PPA, const ProfPos &PPB)\r
+ {\r
+ SCORE Score = 0;\r
+ for (unsigned n = 0; n < 20; ++n)\r
+ {\r
+ const unsigned uLetter = PPA.m_uSortOrder[n];\r
+ const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
+ if (0 == fcLetter)\r
+ break;\r
+ Score += fcLetter*PPB.m_AAScores[uLetter];\r
+ }\r
+ return Score - g_scoreCenter;\r
+ }\r
+\r
+SCORE ScoreProfPos2SP(const ProfPos &PPA, const ProfPos &PPB)\r
+ {\r
+ SCORE Score = 0;\r
+ for (unsigned n = 0; n < 20; ++n)\r
+ {\r
+ const unsigned uLetter = PPA.m_uSortOrder[n];\r
+ const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
+ if (0 == fcLetter)\r
+ break;\r
+ Score += fcLetter*PPB.m_AAScores[uLetter];\r
+ }\r
+ return Score - g_scoreCenter;\r
+ }\r
+\r
+SCORE ScoreProfPos2SPN(const ProfPos &PPA, const ProfPos &PPB)\r
+ {\r
+ SCORE Score = 0;\r
+ for (unsigned n = 0; n < 4; ++n)\r
+ {\r
+ const unsigned uLetter = PPA.m_uSortOrder[n];\r
+ const FCOUNT fcLetter = PPA.m_fcCounts[uLetter];\r
+ if (0 == fcLetter)\r
+ break;\r
+ Score += fcLetter*PPB.m_AAScores[uLetter];\r
+ }\r
+ return Score - g_scoreCenter;\r
+ }\r
+\r
+SCORE ScoreProfPos2(const ProfPos &PPA, const ProfPos &PPB)\r
+ {\r
+ if (PPSCORE_SP == g_PPScore)\r
+ return ScoreProfPos2NS(PPA, PPB);\r
+ else if (PPSCORE_LE == g_PPScore)\r
+ return ScoreProfPos2LA(PPA, PPB);\r
+ else if (PPSCORE_SV == g_PPScore)\r
+ return ScoreProfPos2SP(PPA, PPB);\r
+ else if (PPSCORE_SPN == g_PPScore)\r
+ return ScoreProfPos2SPN(PPA, PPB);\r
+ Quit("Invalid g_PPScore");\r
+ return 0;\r
+ }\r