11 void DeleteProgNode(ProgNode &Node)
\r
13 delete[] Node.m_Prof;
\r
14 delete[] Node.m_EstringL;
\r
15 delete[] Node.m_EstringR;
\r
18 Node.m_EstringL = 0;
\r
19 Node.m_EstringR = 0;
\r
22 static void MakeNode(ProgNode &OldNode, ProgNode &NewNode, bool bSwapLR)
\r
26 NewNode.m_EstringL = OldNode.m_EstringR;
\r
27 NewNode.m_EstringR = OldNode.m_EstringL;
\r
31 NewNode.m_EstringL = OldNode.m_EstringL;
\r
32 NewNode.m_EstringR = OldNode.m_EstringR;
\r
34 NewNode.m_Prof = OldNode.m_Prof;
\r
35 NewNode.m_uLength = OldNode.m_uLength;
\r
36 NewNode.m_Weight = OldNode.m_Weight;
\r
39 OldNode.m_EstringL = 0;
\r
40 OldNode.m_EstringR = 0;
\r
43 void RealignDiffsE(const MSA &msaIn, const SeqVect &v,
\r
44 const Tree &NewTree, const Tree &OldTree,
\r
45 const unsigned uNewNodeIndexToOldNodeIndex[],
\r
46 MSA &msaOut, ProgNode *OldProgNodes)
\r
48 assert(OldProgNodes != 0);
\r
50 const unsigned uNodeCount = NewTree.GetNodeCount();
\r
51 if (uNodeCount%2 == 0)
\r
52 Quit("RealignDiffs: Expected odd number of nodes");
\r
54 const unsigned uMergeCount = (uNodeCount - 1)/2;
\r
55 ProgNode *NewProgNodes = new ProgNode[uNodeCount];
\r
57 for (unsigned uNewNodeIndex = 0; uNewNodeIndex < uNodeCount; ++uNewNodeIndex)
\r
59 if (NODE_CHANGED == uNewNodeIndexToOldNodeIndex[uNewNodeIndex])
\r
62 unsigned uOldNodeIndex = uNewNodeIndexToOldNodeIndex[uNewNodeIndex];
\r
63 assert(uNewNodeIndex < uNodeCount);
\r
64 assert(uOldNodeIndex < uNodeCount);
\r
66 ProgNode &NewNode = NewProgNodes[uNewNodeIndex];
\r
67 ProgNode &OldNode = OldProgNodes[uOldNodeIndex];
\r
68 bool bSwapLR = false;
\r
69 if (!NewTree.IsLeaf(uNewNodeIndex))
\r
71 unsigned uNewLeft = NewTree.GetLeft(uNewNodeIndex);
\r
72 unsigned uNewRight = NewTree.GetRight(uNewNodeIndex);
\r
73 unsigned uOld = uNewNodeIndexToOldNodeIndex[uNewNodeIndex];
\r
74 unsigned uOldLeft = OldTree.GetLeft(uOld);
\r
75 unsigned uOldRight = OldTree.GetRight(uOld);
\r
76 assert(uOldLeft < uNodeCount && uOldRight < uNodeCount);
\r
77 if (uOldLeft != uNewNodeIndexToOldNodeIndex[uNewLeft])
\r
79 assert(uOldLeft == uNewNodeIndexToOldNodeIndex[uNewRight]);
\r
83 MakeNode(OldNode, NewNode, bSwapLR);
\r
85 Log("MakeNode old=%u new=%u swap=%d length=%u weight=%.3g\n",
\r
86 uOldNodeIndex, uNewNodeIndex, bSwapLR, NewNode.m_uLength, NewNode.m_Weight);
\r
91 SetProgressDesc("Refine tree");
\r
92 for (unsigned uNewNodeIndex = NewTree.FirstDepthFirstNode();
\r
93 NULL_NEIGHBOR != uNewNodeIndex;
\r
94 uNewNodeIndex = NewTree.NextDepthFirstNode(uNewNodeIndex))
\r
96 if (NODE_CHANGED != uNewNodeIndexToOldNodeIndex[uNewNodeIndex])
\r
99 Progress(uJoin, uMergeCount - 1);
\r
102 const unsigned uMergeNodeIndex = uNewNodeIndex;
\r
103 ProgNode &Parent = NewProgNodes[uMergeNodeIndex];
\r
105 const unsigned uLeft = NewTree.GetLeft(uNewNodeIndex);
\r
106 const unsigned uRight = NewTree.GetRight(uNewNodeIndex);
\r
108 ProgNode &Node1 = NewProgNodes[uLeft];
\r
109 ProgNode &Node2 = NewProgNodes[uRight];
\r
112 Node1.m_Prof, Node1.m_uLength, Node1.m_Weight,
\r
113 Node2.m_Prof, Node2.m_uLength, Node2.m_Weight,
\r
115 &Parent.m_Prof, &Parent.m_uLength);
\r
116 PathToEstrings(Parent.m_Path, &Parent.m_EstringL, &Parent.m_EstringR);
\r
118 Parent.m_Weight = Node1.m_Weight + Node2.m_Weight;
\r
120 delete[] Node1.m_Prof;
\r
121 delete[] Node2.m_Prof;
\r
127 ProgressStepsDone();
\r
130 MakeRootMSABrenner((SeqVect &) v, NewTree, NewProgNodes, msaOut);
\r
132 MakeRootMSA(v, NewTree, NewProgNodes, msaOut);
\r
135 AssertMSAEqIgnoreCaseAndGaps(msaIn, msaOut);
\r
138 for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
\r
139 DeleteProgNode(NewProgNodes[uNodeIndex]);
\r
141 delete[] NewProgNodes;
\r