--- /dev/null
+#include "muscle.h"\r
+#include "msa.h"\r
+#include "tree.h"\r
+#include "profile.h"\r
+#include "pwpath.h"\r
+#include "seqvect.h"\r
+#include "estring.h"\r
+\r
+#define TRACE 0\r
+\r
+void DeleteProgNode(ProgNode &Node)\r
+ {\r
+ delete[] Node.m_Prof;\r
+ delete[] Node.m_EstringL;\r
+ delete[] Node.m_EstringR;\r
+\r
+ Node.m_Prof = 0;\r
+ Node.m_EstringL = 0;\r
+ Node.m_EstringR = 0;\r
+ }\r
+\r
+static void MakeNode(ProgNode &OldNode, ProgNode &NewNode, bool bSwapLR)\r
+ {\r
+ if (bSwapLR)\r
+ {\r
+ NewNode.m_EstringL = OldNode.m_EstringR;\r
+ NewNode.m_EstringR = OldNode.m_EstringL;\r
+ }\r
+ else\r
+ {\r
+ NewNode.m_EstringL = OldNode.m_EstringL;\r
+ NewNode.m_EstringR = OldNode.m_EstringR;\r
+ }\r
+ NewNode.m_Prof = OldNode.m_Prof;\r
+ NewNode.m_uLength = OldNode.m_uLength;\r
+ NewNode.m_Weight = OldNode.m_Weight;\r
+\r
+ OldNode.m_Prof = 0;\r
+ OldNode.m_EstringL = 0;\r
+ OldNode.m_EstringR = 0;\r
+ }\r
+\r
+void RealignDiffsE(const MSA &msaIn, const SeqVect &v,\r
+ const Tree &NewTree, const Tree &OldTree, \r
+ const unsigned uNewNodeIndexToOldNodeIndex[],\r
+ MSA &msaOut, ProgNode *OldProgNodes)\r
+ {\r
+ assert(OldProgNodes != 0);\r
+\r
+ const unsigned uNodeCount = NewTree.GetNodeCount();\r
+ if (uNodeCount%2 == 0)\r
+ Quit("RealignDiffs: Expected odd number of nodes");\r
+\r
+ const unsigned uMergeCount = (uNodeCount - 1)/2;\r
+ ProgNode *NewProgNodes = new ProgNode[uNodeCount];\r
+\r
+ for (unsigned uNewNodeIndex = 0; uNewNodeIndex < uNodeCount; ++uNewNodeIndex)\r
+ {\r
+ if (NODE_CHANGED == uNewNodeIndexToOldNodeIndex[uNewNodeIndex])\r
+ continue;\r
+\r
+ unsigned uOldNodeIndex = uNewNodeIndexToOldNodeIndex[uNewNodeIndex];\r
+ assert(uNewNodeIndex < uNodeCount);\r
+ assert(uOldNodeIndex < uNodeCount);\r
+\r
+ ProgNode &NewNode = NewProgNodes[uNewNodeIndex];\r
+ ProgNode &OldNode = OldProgNodes[uOldNodeIndex];\r
+ bool bSwapLR = false;\r
+ if (!NewTree.IsLeaf(uNewNodeIndex))\r
+ {\r
+ unsigned uNewLeft = NewTree.GetLeft(uNewNodeIndex);\r
+ unsigned uNewRight = NewTree.GetRight(uNewNodeIndex);\r
+ unsigned uOld = uNewNodeIndexToOldNodeIndex[uNewNodeIndex];\r
+ unsigned uOldLeft = OldTree.GetLeft(uOld);\r
+ unsigned uOldRight = OldTree.GetRight(uOld);\r
+ assert(uOldLeft < uNodeCount && uOldRight < uNodeCount);\r
+ if (uOldLeft != uNewNodeIndexToOldNodeIndex[uNewLeft])\r
+ {\r
+ assert(uOldLeft == uNewNodeIndexToOldNodeIndex[uNewRight]);\r
+ bSwapLR = true;\r
+ }\r
+ }\r
+ MakeNode(OldNode, NewNode, bSwapLR);\r
+#if TRACE\r
+ Log("MakeNode old=%u new=%u swap=%d length=%u weight=%.3g\n",\r
+ uOldNodeIndex, uNewNodeIndex, bSwapLR, NewNode.m_uLength, NewNode.m_Weight);\r
+#endif\r
+ }\r
+\r
+ unsigned uJoin = 0;\r
+ SetProgressDesc("Refine tree");\r
+ for (unsigned uNewNodeIndex = NewTree.FirstDepthFirstNode();\r
+ NULL_NEIGHBOR != uNewNodeIndex;\r
+ uNewNodeIndex = NewTree.NextDepthFirstNode(uNewNodeIndex))\r
+ {\r
+ if (NODE_CHANGED != uNewNodeIndexToOldNodeIndex[uNewNodeIndex])\r
+ continue;\r
+\r
+ Progress(uJoin, uMergeCount - 1);\r
+ ++uJoin;\r
+\r
+ const unsigned uMergeNodeIndex = uNewNodeIndex;\r
+ ProgNode &Parent = NewProgNodes[uMergeNodeIndex];\r
+\r
+ const unsigned uLeft = NewTree.GetLeft(uNewNodeIndex);\r
+ const unsigned uRight = NewTree.GetRight(uNewNodeIndex);\r
+\r
+ ProgNode &Node1 = NewProgNodes[uLeft];\r
+ ProgNode &Node2 = NewProgNodes[uRight];\r
+\r
+ AlignTwoProfs(\r
+ Node1.m_Prof, Node1.m_uLength, Node1.m_Weight,\r
+ Node2.m_Prof, Node2.m_uLength, Node2.m_Weight,\r
+ Parent.m_Path,\r
+ &Parent.m_Prof, &Parent.m_uLength);\r
+ PathToEstrings(Parent.m_Path, &Parent.m_EstringL, &Parent.m_EstringR);\r
+\r
+ Parent.m_Weight = Node1.m_Weight + Node2.m_Weight;\r
+\r
+ delete[] Node1.m_Prof;\r
+ delete[] Node2.m_Prof;\r
+\r
+ Node1.m_Prof = 0;\r
+ Node2.m_Prof = 0;\r
+ }\r
+\r
+ ProgressStepsDone();\r
+\r
+ if (g_bBrenner)\r
+ MakeRootMSABrenner((SeqVect &) v, NewTree, NewProgNodes, msaOut);\r
+ else\r
+ MakeRootMSA(v, NewTree, NewProgNodes, msaOut);\r
+\r
+#if DEBUG\r
+ AssertMSAEqIgnoreCaseAndGaps(msaIn, msaOut);\r
+#endif\r
+\r
+ for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)\r
+ DeleteProgNode(NewProgNodes[uNodeIndex]);\r
+\r
+ delete[] NewProgNodes;\r
+ }\r