dccdf29485000ddce07f65a431d52a51ffd158cf braney Wed Nov 16 18:41:22 2016 -0800 add support for protein psls in bigPsl diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c index 513eb59..51dfe47 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -2971,48 +2971,53 @@ char *item, int start, int end) /* Handle click in big psl track. */ { struct psl* pslList; char *fileName = bbiNameFromSettingOrTable(tdb, conn, tdb->table); struct bbiFile *bbi = bigBedFileOpen(fileName); struct lm *lm = lmInit(0); int ivStart = start, ivEnd = end; if (start == end) { // item is an insertion; expand the search range from 0 bases to 2 so we catch it: ivStart = max(0, start-1); ivEnd++; } +unsigned seqTypeField = bbExtraFieldIndex(bbi, "seqType"); struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, seqName, ivStart, ivEnd, 0, lm); char *bedRow[32]; char startBuf[16], endBuf[16]; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, seqName, startBuf, endBuf, bedRow, 4); struct bed *bed = bedLoadN(bedRow, 4); if (sameString(bed->name, item)) { bb->next = NULL; break; } } -pslList = pslFromBigPsl(seqName, bb, NULL, NULL); +pslList = pslFromBigPsl(seqName, bb, seqTypeField, NULL, NULL); printf("<H3>%s/Genomic Alignments</H3>", item); -printAlignmentsExtra(pslList, start, "htcBigPslAli", "htcBigPslAliInWindow", tdb->table, item); +if (pslIsProtein(pslList)) + printAlignmentsSimple(pslList, start, "htcBigPslAli", tdb->table, item); +else + printAlignmentsExtra(pslList, start, "htcBigPslAli", "htcBigPslAliInWindow", + tdb->table, item); pslFreeList(&pslList); printItemDetailsHtml(tdb, item); } void genericPslClick(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start, char *subType) /* Handle click in generic psl track. */ { struct psl* pslList = getAlignments(conn, tdb->table, item); /* check if there is an alignment available for this sequence. This checks * both genbank sequences and other sequences in the seq table. If so, * set it up so they can click through to the alignment. */ if (hGenBankHaveSeq(database, item, NULL)) { @@ -7232,36 +7237,46 @@ char *bedRow[32]; char startBuf[16], endBuf[16]; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, seqName, startBuf, endBuf, bedRow, ArraySize(bedRow)); struct bed *bed = bedLoadN(bedRow, 12); if (sameString(bed->name, acc)) { bb->next = NULL; break; } } if (bb == NULL) errAbort("item %s not found in range %s:%d-%d in bigBed %s (%s)", acc, chrom, start, end, tdb->table, fileName); -psl = pslFromBigPsl(seqName, bb, &seq, &cdsString); +unsigned seqTypeField = bbExtraFieldIndex(bbi, "seqType"); +psl = pslFromBigPsl(seqName, bb, seqTypeField, &seq, &cdsString); +if (cdsString) genbankParseCds(cdsString, &cdsStart, &cdsEnd); +if (seq == NULL) + { + printf("Sequence for %s not available.\n", psl->qName); + return; + } struct dnaSeq *rnaSeq = newDnaSeq(seq, strlen(seq), acc); -showSomeAlignment(psl, rnaSeq, gftRna, 0, rnaSeq->size, NULL, cdsStart, cdsEnd); +enum gfType type = gftRna; +if (pslIsProtein(psl)) + type = gftProt; +showSomeAlignment(psl, rnaSeq, type, 0, rnaSeq->size, NULL, cdsStart, cdsEnd); } void htcBigPslAliInWindow(char *acc) /* Show alignment in window for accession in bigPsl file. */ { struct psl *partPsl, *wholePsl; char *aliTable; int start; unsigned int cdsStart = 0, cdsEnd = 0; /* Print start of HTML. */ writeFramesetType(); puts("<HTML>"); aliTable = cartString(cart, "aliTable"); if (isCustomTrack(aliTable)) @@ -7283,31 +7298,39 @@ char *fileName = bbiNameFromSettingOrTable(tdb, NULL, tdb->table); struct bbiFile *bbi = bigBedFileOpen(fileName); struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); char *bedRow[32]; char startBuf[16], endBuf[16]; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, seqName, startBuf, endBuf, bedRow, ArraySize(bedRow)); struct bed *bed = bedLoadN(bedRow, 12); if (sameString(bed->name, acc)) { bb->next = NULL; break; } } -wholePsl = pslFromBigPsl(seqName, bb, &seq, &cdsString); +unsigned seqTypeField = bbExtraFieldIndex(bbi, "seqType"); +wholePsl = pslFromBigPsl(seqName, bb, seqTypeField, &seq, &cdsString); + +if (seq == NULL) + { + printf("Sequence for %s not available.\n", wholePsl->qName); + return; + } +if (cdsString) genbankParseCds(cdsString, &cdsStart, &cdsEnd); if (wholePsl->tStart >= winStart && wholePsl->tEnd <= winEnd) partPsl = wholePsl; else partPsl = pslTrimToTargetRange(wholePsl, winStart, winEnd); struct dnaSeq *rnaSeq = newDnaSeq(seq, strlen(seq), acc); showSomePartialDnaAlignment(partPsl, wholePsl, rnaSeq, NULL, cdsStart, cdsEnd); } static struct dnaSeq *getBaseColorSequence(char *itemName, char *table) /* Grab sequence using the sequence and extFile table names out of BASE_COLOR_USE_SEQUENCE. */ { struct trackDb *tdb = hashMustFindVal(trackHash, table);