8 #include "distfunc.h"
\r
12 void ProgressiveAlign(const SeqVect &v, const Tree &GuideTree, MSA &a)
\r
14 assert(GuideTree.IsRooted());
\r
17 Log("GuideTree:\n");
\r
21 const unsigned uSeqCount = v.Length();
\r
22 const unsigned uNodeCount = 2*uSeqCount - 1;
\r
24 ProgNode *ProgNodes = new ProgNode[uNodeCount];
\r
27 unsigned uTreeNodeIndex = GuideTree.FirstDepthFirstNode();
\r
28 SetProgressDesc("Align node");
\r
31 if (GuideTree.IsLeaf(uTreeNodeIndex))
\r
33 if (uTreeNodeIndex >= uNodeCount)
\r
34 Quit("TreeNodeIndex=%u NodeCount=%u\n", uTreeNodeIndex, uNodeCount);
\r
35 ProgNode &Node = ProgNodes[uTreeNodeIndex];
\r
36 unsigned uId = GuideTree.GetLeafId(uTreeNodeIndex);
\r
37 if (uId >= uSeqCount)
\r
38 Quit("Seq index out of range");
\r
39 const Seq &s = *(v[uId]);
\r
40 Node.m_MSA.FromSeq(s);
\r
41 Node.m_MSA.SetSeqId(0, uId);
\r
42 Node.m_uLength = Node.m_MSA.GetColCount();
\r
46 Progress(uJoin, uSeqCount - 1);
\r
49 const unsigned uMergeNodeIndex = uTreeNodeIndex;
\r
50 ProgNode &Parent = ProgNodes[uMergeNodeIndex];
\r
52 const unsigned uLeft = GuideTree.GetLeft(uTreeNodeIndex);
\r
53 const unsigned uRight = GuideTree.GetRight(uTreeNodeIndex);
\r
55 ProgNode &Node1 = ProgNodes[uLeft];
\r
56 ProgNode &Node2 = ProgNodes[uRight];
\r
59 AlignTwoMSAs(Node1.m_MSA, Node2.m_MSA, Parent.m_MSA, Path);
\r
60 Parent.m_uLength = Parent.m_MSA.GetColCount();
\r
62 Node1.m_MSA.Clear();
\r
63 Node2.m_MSA.Clear();
\r
65 uTreeNodeIndex = GuideTree.NextDepthFirstNode(uTreeNodeIndex);
\r
67 while (NULL_NEIGHBOR != uTreeNodeIndex);
\r
68 ProgressStepsDone();
\r
70 unsigned uRootNodeIndex = GuideTree.GetRootNodeIndex();
\r
71 const ProgNode &RootProgNode = ProgNodes[uRootNodeIndex];
\r
72 a.Copy(RootProgNode.m_MSA);
\r