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);