dccdf29485000ddce07f65a431d52a51ffd158cf braney Wed Nov 16 18:41:22 2016 -0800 add support for protein psls in bigPsl diff --git src/hg/hgTracks/bigBedTrack.c src/hg/hgTracks/bigBedTrack.c index e69d6e7..059beb4 100644 --- src/hg/hgTracks/bigBedTrack.c +++ src/hg/hgTracks/bigBedTrack.c @@ -119,62 +119,69 @@ field = cloneString(restFields[fieldIdx]); freeMem(rest); return field; } void bigBedAddLinkedFeaturesFromExt(struct track *track, char *chrom, int start, int end, int scoreMin, int scoreMax, boolean useItemRgb, int fieldCount, struct linkedFeatures **pLfList, int maxItems) /* Read in items in chrom:start-end from bigBed file named in track->bbiFileName, convert * them to linkedFeatures, and add to head of list. */ { struct lm *lm = lmInit(0); struct trackDb *tdb = track->tdb; struct bigBedInterval *bb, *bbList = bigBedSelectRangeExt(track, chrom, start, end, lm, maxItems); -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); struct bbiFile *bbi = fetchBbiForTrack(track); +int seqTypeField = 0; +if (sameString(track->tdb->type, "bigPsl")) + { + seqTypeField = bbExtraFieldIndex(bbi, "seqType"); + } + int mouseOverIdx = bbExtraFieldIndex(bbi, mouseOverField); for (bb = bbList; bb != NULL; bb = bb->next) { - bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); struct linkedFeatures *lf; if (sameString(track->tdb->type, "bigPsl")) { char *seq, *cds; - struct psl *psl = pslFromBigPsl(chromName, bb, &seq, &cds); - int sizeMul = 1; // we're assuming not protein at the moment + struct psl *psl = pslFromBigPsl(chromName, bb, seqTypeField, &seq, &cds); + int sizeMul = pslIsProtein(psl) ? 3 : 1; 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; if (lf->orientation == -1) reverseComplement(seq, strlen(seq)); lf->extra = seq; lf->cds = cds; } else { + char startBuf[16], endBuf[16]; + char *bedRow[32]; + + bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); struct bed *bed = bedLoadN(bedRow, fieldCount); lf = bedMungToLinkedFeatures(&bed, tdb, fieldCount, scoreMin, scoreMax, useItemRgb); } if (sameString(track->tdb->type, "bigGenePred") || startsWith("genePred", track->tdb->type)) { struct genePred *gp = lf->original = genePredFromBigGenePred(chromName, bb); lf->extra = gp->name2; lf->isBigGenePred = TRUE; } char* mouseOver = restField(bb, mouseOverIdx); lf->mouseOver = mouseOver; // leaks some memory, cloneString handles NULL ifself