Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / progressivealign.cpp
diff --git a/website/archive/binaries/mac/src/muscle/progressivealign.cpp b/website/archive/binaries/mac/src/muscle/progressivealign.cpp
new file mode 100644 (file)
index 0000000..c2feb3b
--- /dev/null
@@ -0,0 +1,76 @@
+#include "muscle.h"\r
+#include <math.h>\r
+#include "tree.h"\r
+#include "seqvect.h"\r
+#include "profile.h"\r
+#include "msa.h"\r
+#include "pwpath.h"\r
+#include "distfunc.h"\r
+\r
+#define TRACE 0\r
+\r
+void ProgressiveAlign(const SeqVect &v, const Tree &GuideTree, MSA &a)\r
+       {\r
+       assert(GuideTree.IsRooted());\r
+\r
+#if    TRACE\r
+       Log("GuideTree:\n");\r
+       GuideTree.LogMe();\r
+#endif\r
+\r
+       const unsigned uSeqCount = v.Length();\r
+       const unsigned uNodeCount = 2*uSeqCount - 1;\r
+\r
+       ProgNode *ProgNodes = new ProgNode[uNodeCount];\r
+\r
+       unsigned uJoin = 0;\r
+       unsigned uTreeNodeIndex = GuideTree.FirstDepthFirstNode();\r
+       SetProgressDesc("Align node");\r
+       do\r
+               {\r
+               if (GuideTree.IsLeaf(uTreeNodeIndex))\r
+                       {\r
+                       if (uTreeNodeIndex >= uNodeCount)\r
+                               Quit("TreeNodeIndex=%u NodeCount=%u\n", uTreeNodeIndex, uNodeCount);\r
+                       ProgNode &Node = ProgNodes[uTreeNodeIndex];\r
+                       unsigned uId = GuideTree.GetLeafId(uTreeNodeIndex);\r
+                       if (uId >= uSeqCount)\r
+                               Quit("Seq index out of range");\r
+                       const Seq &s = *(v[uId]);\r
+                       Node.m_MSA.FromSeq(s);\r
+                       Node.m_MSA.SetSeqId(0, uId);\r
+                       Node.m_uLength = Node.m_MSA.GetColCount();\r
+                       }\r
+               else\r
+                       {\r
+                       Progress(uJoin, uSeqCount - 1);\r
+                       ++uJoin;\r
+\r
+                       const unsigned uMergeNodeIndex = uTreeNodeIndex;\r
+                       ProgNode &Parent = ProgNodes[uMergeNodeIndex];\r
+\r
+                       const unsigned uLeft = GuideTree.GetLeft(uTreeNodeIndex);\r
+                       const unsigned uRight = GuideTree.GetRight(uTreeNodeIndex);\r
+\r
+                       ProgNode &Node1 = ProgNodes[uLeft];\r
+                       ProgNode &Node2 = ProgNodes[uRight];\r
+\r
+                       PWPath Path;\r
+                       AlignTwoMSAs(Node1.m_MSA, Node2.m_MSA, Parent.m_MSA, Path);\r
+                       Parent.m_uLength = Parent.m_MSA.GetColCount();\r
+\r
+                       Node1.m_MSA.Clear();\r
+                       Node2.m_MSA.Clear();\r
+                       }\r
+               uTreeNodeIndex = GuideTree.NextDepthFirstNode(uTreeNodeIndex);\r
+               }\r
+       while (NULL_NEIGHBOR != uTreeNodeIndex);\r
+       ProgressStepsDone();\r
+\r
+       unsigned uRootNodeIndex = GuideTree.GetRootNodeIndex();\r
+       const ProgNode &RootProgNode = ProgNodes[uRootNodeIndex];\r
+       a.Copy(RootProgNode.m_MSA);\r
+\r
+       delete[] ProgNodes;\r
+       ProgNodes = 0;\r
+       }\r