8be39eded2ca995a387d5c47127f049c2b228932
braney
  Tue Jun 2 17:26:58 2015 -0700
changes to get NCBI RefSeq track to use the trackVersion table, and to
grab Genbank information when available.  #13673

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 6caacc9..34c7317 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -8798,101 +8798,75 @@
     if (nonCoding)
         printf("none (non-coding)<BR>\n");
     else
         printf("<A HREF=\"%s/protview?peptide=%s\" "
 	      "target=_blank>%s</A><BR>", dbUrl, proteinID, proteinID);
     }
 freeMem(shortItemName);
 }
 
 void doEnsemblGene(struct trackDb *tdb, char *item, char *itemForUrl)
 /* Put up Ensembl Gene track info or Ensembl NonCoding track info. */
 {
 char *dupe, *type, *words[16];
 int wordCount;
 int start = cartInt(cart, "o");
-struct sqlConnection *conn = hAllocConn(database);
 char condStr[256];
-char versionString[256];
-char dateReference[256];
 char headerTitle[512];
 
-/* see if hgFixed.trackVersion exists */
-boolean trackVersionExists = hTableExists("hgFixed", "trackVersion");
-/* assume nothing found */
-versionString[0] = 0;
-dateReference[0] = 0;
-
-if (trackVersionExists)
-    {
-    char query[256];
-    sqlSafef(query, sizeof(query), "select version,dateReference from hgFixed.trackVersion where db = '%s' AND name = 'ensGene' order by updateTime DESC limit 1", database);
-    struct sqlResult *sr = sqlGetResult(conn, query);
-    char **row;
-
-    /* in case of NULL result from the table */
-    versionString[0] = 0;
-    while ((row = sqlNextRow(sr)) != NULL)
-	{
-	safef(versionString, sizeof(versionString), "Ensembl %s",
-		row[0]);
-	safef(dateReference, sizeof(dateReference), "%s",
-		row[1]);
-	}
-    sqlFreeResult(&sr);
-    }
-
 if (itemForUrl == NULL)
     itemForUrl = item;
 dupe = cloneString(tdb->type);
-if (versionString[0])
-    safef(headerTitle, sizeof(headerTitle), "%s - %s", item, versionString);
+
+struct trackVersion *trackVersion = getTrackVersion(database, tdb->track);
+if ((trackVersion != NULL) && !isEmpty(trackVersion->version))
+    safef(headerTitle, sizeof(headerTitle), "%s - Ensembl %s", item, trackVersion->version);
 else
     safef(headerTitle, sizeof(headerTitle), "%s", item);
 
 genericHeader(tdb, headerTitle);
 wordCount = chopLine(dupe, words);
 char *archive = trackDbSetting(tdb, "ensArchive");
 if (archive == NULL)
     {
-    if (dateReference[0])
+    if ((trackVersion != NULL) && !isEmpty(trackVersion->dateReference))
 	{
-	if (differentWord("current", dateReference))
-	    archive = cloneString(dateReference);
+	if (differentWord("current", trackVersion->dateReference))
+	    archive = cloneString(trackVersion->dateReference);
 	}
     }
 printEnsemblCustomUrl(tdb, itemForUrl, item == itemForUrl, archive);
 sqlSafefFrag(condStr, sizeof condStr, "name='%s'", item);
 
+struct sqlConnection *conn = hAllocConn(database);
+
 /* if this is a non-coding gene track, then print the biotype and
    the external ID */
 if (sameWord(tdb->table, "ensGeneNonCoding"))
     {
-    struct sqlConnection *conn2 = hAllocConn(database);
     char query[256];
     struct sqlResult *sr = NULL;
     char **row;
     sqlSafef(query, sizeof(query), "select biotype, extGeneId from %s where %s",
           tdb->table, condStr);
     sr = sqlGetResult(conn, query);
     if ((row = sqlNextRow(sr)) != NULL)
         {
         printf("<B>Gene Type:</B> %s<BR>\n", row[0]);
         printf("<B>External Gene ID:</B> %s<BR>\n", row[1]);
         }
     sqlFreeResult(&sr);
-    hFreeConn(&conn2);
     }
 else
     {
     /* print CCDS if this is not a non-coding gene */
     printCcdsForSrcDb(conn, item);
     printf("<BR>\n");
     }
 
 if (hTableExists(database, "ensInfo"))
     {
     struct sqlResult *sr;
     char query[256], **row;
     struct ensInfo *info = NULL;
 
     sqlSafef(query, sizeof(query),
@@ -11297,139 +11271,198 @@
     {
     AllocVar(palInfo);
     palInfo->chrom = chrom;
     palInfo->left = left;
     palInfo->right = right;
     palInfo->rnaName = rnaName;
     }
 
 geneShowPosAndLinksPal(rl->mrnaAcc, rl->protAcc, tdb, "refPep", "htcTranslatedProtein",
 		    "htcRefMrna", "htcGeneInGenome", "mRNA Sequence",palInfo);
 
 printTrackHtml(tdb);
 hFreeConn(&conn);
 }
 
-void doNcbiRefGene(struct trackDb *tdb, char *rnaName)
-/* Process click on a NCBI RefSeq gene. */
+static struct refLink *printRefSeqInfo( struct sqlConnection *conn, struct trackDb *tdb, char *rnaName, char *version)
 {
-struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[256];
 char *sqlRnaName = rnaName;
-struct ncbiRefLink *rl;
-boolean isPredicted = sameString(tdb->table, "ncbiRefPredicted");
+char *summary = NULL;
+boolean isXeno = sameString(tdb->table, "xenoRefGene");
+struct refLink *rl;
 
 /* Make sure to escape single quotes for DB parseability */
 if (strchr(rnaName, '\''))
     {
     sqlRnaName = replaceChars(rnaName, "'", "''");
     }
 /* get refLink entry */
-sqlSafef(query, sizeof(query), "select * from ncbiRefLink where id = '%s'", sqlRnaName);
+if (version == NULL)
+    {
+    sqlSafef(query, sizeof(query), "select * from refLink where mrnaAcc = '%s'", sqlRnaName);
     sr = sqlGetResult(conn, query);
     if ((row = sqlNextRow(sr)) == NULL)
-    errAbort("Couldn't find %s in ncbiRefLink table.", rnaName);
-rl = ncbiRefLinkLoad(row);
+	errAbort("Couldn't find %s in refLink table - this accession may no longer be available.", rnaName);
+    rl = refLinkLoad(row);
+    sqlFreeResult(&sr);
+    }
+else
+    {
+    sqlSafef(query, sizeof(query), "select * from refLink r, gbCdnaInfo g where mrnaAcc = '%s' and r.mrnaAcc=g.acc and g.version='%s'", sqlRnaName, version);
+    sr = sqlGetResult(conn, query);
+    if ((row = sqlNextRow(sr)) == NULL)
+	{
+	sqlFreeResult(&sr);
+	return NULL;
+	}
+    rl = refLinkLoad(row);
     sqlFreeResult(&sr);
+    }
 
 /* print the first section with info  */
-if (isPredicted)
-    cartWebStart(cart, database, "NCBI Predicted RefSeq Gene");
-else
-    cartWebStart(cart, database, "NCBI Curated RefSeq Gene");
 printf("<table border=0>\n<tr>\n");
-prNcbiRefGeneInfo(conn, rnaName, sqlRnaName, rl, isPredicted);
+prRefGeneInfo(conn, rnaName, sqlRnaName, rl, isXeno);
+addGeneExtra(rl->name);  /* adds columns if extra info is available */
 
 printf("</tr>\n</table>\n");
 
+/* optional summary text */
+summary = getRefSeqSummary(conn, sqlRnaName);
+if (summary != NULL)
+    {
+    htmlHorizontalLine();
+    printf("<H3>Summary of %s</H3>\n", rl->name);
+    printf("<P>%s</P>\n", summary);
+    freeMem(summary);
+    }
 htmlHorizontalLine();
 
-struct palInfo *palInfo = NULL;
-
-
-geneShowPosAndLinksPal(rl->id, NULL, tdb, NULL, "htcTranslatedProtein",
-		    "htcGeneMrna", "htcGeneInGenome", "mRNA Sequence",palInfo);
-
-printTrackHtml(tdb);
-hFreeConn(&conn);
+return rl;
 }
-void doRefGene(struct trackDb *tdb, char *rnaName)
-/* Process click on a known RefSeq gene. */
+
+void doNcbiRefGene(struct trackDb *tdb, char *rnaName)
+/* Process click on a NCBI RefSeq gene. */
 {
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[256];
 char *sqlRnaName = rnaName;
-char *summary = NULL;
-boolean isXeno = sameString(tdb->table, "xenoRefGene");
-struct refLink *rl;
-int start = cartInt(cart, "o");
+struct ncbiRefLink *nrl;
+boolean isPredicted = sameString(tdb->table, "ncbiRefPredicted");
 int left = cartInt(cart, "l");
 int right = cartInt(cart, "r");
 char *chrom = cartString(cart, "c");
+char noDot[1024];
+
+struct dyString *dy = newDyString(1024);
+if (isPredicted)
+    dyStringPrintf(dy, "NCBI Predicted RefSeq Gene");
+else
+    dyStringPrintf(dy, "NCBI Curated RefSeq Gene");
+
+struct trackVersion *trackVersion = getTrackVersion(database, "ncbiRefSeq");
+if ((trackVersion != NULL) && !isEmpty(trackVersion->version))
+    dyStringPrintf(dy, "- Release %s\n", trackVersion->version);
+
+cartWebStart(cart, database, "%s", dy->string);
+safecpy(noDot, sizeof noDot,  rnaName);
+char *ptr = strchr(noDot, '.');
+if (ptr)
+    *ptr++ = 0;
+
+// get info from Genbank (if any)
+struct refLink *rl = printRefSeqInfo( conn, tdb, noDot, ptr);
 
 /* Make sure to escape single quotes for DB parseability */
 if (strchr(rnaName, '\''))
     {
     sqlRnaName = replaceChars(rnaName, "'", "''");
     }
+
 /* get refLink entry */
-sqlSafef(query, sizeof(query), "select * from refLink where mrnaAcc = '%s'", sqlRnaName);
+sqlSafef(query, sizeof(query), "select * from ncbiRefLink where id = '%s'", sqlRnaName);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) == NULL)
-    errAbort("Couldn't find %s in refLink table - this accession may no longer be available.", rnaName);
-rl = refLinkLoad(row);
+    errAbort("Couldn't find %s in ncbiRefLink table.", rnaName);
+nrl = ncbiRefLinkLoad(row);
 sqlFreeResult(&sr);
 
 /* print the first section with info  */
-if (isXeno)
-    cartWebStart(cart, database, "Non-%s RefSeq Gene", organism);
-else
-    cartWebStart(cart, database, "RefSeq Gene");
 printf("<table border=0>\n<tr>\n");
-prRefGeneInfo(conn, rnaName, sqlRnaName, rl, isXeno);
-addGeneExtra(rl->name);  /* adds columns if extra info is available */
+if (rl == NULL)
+    {
+    prNcbiRefGeneInfo(conn, rnaName, sqlRnaName, nrl, isPredicted);
+    htmlHorizontalLine();
+    }
+
+if ((trackVersion != NULL) && !isEmpty(trackVersion->version))
+    {
+    printf("<B>Annotation Release:</B> <A HREF=\"%s\" TARGET=_blank> %s <BR></A>", trackVersion->comment, trackVersion->version);
+    htmlHorizontalLine();
+    }
 
 printf("</tr>\n</table>\n");
 
-/* optional summary text */
-summary = getRefSeqSummary(conn, sqlRnaName);
-if (summary != NULL)
+struct palInfo *palInfo = NULL;
+
+if (genbankIsRefSeqCodingMRnaAcc(rnaName))
     {
-    htmlHorizontalLine();
-    printf("<H3>Summary of %s</H3>\n", rl->name);
-    printf("<P>%s</P>\n", summary);
-    freeMem(summary);
+    AllocVar(palInfo);
+    palInfo->chrom = chrom;
+    palInfo->left = left;
+    palInfo->right = right;
+    palInfo->rnaName = rnaName;
     }
-htmlHorizontalLine();
 
-/* print alignments that track was based on */
+geneShowPosAndLinksPal(nrl->id, NULL, tdb, NULL, "htcTranslatedProtein",
+		    "htcGeneMrna", "htcGeneInGenome", "mRNA Sequence",palInfo);
+
+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");
+
+boolean isXeno = sameString(tdb->table, "xenoRefGene");
+if (isXeno)
+    cartWebStart(cart, database, "Non-%s RefSeq Gene", organism);
+else
+    cartWebStart(cart, database, "RefSeq Gene");
+struct refLink *rl = printRefSeqInfo( conn, tdb, rnaName, NULL);
+
+/* print alignments that track was based on */
 char *aliTbl = (sameString(tdb->table, "refGene") ? "refSeqAli" : "xenoRefSeqAli");
 if (hTableExists(database, aliTbl))
     {
     struct psl *pslList = getAlignments(conn, aliTbl, rl->mrnaAcc);
     printf("<H3>mRNA/Genomic Alignments</H3>");
     printAlignments(pslList, start, "htcCdnaAli", aliTbl, rl->mrnaAcc);
     }
 else
     warn("Sequence alignment links not shown below, the table %s.refSeqAli is not installed " 
             "on this server", database);
-}
 
 htmlHorizontalLine();
 
 struct palInfo *palInfo = NULL;
 
 if (genbankIsRefSeqCodingMRnaAcc(rnaName))
     {
     AllocVar(palInfo);
     palInfo->chrom = chrom;
     palInfo->left = left;
     palInfo->right = right;
     palInfo->rnaName = rnaName;
     }
 
 geneShowPosAndLinksPal(rl->mrnaAcc, rl->protAcc, tdb, "refPep", "htcTranslatedProtein",