34b850ae144d1c2156abe6ec230c2d2ae992cf6f
braney
  Thu Aug 6 15:51:57 2015 -0700
more polish for bigPsl support.  hgc alignments work now  #14241

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 7829e9d..86945e6 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -2865,48 +2865,32 @@
 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++;
     }  
 
 struct bigBedInterval *bbList = bigBedIntervalQuery(bbi, seqName, ivStart, ivEnd, 0, lm);
 pslList = pslFromBigPsl(seqName, bbList,  hChromSize(database, seqName), NULL, NULL);
 
-/* 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 ( 1) //hGenBankHaveSeq(database, item, NULL))
-    {
 printf("<H3>%s/Genomic Alignments</H3>", item);
-    /*
-    if (sameString("protein", subType))
-        printAlignments(pslList, start, "htcProteinAli", tdb->table, item);
-    else
-    */
-        printAlignments(pslList, start, "htcCdnaAli", tdb->table, item);
-    }
-else
-    {
-    /* just dump the psls */
-    pslDumpHtml(pslList);
-    }
+printAlignments(pslList, start, "htcBigPslAli", 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))
     {
@@ -6982,30 +6966,76 @@
     }
 else
     {
     struct trackDb *tdb = hashMustFindVal(trackHash, trackTable);
     char *cdsTable = trackDbSetting(tdb, "cdsTable");
     if (isNotEmpty(cdsTable) && hTableExists(database, cdsTable))
 	{
 	sqlSafef(query, sizeof(query), "select cds from %s where id = '%s'", cdsTable, acc);
 	char *cdsString = sqlQuickString(conn, query);
 	if (isNotEmpty(cdsString))
 	    genbankParseCds(cdsString, retCdsStart, retCdsEnd);
 	}
     }
 }
 
+void htcBigPslAli(char *acc)
+/* Show alignment for accession in bigPsl file. */
+{
+struct psl *psl;
+char *aliTable;
+int start;
+unsigned int cdsStart = 0, cdsEnd = 0;
+
+
+/* Print start of HTML. */
+writeFramesetType();
+puts("<HTML>");
+aliTable = cartString(cart, "aliTable");
+tdb = hashFindVal(trackHash, aliTable);
+printf("<HEAD>\n<TITLE>%s vs Genomic [%s]</TITLE>\n</HEAD>\n\n", acc, aliTable);
+
+/* Get some environment vars. */
+start = cartInt(cart, "l");
+int end = cartInt(cart, "r");
+char *chrom = cartString(cart, "c");
+
+char *seq, *cdsString = NULL;
+struct lm *lm = lmInit(0);
+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;
+	}
+    }
+psl = pslFromBigPsl(seqName, bb,  hChromSize(database, seqName), &seq, &cdsString);
+genbankParseCds(cdsString,  &cdsStart, &cdsEnd);
+
+
+struct dnaSeq *rnaSeq = newDnaSeq(seq, strlen(seq), acc);
+showSomeAlignment(psl, rnaSeq, gftRna, 0, rnaSeq->size, NULL, cdsStart, cdsEnd);
+}
+
 void htcCdnaAli(char *acc)
 /* Show alignment for accession. */
 {
 char query[256];
 char table[64];
 char accTmp[64];
 struct sqlConnection *conn;
 struct sqlResult *sr;
 char **row;
 struct psl *psl;
 struct dnaSeq *rnaSeq;
 char *aliTable;
 int start;
 unsigned int cdsStart = 0, cdsEnd = 0;
 boolean hasBin;
@@ -24618,33 +24648,39 @@
     }
 
 struct customTrack *ct = NULL;
 if (isCustomTrack(track))
     {
     struct customTrack *ctList = getCtList();
     for (ct = ctList; ct != NULL; ct = ct->next)
         if (sameString(track, ct->tdb->track))
             break;
     }
 
 if ((!isCustomTrack(track) && dbIsFound)
 ||  ((ct!= NULL) && (ct->dbTrackType != NULL) && sameString(ct->dbTrackType, "maf")))
     {
     trackHash = makeTrackHashWithComposites(database, seqName, TRUE);
-    if (isHubTrack(track))
+    if (sameString("htcBigPslAli", track) )
+	{
+	char *aliTable = cartString(cart, "aliTable");
+	if (isHubTrack(aliTable))	
+	    tdb = hubConnectAddHubForTrackAndFindTdb( database, aliTable, NULL, trackHash);
+	}
+    else if (isHubTrack(track))
 	{
-	hubConnectAddHubForTrackAndFindTdb( database, track, NULL, trackHash);
+	tdb = hubConnectAddHubForTrackAndFindTdb( database, track, NULL, trackHash);
 	}
     if (parentWigMaf)
         {
         int wordCount, i;
         char *words[16];
         char *typeLine;
         char *wigType = needMem(128);
         tdb = hashFindVal(trackHash, parentWigMaf);
         if (!tdb)
             errAbort("can not find trackDb entry for parentWigMaf track %s.",
                     parentWigMaf);
         typeLine = cloneString(tdb->type);
         wordCount = chopLine(typeLine, words);
         if (wordCount < 1)
          errAbort("trackDb entry for parentWigMaf track %s has corrupt type line.",
@@ -25304,30 +25340,34 @@
     {
     doCgh(table, item, tdb);
     }
 else if (sameWord(table, "mcnBreakpoints"))
     {
     doMcnBreakpoints(table, item, tdb);
     }
 else if (sameWord(table, "htcChainAli"))
     {
     htcChainAli(item);
     }
 else if (sameWord(table, "htcChainTransAli"))
     {
     htcChainTransAli(item);
     }
+else if (sameWord(table, "htcBigPslAli"))
+    {
+    htcBigPslAli(item);
+    }
 else if (sameWord(table, "htcCdnaAli"))
     {
     htcCdnaAli(item);
     }
 else if (sameWord(table, "htcUserAli"))
     {
     htcUserAli(item);
     }
 else if (sameWord(table, "htcGetBlastPep"))
     {
     doGetBlastPep(item, cartString(cart, "aliTable"));
     }
 else if (sameWord(table, "htcProteinAli"))
     {
     htcProteinAli(item, cartString(cart, "aliTable"));