1 #include "muscle.h"
2 #include "msa.h"
3 #include "tree.h"
4 #include "profile.h"
5 #include <stdio.h>
6 
RefineTree(MSA & msa,Tree & tree)7 void RefineTree(MSA &msa, Tree &tree)
8 	{
9 	const unsigned uSeqCount = msa.GetSeqCount();
10 	if (tree.GetLeafCount() != uSeqCount)
11 		Quit("Refine tree, tree has different number of nodes");
12 
13 	if (uSeqCount < 3)
14 		return;
15 
16 #if	DEBUG
17 	ValidateMuscleIds(msa);
18 	ValidateMuscleIds(tree);
19 #endif
20 
21 	unsigned *IdToDiffsLeafNodeIndex = new unsigned[uSeqCount];
22 	unsigned uDiffsCount = uSeqCount;
23 	Tree Tree2;
24 	for (unsigned uIter = 0; uIter < g_uMaxTreeRefineIters; ++uIter)
25 		{
26 		TreeFromMSA(msa, Tree2, g_Cluster2, g_Distance2, g_Root2, g_pstrDistMxFileName2);
27 
28 #if	DEBUG
29 		ValidateMuscleIds(Tree2);
30 #endif
31 
32 		Tree Diffs;
33 		DiffTrees(Tree2, tree, Diffs, IdToDiffsLeafNodeIndex);
34 
35 		tree.Copy(Tree2);
36 
37 		const unsigned uNewDiffsNodeCount = Diffs.GetNodeCount();
38 		const unsigned uNewDiffsCount = (uNewDiffsNodeCount - 1)/2;
39 
40 		if (0 == uNewDiffsCount || uNewDiffsCount >= uDiffsCount)
41 			{
42 			ProgressStepsDone();
43 			break;
44 			}
45 		uDiffsCount = uNewDiffsCount;
46 
47 		MSA msa2;
48 		RealignDiffs(msa, Diffs, IdToDiffsLeafNodeIndex, msa2);
49 
50 #if	DEBUG
51 		ValidateMuscleIds(msa2);
52 #endif
53 
54 		msa.Copy(msa2);
55 		SetCurrentAlignment(msa);
56 		}
57 
58 	delete[] IdToDiffsLeafNodeIndex;
59 	}
60