7 void RefineTree(MSA &msa, Tree &tree)
\r
9 const unsigned uSeqCount = msa.GetSeqCount();
\r
10 if (tree.GetLeafCount() != uSeqCount)
\r
11 Quit("Refine tree, tree has different number of nodes");
\r
17 ValidateMuscleIds(msa);
\r
18 ValidateMuscleIds(tree);
\r
21 unsigned *IdToDiffsLeafNodeIndex = new unsigned[uSeqCount];
\r
22 unsigned uDiffsCount = uSeqCount;
\r
24 for (unsigned uIter = 0; uIter < g_uMaxTreeRefineIters; ++uIter)
\r
26 TreeFromMSA(msa, Tree2, g_Cluster2, g_Distance2, g_Root2, g_pstrDistMxFileName2);
\r
29 ValidateMuscleIds(Tree2);
\r
33 DiffTrees(Tree2, tree, Diffs, IdToDiffsLeafNodeIndex);
\r
37 const unsigned uNewDiffsNodeCount = Diffs.GetNodeCount();
\r
38 const unsigned uNewDiffsCount = (uNewDiffsNodeCount - 1)/2;
\r
40 if (0 == uNewDiffsCount || uNewDiffsCount >= uDiffsCount)
\r
42 ProgressStepsDone();
\r
45 uDiffsCount = uNewDiffsCount;
\r
48 RealignDiffs(msa, Diffs, IdToDiffsLeafNodeIndex, msa2);
\r
51 ValidateMuscleIds(msa2);
\r
55 SetCurrentAlignment(msa);
\r
58 delete[] IdToDiffsLeafNodeIndex;
\r