6c0adf59ef794e2a107de7cbf638041158dc406e kent Mon Jun 20 17:35:31 2022 -0700 Fixed crash bug. Improved status reporting. Removed some debugging statements. diff --git src/hg/oneShot/testLiftRechainer/testLiftRechainer.c src/hg/oneShot/testLiftRechainer/testLiftRechainer.c index 4bc2c2d..1cb65435 100644 --- src/hg/oneShot/testLiftRechainer/testLiftRechainer.c +++ src/hg/oneShot/testLiftRechainer/testLiftRechainer.c @@ -345,90 +345,89 @@ { struct crossover *cross = crossoverNew(tPos, bestSource); slAddHead(&rechain->crossList, cross); } } /* Go through active list one last time updating last scores */ for (el = activeList->head; !dlEnd(el); el = el->next) { struct rechain *rechain = el->val; rechain->lastScore = rechain->score; } } verbose(2, "qRcSeqHash has %d elements\n", qRcSeqHash->elCount); -verbose(1, "%d chains on active list, %d on archive list\n", +verbose(2, "%d chains on active list, %d on archive list\n", dlCount(activeList), dlCount(archiveList)); /* Find best scoreing chain that is still active at end */ struct dlNode *el; struct rechain *bestChain = NULL; long long bestScore = -BIGNUM; for (el = activeList->head; !dlEnd(el); el = el->next) { struct rechain *rechain = el->val; + verbose(2, "active %d: score %lld last from %d\n", rechainId(rechain), rechain->score, + rechainId(rechain->crossList->rechain)); if (rechain->score > bestScore) { bestChain = rechain; bestScore = rechain->score; - verbose(1, "active %d: score %lld cross %d last from %d\n", rechainId(rechain), rechain->score, - slCount(rechain->crossList), rechainId(rechain->crossList->rechain)); } } /* Do traceback */ struct chainPart *partList = NULL, *part; struct rechain *rechain; int tEnd = tSeq->size; for (rechain = bestChain; rechain != NULL; ) { - // uglyf("rechain id %d tEnd %d\n", rechainId(rechain), tEnd); struct rechain *prev = NULL; struct crossover *cross, *nextCross = NULL; int tStart = 0; for (cross = rechain->crossList; cross != NULL; cross = nextCross) { nextCross = cross->next; - // uglyf(" crossing back to chain %d at %d\n", rechainId(cross->rechain), cross->tPos); if (cross->tPos <= tEnd) { tStart = cross->tPos; if (nextCross != NULL) prev = nextCross->rechain; rechain->crossList = cross; break; } } chain = rechain->chain; if (chain != NULL) { AllocVar(part); part->chain = chain; part->tStart = tStart; part->tEnd = tEnd; slAddHead(&partList, part); - // uglyf("chainId %d (%d-%d) qSeq (%s:%d-%d) [%s:%d-%d] %d\n", chain->id, chain->tStart, chain->tEnd, chain->qName, chain->qStart, chain->qEnd, chain->tName, tStart, tEnd, tEnd-tStart); } rechain = prev; tEnd = tStart; } +verbose(1, " score %lld in %d parts\n", bestScore, slCount(partList)); for (part = partList; part != NULL; part = part->next) { struct chain *chainToFree = NULL, *subchain; chainSubsetOnT(part->chain, part->tStart, part->tEnd, &subchain, &chainToFree); + if (subchain != NULL) chainWrite(subchain, f); chainFree(&chainToFree); } slFreeList(&partList); } void testLiftRechainer(char *chainFile, char *tTwoBit, char *qTwoBit, char *out) /* Rework chains into lift only chain */ { dnaUtilOpen(); struct hash *tSizeHash = twoBitChromHash(tTwoBit); struct hash *qSizeHash = twoBitChromHash(qTwoBit); struct chainTarget *targetList = readChainTargets(chainFile, tSizeHash, qSizeHash); verbose(1, "Read %d chains targets to go against %d target sequences and %d query sequences\n", slCount(targetList), tSizeHash->elCount, qSizeHash->elCount); @@ -443,31 +442,32 @@ toLowerN(qSeq->dna, qSeq->size); hashAdd(qSeqHash, qSeq->name, qSeq); qTotal += qSeq->size; } verbose(1, "Read %lld query bases in %d sequences\n", qTotal, qSeqHash->elCount); /* Open output now that all input has been at least checked */ FILE *f = mustOpen(out, "w"); struct twoBitFile *targetTwoBit = twoBitOpen(tTwoBit); struct chainTarget *target; for (target = targetList; target != NULL; target = target->next) { int tSize = hashIntVal(tSizeHash, target->name); struct dnaSeq *tSeq = twoBitReadSeqFragLower(targetTwoBit, target->name, 0, tSize); - verbose(1, "Read %d bases in %s\n", tSeq->size, target->name); + verbose(1, "%s has %d bases and %d chains\n", + target->name, tSeq->size, slCount(target->chainList)); rechainOneTarget(target, tSeq, qSeqHash, qRcSeqHash, f); dnaSeqFree(&tSeq); } carefulClose(&f); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 5) usage(); testLiftRechainer(argv[1], argv[2], argv[3], argv[4]); return 0;