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;