+++ /dev/null
-#include "muscle.h"\r
-#include "profile.h"\r
-#include "msa.h"\r
-#include "pwpath.h"\r
-#include "seqvect.h"\r
-#include "clust.h"\r
-#include "tree.h"\r
-\r
-#define TRACE 0\r
-\r
-struct Range\r
- {\r
- unsigned m_uBestColLeft;\r
- unsigned m_uBestColRight;\r
- };\r
-\r
-static void ListVertSavings(unsigned uColCount, unsigned uAnchorColCount,\r
- const Range *Ranges, unsigned uRangeCount)\r
- {\r
- if (!g_bVerbose || !g_bAnchors)\r
- return;\r
- double dTotalArea = uColCount*uColCount;\r
- double dArea = 0.0;\r
- for (unsigned i = 0; i < uRangeCount; ++i)\r
- {\r
- unsigned uLength = Ranges[i].m_uBestColRight - Ranges[i].m_uBestColLeft;\r
- dArea += uLength*uLength;\r
- }\r
- double dPct = (dTotalArea - dArea)*100.0/dTotalArea;\r
- Log("Anchor columns found %u\n", uAnchorColCount);\r
- Log("DP area saved by anchors %-4.1f%%\n", dPct);\r
- }\r
-\r
-static void ColsToRanges(const unsigned BestCols[], unsigned uBestColCount,\r
- unsigned uColCount, Range Ranges[])\r
- {\r
-// N best columns produces N+1 vertical blocks.\r
- const unsigned uRangeCount = uBestColCount + 1;\r
- for (unsigned uIndex = 0; uIndex < uRangeCount ; ++uIndex)\r
- {\r
- unsigned uBestColLeft = 0;\r
- if (uIndex > 0)\r
- uBestColLeft = BestCols[uIndex-1];\r
- \r
- unsigned uBestColRight = uColCount;\r
- if (uIndex < uBestColCount)\r
- uBestColRight = BestCols[uIndex];\r
-\r
- Ranges[uIndex].m_uBestColLeft = uBestColLeft;\r
- Ranges[uIndex].m_uBestColRight = uBestColRight;\r
- }\r
- }\r
-\r
-// Return true if any changes made\r
-bool RefineVert(MSA &msaIn, const Tree &tree, unsigned uIters)\r
- {\r
- bool bAnyChanges = false;\r
-\r
- const unsigned uColCountIn = msaIn.GetColCount();\r
- const unsigned uSeqCountIn = msaIn.GetSeqCount();\r
-\r
- if (uColCountIn < 3 || uSeqCountIn < 3)\r
- return false;\r
-\r
- unsigned *AnchorCols = new unsigned[uColCountIn];\r
- unsigned uAnchorColCount;\r
- SetMSAWeightsMuscle(msaIn);\r
- FindAnchorCols(msaIn, AnchorCols, &uAnchorColCount);\r
-\r
- const unsigned uRangeCount = uAnchorColCount + 1;\r
- Range *Ranges = new Range[uRangeCount];\r
-\r
-#if TRACE\r
- Log("%u ranges\n", uRangeCount);\r
-#endif\r
-\r
- ColsToRanges(AnchorCols, uAnchorColCount, uColCountIn, Ranges);\r
- ListVertSavings(uColCountIn, uAnchorColCount, Ranges, uRangeCount);\r
-\r
-#if TRACE\r
- {\r
- Log("Anchor cols: ");\r
- for (unsigned i = 0; i < uAnchorColCount; ++i)\r
- Log(" %u", AnchorCols[i]);\r
- Log("\n");\r
-\r
- Log("Ranges:\n");\r
- for (unsigned i = 0; i < uRangeCount; ++i)\r
- Log("%4u - %4u\n", Ranges[i].m_uBestColLeft, Ranges[i].m_uBestColRight);\r
- }\r
-#endif\r
-\r
- delete[] AnchorCols;\r
-\r
- MSA msaOut;\r
- msaOut.SetSize(uSeqCountIn, 0);\r
-\r
- for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCountIn; ++uSeqIndex)\r
- {\r
- const char *ptrName = msaIn.GetSeqName(uSeqIndex);\r
- unsigned uId = msaIn.GetSeqId(uSeqIndex);\r
- msaOut.SetSeqName(uSeqIndex, ptrName);\r
- msaOut.SetSeqId(uSeqIndex, uId);\r
- }\r
-\r
- for (unsigned uRangeIndex = 0; uRangeIndex < uRangeCount; ++uRangeIndex)\r
- {\r
- MSA msaRange;\r
-\r
- const Range &r = Ranges[uRangeIndex];\r
-\r
- const unsigned uFromColIndex = r.m_uBestColLeft;\r
- const unsigned uRangeColCount = r.m_uBestColRight - uFromColIndex;\r
-\r
- if (0 == uRangeColCount)\r
- continue;\r
- else if (1 == uRangeColCount)\r
- {\r
- MSAFromColRange(msaIn, uFromColIndex, 1, msaRange);\r
- MSAAppend(msaOut, msaRange);\r
- continue;\r
- }\r
- MSAFromColRange(msaIn, uFromColIndex, uRangeColCount, msaRange);\r
-\r
-#if TRACE\r
- Log("\n-------------\n");\r
- Log("Range %u - %u count=%u\n", r.m_uBestColLeft, r.m_uBestColRight, uRangeColCount);\r
- Log("Before:\n");\r
- msaRange.LogMe();\r
-#endif\r
-\r
- bool bLockLeft = (0 != uRangeIndex);\r
- bool bLockRight = (uRangeCount - 1 != uRangeIndex);\r
- bool bAnyChangesThisBlock = RefineHoriz(msaRange, tree, uIters, bLockLeft, bLockRight);\r
- bAnyChanges = (bAnyChanges || bAnyChangesThisBlock);\r
-\r
-#if TRACE\r
- Log("After:\n");\r
- msaRange.LogMe();\r
-#endif\r
-\r
- MSAAppend(msaOut, msaRange);\r
-\r
-#if TRACE\r
- Log("msaOut after Cat:\n");\r
- msaOut.LogMe();\r
-#endif\r
- }\r
-\r
-#if DEBUG\r
-// Sanity check\r
- AssertMSAEqIgnoreCaseAndGaps(msaIn, msaOut);\r
-#endif\r
-\r
- delete[] Ranges;\r
- if (bAnyChanges)\r
- msaIn.Copy(msaOut);\r
- return bAnyChanges;\r
- }\r