66ac66a061e340e89fe94822c3d881e4af932549
braney
  Wed Aug 5 14:44:18 2015 -0700
do a better job of bigPsl support (query gaps)  #14241

diff --git src/hg/hgTracks/bigBedTrack.c src/hg/hgTracks/bigBedTrack.c
index 80f10f1..9af5816 100644
--- src/hg/hgTracks/bigBedTrack.c
+++ src/hg/hgTracks/bigBedTrack.c
@@ -155,47 +155,60 @@
 struct lm *lm = lmInit(0);
 struct trackDb *tdb = track->tdb;
 struct bigBedInterval *bb, *bbList = bigBedSelectRange(track, chrom, start, end, lm);
 char *bedRow[32];
 char startBuf[16], endBuf[16];
 char *scoreFilter = cartOrTdbString(cart, track->tdb, "scoreFilter", NULL);
 char *mouseOverField = cartOrTdbString(cart, track->tdb, "mouseOverField", NULL);
 int minScore = 0;
 if (scoreFilter)
     minScore = atoi(scoreFilter);
 
 int mouseOverIdx = bbExtraFieldIndex(tdb, mouseOverField);
 
 for (bb = bbList; bb != NULL; bb = bb->next)
     {
-    char* mouseOver = restField(bb, mouseOverIdx);
     bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow));
-    struct bed *bed = bedLoadN(bedRow, fieldCount);
-    struct linkedFeatures *lf = bedMungToLinkedFeatures(&bed, tdb, fieldCount,
-    	scoreMin, scoreMax, useItemRgb);
-    if (scoreFilter == NULL || lf->score >= minScore)
-	slAddHead(pLfList, lf);
-    lf->mouseOver   = mouseOver; // leaks some memory, cloneString handles NULL ifself 
-    if (sameString(track->tdb->type, "bigGenePred"))
-	lf->original = genePredFromBigGenePred(chromName, bb); 
-    else if (sameString(track->tdb->type, "bigPsl"))
+    struct linkedFeatures *lf;
+    if (sameString(track->tdb->type, "bigPsl"))
 	{
 	char *seq, *cds;
-	lf->original = pslFromBigPsl(chromName, bb, seqBaseCount, &seq, &cds); 
+	struct psl *psl = pslFromBigPsl(chromName, bb, seqBaseCount, &seq, &cds); 
+	int sizeMul = 1;  // we're assuming not protein at the moment
+	boolean isXeno = 0;  // just affects grayIx
+	boolean nameGetsPos = FALSE; // we want the name to stay the name
+
+	lf = lfFromPslx(psl, sizeMul, isXeno, nameGetsPos, track);
+	lf->original = psl;
 	lf->extra = seq;
 	lf->cds = cds;
 	}
+    else
+	{
+	struct bed *bed = bedLoadN(bedRow, fieldCount);
+	lf = bedMungToLinkedFeatures(&bed, tdb, fieldCount,
+	    scoreMin, scoreMax, useItemRgb);
+	}
+
+    if (sameString(track->tdb->type, "bigGenePred"))
+	lf->original = genePredFromBigGenePred(chromName, bb); 
+
+    char* mouseOver = restField(bb, mouseOverIdx);
+    lf->mouseOver   = mouseOver; // leaks some memory, cloneString handles NULL ifself 
+
+    if (scoreFilter == NULL || lf->score >= minScore)
+	slAddHead(pLfList, lf);
     }
 lmCleanup(&lm);
 }
 
 
 boolean canDrawBigBedDense(struct track *tg)
 /* Return TRUE if conditions are such that can do the fast bigBed dense data fetch and
  * draw. */
 {
 return tg->isBigBed;
 }
 
 
 void bigBedDrawDense(struct track *tg, int seqStart, int seqEnd,
         struct hvGfx *hvg, int xOff, int yOff, int width,