Next version of JABA
[jabaws.git] / binaries / src / muscle / makerootmsab.cpp
1 #include "muscle.h"\r
2 #include "tree.h"\r
3 #include "profile.h"\r
4 #include "msa.h"\r
5 #include "seqvect.h"\r
6 #include "pwpath.h"\r
7 \r
8 static void DoSeq(Seq &s, unsigned uSeqIndex, const ProfPos *RootProf,\r
9   unsigned uRootProfLength, MSA &msaOut)\r
10         {\r
11         MSA msaSeq;\r
12         msaSeq.FromSeq(s);\r
13         const unsigned uSeqLength = s.Length();\r
14 \r
15         MSA msaDummy;\r
16         msaDummy.SetSize(1, uRootProfLength);\r
17         msaDummy.SetSeqId(0, 0);\r
18         msaDummy.SetSeqName(0, "Dummy0");\r
19         for (unsigned uColIndex = 0; uColIndex < uRootProfLength; ++uColIndex)\r
20                 msaDummy.SetChar(0, uColIndex, '?');\r
21 \r
22         ProfPos *SeqProf = ProfileFromMSA(msaSeq);\r
23         for (unsigned uColIndex = 0; uColIndex < uSeqLength; ++uColIndex)\r
24                 {\r
25                 ProfPos &PP = SeqProf[uColIndex];\r
26                 PP.m_scoreGapOpen = MINUS_INFINITY;\r
27                 PP.m_scoreGapClose = MINUS_INFINITY;\r
28                 }\r
29 \r
30         ProfPos *ProfOut;\r
31         unsigned uLengthOut;\r
32         PWPath Path;\r
33         AlignTwoProfs(SeqProf, uSeqLength, 1.0, RootProf, uRootProfLength, 1.0,\r
34           Path, &ProfOut, &uLengthOut);\r
35         assert(uLengthOut = uRootProfLength);\r
36         delete[] ProfOut;\r
37 \r
38         MSA msaCombined;\r
39         AlignTwoMSAsGivenPath(Path, msaSeq, msaDummy, msaCombined);\r
40 \r
41         msaCombined.LogMe();\r
42         msaOut.SetSeqName(uSeqIndex, s.GetName());\r
43         msaOut.SetSeqId(uSeqIndex, s.GetId());\r
44         for (unsigned uColIndex = 0; uColIndex < uRootProfLength; ++uColIndex)\r
45                 msaOut.SetChar(uSeqIndex, uColIndex, msaCombined.GetChar(0, uColIndex));\r
46         }\r
47 \r
48 // Steven Brenner's O(NL^2) proposal for creating a root alignment\r
49 // Align each sequence to the profile at the root.\r
50 // Compare the e-string solution, which is O(NL log N).\r
51 void MakeRootMSABrenner(SeqVect &v, const Tree &GuideTree, ProgNode Nodes[],\r
52   MSA &a)\r
53         {\r
54         const unsigned uSeqCount = v.Length();\r
55         const unsigned uRootNodeIndex = GuideTree.GetRootNodeIndex();\r
56         const ProfPos *RootProfile = Nodes[uRootNodeIndex].m_Prof;\r
57         const unsigned uRootColCount = Nodes[uRootNodeIndex].m_uLength;\r
58         a.SetSize(uSeqCount, uRootColCount);\r
59 \r
60         for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCount; ++uSeqIndex)\r
61                 DoSeq(*v[uSeqIndex], uSeqIndex, RootProfile, uRootColCount, a);\r
62         }\r