--- /dev/null
+#include "muscle.h"\r
+#include "msa.h"\r
+#include "tree.h"\r
+#include "profile.h"\r
+#include <stdio.h>\r
+\r
+void RefineTree(MSA &msa, Tree &tree)\r
+ {\r
+ const unsigned uSeqCount = msa.GetSeqCount();\r
+ if (tree.GetLeafCount() != uSeqCount)\r
+ Quit("Refine tree, tree has different number of nodes");\r
+\r
+ if (uSeqCount < 3)\r
+ return;\r
+\r
+#if DEBUG\r
+ ValidateMuscleIds(msa);\r
+ ValidateMuscleIds(tree);\r
+#endif\r
+\r
+ unsigned *IdToDiffsLeafNodeIndex = new unsigned[uSeqCount];\r
+ unsigned uDiffsCount = uSeqCount;\r
+ Tree Tree2;\r
+ for (unsigned uIter = 0; uIter < g_uMaxTreeRefineIters; ++uIter)\r
+ {\r
+ TreeFromMSA(msa, Tree2, g_Cluster2, g_Distance2, g_Root2, g_pstrDistMxFileName2);\r
+\r
+#if DEBUG\r
+ ValidateMuscleIds(Tree2);\r
+#endif\r
+\r
+ Tree Diffs;\r
+ DiffTrees(Tree2, tree, Diffs, IdToDiffsLeafNodeIndex);\r
+\r
+ tree.Copy(Tree2);\r
+\r
+ const unsigned uNewDiffsNodeCount = Diffs.GetNodeCount();\r
+ const unsigned uNewDiffsCount = (uNewDiffsNodeCount - 1)/2;\r
+\r
+ if (0 == uNewDiffsCount || uNewDiffsCount >= uDiffsCount)\r
+ {\r
+ ProgressStepsDone();\r
+ break;\r
+ }\r
+ uDiffsCount = uNewDiffsCount;\r
+\r
+ MSA msa2;\r
+ RealignDiffs(msa, Diffs, IdToDiffsLeafNodeIndex, msa2);\r
+\r
+#if DEBUG\r
+ ValidateMuscleIds(msa2);\r
+#endif\r
+\r
+ msa.Copy(msa2);\r
+ SetCurrentAlignment(msa);\r
+ }\r
+\r
+ delete[] IdToDiffsLeafNodeIndex;\r
+ }\r