Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / realigndiffse.cpp
diff --git a/website/archive/binaries/mac/src/muscle/realigndiffse.cpp b/website/archive/binaries/mac/src/muscle/realigndiffse.cpp
new file mode 100644 (file)
index 0000000..559c333
--- /dev/null
@@ -0,0 +1,142 @@
+#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