13 unsigned m_uBestColLeft;
\r
14 unsigned m_uBestColRight;
\r
17 static void ListVertSavings(unsigned uColCount, unsigned uAnchorColCount,
\r
18 const Range *Ranges, unsigned uRangeCount)
\r
20 if (!g_bVerbose || !g_bAnchors)
\r
22 double dTotalArea = uColCount*uColCount;
\r
24 for (unsigned i = 0; i < uRangeCount; ++i)
\r
26 unsigned uLength = Ranges[i].m_uBestColRight - Ranges[i].m_uBestColLeft;
\r
27 dArea += uLength*uLength;
\r
29 double dPct = (dTotalArea - dArea)*100.0/dTotalArea;
\r
30 Log("Anchor columns found %u\n", uAnchorColCount);
\r
31 Log("DP area saved by anchors %-4.1f%%\n", dPct);
\r
34 static void ColsToRanges(const unsigned BestCols[], unsigned uBestColCount,
\r
35 unsigned uColCount, Range Ranges[])
\r
37 // N best columns produces N+1 vertical blocks.
\r
38 const unsigned uRangeCount = uBestColCount + 1;
\r
39 for (unsigned uIndex = 0; uIndex < uRangeCount ; ++uIndex)
\r
41 unsigned uBestColLeft = 0;
\r
43 uBestColLeft = BestCols[uIndex-1];
\r
45 unsigned uBestColRight = uColCount;
\r
46 if (uIndex < uBestColCount)
\r
47 uBestColRight = BestCols[uIndex];
\r
49 Ranges[uIndex].m_uBestColLeft = uBestColLeft;
\r
50 Ranges[uIndex].m_uBestColRight = uBestColRight;
\r
54 // Return true if any changes made
\r
55 bool RefineVert(MSA &msaIn, const Tree &tree, unsigned uIters)
\r
57 bool bAnyChanges = false;
\r
59 const unsigned uColCountIn = msaIn.GetColCount();
\r
60 const unsigned uSeqCountIn = msaIn.GetSeqCount();
\r
62 if (uColCountIn < 3 || uSeqCountIn < 3)
\r
65 unsigned *AnchorCols = new unsigned[uColCountIn];
\r
66 unsigned uAnchorColCount;
\r
67 SetMSAWeightsMuscle(msaIn);
\r
68 FindAnchorCols(msaIn, AnchorCols, &uAnchorColCount);
\r
70 const unsigned uRangeCount = uAnchorColCount + 1;
\r
71 Range *Ranges = new Range[uRangeCount];
\r
74 Log("%u ranges\n", uRangeCount);
\r
77 ColsToRanges(AnchorCols, uAnchorColCount, uColCountIn, Ranges);
\r
78 ListVertSavings(uColCountIn, uAnchorColCount, Ranges, uRangeCount);
\r
82 Log("Anchor cols: ");
\r
83 for (unsigned i = 0; i < uAnchorColCount; ++i)
\r
84 Log(" %u", AnchorCols[i]);
\r
88 for (unsigned i = 0; i < uRangeCount; ++i)
\r
89 Log("%4u - %4u\n", Ranges[i].m_uBestColLeft, Ranges[i].m_uBestColRight);
\r
93 delete[] AnchorCols;
\r
96 msaOut.SetSize(uSeqCountIn, 0);
\r
98 for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCountIn; ++uSeqIndex)
\r
100 const char *ptrName = msaIn.GetSeqName(uSeqIndex);
\r
101 unsigned uId = msaIn.GetSeqId(uSeqIndex);
\r
102 msaOut.SetSeqName(uSeqIndex, ptrName);
\r
103 msaOut.SetSeqId(uSeqIndex, uId);
\r
106 for (unsigned uRangeIndex = 0; uRangeIndex < uRangeCount; ++uRangeIndex)
\r
110 const Range &r = Ranges[uRangeIndex];
\r
112 const unsigned uFromColIndex = r.m_uBestColLeft;
\r
113 const unsigned uRangeColCount = r.m_uBestColRight - uFromColIndex;
\r
115 if (0 == uRangeColCount)
\r
117 else if (1 == uRangeColCount)
\r
119 MSAFromColRange(msaIn, uFromColIndex, 1, msaRange);
\r
120 MSAAppend(msaOut, msaRange);
\r
123 MSAFromColRange(msaIn, uFromColIndex, uRangeColCount, msaRange);
\r
126 Log("\n-------------\n");
\r
127 Log("Range %u - %u count=%u\n", r.m_uBestColLeft, r.m_uBestColRight, uRangeColCount);
\r
132 bool bLockLeft = (0 != uRangeIndex);
\r
133 bool bLockRight = (uRangeCount - 1 != uRangeIndex);
\r
134 bool bAnyChangesThisBlock = RefineHoriz(msaRange, tree, uIters, bLockLeft, bLockRight);
\r
135 bAnyChanges = (bAnyChanges || bAnyChangesThisBlock);
\r
142 MSAAppend(msaOut, msaRange);
\r
145 Log("msaOut after Cat:\n");
\r
152 AssertMSAEqIgnoreCaseAndGaps(msaIn, msaOut);
\r
157 msaIn.Copy(msaOut);
\r
158 return bAnyChanges;
\r