f088470a9391f341dd21dfaa61228dd8d777eaf8
braney
  Thu Feb 18 17:47:48 2016 -0800
fix up the links on the ncbiRefSeq hgc page

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index dd65dba..b1f8fb2 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -5676,31 +5676,31 @@
 
 struct psl *psl = pslList;
 for (psl = pslList; psl != NULL; psl = psl->next)
     {
     if ( pslTrimToTargetRange(psl, winStart, winEnd) != NULL
         &&
 	!startsWith("xeno", tableName)
 	&& !(startsWith("user", tableName) && pslIsProtein(psl))
 	&& psl->tStart == startFirst
         && sameString(psl->tName, seqName)
 	)
 	{
         char otherString[512];
 	safef(otherString, sizeof(otherString), "%d&aliTable=%s",
 	      psl->tStart, tableName);
-	hgcAnchorSomewhere("htcCdnaAliInWindow", cgiEncode(psl->qName),
+	hgcAnchorSomewhere("htcCdnaAliInWindow", cgiEncode(itemIn),
 			   otherString, psl->tName);
 	printf("<BR>View details of parts of alignment within browser window</A>.<BR>\n");
 	}
     }
 }
 
 struct psl *getAlignments(struct sqlConnection *conn, char *table, char *acc)
 /* get the list of alignments for the specified acc */
 {
 struct sqlResult *sr = NULL;
 char **row;
 struct psl *psl, *pslList = NULL;
 boolean hasBin;
 char splitTable[64];
 char query[256];
@@ -7019,30 +7019,45 @@
     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);
 }
 
+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);
+char *spec = trackDbRequiredSetting(tdb, BASE_COLOR_USE_SEQUENCE);
+char *specCopy = cloneString(spec);
+
+// value is: extFile seqTbl extFileTbl
+char *words[3];
+int nwords = chopByWhite(specCopy, words, ArraySize(words));
+if ((nwords != ArraySize(words)) || !sameString(words[0], "extFile"))
+    errAbort("invalid %s track setting: %s", BASE_COLOR_USE_SEQUENCE, spec);
+return hDnaSeqGet(database, itemName, words[1], words[2]);
+}
+
 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;
@@ -7076,30 +7091,34 @@
 if (sameString("mrnaBlastz", aliTable) || sameString("pseudoMrna", aliTable))
     {
     struct sqlConnection *conn = hAllocConn(database);
     unsigned retId = 0;
     safef(accTmp, sizeof accTmp, "bz-%s", acc);
     if (hRnaSeqAndIdx(accTmp, &rnaSeq, &retId, conn) == -1)
         rnaSeq = hRnaSeq(database, acc);
     hFreeConn(&conn);
     }
 else if (sameString("HInvGeneMrna", aliTable))
     {
     /* get RNA accession for the gene id in the alignment */
     sqlSafef(query, sizeof query, "select mrnaAcc from HInv where geneId='%s'", acc);
     rnaSeq = hRnaSeq(database, sqlQuickString(conn, query));
     }
+else if (sameString("ncbiRefSeqPsl", aliTable))
+    {
+    rnaSeq = getBaseColorSequence(acc, aliTable);
+    }
 else
     {
     char *cdnaTable = NULL;
     struct trackDb *tdb = hashFindVal(trackHash, aliTable);
     if (tdb != NULL)
 	cdnaTable = trackDbSetting(tdb, "cdnaTable");
     if (isNotEmpty(cdnaTable) && hTableExists(database, cdnaTable))
 	rnaSeq = hGenBankGetMrna(database, acc, cdnaTable);
     else
 	rnaSeq = hRnaSeq(database, acc);
     }
 
 if (startsWith("xeno", aliTable))
     showSomeAlignment(psl, rnaSeq, gftDnaX, 0, rnaSeq->size, NULL, cdsStart, cdsEnd);
 else
