+++ /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