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,