@@ -7187,44 +7206,33 @@
     rnaSeq = oSeq;
     }
 else
     {
     /* Look up alignments in database */
     hFindSplitTable(database, seqName, aliTable, table, &hasBin);
     sqlSafef(query, sizeof(query),
          "select * from %s where qName = '%s' and tName=\"%s\" and tStart=%d", 
          table, acc, seqName, start);
     sr = sqlGetResult(conn, query);
     if ((row = sqlNextRow(sr)) == NULL)
 	errAbort("Couldn't find alignment for %s at %d", acc, start);
     wholePsl = pslLoad(row+hasBin);
     sqlFreeResult(&sr);
 
-    if (startsWith("ucscRetroAli", aliTable) || startsWith("retroMrnaAli", aliTable) || sameString("pseudoMrna", aliTable) || startsWith("altSeqLiftOverPsl", aliTable))
+    if (startsWith("ucscRetroAli", aliTable) || startsWith("retroMrnaAli", aliTable) || sameString("pseudoMrna", aliTable) || startsWith("altSeqLiftOverPsl", aliTable) || startsWith("ncbiRefSeqPsl", aliTable))
 	{
-        rnaSeq = NULL;
-	char *trackName = hGetTrackForTable(database, aliTable);
-	struct trackDb *tdb = hashMustFindVal(trackHash, trackName);
-        char *spec = trackDbRequiredSetting(tdb, BASE_COLOR_USE_SEQUENCE);
-        char *specCopy = cloneString(spec);
-
-        // value is: extFile seqTbl extFileTbl
-        char *words[3];
-        int nwords = chopByWhite(specCopy, words, ArraySize(words));
-        if ((nwords != ArraySize(words)) || !sameString(words[0], "extFile"))
-            errAbort("invalid %s track setting: %s", BASE_COLOR_USE_SEQUENCE, spec);
-        rnaSeq = hDnaSeqGet(database, acc, words[1], words[2]);
+        rnaSeq = getBaseColorSequence(acc, aliTable);
 	}
     else if (sameString("HInvGeneMrna", aliTable))
 	{
 	/* get RNA accession for the gene id in the alignment */
 	sqlSafef(query, sizeof(query), "select mrnaAcc from HInv where geneId='%s'",
 	      acc);
 	rnaSeq = hRnaSeq(database, sqlQuickString(conn, query));
 	}
     else
 	{
 	char *cdnaTable = NULL;
 	struct trackDb *tdb = hashFindVal(trackHash, aliTable);
 	if (tdb != NULL)
 	    cdnaTable = trackDbSetting(tdb, "cdnaTable");
 	if (isNotEmpty(cdnaTable) && hTableExists(database, cdnaTable))
@@ -8247,30 +8255,43 @@
     else if (gp->strand[0] == '-' && gp->cdsEndStat != cdsComplete)
         offset = (3 - gp->exonFrames[gp->exonCount-1]) % 3;
 }
 /* NOTE: this fix will not handle the case in which frame is shifted
  * internally or at multiple exons, as when frame-shift gaps occur in
  * an alignment of an mRNA to the genome.  Going to have to come back
  * and address that later... (acs) */
 
 dnaTranslateSome(cdsDna->dna+offset, prot, protBufSize);
 dnaSeqFree(&cdsDna);
 return prot;
 }
 
 
 
