--- /dev/null
+#include "muscle.h"\r
+#include "msa.h"\r
+#include <errno.h>\r
+\r
+extern float VTML_SP[32][32];\r
+extern float NUC_SP[32][32];\r
+\r
+static double GetColScore(const MSA &msa, unsigned uCol)\r
+ {\r
+ const unsigned uSeqCount = msa.GetSeqCount();\r
+ unsigned uPairCount = 0;\r
+ double dSum = 0.0;\r
+ for (unsigned uSeq1 = 0; uSeq1 < uSeqCount; ++uSeq1)\r
+ {\r
+ if (msa.IsGap(uSeq1, uCol))\r
+ continue;\r
+ unsigned uLetter1 = msa.GetLetterEx(uSeq1, uCol);\r
+ if (uLetter1 >= g_AlphaSize)\r
+ continue;\r
+ for (unsigned uSeq2 = uSeq1 + 1; uSeq2 < uSeqCount; ++uSeq2)\r
+ {\r
+ if (msa.IsGap(uSeq2, uCol))\r
+ continue;\r
+ unsigned uLetter2 = msa.GetLetterEx(uSeq2, uCol);\r
+ if (uLetter2 >= g_AlphaSize)\r
+ continue;\r
+ double Score;\r
+ switch (g_Alpha)\r
+ {\r
+ case ALPHA_Amino:\r
+ Score = VTML_SP[uLetter1][uLetter2];\r
+ break;\r
+ case ALPHA_DNA:\r
+ case ALPHA_RNA:\r
+ Score = NUC_SP[uLetter1][uLetter2];\r
+ break;\r
+ default:\r
+ Quit("GetColScore: invalid alpha=%d", g_Alpha);\r
+ }\r
+ dSum += Score;\r
+ ++uPairCount;\r
+ }\r
+ }\r
+ if (0 == uPairCount)\r
+ return 0;\r
+ return dSum / uPairCount;\r
+ }\r
+\r
+void WriteScoreFile(const MSA &msa)\r
+ {\r
+ FILE *f = fopen(g_pstrScoreFileName, "w");\r
+ if (0 == f)\r
+ Quit("Cannot open score file '%s' errno=%d", g_pstrScoreFileName, errno);\r
+\r
+ const unsigned uColCount = msa.GetColCount();\r
+ const unsigned uSeqCount = msa.GetSeqCount();\r
+ for (unsigned uCol = 0; uCol < uColCount; ++uCol)\r
+ {\r
+ double Score = GetColScore(msa, uCol);\r
+ fprintf(f, "%10.3f ", Score);\r
+ for (unsigned uSeq = 0; uSeq < uSeqCount; ++uSeq)\r
+ {\r
+ char c = msa.GetChar(uSeq, uCol);\r
+ fprintf(f, "%c", c);\r
+ }\r
+ fprintf(f, "\n");\r
+ }\r
+ fclose(f);\r
+ }\r