+void ncbiRefSeqSequence(char *itemName)
+{
+char *table = cartString(cart, "o");
+struct dnaSeq *rnaSeq = getBaseColorSequence(itemName, table );
+cartHtmlStart("RefSeq mRNA Sequence");
+
+printf("<PRE><TT>");
+printf(">%s\n", itemName);
+faWriteNext(stdout, NULL, rnaSeq->dna, rnaSeq->size);
+printf("</TT></PRE>");
+}
+
+
 void htcGeneMrna(char *geneName)
 /* Display cDNA predicted from genome */
 {
 char *table = cartString(cart, "o");
 cartHtmlStart("Predicted mRNA from Genome");
 struct genePred *gp, *gpList = getGenePredForPosition(table, geneName), *next;
 int cdsStart, cdsEnd;
 struct dnaSeq *seq;
 
 for(gp = gpList; gp; gp = next)
     {
     next = gp->next;
     seq = getCdnaSeq(gp);
     getCdsInMrna(gp, &cdsStart, &cdsEnd);
     toUpperN(seq->dna + cdsStart, cdsEnd - cdsStart);
@@ -11495,57 +11516,57 @@
 htmlHorizontalLine();
 if (differentWord("n/a", nrl->description))
     {
     printf("Summary of <b>%s</b><br>\n%s<br>\n", nrl->name, nrl->description);
     htmlHorizontalLine();
     }
 
 struct psl *pslList = getAlignments(conn, "ncbiRefSeqPsl", itemName);
 // if the itemName isn't found, it might be found as the nrl->mrnaAcc
 if (! pslList)
     pslList = getAlignments(conn, "ncbiRefSeqPsl", nrl->mrnaAcc);
 if (pslList)
     {
     int start = cartInt(cart, "o");
     printf("<H3>mRNA/Genomic Alignments</H3>");
-    printAlignments(pslList, start, "ncbiRefSeqPsl", "ncbiRefSeqPsl", itemName);
+    printAlignments(pslList, start, "htcCdnaAli", "ncbiRefSeqPsl", itemName);
     }
 else
     {
     printf ("<h4>there is NO alignment for %s</h4><br>\n", itemName);
     }
 
 htmlHorizontalLine();
 
+if (!sameString(tdb->track, "ncbiRefSeqPsl"))
     showGenePos(itemName, tdb);
 
-printf("<h3>Links xyz to sequence:</h3>\n");
+printf("<h3>Links to sequence:</h3>\n");
 printf("<ul>\n");
-printf("<li>need to figure out how to make these links, these don't work.\n");
-
-// might need something like this: seq = hPepSeq(database, buffer);
-
 puts("<li>\n");
-hgcAnchorSomewhere("htcTranslatedProtein", itemName, "seqNcbiRefSeq",
-		       nrl->mrnaAcc);
+hgcAnchorSomewhere("htcTranslatedProtein", nrl->protAcc, "ncbiRefSeqPepTable", seqName);
 printf("Predicted Protein</a> \n");
 puts("</li>\n");
 puts("<li>\n");
-hgcAnchorSomewhere("htcGeneMrna", itemName, tdb->track, nrl->mrnaAcc);
+hgcAnchorSomewhere("ncbiRefSeqSequence", itemName, "ncbiRefSeqPsl", seqName);
 printf("%s</a> may be different from the genomic sequence.\n",
 	   "Predicted mRNA");
 puts("</li>\n");
+puts("<LI>\n");
+hgcAnchorSomewhere("getDna", itemName, tdb->track, seqName);
+printf("Genomic Sequence</A> from assembly\n");
+puts("</LI>\n");
 
 printf("</ul>\n");
 
 printTrackHtml(tdb);
 hFreeConn(&conn);
 }
 
 void doRefGene(struct trackDb *tdb, char *rnaName)
 /* Process click on a known RefSeq gene. */
 {
 struct sqlConnection *conn = hAllocConn(database);
 int start = cartInt(cart, "o");
 int left = cartInt(cart, "l");
 int right = cartInt(cart, "r");
 char *chrom = cartString(cart, "c");
@@ -24977,30 +24998,31 @@
     doSuperfamily(tdb, item, NULL);
     }
 else if (sameWord(table, "ensGene") || sameWord (table, "ensGeneNonCoding"))
     {
     doEnsemblGene(tdb, item, NULL);
     }
 else if (sameWord(table, "xenoRefGene"))
     {
     doRefGene(tdb, item);
     }
 else if (sameWord(table, "knownGene"))
     {
     doKnownGene(tdb, item);
     }
 else if (sameWord(table, "ncbiRefSeq") ||
+         sameWord(table, "ncbiRefSeqPsl") ||
          sameWord(table, "ncbiRefSeqCurated") ||
          sameWord(table, "ncbiRefSeqPredicted") ||
          sameWord(table, "ncbiRefSeqOther") )
     {
     doNcbiRefSeq(tdb, item);
     }
 else if (sameWord(table, "refGene") )
     {
     doRefGene(tdb, item);
     }
 else if (sameWord(table, "ccdsGene"))
     {
     doCcdsGene(tdb, item);
     }
 else if (isNewGencodeGene(tdb))
@@ -25414,30 +25436,34 @@
     {
     htcExtSeq(item);
     }
 else if (sameWord(table, "htcTranslatedProtein"))
     {
     htcTranslatedProtein(item);
     }
 else if (sameWord(table, "htcTranslatedPredMRna"))
     {
     htcTranslatedPredMRna(item);
     }
 else if (sameWord(table, "htcTranslatedMRna"))
     {
     htcTranslatedMRna(tdbForTableArg(), item);
     }
+else if (sameWord(table, "ncbiRefSeqSequence"))
+    {
+    ncbiRefSeqSequence(item);
+    }
 else if (sameWord(table, "htcGeneMrna"))
     {
     htcGeneMrna(item);
     }
 else if (sameWord(table, "htcRefMrna"))
     {
     htcRefMrna(item);
     }
 else if (sameWord(table, "htcDisplayMrna"))
     {
     htcDisplayMrna(item);
     }
 else if (sameWord(table, "htcGeneInGenome"))
     {
     htcGeneInGenome(item);