src/hg/hgc/hgc.c 1.1620

1.1620 2010/05/11 01:43:28 kent
Refactoring to split the trackDb.tableName field into separate track and table fields. Similarly track.mapName field goes to the same track and table fields.
Index: src/hg/hgc/hgc.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgc/hgc.c,v
retrieving revision 1.1619
retrieving revision 1.1620
diff -b -B -U 4 -r1.1619 -r1.1620
--- src/hg/hgc/hgc.c	4 May 2010 00:03:28 -0000	1.1619
+++ src/hg/hgc/hgc.c	11 May 2010 01:43:28 -0000	1.1620
@@ -832,9 +832,9 @@
 	sprintf(endString, "%d", winEnd);
 	ins[0] = "$$";
 	outs[0] = idInUrl;
 	ins[1] = "$T";
-	outs[1] = tdb->tableName;
+	outs[1] = tdb->track;
 	ins[2] = "$S";
 	outs[2] = seqName;
 	ins[3] = "$[";
 	outs[3] = startString;
@@ -871,9 +871,9 @@
 	printf("<B>%s </B>",
                trackDbSettingOrDefault(tdb, urlLabelSetting, "Outside Link:"));
         printf("<A HREF=\"%s\" target=_blank>", eUrl->string);
 
-	if (sameWord(tdb->tableName, "npredGene"))
+	if (sameWord(tdb->table, "npredGene"))
 	    {
 	    printf("%s (%s)</A><BR>\n", idInUrl, "NCBI MapView");
 	    }
 	else
@@ -917,9 +917,9 @@
 struct sqlResult *sr;
 char **row;
 boolean firstTime = TRUE;
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
         table, item, seqName, start);
 
 /*errAbort( "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
@@ -986,9 +986,9 @@
             filterTable, filterCt);
     }
 else
     {
-    hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+    hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
     safef(query, sizeof(query),
           "select * from %s where chrom = '%s' and chromEnd > %d and "
           "chromStart < %d order by score desc",
           table, seqName, winStart, winEnd);
@@ -1087,9 +1087,9 @@
         continue;
     *title = '\0';
     title++;
     if((table = strchr(words[ix],'.')) == NULL)
-        table = tdb->tableName;
+        table = tdb->table;
     else
         {
         *table++ = '\0';  // assigns before advance
         if((words[ix] = strchr(table,'.')) != NULL)
@@ -1113,9 +1113,9 @@
         gotOne = TRUE;
         printf("<P>The item \"%s\" has been located in other genomes:\n<UL>\n",name);
         }
     printf("<LI>");
-    safef(extra,sizeof(extra),"%s=full",tdb->tableName);
+    safef(extra,sizeof(extra),"%s=full",tdb->track);
     linkToOtherBrowserExtra(db, chrom, beg, end, extra);
     printf("%s</A></LI>\n",strSwapChar(title,'_',' '));
     sqlFreeResult(&sr);
     }
@@ -1147,9 +1147,9 @@
 struct sqlConnection *sc;
 struct atom ret;
 
 genericHeader(tdb, item);
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 #if 0
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", table, escapedName, seqName, start);
 sr = sqlGetResult(conn, query);
 printf("<B>This is the item you clicked on:</B><BR>\n");
@@ -1298,14 +1298,14 @@
 char **row;
 boolean firstTime = TRUE;
 char *escapedName = sqlEscapeString(item);
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 if (bedSize <= 3)
     sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d", table, seqName, start);
 else
     {
-    struct hTableInfo *hti = hFindTableInfoWithConn(conn, seqName, tdb->tableName);
+    struct hTableInfo *hti = hFindTableInfoWithConn(conn, seqName, tdb->table);
     if (hti && *hti->nameField && differentString("name", hti->nameField))
 	sprintf(query, "select * from %s where %s = '%s' and chrom = '%s' and chromStart = %d",
 	    table, hti->nameField, escapedName, seqName, start);
     else
@@ -1452,9 +1452,9 @@
 struct sqlResult *sr;
 char **row;
 boolean firstTime = TRUE;
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 if (bedSize <= 3)
     sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d", table, seqName, start);
 else
     sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
@@ -2174,9 +2174,9 @@
 
 void showGenePos(char *name, struct trackDb *tdb)
 /* Show gene prediction position and other info. */
 {
-char *track = tdb->tableName;
+char *rootTable = tdb->table;
 char query[512];
 struct sqlConnection *conn = hAllocConn(database);
 struct genePred *gpList = NULL, *gp = NULL;
 boolean hasBin;
@@ -2184,9 +2184,9 @@
 struct sqlResult *sr = NULL;
 char **row = NULL;
 char *classTable = trackDbSetting(tdb, GENEPRED_CLASS_TBL);
 
-hFindSplitTable(database, seqName, track, table, &hasBin);
+hFindSplitTable(database, seqName, rootTable, table, &hasBin);
 safef(query, sizeof(query), "name = \"%s\"", name);
 gpList = genePredReaderLoadQuery(conn, table, query);
 for (gp = gpList; gp != NULL; gp = gp->next)
     {
@@ -2253,17 +2253,17 @@
 		      struct sqlConnection *connMm)
 /* Show gene prediction position and other info. */
 {
 char query[512];
-char *track = tdb->tableName;
+char *rootTable = tdb->table;
 struct sqlResult *sr;
 char **row;
 struct genePred *gp = NULL;
 boolean hasBin;
 int posCount = 0;
 char table[64] ;
 
-hFindSplitTable(database, seqName, track, table, &hasBin);
+hFindSplitTable(database, seqName, rootTable, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s'", table, name);
 sr = sqlGetResult(connMm, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
@@ -2282,9 +2282,9 @@
 			 char *mrnaClick, char *genomicClick, char *mrnaDescription)
 /* Show parts of gene common to everything. If pepTable is not null,
  * it's the old table name, but will check gbSeq first. */
 {
-char *geneTable = tdb->tableName;
+char *geneTable = tdb->table;
 boolean foundPep = FALSE;
 
 showGenePos(geneName, tdb);
 if (startsWith("ENCODE Gencode",tdb->longLabel))
@@ -2365,9 +2365,9 @@
     }
 
 puts("<LI>\n");
 hgcAnchorSomewhere(mrnaClick, geneName, geneTable, seqName);
-/* ugly hack to put out a correct message describing the mRNA */
+/* hack to put out a correct message describing the mRNA */
 if (sameString(mrnaClick, "htcGeneMrna"))
     printf("%s</A> from genomic sequences\n", mrnaDescription);
 else
     printf("%s</A> may be different from the genomic sequence.\n",
@@ -2385,9 +2385,9 @@
 				  char *pepTable, char *pepClick,
 				  char *mrnaClick, char *genomicClick, char *mrnaDescription)
 /* Show parts of a DNA based RefSeq gene */
 {
-char *geneTable = tdb->tableName;
+char *geneTable = tdb->table;
 
 showGenePos(geneName, tdb);
 printf("<H3>Links to sequence:</H3>\n");
 printf("<UL>\n");
@@ -2403,9 +2403,9 @@
 			      struct sqlConnection *connMm, char *pepClick,
 			      char *mrnaClick, char *genomicClick, char *mrnaDescription)
 /* Show parts of gene common to everything */
 {
-char *geneTable = tdb->tableName;
+char *geneTrack = tdb->track;
 
 showGenePosMouse(geneName, tdb, connMm);
 printf("<H3>Links to sequence:</H3>\n");
 printf("<UL>\n");
@@ -2413,11 +2413,11 @@
     {
     hgcAnchorSomewhereDb(pepClick, pepName, pepTable, seqName, mousedb);
     printf("<LI>Translated Protein</A> \n");
     }
-hgcAnchorSomewhereDb(mrnaClick, geneName, geneTable, seqName, mousedb);
+hgcAnchorSomewhereDb(mrnaClick, geneName, geneTrack, seqName, mousedb);
 printf("<LI>%s</A>\n", mrnaDescription);
-hgcAnchorSomewhereDb(genomicClick, geneName, geneTable, seqName, mousedb);
+hgcAnchorSomewhereDb(genomicClick, geneName, geneTrack, seqName, mousedb);
 printf("<LI>Genomic Sequence</A> DNA sequence from assembly\n");
 printf("</UL>\n");
 }
 
@@ -2487,20 +2487,20 @@
 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->tableName, item);
+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))
     {
     printf("<H3>%s/Genomic Alignments</H3>", item);
     if (sameString("protein", subType))
-        printAlignments(pslList, start, "htcProteinAli", tdb->tableName, item);
+        printAlignments(pslList, start, "htcProteinAli", tdb->track, item);
     else
-        printAlignments(pslList, start, "htcCdnaAli", tdb->tableName, item);
+        printAlignments(pslList, start, "htcCdnaAli", tdb->track, item);
     }
 else
     {
     /* just dump the psls */
@@ -2509,46 +2509,54 @@
 pslFreeList(&pslList);
 }
 
 
+static char *getParentTableName(struct trackDb *tdb)
+/* Get the track table or composite track parent table if applicable. */
+{
+tdb = trackDbTopLevelSelfOrParent(tdb);
+return tdb->table;
+}
+
 static char *getParentTrackName(struct trackDb *tdb)
-/* Get the track table name or composite track parent name if applicable. */
+/* Get the track name or composite track parent name if applicable. */
 {
 tdb = trackDbTopLevelSelfOrParent(tdb);
-return tdb->tableName;
+return tdb->track;
 }
 
+
 void printTBSchemaLink(struct trackDb *tdb)
 /* Make link to TB schema -- unless this is an on-the-fly (tableless) track. */
 {
-if (hTableOrSplitExists(database, tdb->tableName))
+if (hTableOrSplitExists(database, tdb->table))
     {
-    char *trackTable = getParentTrackName(tdb);
+    char *trackTable = getParentTableName(tdb);
     printf("<P><A HREF=\"../cgi-bin/hgTables?db=%s&hgta_group=%s&hgta_track=%s"
 	   "&hgta_table=%s&position=%s:%d-%d&"
 	   "hgta_doSchema=describe+table+schema\" target=ucscSchema title='Open schema in new window'>"
 	   "View table schema</A></P>\n",
-	   database, tdb->grp, trackTable, tdb->tableName,
+	   database, tdb->grp, trackTable, tdb->table,
 	   seqName, winStart+1, winEnd);
     }
 }
 
 void printTrackUiLink(struct trackDb *tdb)
 /* Make link to hgTrackUi. */
 {
-char *trackTable = getParentTrackName(tdb);
+char *trackName = getParentTrackName(tdb);
 struct trackDb *parentTdb = tdb;
-if (!sameString(trackTable, tdb->tableName))
-    parentTdb = hTrackDbForTrack(database, trackTable);
+if (!sameString(trackName, tdb->track))
+    parentTdb = hTrackDbForTrack(database, trackName);
 printf("<P><A HREF=\"../cgi-bin/hgTrackUi?g=%s&%s\">"
        "Go to %s track controls</A></P>\n",
-       trackTable, cartSidUrlString(cart), parentTdb->shortLabel);
+       trackName, cartSidUrlString(cart), parentTdb->shortLabel);
 }
 
 void printDataVersion(struct trackDb *tdb)
 /* If this annotation has a dataVersion trackDb setting, print it */
 {
-(void)metadataForTable(database,tdb,NULL);
+metadataForTable(database,tdb,NULL);
 const char *version = metadataFindValue(tdb,"dataVersion");
 if(version != NULL)
     printf("<B>Data version:</B> %s <BR>\n", version);
 else
@@ -2596,15 +2604,15 @@
  * to the TB table schema page for this table. */
 {
 char *tableName;
 
-if (!isCustomTrack(tdb->tableName))
+if (!isCustomTrack(tdb->track))
     {
     extraUiLinks(database,tdb);
     printTrackUiLink(tdb);
     printDataVersion(tdb);
     printOrigAssembly(tdb);
-    if ((tableName = hTableForTrack(database, tdb->tableName)) != NULL)
+    if ((tableName = hTableForTrack(database, tdb->table)) != NULL)
 	{
 	struct sqlConnection *conn = hAllocConnTrack(database, tdb);
 
 	char *date = firstWordInLine(sqlTableUpdate(conn, tableName));
@@ -2721,9 +2729,8 @@
 void genericChainClick(struct sqlConnection *conn, struct trackDb *tdb,
 		       char *item, int start, char *otherDb)
 /* Handle click in chain track, at least the basics. */
 {
-char *track = tdb->tableName;
 char *thisOrg = hOrganism(database);
 char *otherOrg = NULL;
 struct chain *chain = NULL, *subChain = NULL, *toFree = NULL;
 int chainWinSize;
@@ -2740,9 +2747,9 @@
     /* use first word of chain label (count on org name as first word) */
     otherOrg = firstWordInLine(cloneString(tdb->shortLabel));
     }
 
-chain = chainLoadIdRange(database, track, seqName, winStart, winEnd, atoi(item));
+chain = chainLoadIdRange(database, tdb->table, seqName, winStart, winEnd, atoi(item));
 chainSubsetOnT(chain, winStart, winEnd, &subChain, &toFree);
 
 if (subChain == NULL)
     nullSubset = TRUE;
@@ -2827,9 +2834,9 @@
 if (normScoreAvailable)
     {
     boolean hasBin;
     char tableName[HDB_MAX_TABLE_STRING];
-    hFindSplitTable(database, chain->tName, track, tableName, &hasBin);
+    hFindSplitTable(database, chain->tName, tdb->table, tableName, &hasBin);
     char query[256];
     struct sqlResult *sr;
     char **row;
     safef(query, ArraySize(query),
@@ -2853,9 +2860,9 @@
 if (sqlDatabaseExists(otherDb) && chromSeqFileExists(otherDb, chain->qName))
     {
     if (chainWinSize < 1000000)
         {
-        hgcAnchorSomewhere("htcChainAli", item, track, chain->tName);
+        hgcAnchorSomewhere("htcChainAli", item, tdb->track, chain->tName);
         printf("View details of parts of chain within browser "
            "window</A>.<BR>\n");
         }
     else
@@ -2968,9 +2975,9 @@
     {
     /* use first word in short track label */
     otherOrg = firstWordInLine(cloneString(tdb->shortLabel));
     }
-hFindSplitTable(database, seqName, tdb->tableName, table, &rowOffset);
+hFindSplitTable(database, seqName, tdb->table, table, &rowOffset);
 snprintf(query, sizeof(query),
 	 "select * from %s where tName = '%s' and tStart <= %d and tEnd > %d "
 	 "and level = %s",
 	 table, seqName, start, start, item);
@@ -3099,9 +3106,9 @@
 dupe = cloneString(tdb->type);
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
 	    table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 
@@ -3210,9 +3217,9 @@
 dupe = cloneString(tdb->type);
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
 	    table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 
@@ -3323,9 +3330,9 @@
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, item, FALSE);
 /* printCustomUrl(tdb, itemForUrl, item == itemForUrl); */
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
 	    table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
@@ -3360,9 +3367,9 @@
 boolean firstTime = TRUE;
 int start = cartInt(cart, "o");
 int bedSize = 5;
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 dyStringPrintf(query, "select * from %s where chrom = '%s' and ",
 	       table, seqName);
 hAddBinToQuery(winStart, winEnd, query);
 dyStringPrintf(query, "name = '%s' and chromStart = %d", item, start);
@@ -3403,9 +3410,9 @@
 int start = cartInt(cart, "o");
 
 genericHeader(tdb, item);
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 dyStringPrintf(query, "select * from %s where chrom = '%s' and ",
 	       table, seqName);
 hAddBinToQuery(winStart, winEnd, query);
 dyStringPrintf(query, "name = '%s' and chromStart = %d", item, start);
@@ -3433,9 +3440,9 @@
 struct sqlResult *sr;
 char query[256];
 char **row;
 genericHeader(tdb, item);
-safef(query, sizeof(query), "select chrom,chromStart,chromEnd,name,score,strand from %s where name='%s'", tdb->tableName, item);
+safef(query, sizeof(query), "select chrom,chromStart,chromEnd,name,score,strand from %s where name='%s'", tdb->table, item);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
     struct bed *itemBed = bedLoad6(row);
@@ -3618,13 +3625,13 @@
     char *bigImagePath = trackDbSettingClosestToHome(tdb, ITEM_BIG_IMAGE_PATH);
     char *bothWords[2];
     int shouldBeTwo = chopLine(imagePath, bothWords);
     if (shouldBeTwo != 2)
-	errAbort("itemImagePath setting for %s track incorrect. Needs to be \"itemImagePath <path> <suffix>\".", tdb->tableName);
+	errAbort("itemImagePath setting for %s track incorrect. Needs to be \"itemImagePath <path> <suffix>\".", tdb->track);
     printf("<BR><IMG SRC=\"%s/%s.%s\"><BR><BR>\n", bothWords[0], item, bothWords[1]);
     shouldBeTwo = chopLine(bigImagePath, bothWords);
     if (shouldBeTwo != 2)
-	errAbort("bigItemImagePath setting for %s track incorrect. Needs to be \"itemImagePath <path> <suffix>\".", tdb->tableName);
+	errAbort("bigItemImagePath setting for %s track incorrect. Needs to be \"itemImagePath <path> <suffix>\".", tdb->track);
     printf("<A HREF=\"%s/%s.%s\">Download Original Image</A><BR>\n", bothWords[0], item, bothWords[1]);
     }
 
 printTrackHtml(tdb);
@@ -3777,9 +3784,10 @@
 
 for (ct=ctList;  ct != NULL;  ct=ct->next)
     {
     AllocVar(tdb);
-    tdb->tableName = ct->tdb->tableName;
+    tdb->track = ct->tdb->track;
+    tdb->table = ct->tdb->table;
     tdb->shortLabel = ct->tdb->shortLabel;
     tdb->type = ct->tdb->type;
     tdb->longLabel = ct->tdb->longLabel;
     tdb->visibility = ct->tdb->visibility;
@@ -3809,9 +3817,9 @@
 {
 struct customTrack *ct;
 
 for (ct=getCtList();  ct != NULL;  ct=ct->next)
-    if (sameString(name, ct->tdb->tableName))
+    if (sameString(name, ct->tdb->track))
 	return(ct);
 
 return(NULL);
 }
@@ -3867,9 +3875,10 @@
 else
     {
     struct trackDb *tdb;
     AllocVar(tdb);
-    tdb->tableName = cloneString(USER_PSL_TRACK_NAME);
+    tdb->track = cloneString(USER_PSL_TRACK_NAME);
+    tdb->table = cloneString(USER_PSL_TRACK_NAME);
     tdb->shortLabel = cloneString(USER_PSL_TRACK_LABEL);
     tdb->type = cloneString("psl");
     tdb->longLabel = cloneString(USER_PSL_TRACK_LONGLABEL);
     tdb->visibility = tvFull;
@@ -3931,9 +3940,9 @@
     struct trackDb *rtdb;
     char *visString = cartOptionalString(cart, "rmsk");
     for (rtdb = tdbList;  rtdb != NULL;  rtdb=rtdb->next)
 	{
-	if (startsWith(rtdb->tableName, "rmsk"))
+	if (startsWith(rtdb->table, "rmsk"))
 	    break;
 	}
     printf("<P> <B>Note:</B> repeat masking style from previous page will <B>not</B> apply to this page.\n");
     if ((rtdb != NULL) &&
@@ -3974,12 +3983,13 @@
 printf("<TABLE BORDER=1>\n");
 printf("<TR><TD>Track<BR>Name</TD><TD>Toggle<BR>Case</TD><TD>Under-<BR>line</TD><TD>Bold</TD><TD>Italic</TD><TD>Red</TD><TD>Green</TD><TD>Blue</TD></TR>\n");
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
-    char *track = tdb->tableName;
-    if (sameString(USER_PSL_TRACK_NAME, track) ||
+    char *table = tdb->table;
+    char *track = tdb->track;
+    if (sameString(USER_PSL_TRACK_NAME, table) ||
 	(lookupCt(track) != NULL) ||
-	(fbUnderstandTrack(database, track) && !dnaIgnoreTrack(track)))
+	(fbUnderstandTrack(database, table) && !dnaIgnoreTrack(table)))
 	{
         char *visString = cartUsualString(cart, track, hStringFromTv(tdb->visibility));
          if (differentString(visString, "hide") && tdb->parent)
             {
@@ -4010,34 +4020,34 @@
 	else
 	    {
 	    printf("<TR>");
 	    printf("<TD>%s</TD>", tdb->shortLabel);
-	    sprintf(buf, "%s_case", tdb->tableName);
+	    sprintf(buf, "%s_case", tdb->track);
 	    printf("<TD>");
 	    cgiMakeCheckBox(buf, cartUsualBoolean(cart, buf, FALSE));
 	    printf("</TD>");
-	    sprintf(buf, "%s_u", tdb->tableName);
+	    sprintf(buf, "%s_u", tdb->track);
 	    printf("<TD>");
 	    cgiMakeCheckBox(buf, cartUsualBoolean(cart, buf, FALSE));
 	    printf("</TD>");
-	    sprintf(buf, "%s_b", tdb->tableName);
+	    sprintf(buf, "%s_b", tdb->track);
 	    printf("<TD>");
 	    cgiMakeCheckBox(buf, cartUsualBoolean(cart, buf, FALSE));
 	    printf("</TD>");
-	    sprintf(buf, "%s_i", tdb->tableName);
+	    sprintf(buf, "%s_i", tdb->track);
 	    printf("<TD>");
 	    cgiMakeCheckBox(buf, cartUsualBoolean(cart, buf, FALSE));
 	    printf("</TD>");
 	    printf("<TD>");
-	    sprintf(buf, "%s_red", tdb->tableName);
+	    sprintf(buf, "%s_red", tdb->track);
 	    cgiMakeIntVar(buf, cartUsualInt(cart, buf, 0), 3);
 	    printf("</TD>");
 	    printf("<TD>");
-	    sprintf(buf, "%s_green", tdb->tableName);
+	    sprintf(buf, "%s_green", tdb->track);
 	    cgiMakeIntVar(buf, cartUsualInt(cart, buf, 0), 3);
 	    printf("</TD>");
 	    printf("<TD>");
-	    sprintf(buf, "%s_blue", tdb->tableName);
+	    sprintf(buf, "%s_blue", tdb->track);
 	    cgiMakeIntVar(buf, cartUsualInt(cart, buf, 0), 3);
 	    printf("</TD>");
 	    printf("</TR>\n");
 	    }
@@ -4284,9 +4294,9 @@
 {
 struct hTableInfo *hti;
 
 AllocVar(hti);
-hti->rootName = cloneString(ct->tdb->tableName);
+hti->rootName = cloneString(ct->tdb->table);
 hti->isPos = TRUE;
 hti->isSplit = FALSE;
 hti->hasBin = FALSE;
 hti->type = cloneString(ct->tdb->type);
@@ -4523,14 +4533,15 @@
 
 AllocArray(colors, winSize);
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
-    char *track = tdb->tableName;
+    char *track = tdb->track;
+    char *table = tdb->table;
     struct featureBits *fbList = NULL, *fb;
     struct customTrack *ct = lookupCt(track);
-    if (sameString(USER_PSL_TRACK_NAME, track) ||
+    if (sameString(USER_PSL_TRACK_NAME, table) ||
 	(ct != NULL) ||
-	(fbUnderstandTrack(database, track) && !dnaIgnoreTrack(track)))
+	(fbUnderstandTrack(database, table) && !dnaIgnoreTrack(table)))
         {
 	char buf[256];
 	int r,g,b;
 	/* to save a LOT of time, don't fetch track features unless some
@@ -4610,9 +4621,9 @@
             if (!ct->bedList)
                 bedFreeList(&ctBedList);
 	    }
 	else
-	    fbList = fbGetRange(database, track, seqName, winStart, winEnd);
+	    fbList = fbGetRange(database, tdb->table, seqName, winStart, winEnd);
 
 	/* Flip underline/italic/bold bits. */
 	getDnaHandleBits(track, "u", uBits, winStart, winEnd, isRc, fbList);
 	getDnaHandleBits(track, "b", bBits, winStart, winEnd, isRc, fbList);
@@ -5108,9 +5119,9 @@
         }
     if (hGenBankHaveSeq(database, acc, NULL))
         {
         printf("<B>%s sequence:</B> ", type);
-        hgcAnchorSomewhere("htcDisplayMrna", acc, tdb->tableName, seqName);
+        hgcAnchorSomewhere("htcDisplayMrna", acc, tdb->track, seqName);
         printf("%s</A><BR>\n", acc);
         }
     }
 else
@@ -5262,36 +5273,33 @@
 
 void doHgRna(struct trackDb *tdb, char *acc)
 /* Click on an individual RNA. */
 {
-char *track = tdb->tableName;
+char *track = tdb->track;
+char *table = tdb->table;
 struct sqlConnection *conn = hAllocConn(database);
 char *type;
-char *table;
 int start = cartInt(cart, "o");
 struct psl *pslList = NULL;
 
 if (sameString("xenoMrna", track) || sameString("xenoBestMrna", track) || sameString("xenoEst", track) || sameString("sim4", track) )
     {
     char temp[256];
     sprintf(temp, "non-%s RNA", organism);
     type = temp;
-    table = track;
     }
 else if ( sameWord("blatzHg17KG", track)  )
     {
     type = "Human mRNA";
-    table = track;
     }
 else if (stringIn("estFiltered",track))
     {
     type = "EST";
-    table = track;
     }
 else if (stringIn("est", track) || stringIn("Est", track))
     {
     type = "EST";
-    table = "all_est";
+    // 	table = "all_est";	// Should fall out of wash now
     }
 else if (startsWith("psu", track))
     {
     type = "Pseudo & Real Genes";
@@ -5299,14 +5307,12 @@
     }
 else if (sameWord("xenoBlastzMrna", track) )
     {
     type = "Blastz to foreign mRNA";
-    table = "xenoBlastzMrna";
     }
 else if (startsWith("mrnaBlastz",track  ))
     {
     type = "mRNA";
-    table = track;
     }
 else if (startsWith("pseudoMrna",track) || startsWith("pseudoGeneLink",track))
     {
     type = "mRNA";
@@ -5314,19 +5320,17 @@
     }
 else if (startsWith("celeraMrna",track))
     {
     type = "mRNA";
-    table = "celeraMrna";
     }
 else if (startsWith("all_mrnaFiltered",track))
     {
     type = "mRNA";
-    table = track;
     }
 else
     {
     type = "mRNA";
-    table = "all_mrna";
+    // table = "all_mrna";  // should fall out of wash now
     }
 
 /* Print non-sequence info. */
 cartWebStart(cart, database, "%s", acc);
@@ -5345,22 +5349,22 @@
     return;
     }
 htmlHorizontalLine();
 printf("<H3>%s/Genomic Alignments</H3>", type);
-if (startsWith("mrnaBlastz",tdb->tableName))
+if (startsWith("mrnaBlastz",tdb->table))
     slSort(&pslList, pslCmpScoreDesc);
 
-printAlignments(pslList, start, "htcCdnaAli", table, acc);
+printAlignments(pslList, start, "htcCdnaAli", track, acc);
 
 printTrackHtml(tdb);
 hFreeConn(&conn);
 }
 
 void printPslFormat(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start, char *subType)
 /* Handles click in affyU95 or affyU133 tracks */
 {
-struct psl* pslList = getAlignments(conn, tdb->tableName, item);
-struct psl* psl;
+struct psl  *pslList = getAlignments(conn, tdb->table, item);
+struct psl *psl;
 char *face = "Times"; /* specifies font face to use */
 char *fsize = "+1"; /* specifies font size */
 
 /* check if there is an alignment available for this sequence.  This checks
@@ -5368,9 +5372,9 @@
  * set it up so they can click through to the alignment. */
 if (hGenBankHaveSeq(database, item, NULL))
     {
     printf("<H3>%s/Genomic Alignments</H3>", item);
-    printAlignments(pslList, start, "htcCdnaAli", tdb->tableName, item);
+    printAlignments(pslList, start, "htcCdnaAli", tdb->track, item);
     }
 else
     {
     /* print out the psls */
@@ -5408,9 +5412,9 @@
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, itemForUrl, item == itemForUrl);
 
 /* If this is the affyZebrafish track, check for human ortholog information */
-if (sameString("affyZebrafish", tdb->tableName))
+if (sameString("affyZebrafish", tdb->table))
     {
     if (orthoTable != NULL && hTableExists(database, orthoTable))
         {
         safef(query, sizeof(query), "select geneSymbol, description from %s where name = '%s' ", orthoTable, item);
@@ -5569,9 +5573,9 @@
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, itemForUrl, item == itemForUrl);
 
-safef(query, sizeof(query), "select tName, tEnd, strand from %s where qName='%s' and tStart=%d;", tdb->tableName, item, start);
+safef(query, sizeof(query), "select tName, tEnd, strand from %s where qName='%s' and tStart=%d;", tdb->table, item, start);
 
 sr = sqlMustGetResult(conn, query);
 row = sqlNextRow(sr);
 
@@ -5855,9 +5859,8 @@
 
 void doHgGold(struct trackDb *tdb, char *fragName)
 /* Click on a fragment of golden path. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlConnection *conn2 = hAllocConn(database);
 struct sqlConnection *conn3 = hAllocConn(database);
 char query[256];
@@ -5881,9 +5884,9 @@
 char *tmpString;
 int first;
 
 cartWebStart(cart, database, "%s", fragName);
-hFindSplitTable(database, seqName, track, splitTable, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, splitTable, &hasBin);
 sprintf(query, "select * from %s where frag = '%s' and chromStart = %d",
 	splitTable, fragName, start);
 sr = sqlMustGetResult(conn, query);
 row = sqlNextRow(sr);
@@ -6003,9 +6006,8 @@
 
 void doHgGap(struct trackDb *tdb, char *gapType)
 /* Print a teeny bit of info about a gap. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 char query[256];
 struct sqlResult *sr;
 char **row;
@@ -6014,10 +6016,10 @@
 boolean hasBin;
 char splitTable[64];
 
 cartWebStart(cart, database, "Gap in Sequence");
-hFindSplitTable(database, seqName, track, splitTable, &hasBin);
-if (sameString(track, splitTable))
+hFindSplitTable(database, seqName, tdb->table, splitTable, &hasBin);
+if (sameString(tdb->table, splitTable))
     safef(query, sizeof(query), "select * from %s where chrom = '%s' and "
 	  "chromStart = %d",
 	  splitTable, seqName, start);
 else
@@ -6057,9 +6059,8 @@
 
 void doHgContig(struct trackDb *tdb, char *ctgName)
 /* Click on a contig. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlConnection *conn2 = hAllocConn(database);
 char query[256], query2[256];
 struct sqlResult *sr, *sr2;
@@ -6079,12 +6080,12 @@
     printf("<B>Name:</B>&nbsp;<A HREF=\"%s\" TARGET=_blank>%s</A><BR>\n",
 	query, ctgName);
 freeMem(ncbiTerm);
 safef(query, sizeof(query), "select * from %s where contig = '%s'",
-	track, ctgName);
-selectOneRow(conn, track, query, &sr, &row);
+	tdb->table, ctgName);
+selectOneRow(conn, tdb->table, query, &sr, &row);
 
-if (sameString("ctgPos2", track))
+if (sameString("ctgPos2", tdb->table))
     {
     ctg2 = ctgPos2Load(row);
     printf("<B>Type:</B> %s<BR>\n", ctg2->type);
     ctg = (struct ctgPos*)ctg2;
@@ -6144,19 +6145,18 @@
 
 void doHgCover(struct trackDb *tdb, char *cloneName)
 /* Respond to click on clone. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 char query[256];
 struct sqlResult *sr;
 char **row;
 struct clonePos *clone;
 int fragCount;
 
 cartWebStart(cart, database, "%s", cloneName);
-sprintf(query, "select * from %s where name = '%s'", track, cloneName);
-selectOneRow(conn, track, query, &sr, &row);
+sprintf(query, "select * from %s where name = '%s'", tdb->table, cloneName);
+selectOneRow(conn, tdb->table, query, &sr, &row);
 clone = clonePosLoad(row);
 sqlFreeResult(&sr);
 
 sprintf(query,
@@ -6194,17 +6194,16 @@
 struct bactigPos *bactig;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
-char *track = tdb->tableName;
 char query[256];
 char goldTable[16];
 char ctgStartStr[16];
 int ctgStart;
 
 genericHeader(tdb, bactigName);
-sprintf(query, "select * from %s where name = '%s'", track, bactigName);
-selectOneRow(conn, track, query, &sr, &row);
+sprintf(query, "select * from %s where name = '%s'", tdb->table, bactigName);
+selectOneRow(conn, tdb->table, query, &sr, &row);
 bactig = bactigPosLoad(row);
 sqlFreeResult(&sr);
 printf("<B>Name:</B> %s<BR>\n", bactigName);
 
@@ -7017,9 +7016,8 @@
 
 void doHgRepeat(struct trackDb *tdb, char *repeat)
 /* Do click on a repeat track. */
 {
-char *track = tdb->tableName;
 int offset = cartInt(cart, "o");
 cartWebStart(cart, database, "Repeat");
 if (offset >= 0)
     {
@@ -7032,13 +7030,13 @@
     char table[64];
     boolean hasBin;
     int start = cartInt(cart, "o");
 
-    hFindSplitTable(database, seqName, track, table, &hasBin);
+    hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
     sprintf(query, "select * from %s where  repName = '%s' and genoName = '%s' and genoStart = %d",
 	    table, repeat, seqName, start);
     sr = sqlGetResult(conn, query);
-    if (sameString(track,"rmskNew"))
+    if (sameString(tdb->table,"rmskNew"))
         printf("<H3>CENSOR Information</H3>\n");
     else
         printf("<H3>RepeatMasker Information</H3>\n");
     while ((row = sqlNextRow(sr)) != NULL)
@@ -7078,9 +7076,8 @@
 
 void doHgIsochore(struct trackDb *tdb, char *item)
 /* do click on isochore track. */
 {
-char *track = tdb->tableName;
 cartWebStart(cart, database, "Isochore Info");
 printf("<H2>Isochore Information</H2>\n");
 if (cgiVarExists("o"))
     {
@@ -7090,9 +7087,9 @@
     char **row;
     char query[256];
     int start = cartInt(cart, "o");
     sprintf(query, "select * from %s where  name = '%s' and chrom = '%s' and chromStart = %d",
-	    track, item, seqName, start);
+	    tdb->table, item, seqName, start);
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
 	{
 	iso = isochoresLoad(row);
@@ -7112,9 +7109,8 @@
 
 void doSimpleRepeat(struct trackDb *tdb, char *item)
 /* Print info on simple repeat. */
 {
-char *track = tdb->tableName;
 cartWebStart(cart, database, "Simple Repeat Info");
 printf("<H2>Simple Tandem Repeat Information</H2>\n");
 if (cgiVarExists("o"))
     {
@@ -7123,11 +7119,11 @@
     struct sqlResult *sr;
     char **row;
     char query[256];
     int start = cartInt(cart, "o");
-    int rowOffset = hOffsetPastBin(database, seqName, track);
+    int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
     sprintf(query, "select * from %s where  name = '%s' and chrom = '%s' and chromStart = %d",
-	    track, item, seqName, start);
+	    tdb->table, item, seqName, start);
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
 	{
 	rep = simpleRepeatLoad(row+rowOffset);
@@ -7214,9 +7210,9 @@
 
 void doCpgIsland(struct trackDb *tdb, char *item)
 /* Print info on CpG Island. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 boolean isExt = hHasField(database, table, "obsExp");
 cartWebStart(cart, database, "CpG Island Info");
 printf("<H2>CpG Island Info</H2>\n");
 if (cgiVarExists("o"))
@@ -7304,17 +7300,16 @@
 
 void doIlluminaProbes(struct trackDb *tdb, char *item)
 /* The details page of the Illumina Probes track. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
-int rowOffset = hOffsetPastBin(database, seqName, track);
+int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 char query[256];
 int start = cartInt(cart, "o");
 genericHeader(tdb, item);
-safef(query, sizeof(query), "select * from %s where name = '%s' and chromStart = '%d'", track, item, start);
+safef(query, sizeof(query), "select * from %s where name = '%s' and chromStart = '%d'", tdb->table, item, start);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
     struct bed *bed = bedLoad12(row+rowOffset);
@@ -7343,16 +7338,15 @@
 
 void doSwitchDbTss(struct trackDb *tdb, char *item)
 /* Print SwitchDB TSS details. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
-int rowOffset = hOffsetPastBin(database, seqName, track);
+int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 char query[256];
 genericHeader(tdb, item);
-safef(query, sizeof(query), "select * from %s where name = '%s'", track, item);
+safef(query, sizeof(query), "select * from %s where name = '%s'", tdb->table, item);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
     struct switchDbTss tss;
@@ -7487,13 +7481,13 @@
 char *prot = NULL;
 
 hgcStart("Protein Translation from Genome");
 safef(where, sizeof(where), "name = \"%s\"", geneName);
-gp = genePredReaderLoadQuery(conn, tdb->tableName, where);
+gp = genePredReaderLoadQuery(conn, tdb->table, where);
 hFreeConn(&conn);
 if (gp == NULL)
     errAbort("%s not found in %s when translating to protein",
-             geneName, tdb->tableName);
+             geneName, tdb->table);
 else if (gp->cdsStart == gp->cdsEnd)
     errAbort("No CDS defined: no protein translation for %s", geneName);
 prot = getPredMRnaProtSeq(gp);
 safef(protName, sizeof(protName), "%s_prot", geneName);
@@ -7834,19 +7828,18 @@
  * alignment. */
 {
 int start = cartInt(cart, "o");
 int total = 0, i = 0;
-char *track = tdb->tableName;
 struct psl *pslList = NULL;
 struct sqlConnection *conn = hAllocConn(database);
 
 genericHeader(tdb, item);
 printCustomUrl(tdb, item, TRUE);
 
 puts("<P>");
 puts("<B>Alignment Summary:</B><BR>\n");
-pslList = getAlignments(conn, track, item);
-printAlignments(pslList, start, "htcCdnaAli", track, item);
+pslList = getAlignments(conn, tdb->table, item);
+printAlignments(pslList, start, "htcCdnaAli", tdb->track, item);
 
 puts("<P>");
 total = 0;
 for (i=0;  i < pslList -> blockCount;  i++)
@@ -8068,17 +8061,17 @@
 char dbUrl[256];
 char geneType[256];
 char gtpTable[256];
 
-if (startsWith("ens", tdb->tableName))
+if (startsWith("ens", tdb->table))
    {
    isEnsembl = TRUE;
    safef(geneType, sizeof(geneType), "Ensembl");
    safef(gtpTable, sizeof(gtpTable), "ensGtp");
    if (hTableExists(database, gtpTable))
       hasEnsGtp = TRUE;
    }
-else if (startsWith("vega", tdb->tableName))
+else if (startsWith("vega", tdb->table))
    {
    isVega = TRUE;
    safef(geneType, sizeof(geneType), "Vega");
    safef(gtpTable, sizeof(gtpTable), "vegaGtp");
@@ -8117,9 +8110,9 @@
 
 boolean nonCoding = FALSE;
 char query[512];
 safef(query, sizeof(query), "name = \"%s\"", itemName);
-struct genePred *gpList = genePredReaderLoadQuery(conn, tdb->tableName, query);
+struct genePred *gpList = genePredReaderLoadQuery(conn, tdb->table, query);
 if (gpList && (gpList->cdsStart == gpList->cdsEnd))
     nonCoding = TRUE;
 genePredFreeList(&gpList);
 /* get gene and protein IDs */
@@ -8218,16 +8211,16 @@
 sprintf(condStr, "name='%s'", item);
 
 /* if this is a non-coding gene track, then print the biotype and
    the external ID */
-if (sameWord(tdb->tableName, "ensGeneNonCoding"))
+if (sameWord(tdb->table, "ensGeneNonCoding"))
     {
     struct sqlConnection *conn2 = hAllocConn(database);
     char query[256];
     struct sqlResult *sr = NULL;
     char **row;
     safef(query, sizeof(query), "select biotype, extGeneId from %s where %s",
-          tdb->tableName, condStr);
+          tdb->table, condStr);
     sr = sqlGetResult(conn, query);
     if ((row = sqlNextRow(sr)) != NULL)
         {
         printf("<B>Gene Type:</B> %s<BR>\n", row[0]);
@@ -8269,9 +8262,9 @@
     }
 
 /* skip the rest if this gene is not in ensGene */
 sprintf(condStr, "name='%s'", item);
-if (sqlGetField(database, tdb->tableName, "name", condStr) != NULL)
+if (sqlGetField(database, tdb->table, "name", condStr) != NULL)
     {
     if (wordCount > 0)
     	{
     	type = words[0];
@@ -8510,9 +8503,9 @@
 struct sqlResult *sr;
 char **row;
 char *otherDb = trackDbSetting(tdb, "otherDb");
 char *qtlOrg;
-if (sameString(tdb->tableName, "rgdQtl"))
+if (sameString(tdb->table, "rgdQtl"))
     qtlOrg = organism;
 else if (isNotEmpty(otherDb))
     qtlOrg = hOrganism(otherDb);
 else
@@ -8521,9 +8514,9 @@
 genericHeader(tdb, item);
 printf("<B>%s QTL %s: ", qtlOrg, item);
 safef(query, sizeof(query),
       "select description from %sLink where name='%s';",
-      tdb->tableName, item);
+      tdb->table, item);
 sr = sqlMustGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     printf("%s", row[0]);
 sqlFreeResult(&sr);
@@ -8532,9 +8525,9 @@
 if (isNotEmpty(tdb->url))
     {
     boolean gotId = FALSE;
     safef(query, sizeof(query), "select id from %sLink where name='%s';",
-	  tdb->tableName, item);
+	  tdb->table, item);
     sr = sqlMustGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
         {
 	char *qtlId = row[0];
@@ -8552,9 +8545,9 @@
 struct bed *selectedPos=NULL, *otherPosList=NULL, *bed=NULL;
 safef(query, sizeof(query),
       "select chrom, chromStart, chromEnd from %s where name='%s' "
       "order by (chromEnd-chromStart);",
-      tdb->tableName, item);
+      tdb->table, item);
 sr = sqlMustGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     bed = bedLoad3(row);
@@ -9089,9 +9082,9 @@
 /* Put up VAX 004 info. */
 {
 char *id;
 struct sqlConnection *conn = hAllocConn(database);
-char *aliTbl = tdb->tableName;
+char *aliTbl = tdb->table;
 int start = cartInt(cart, "o");
 char cond_str[255], *subjId;
 
 genericHeader(tdb, item);
@@ -9110,9 +9103,9 @@
 
 /* print alignments that track was based on */
 struct psl *pslList = getAlignments(conn, aliTbl, item);
 printf("<H3>Genomic Alignments</H3>");
-printAlignments(pslList, start, "htcCdnaAli", aliTbl, item);
+printAlignments(pslList, start, "htcCdnaAli", tdb->track, item);
 hFreeConn(&conn);
 
 printTrackHtml(tdb);
 }
@@ -9121,9 +9115,9 @@
 {
 char *url = tdb->url;
 char *id;
 struct sqlConnection *conn = hAllocConn(database);
-char *aliTbl = tdb->tableName;
+char *aliTbl = tdb->table;
 int start = cartInt(cart, "o");
 
 genericHeader(tdb, item);
 
@@ -9135,9 +9129,9 @@
 
 /* print alignments that track was based on */
 struct psl *pslList = getAlignments(conn, aliTbl, item);
 printf("<H3>Genomic Alignments</H3>");
-printAlignments(pslList, start, "htcCdnaAli", aliTbl, item);
+printAlignments(pslList, start, "htcCdnaAli", tdb->track, item);
 hFreeConn(&conn);
 
 printTrackHtml(tdb);
 }
@@ -9183,9 +9177,8 @@
 
 void doRgdGene(struct trackDb *tdb, char *rnaName)
 /* Process click on a RGD gene. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[256];
@@ -9256,9 +9249,9 @@
 htmlHorizontalLine();
 
 /* print alignments that track was based on */
 {
-char *aliTbl = (sameString(track, "rgdGene") ? "refSeqAli" : "xenoRGDAli");
+char *aliTbl = (sameString(tdb->table, "rgdGene") ? "refSeqAli" : "xenoRGDAli");
 struct psl *pslList = getAlignments(conn, aliTbl, rl->mrnaAcc);
 printf("<H3>mRNA/Genomic Alignments</H3>");
 printAlignments(pslList, start, "htcCdnaAli", aliTbl, rl->mrnaAcc);
 }
@@ -9702,9 +9695,9 @@
 char **row;
 char query[256];
 char *sqlRnaName = rnaName;
 char *summary = NULL;
-boolean isXeno = sameString(tdb->tableName, "xenoRefGene");
+boolean isXeno = sameString(tdb->table, "xenoRefGene");
 struct refLink *rl;
 int start = cartInt(cart, "o");
 int left = cartInt(cart, "l");
 int right = cartInt(cart, "r");
@@ -9732,9 +9725,9 @@
 prRefGeneInfo(conn, rnaName, sqlRnaName, rl, isXeno);
 addGeneExtra(rl->name);  /* adds columns if extra info is available */
 
 if (genbankIsRefSeqCodingMRnaAcc(rnaName))
-    addPalLink(conn, tdb->tableName,  chrom, left, right, rnaName);
+    addPalLink(conn, tdb->track,  chrom, left, right, rnaName);
 
 printf("</tr>\n</table>\n");
 
 /* optional summary text */
@@ -9749,9 +9742,9 @@
 htmlHorizontalLine();
 
 /* print alignments that track was based on */
 {
-char *aliTbl = (sameString(tdb->tableName, "refGene") ? "refSeqAli" : "xenoRefSeqAli");
+char *aliTbl = (sameString(tdb->table, "refGene") ? "refSeqAli" : "xenoRefSeqAli");
 struct psl *pslList = getAlignments(conn, aliTbl, rl->mrnaAcc);
 printf("<H3>mRNA/Genomic Alignments</H3>");
 printAlignments(pslList, start, "htcCdnaAli", aliTbl, rl->mrnaAcc);
 }
@@ -10121,9 +10114,9 @@
 else
     {
     /* display mrna */
     printf("<LI><B>mRna:</B> %s \n", pg->name);
-    linkToOtherBrowserExtra(database, pg->gChrom, pg->gStart, pg->gEnd, "all_mrna=pack");
+    linkToOtherBrowserExtra(database, pg->gChrom, pg->gStart, pg->gEnd, "mrna=pack");
     printf("%s:%d-%d \n", pg->gChrom, pg->gStart, pg->gEnd);
     printf("</A></LI>");
     }
 if (!sameString(pg->mgc,"noMgc"))
@@ -10187,9 +10180,9 @@
 #endif /* NOT_USED */
 
     if (pslList != NULL)
         {
-        printAlignments(pslList, pslList->tStart, "htcCdnaAli", "all_mrna", \
+        printAlignments(pslList, pslList->tStart, "htcCdnaAli", "mrna", \
                 pg->name);
         htmlHorizontalLine();
         safef(chainTable_chrom,sizeof(chainTable_chrom), "%s_chainSelf",\
                 pg->chrom);
@@ -10259,9 +10252,9 @@
 
 void doPseudoPsl(struct trackDb *tdb, char *acc)
 /* Click on an pseudogene based on mrna alignment. */
 {
-char *track = tdb->tableName;
+char *tableName = tdb->table;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
 char **row;
 char where[256];
@@ -10283,9 +10276,9 @@
     alignTable = cloneString("pseudoMrna");
 if (startsWith("pseudoUcsc",alignTable))
     {
     alignTable = cloneString("pseudoMrna");
-    track = cloneString("pseudoGeneLink3");
+    tableName = cloneString("pseudoGeneLink3");
     }
 if (hTableExists(database, alignTable) )
     {
     pslList = loadPslRangeT(alignTable, acc, chrom, winStart, winEnd);
@@ -10300,9 +10293,9 @@
 cartWebStart(cart, database, "%s", acc);
 
 
 safef(where, sizeof(where), "name = '%s'", acc);
-sr = hRangeQuery(conn, track, chrom, start, end, where, &rowOffset);
+sr = hRangeQuery(conn, tableName, chrom, start, end, where, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     pg = pseudoGeneLinkLoad(row+rowOffset);
     if (pg != NULL)
@@ -10347,12 +10340,12 @@
 
 headerItem = cloneString(geneName);
 genericHeader(tdb, headerItem);
 printCustomUrl(tdb, geneName, FALSE);
-if ((sameString(tdb->tableName, "encodePseudogeneConsensus")) ||
-         (sameString(tdb->tableName, "encodePseudogeneYale")))
+if ((sameString(tdb->table, "encodePseudogeneConsensus")) ||
+         (sameString(tdb->table, "encodePseudogeneYale")))
     {
-    safef(query, sizeof(query), "select name2 from %s where name = '%s'", tdb->tableName, geneName);
+    safef(query, sizeof(query), "select name2 from %s where name = '%s'", tdb->table, geneName);
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
         {
         name2 = cloneString(row[0]);
@@ -10453,9 +10446,8 @@
 }
 
 void doTrnaGenesGb(struct trackDb *tdb, char *trnaName)
 {
-char *track = tdb->tableName;
 struct tRNAs *trna;
 char query[512];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -10470,12 +10462,12 @@
 genericHeader(tdb,trnaName);
 dupe = cloneString(tdb->type);
 wordCount = chopLine(dupe, words);
 
-rowOffset = hOffsetPastBin(database, seqName, track);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 safef(query, ArraySize(query),
 "select * from %s where name = '%s' and chromStart=%d and chromEnd=%d",
-track, trnaName, start, end);
+tdb->table, trnaName, start, end);
 
 sr = sqlGetResult(conn, query);
 
 /* use TABLE to align image with other info side by side */
@@ -10708,9 +10700,9 @@
 /* Show Berkeley Drosophila Genome Project gene info. */
 {
 struct bdgpGeneInfo *bgi = NULL;
 struct flyBaseSwissProt *fbsp = NULL;
-char *geneTable = tdb->tableName;
+char *geneTable = tdb->table;
 char *truncName = cloneString(geneName);
 char *ptr = strchr(truncName, '-');
 char infoTable[128];
 char pepTable[128];
@@ -10818,15 +10810,15 @@
     puts("</LI>\n");
     }
 
 puts("<LI>\n");
-hgcAnchorSomewhere("htcGeneMrna", geneName, geneTable, seqName);
+hgcAnchorSomewhere("htcGeneMrna", geneName, tdb->track, seqName);
 printf("%s</A> may be different from the genomic sequence.\n",
        "Predicted mRNA");
 puts("</LI>\n");
 
 puts("<LI>\n");
-hgcAnchorSomewhere("htcGeneInGenome", geneName, geneTable, seqName);
+hgcAnchorSomewhere("htcGeneInGenome", geneName, tdb->track, seqName);
 printf("Genomic Sequence</A> from assembly\n");
 puts("</LI>\n");
 printf("</UL>\n");
 printTrackHtml(tdb);
@@ -10863,9 +10855,9 @@
 if (n < 3)
     n = 3;
 if (n > maxN)
     n = maxN;
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 safef(query, sizeof(query),
       "select * from %s where chrom = '%s' and chromStart = %d "
       "and name = '%s'",
       table, seqName, start, name);
@@ -10965,9 +10957,8 @@
 
 printCustomUrl(tdb, geneName, FALSE);
 if (startsWith("genePred", tdb->type))
     {
-    char *geneTable = tdb->tableName;
     char *pepTable = pepTableFromType(tdb->type);
     showGenePos(geneName, tdb);
     printf("<H3>Links to sequence:</H3>\n");
     printf("<UL>\n");
@@ -10979,18 +10970,19 @@
 			   seqName);
 	printf("Predicted Protein</A> \n");
 	puts("</LI>\n");
 	}
-    else { uglyf("Doh, no go for %s from %s<BR>\n", geneName, pepTable); }
+    else 
+        errAbort("Doh, no go for %s from %s<BR>\n", geneName, pepTable);
 
     puts("<LI>\n");
-    hgcAnchorSomewhere("htcGeneMrna", geneName, geneTable, seqName);
+    hgcAnchorSomewhere("htcGeneMrna", geneName, tdb->track, seqName);
     printf("%s</A> may be different from the genomic sequence.\n",
 	   "Predicted mRNA");
     puts("</LI>\n");
 
     puts("<LI>\n");
-    hgcAnchorSomewhere("htcGeneInGenome", geneName, geneTable, seqName);
+    hgcAnchorSomewhere("htcGeneInGenome", geneName, tdb->track, seqName);
     printf("Genomic Sequence</A> from assembly\n");
     puts("</LI>\n");
     printf("</UL>\n");
     }
@@ -11007,9 +10999,9 @@
 void doBGIGene(struct trackDb *tdb, char *geneName)
 /* Show Beijing Genomics Institute gene annotation info. */
 {
 struct bgiGeneInfo *bgi = NULL;
-char *geneTable = tdb->tableName;
+char *geneTable = tdb->table;
 char infoTable[128];
 char pepTable[128];
 char query[512];
 
@@ -11135,15 +11127,15 @@
     puts("</LI>\n");
     }
 
 puts("<LI>\n");
-hgcAnchorSomewhere("htcGeneMrna", geneName, geneTable, seqName);
+hgcAnchorSomewhere("htcGeneMrna", geneName, tdb->track, seqName);
 printf("%s</A> may be different from the genomic sequence.\n",
        "Predicted mRNA");
 puts("</LI>\n");
 
 puts("<LI>\n");
-hgcAnchorSomewhere("htcGeneInGenome", geneName, geneTable, seqName);
+hgcAnchorSomewhere("htcGeneInGenome", geneName, tdb->track, seqName);
 printf("Genomic Sequence</A> from assembly\n");
 puts("</LI>\n");
 printf("</UL>\n");
 printTrackHtml(tdb);
@@ -11152,9 +11144,9 @@
 
 void doBGISnp(struct trackDb *tdb, char *itemName)
 /* Put up info on a Beijing Genomics Institute SNP. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct bgiSnp snp;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -11247,9 +11239,8 @@
 
 void doGenomicDups(struct trackDb *tdb, char *dupName)
 /* Handle click on genomic dup track. */
 {
-char *track = tdb->tableName;
 struct genomicDups dup;
 char query[512];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -11261,14 +11252,14 @@
 printf("<H2>Genomic Duplication Region</H2>\n");
 if (cgiVarExists("o"))
     {
     int start = cartInt(cart, "o");
-    int rowOffset = hOffsetPastBin(database, seqName, track);
+    int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
     parseChromPointPos(dupName, oChrom, &oStart);
 
     sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d "
 	    "and otherChrom = '%s' and otherStart = %d",
-	    track, seqName, start, oChrom, oStart);
+	    tdb->table, seqName, start, oChrom, oStart);
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)))
 	{
 	genomicDupsStaticLoad(row+rowOffset, &dup);
@@ -11310,9 +11301,8 @@
 
 void doBlatMouse(struct trackDb *tdb, char *itemName)
 /* Handle click on blatMouse track. */
 {
-char *track = tdb->tableName;
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
 char **row;
@@ -11372,9 +11362,9 @@
     }
 
 /* Get alignment info and print. */
 printf("<H2>Alignments</H2>\n");
-hFindSplitTable(database, seqName, track, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where qName = '%s'", table, itemName);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
@@ -11382,9 +11372,9 @@
     slAddHead(&pslList, psl);
     }
 sqlFreeResult(&sr);
 slReverse(&pslList);
-printAlignments(pslList, start, "htcBlatXeno", track, itemName);
+printAlignments(pslList, start, "htcBlatXeno", tdb->track, itemName);
 printTrackHtml(tdb);
 }
 
 boolean parseRange(char *range, char **retSeq, int *retStart, int *retEnd)
@@ -11508,9 +11498,9 @@
 char *cgiItem = cgiEncode(item);
 char *thisOrg = hOrganism(database);
 
 cartWebStart(cart, database, "%s", tdb->longLabel);
-psl = loadPslFromRangePair(tdb->tableName, item);
+psl = loadPslFromRangePair(tdb->table, item);
 printf("<B>%s position:</B> <a target=\"_blank\" href=\"%s?db=%s&position=%s%%3A%d-%d\">%s:%d-%d</a><BR>\n",
        otherOrg, hgTracksName(), otherDb, psl->qName, psl->qStart+1, psl->qEnd,
        psl->qName, psl->qStart+1, psl->qEnd);
 printf("<B>%s size:</B> %d<BR>\n", otherOrg, psl->qEnd - psl->qStart);
@@ -11524,9 +11514,9 @@
 printf("<B>Strand:</B> %s<BR>\n",psl->strand);
 printf("<B>Browser window position:</B> %s:%d-%d<BR>\n", seqName, winStart+1, winEnd);
 printf("<B>Browser window size:</B> %d<BR>\n", winEnd - winStart);
 sprintf(otherString, "%d&pslTable=%s&otherOrg=%s&otherChromTable=%s&otherDb=%s", psl->tStart,
-	tdb->tableName, otherOrg, otherChromTable, otherDb);
+	tdb->table, otherOrg, otherChromTable, otherDb);
 /* joni */
 if (pslTrimToTargetRange(psl, winStart, winEnd) != NULL)
     {
     hgcAnchorSomewhere("htcLongXenoPsl2", cgiItem, otherString, psl->tName);
@@ -11553,9 +11543,9 @@
 char *cgiItem = cgiEncode(item);
 char *thisOrg = hOrganism(database);
 
 cartWebStart(cart, database, "%s", tdb->longLabel);
-psl = loadPslFromRangePair(tdb->tableName, item);
+psl = loadPslFromRangePair(tdb->table, item);
 printf("<B>%s position:</B> %s:%d-%d<BR>\n", otherOrg,
        psl->qName, psl->qStart+1, psl->qEnd);
 printf("<B>%s size:</B> %d<BR>\n", otherOrg, psl->qEnd - psl->qStart);
 printf("<B>%s position:</B> %s:%d-%d<BR>\n", thisOrg,
@@ -11568,9 +11558,9 @@
 printf("<B>Strand:</B> %s<BR>\n",psl->strand);
 printf("<B>Browser window position:</B> %s:%d-%d<BR>\n", seqName, winStart+1, winEnd);
 printf("<B>Browser window size:</B> %d<BR>\n", winEnd - winStart);
 sprintf(otherString, "%d&pslTable=%s&otherOrg=%s&otherChromTable=%s&otherDb=%s", psl->tStart,
-	tdb->tableName, otherOrg, otherChromTable, otherDb);
+	tdb->table, otherOrg, otherChromTable, otherDb);
 
 printCustomUrl(tdb, item, TRUE);
 printTrackHtml(tdb);
 freez(&cgiItem);
@@ -11587,9 +11577,9 @@
 char *cgiItem = cgiEncode(item);
 char *thisOrg = hOrganism(database);
 
 cartWebStart(cart, database, "%s", tdb->longLabel);
-psl = loadPslFromRangePair(tdb->tableName, item);
+psl = loadPslFromRangePair(tdb->table, item);
 printf("<B>%s position:</B> %s:%d-%d<BR>\n", otherOrg,
        psl->qName, psl->qStart+1, psl->qEnd);
 printf("<B>%s size:</B> %d<BR>\n", otherOrg, psl->qEnd - psl->qStart);
 printf("<B>%s position:</B> %s:%d-%d<BR>\n", thisOrg,
@@ -11608,9 +11598,9 @@
 printf("Link to <a href=\"http://hgwdev-tcbruen.cse.ucsc.edu/cgi-bin/hgTracks?db=zoo%s1&position=chr1:%d-%d\">%s database</a><BR>\n",
        anotherString, psl->qStart, psl->qEnd, otherOrg);
 
 sprintf(otherString, "%d&pslTable=%s&otherOrg=%s&otherChromTable=%s", psl->tStart,
-	tdb->tableName, otherOrg, otherChromTable);
+	tdb->table, otherOrg, otherChromTable);
 if (pslTrimToTargetRange(psl, winStart, winEnd) != NULL)
     {
     hgcAnchorSomewhere("htcLongXenoPsl2", cgiItem, otherString, psl->tName);
     printf("<BR>View details of parts of alignment within browser window</A>.<BR>\n");
@@ -11908,9 +11898,8 @@
 void doAlignCompGeno(struct trackDb *tdb, char *itemName, char *otherGenome)
     /* Handle click on blat or blastz track in a generic fashion */
     /* otherGenome is the text to display for genome name on details page */
 {
-char *track = tdb->tableName;
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
 char **row;
@@ -11946,12 +11935,12 @@
 printf("%s DNA</A><BR>\n", otherGenome);
 
 /* Get alignment info and print. */
 printf("<H2>Alignments</H2>\n");
-hFindSplitTable(database, seqName, track, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 
 /* if this is a non-split table then query with tName */
-if (startsWith(track, table))
+if (startsWith(tdb->table, table))
     safef(query, sizeof(query), "select * from %s where qName = '%s' and tName = '%s'", table, itemName,seqName);
 else
     safef(query, sizeof(query), "select * from %s where qName = '%s'", table, itemName);
 sr = sqlGetResult(conn, query);
@@ -11961,16 +11950,15 @@
     slAddHead(&pslList, psl);
     }
 sqlFreeResult(&sr);
 slReverse(&pslList);
-printAlignments(pslList, start, "htcBlatXeno", track, itemName);
+printAlignments(pslList, start, "htcBlatXeno", tdb->track, itemName);
 printTrackHtml(tdb);
 }
 
 void doTSS(struct trackDb *tdb, char *itemName)
 /* Handle click on DBTSS track. */
 {
-char *track = tdb->tableName;
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
 char **row = NULL;
@@ -11997,9 +11985,9 @@
     }
 
 sqlFreeResult(&sr);
 slReverse(&pslList);
-printAlignments(pslList, start, "htcCdnaAli", track, itemName);
+printAlignments(pslList, start, "htcCdnaAli", tdb->track, itemName);
 printTrackHtml(tdb);
 }
 
 void doEst3(char *itemName)
@@ -12039,9 +12027,8 @@
 
 void doEncodeRna(struct trackDb *tdb, char *itemName)
 /* Handle click on encodeRna track. */
 {
-char *track = tdb->tableName;
 struct encodeRna rna;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -12050,11 +12037,11 @@
 int rowOffset;
 struct slName *nameList, *sl;
 
 genericHeader(tdb, itemName);
-rowOffset = hOffsetPastBin(database, seqName, track);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d and name = '%s'",
-      track, seqName, start, itemName);
+      tdb->table, seqName, start, itemName);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     encodeRnaStaticLoad(row + rowOffset, &rna);
@@ -12084,9 +12071,8 @@
 
 void doRnaGene(struct trackDb *tdb, char *itemName)
 /* Handle click on RNA Genes track. */
 {
-char *track = tdb->tableName;
 struct rnaGene rna;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -12094,11 +12080,11 @@
 char query[256];
 int rowOffset;
 
 genericHeader(tdb, itemName);
-rowOffset = hOffsetPastBin(database, seqName, track);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d and name = '%s'",
-	track, seqName, start, itemName);
+	tdb->table, seqName, start, itemName);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     rnaGeneStaticLoad(row + rowOffset, &rna);
@@ -12118,9 +12104,9 @@
 
 void doStsMarker(struct trackDb *tdb, char *marker)
 /* Respond to click on an STS marker. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 char query[256];
 char title[256];
 struct sqlConnection *conn = hAllocConn(database);
 boolean stsInfo2Exists = sqlTableExists(conn, "stsInfo2");
@@ -12448,9 +12434,9 @@
 
 void doStsMapMouse(struct trackDb *tdb, char *marker)
 /* Respond to click on an STS marker. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 char title[256];
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlConnection *conn1 = hAllocConn(database);
@@ -12574,9 +12560,9 @@
 
 void doStsMapMouseNew(struct trackDb *tdb, char *marker)
 /* Respond to click on an STS marker. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 char title[256];
 char query[256];
 char query1[256];
 struct sqlConnection *conn = hAllocConn(database);
@@ -12753,9 +12739,9 @@
 
 void doStsMapRat(struct trackDb *tdb, char *marker)
 /* Respond to click on an STS marker. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 char title[256];
 char query[256];
 char query1[256];
 struct sqlConnection *conn = hAllocConn(database);
@@ -13241,9 +13227,8 @@
 
 void doMouseOrthoDetail(struct trackDb *tdb, char *itemName)
 /* Handle click on mouse synteny track. */
 {
-char *track = tdb->tableName;
 struct mouseSyn el;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -13254,10 +13239,10 @@
 cartWebStart(cart, database, "Mouse Synteny");
 printf("<H2>Mouse Synteny</H2>\n");
 
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d",
-	track, seqName, start);
-rowOffset = hOffsetPastBin(database, seqName, track);
+	tdb->table, seqName, start);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     htmlHorizontalLine();
@@ -13275,9 +13260,8 @@
 
 void doMouseSyn(struct trackDb *tdb, char *itemName)
 /* Handle click on mouse synteny track. */
 {
-char *track = tdb->tableName;
 struct mouseSyn el;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -13288,10 +13272,10 @@
 cartWebStart(cart, database, "Mouse Synteny");
 printf("<H2>Mouse Synteny</H2>\n");
 
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d",
-	track, seqName, start);
-rowOffset = hOffsetPastBin(database, seqName, track);
+	tdb->table, seqName, start);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     htmlHorizontalLine();
@@ -13309,9 +13293,8 @@
 
 void doMouseSynWhd(struct trackDb *tdb, char *itemName)
 /* Handle click on Whitehead mouse synteny track. */
 {
-char *track = tdb->tableName;
 struct mouseSynWhd el;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -13322,10 +13305,10 @@
 cartWebStart(cart, database, "Mouse Synteny (Whitehead)");
 printf("<H2>Mouse Synteny (Whitehead)</H2>\n");
 
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d",
-	track, seqName, start);
-rowOffset = hOffsetPastBin(database, seqName, track);
+	tdb->table, seqName, start);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     htmlHorizontalLine();
@@ -13348,9 +13331,8 @@
 
 void doEnsPhusionBlast(struct trackDb *tdb, char *itemName)
 /* Handle click on Ensembl Phusion Blast synteny track. */
 {
-char *track = tdb->tableName;
 struct ensPhusionBlast el;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -13364,10 +13346,10 @@
 cartWebStart(cart, database, "%s", tdb->longLabel);
 printf("<H2>%s</H2>\n", tdb->longLabel);
 
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d",
-	track, seqName, start);
-rowOffset = hOffsetPastBin(database, seqName, track);
+	tdb->table, seqName, start);
+rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     htmlHorizontalLine();
@@ -13534,9 +13516,9 @@
 
 void doSnpEntrezGeneLink(struct trackDb *tdb, char *name)
 /* print link to EntrezGene for this SNP */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 if (hTableExists(database, "knownGene") && hTableExists(database, "refLink") &&
     hTableExists(database, "mrnaRefseq") && hTableExists(database, table))
     {
     struct sqlConnection *conn = hAllocConn(database);
@@ -13574,9 +13556,9 @@
 
 void doSnpOld(struct trackDb *tdb, char *itemName)
 /* Put up info on a SNP. */
 {
-char *group = tdb->tableName;
+char *snpTable = tdb->table;
 struct snp snp;
 struct snpMap snpMap;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
@@ -13593,12 +13575,12 @@
 	"from   %s "
 	"where  chrom = '%s' "
 	"  and  chromStart = %d "
 	"  and  name = '%s'",
-        group, seqName, start, itemName);
-rowOffset = hOffsetPastBin(database, seqName, group);
+        snpTable, seqName, start, itemName);
+rowOffset = hOffsetPastBin(database, seqName, snpTable);
 sr = sqlGetResult(conn, query);
-if (sameString(group,"snpMap"))
+if (sameString(snpTable,"snpMap"))
     while ((row = sqlNextRow(sr)) != NULL)
 	{
 	snpMapStaticLoad(row+rowOffset, &snpMap);
 	bedPrintPos((struct bed *)&snpMap, 3, tdb);
@@ -13728,9 +13710,9 @@
 	return -1;
     }
 else
     {
-    safef(snpSeqTable, sizeof(snpSeqTable), "%sSeq", tdb->tableName);
+    safef(snpSeqTable, sizeof(snpSeqTable), "%sSeq", tdb->table);
     if (!hTableExists(database, snpSeqTable))
 	{
 	safecpy(snpSeqTable, sizeof(snpSeqTable), "snpSeq");
 	if (!hTableExists(database, snpSeqTable))
@@ -13762,9 +13744,9 @@
 	return NULL;
     }
 char seqFileBuf[512];
 safef(seqFileBuf, sizeof(seqFileBuf), "/gbdb/%s/snp/%s.fa",
-      database, tdb->tableName);
+      database, tdb->table);
 if (fileExists(seqFileBuf))
     return cloneString(seqFileBuf);
 safef(seqFileBuf, sizeof(seqFileBuf), "/gbdb/%s/snp/snp.fa", database);
 if (fileExists(seqFileBuf))
@@ -14089,25 +14071,25 @@
 
 void doSnp(struct trackDb *tdb, char *itemName)
 /* Process SNP details. */
 {
-char   *group = tdb->tableName;
+char   *snpTable = tdb->table;
 struct snp snp;
 int    start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char   query[256];
-int    rowOffset=hOffsetPastBin(database, seqName, group);
+int    rowOffset=hOffsetPastBin(database, seqName, snpTable);
 int    firstOne=1;
 char  *exception=0;
 char  *chrom="";
 int    chromStart=0;
 
 cartWebStart(cart, database, "Simple Nucleotide Polymorphism (SNP)");
 printf("<H2>Simple Nucleotide Polymorphism (SNP) %s</H2>\n", itemName);
 safef(query, sizeof(query), "select * from %s where chrom='%s' and "
-      "chromStart=%d and name='%s'", group, seqName, start, itemName);
+      "chromStart=%d and name='%s'", snpTable, seqName, start, itemName);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr))!=NULL)
     {
     snpStaticLoad(row+rowOffset, &snp);
@@ -14239,9 +14221,9 @@
 }
 
 void doCnpLocke(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpLocke thisItem;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14269,9 +14251,9 @@
 }
 
 void doCnpIafrate(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpIafrate cnpIafrate;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14300,9 +14282,9 @@
 }
 
 void doCnpIafrate2(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpIafrate2 thisItem;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14340,9 +14322,9 @@
 }
 
 void doDelHinds2(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct delHinds2 thisItem;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14367,9 +14349,9 @@
 }
 
 void doDelConrad2(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct delConrad2 thisItem;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14396,9 +14378,9 @@
 
 
 void doCnpSebat(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpSebat cnpSebat;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14424,9 +14406,9 @@
 }
 
 void doCnpSebat2(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpSebat2 cnpSebat2;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14542,9 +14524,9 @@
 }
 
 void doCnpSharp(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpSharp cnpSharp;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14585,9 +14567,9 @@
 
 
 void doCnpSharp2(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct cnpSharp2 cnpSharp2;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -14623,9 +14605,9 @@
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[512];
-int rowOffset = hOffsetPastBin(database, seqName, tdb->tableName);
+int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 genericHeader(tdb, id);
 printCustomUrl(tdb, id, FALSE);
 
 safef(query, sizeof(query), "select * from dgv where name = '%s'", id);
@@ -14678,9 +14660,9 @@
 
 void doAffy120K(struct trackDb *tdb, char *itemName)
 /* Put up info on an Affymetrix SNP. */
 {
-char *group = tdb->tableName;
+char *table = tdb->table;
 struct snp snp;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -14695,9 +14677,9 @@
 	       "where  chrom = '%s' "
 	       "  and  chromStart = %d "
 	       "  and  name = '%s'",
                seqName, start, itemName);
-rowOffset = hOffsetPastBin(database, seqName, group);
+rowOffset = hOffsetPastBin(database, seqName, table);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     snpStaticLoad(row+rowOffset, &snp);
@@ -14764,9 +14746,9 @@
 
 void doAffy10K(struct trackDb *tdb, char *itemName)
 /* Put up info on an Affymetrix SNP. */
 {
-char *group = tdb->tableName;
+char *table = tdb->table;
 struct snp snp;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -14781,9 +14763,9 @@
 	       "where  chrom = '%s' "
 	       "  and  chromStart = %d "
 	       "  and  name = '%s'",
                seqName, start, itemName);
-rowOffset = hOffsetPastBin(database, seqName, group);
+rowOffset = hOffsetPastBin(database, seqName, table);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     snpStaticLoad(row+rowOffset, &snp);
@@ -15304,9 +15286,9 @@
 /* If the user has selected a gene track for functional annotation,
  * report how this SNP relates to any nearby genes. */
 {
 char varName[512];
-safef(varName, sizeof(varName), "%s_geneTrack", tdb->tableName);
+safef(varName, sizeof(varName), "%s_geneTrack", tdb->track);
 struct slName *geneTracks = cartOptionalSlNameList(cart, varName);
 if (geneTracks == NULL)
     {
     char *defaultGeneTracks = trackDbSetting(tdb, "defaultGeneTracks");
@@ -15677,9 +15659,9 @@
 
 void doSnpWithVersion(struct trackDb *tdb, char *itemName, int version)
 /* Process SNP details. */
 {
-char   *table = tdb->tableName;
+char   *table = tdb->table;
 struct snp125 snp;
 struct snp *snpAlign = NULL;
 int    start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
@@ -15770,14 +15752,14 @@
 char query[512];
 char **row;
 int start = cartInt(cart, "o");
 boolean isBed4 = startsWith("bed 4", tdb->type);
-boolean hasBin = hIsBinned(database, tdb->tableName);
+boolean hasBin = hIsBinned(database, tdb->table);
 
 genericHeader(tdb, item);
 safef(query, sizeof(query),
       "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
-      tdb->tableName, item, seqName, start);
+      tdb->table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
     char *itemForUrl=NULL, *name=NULL, *description=NULL, *marker=NULL;
@@ -15938,13 +15920,13 @@
 int itemStart = cartInt(cart, "o"), itemEnd = cartInt(cart, "t");
 genericHeader(tdb, item);
 struct sqlConnection *conn = hAllocConn(database);
 struct dyString *dy = dyStringNew(512);
-dyStringPrintf(dy, "select * from %s where chrom = '%s' and ", tdb->tableName, seqName);
+dyStringPrintf(dy, "select * from %s where chrom = '%s' and ", tdb->table, seqName);
 hAddBinToQuery(itemStart, itemEnd, dy);
 dyStringPrintf(dy, "chromStart = %d and name = '%s'", itemStart, item);
 struct sqlResult *sr = sqlGetResult(conn, dy->string);
-int rowOffset = hOffsetPastBin(database, seqName, tdb->tableName);
+int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 boolean first = TRUE;
 char **row;
 while ((row = sqlNextRow(sr)) != NULL)
     {
@@ -16017,9 +15999,9 @@
 int bedSize;
 
 genericHeader(tdb, item);
 bedSize = 8;
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s'", table, item);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
@@ -16052,9 +16034,9 @@
 int bedSize;
 
 genericHeader(tdb, item);
 bedSize = 8;
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s'", table, item);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
@@ -16146,9 +16128,8 @@
 
 void doJaxAllele(struct trackDb *tdb, char *item)
 /* Show gene prediction position and other info. */
 {
-char *track = tdb->tableName;
 char query[512];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlConnection *conn2 = hAllocConn(database);
 boolean hasBin;
@@ -16160,9 +16141,9 @@
 genericHeader(tdb, item);
 safef(aliasTable, sizeof(aliasTable), "jaxAlleleInfo");
 safef(phenoTable, sizeof(phenoTable), "jaxAllelePheno");
 safef(query, sizeof(query), "name = \"%s\"", item);
-sr = hRangeQuery(conn, track, seqName, winStart, winEnd, query, &hasBin);
+sr = hRangeQuery(conn, tdb->table, seqName, winStart, winEnd, query, &hasBin);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct bed *bed = bedLoadN(row+hasBin, 12);
     /* Watch out for case-insensitive matches (e.g. one allele is <sla>,
@@ -16257,12 +16238,12 @@
     *selectedPheno = '\0';
     selectedPheno += strlen(" source=");
     }
 genericHeader(tdb, item);
-safef(aliasTable, sizeof(aliasTable), "%sAlias", tdb->tableName);
+safef(aliasTable, sizeof(aliasTable), "%sAlias", tdb->table);
 safef(phenoTable, sizeof(phenoTable), "jaxAllelePheno");
 safef(query, sizeof(query), "name = \"%s\"", item);
-sr = hRangeQuery(conn, tdb->tableName, seqName, winStart, winEnd, query,
+sr = hRangeQuery(conn, tdb->table, seqName, winStart, winEnd, query,
 		 &hasBin);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct bed *bed = bedLoadN(row+hasBin, 12);
@@ -16364,9 +16345,8 @@
 
 void doJaxAliasGenePred(struct trackDb *tdb, char *item)
 /* Show gene prediction position and other info. */
 {
-char *track = tdb->tableName;
 char query[512];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlConnection *conn2 = hAllocConn(database);
 struct genePred *gpList = NULL, *gp = NULL;
@@ -16375,11 +16355,11 @@
 char aliasTable[256];
 boolean gotAlias = FALSE;
 
 genericHeader(tdb, item);
-safef(aliasTable, sizeof(aliasTable), "%sAlias", track);
+safef(aliasTable, sizeof(aliasTable), "%sAlias", tdb->table);
 gotAlias = hTableExists(database, aliasTable);
-hFindSplitTable(database, seqName, track, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 safef(query, sizeof(query), "name = \"%s\"", item);
 gpList = genePredReaderLoadQuery(conn, table, query);
 for (gp = gpList; gp != NULL; gp = gp->next)
     {
@@ -16460,9 +16440,9 @@
 	 "         thickStart, thickEnd, reserved, blockCount, blockSizes, "
 	 "         chromStarts, Id, color "
 	 "from     %s "
 	 "where    name = '%s' and chromStart = %d "
-	 "order by Id ", tdb->tableName, item, start);
+	 "order by Id ", tdb->table, item, start);
 for (ee = encodeErgeLoadByQuery(conn, query); ee!=NULL; ee=ee->next)
     {
     printf("<BR>\n");
     if (ee->Id>0)
@@ -16505,9 +16485,9 @@
 	 "         thickStart, thickEnd, reserved, blockCount, blockSizes, "
 	 "         chromStarts, Id, color, allLines "
 	 "from     %s "
 	 "where    name = '%s' and chromStart = %d "
-	 "order by Id ", tdb->tableName, item, start);
+	 "order by Id ", tdb->table, item, start);
 for (ee = encodeErgeHssCellLinesLoadByQuery(conn, query); ee!=NULL; ee=ee->next)
     {
     if (ee->Id>0)
 	{
@@ -16533,9 +16513,9 @@
 
 
 void doEncodeIndels(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct encodeIndels encodeIndel;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -16907,9 +16887,8 @@
 
 void doCeleraDupPositive(struct trackDb *tdb, char *dupName)
 /* Handle click on celeraDupPositive track. */
 {
-char *track = tdb->tableName;
 struct celeraDupPositive dup;
 char query[512];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
@@ -16925,13 +16904,13 @@
 
 if (cgiVarExists("o"))
     {
     int start = cgiInt("o");
-    int rowOffset = hOffsetPastBin(database, seqName, track);
+    int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 
     safef(query, sizeof(query),
 	  "select * from %s where chrom = '%s' and chromStart = %d and name= '%s'",
-	  track, seqName, start, dupName);
+	  tdb->table, seqName, start, dupName);
     sr = sqlGetResult(conn, query);
     i = 0;
     while ((row = sqlNextRow(sr)))
 	{
@@ -17010,9 +16989,8 @@
 cartWebStart(cart, database, "%s", tdb->longLabel);
 
 if (cgiVarExists("o"))
     {
-    char *track = tdb->tableName;
     struct genomicSuperDups dup;
     struct dyString *query = newDyString(512);
     struct sqlConnection *conn = hAllocConn(database);
     struct sqlResult *sr;
@@ -17029,12 +17007,12 @@
     else if (sameString("hg17", database))
 	alignUrl = "http://humanparalogy.gs.washington.edu";
     else if (sameString("hg15", database) || sameString("hg16", database))
 	alignUrl = "http://humanparalogy.gs.washington.edu/jab/der_oo33";
-    rowOffset = hOffsetPastBin(database, seqName, track);
+    rowOffset = hOffsetPastBin(database, seqName, tdb->table);
     parseSuperDupsChromPointPos(dupName, oChrom, &oStart, &dupId);
     dyStringPrintf(query, "select * from %s where chrom = '%s' and ",
-		   track, seqName);
+		   tdb->table, seqName);
     if (rowOffset > 0)
 	hAddBinToQuery(start, end, query);
     if (dupId >= 0)
 	dyStringPrintf(query, "uid = %d and ", dupId);
@@ -17054,9 +17032,9 @@
 	printf("<A HREF=\"%s&o=%d&t=%d&g=getDna&i=%s&c=%s&l=%d&r=%d&strand=%s&db=%s&table=%s\">"
 	       "View DNA for other position</A><BR>\n",
 	       hgcPathAndSettings(), dup.otherStart, dup.otherEnd, "",
 	       dup.otherChrom, dup.otherStart, dup.otherEnd, dup.strand,
-	       database, track);
+	       database, tdb->track);
 	printf("<B>Other Position Relative Orientation:</B>%s<BR>\n",
 	       dup.strand);
 	printf("<B>Filter Verdict:</B> %s<BR>\n", dup.verdict);
 	printf("&nbsp;&nbsp;&nbsp;<B> testResult:</B>%s<BR>\n", dup.testResult);
@@ -17278,9 +17256,9 @@
 dupe = cloneString(tdb->type);
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, item, FALSE);
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
     	table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 
@@ -17351,9 +17329,9 @@
 dupe = cloneString(tdb->type);
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, item, TRUE);
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
     	table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 
@@ -17397,9 +17375,9 @@
 dupe = cloneString(tdb->type);
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, item, TRUE);
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
     	table, item, seqName, start);
 sr = sqlGetResult(conn, query);
 
@@ -17470,9 +17448,9 @@
 dupe = cloneString(tdb->type);
 genericHeader(tdb, item);
 wordCount = chopLine(dupe, words);
 printCustomUrl(tdb, item, TRUE);
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s'",
         table, item, seqName );
 sr = sqlGetResult(conn, query);
 
@@ -17529,11 +17507,11 @@
 printTrackHtml(tdb);
 hFreeConn(&conn);
 }
 
-void doGcDetails(struct trackDb *tdb, char *itemName) {
+void doGcDetails(struct trackDb *tdb, char *itemName) 
 /* Show details for gc percent */
-char *group = tdb->tableName;
+{
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -17543,9 +17521,9 @@
 char table[64];
 
 cartWebStart(cart, database, "Percentage GC in 20,000 Base Windows (GC)");
 
-hFindSplitTable(database, seqName, group, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where chrom = '%s' and chromStart = %d and name = '%s'",
 	table, seqName, start, itemName);
 
 sr = sqlGetResult(conn, query);
@@ -18054,15 +18032,15 @@
 
 /* Load the altGraphX record and start page. */
 if(id != 0)
     {
-    snprintf(query, sizeof(query),"select * from %s where id=%d", tdb->tableName, id);
+    snprintf(query, sizeof(query),"select * from %s where id=%d", tdb->table, id);
     ag = altGraphXLoadByQuery(conn, query);
     }
 else
     {
     snprintf(query, sizeof(query),"select * from %s where tName like '%s' and tStart <= %d and tEnd >= %d",
-	     tdb->tableName, seqName, winEnd, winStart);
+	     tdb->table, seqName, winEnd, winStart);
     ag = altGraphXLoadByQuery(conn, query);
     }
 if(ag == NULL)
     errAbort("hgc::doAltGraphXDetails() - couldn't find altGraphX with id=%d", id);
@@ -18071,16 +18049,16 @@
 
 /* Print a display of the Graph. */
 printf("<b>Plots of Alt-Splicing:</b>");
 printf("<center>\n");
-if(sameString(tdb->tableName, "altGraphXPsb2004"))
+if(sameString(tdb->table, "altGraphXPsb2004"))
     printf("Common Splicing<br>");
 printf("Alt-Splicing drawn to scale.<br>");
 image = altGraphXMakeImage(tdb,ag);
 freez(&image);
 /* Normally just print graph with exons scaled up. For conserved
    track also display orthologous loci. */
-if(differentString(tdb->tableName, "altGraphXPsb2004"))
+if(differentString(tdb->table, "altGraphXPsb2004"))
     {
     struct altGraphX *copy = altGraphXClone(ag);
     altGraphXVertPosSort(copy);
     altGraphXEnlargeExons(copy);
@@ -18238,9 +18216,9 @@
 int left = cartIntExp( cart, "l" );
 int right = cartIntExp( cart, "r" );
 char *winOn = cartUsualString( cart, "win", "F" );
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s' and chrom = '%s'",
 	table, item, seqName);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
@@ -18269,9 +18247,9 @@
 	    cgiItem = cgiEncode(thisItem);
 	    longXenoPsl1Given(tdb, thisItem, otherOrg, "chromInfo",
 			      otherDb, thisPsl, pslTableName );
 	    sprintf(otherString, "%d&win=T", thisPsl->tStart );
-	    hgcAnchorSomewhere( tdb->tableName, cgiEncode(item), otherString, thisPsl->tName );
+	    hgcAnchorSomewhere( tdb->track, cgiEncode(item), otherString, thisPsl->tName );
 	    printf("View individual alignment windows\n</a>");
 	    printf("<br><br>");
 	    }
 	}
@@ -18329,9 +18307,9 @@
 char pslTableName[128] = "blastzBestMouse";
 int offset;
 int motifid;
 
-hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, table, &hasBin);
 sprintf(query, "select * from %s where name = '%s'",
 	table, item);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
@@ -18420,9 +18398,9 @@
 int start = cartInt(cart, "o");
 char *type;
 fileName = nextWord(&fileItem);
 for (ct = ctList; ct != NULL; ct = ct->next)
-    if (sameString(trackId, ct->tdb->tableName))
+    if (sameString(trackId, ct->tdb->track))
 	break;
 if (ct == NULL)
     errAbort("Couldn't find '%s' in '%s'", trackId, fileName);
 type = ct->tdb->type;
@@ -18460,19 +18438,21 @@
     printf("<P><A HREF=\"../cgi-bin/hgTables?db=%s&hgta_group=%s&hgta_track=%s"
            "&hgta_table=%s&position=%s:%d-%d&"
            "hgta_doSchema=describe+table+schema\" TARGET=_BLANK>"
            "View table schema</A></P>\n",
-           database, ct->tdb->grp, ct->tdb->tableName, ct->tdb->tableName,
+           database, ct->tdb->grp, ct->tdb->table, ct->tdb->table,
            seqName, winStart+1, winEnd);
     }
 else if (ct->dbTrack && sameString(ct->dbTrackType, "maf"))
     {
     struct sqlConnection *conn = hAllocConn(CUSTOM_TRASH);
     struct sqlConnection *conn2 = hAllocConn(CUSTOM_TRASH);
-    char *saveName = ct->tdb->tableName;
-    ct->tdb->tableName = ct->dbTableName;
+    char *saveTable = ct->tdb->table;
+    char *saveTrack = ct->tdb->track;
+    ct->tdb->table = ct->tdb->track = ct->dbTableName;
     customMafClick(conn, conn2, ct->tdb);
-    ct->tdb->tableName = saveName;
+    ct->tdb->table = saveTable;
+    ct->tdb->track = saveTrack;
     hFreeConn(&conn2);
     hFreeConn(&conn);
     }
 else
@@ -18566,9 +18546,9 @@
 struct psl *psl = 0;
 struct sqlResult *sr = NULL;
 struct sqlConnection *conn = hAllocConn(database);
 char query[256], **row;
-struct psl* pslList = getAlignments(conn, tdb->tableName, itemName);
+struct psl* pslList = getAlignments(conn, tdb->table, itemName);
 char *useName = itemName;
 char *acc = NULL, *prot = NULL;
 char *gene = NULL, *pos = NULL;
 char *ptr;
@@ -18579,13 +18559,13 @@
 boolean isSacCer = FALSE;
 char *pred = trackDbSettingOrDefault(tdb, "pred", "NULL");
 char *blastRef = trackDbSettingOrDefault(tdb, "blastRef", "NULL");
 
-if (sameString("blastSacCer1SG", tdb->tableName))
+if (sameString("blastSacCer1SG", tdb->table))
     isSacCer = TRUE;
-if (startsWith("blastDm", tdb->tableName))
+if (startsWith("blastDm", tdb->table))
     isDm = TRUE;
-if (startsWith("blastCe", tdb->tableName))
+if (startsWith("blastCe", tdb->table))
     isCe = TRUE;
 buffer = needMem(strlen(itemName)+ 1);
 strcpy(buffer, itemName);
 acc = buffer;
@@ -18634,9 +18614,9 @@
 if (pos != NULL)
     {
     if (isDm == TRUE)
 	{
-	char *dmDb = cloneString(strchr(tdb->tableName, 'D'));
+	char *dmDb = cloneString(strchr(tdb->track, 'D'));
 
 	*dmDb = tolower(*dmDb);
 	*strchr(dmDb, 'F') = 0;
 
@@ -18646,13 +18626,13 @@
 	}
     else if (isCe == TRUE)
 	{
 	char *assembly;
-	if (sameString("blastWBRef01", tdb->tableName))
+	if (sameString("blastWBRef01", tdb->table))
 	    assembly = "ce3";
-	else if (sameString("blastCe6SG", tdb->tableName))
+	else if (sameString("blastCe6SG", tdb->table))
 	    assembly = "ce6";
-	else if (sameString("blastCe4SG", tdb->tableName))
+	else if (sameString("blastCe4SG", tdb->table))
 	    assembly = "ce4";
 	else
 	    assembly = "ce3";
 	printf("<B>C. elegans position:</B>\n");
@@ -18668,11 +18648,11 @@
 	}
     else
 	{
 	char *assembly;
-	if (sameString("blastHg16KG", tdb->tableName))
+	if (sameString("blastHg16KG", tdb->table))
 	    assembly = "hg16";
-	else if (sameString("blastHg17KG", tdb->tableName))
+	else if (sameString("blastHg17KG", tdb->table))
 	    assembly = "hg17";
 	else
 	    assembly = "hg18";
 	printf("<B>Human position:</B>\n");
@@ -18727,13 +18707,13 @@
 	if (isPslToPrintByClick(psl, start, isClicked))
 	    {
 	    printf("<A HREF=\"%s&o=%d&g=htcProteinAli&i=%s&c=%s&l=%d&r=%d&db=%s&aliTrack=%s&pred=%s\">",
 		hgcPathAndSettings(), psl->tStart, psl->qName,  psl->tName,
-		psl->tStart, psl->tEnd, database,tdb->tableName, pred);
+		psl->tStart, psl->tEnd, database,tdb->track, pred);
 	    printf("alignment</A> ");
 	    printf("<A HREF=\"%s&o=%d&g=htcGetBlastPep&i=%s&c=%s&l=%d&r=%d&db=%s&aliTrack=%s\">",
 		hgcPathAndSettings(), psl->tStart, psl->qName,  psl->tName,
-		psl->tStart, psl->tEnd, database,tdb->tableName);
+		psl->tStart, psl->tEnd, database,tdb->track);
 	    printf("peptide</A> ");
 	    printf("%5.1f%%    %5.1f%% %5d %5d %5.1f%%    %c   ",
 		100.0 * (psl->match + psl->repMatch + psl->misMatch) / psl->qSize,
 		100.0 * (psl->match + psl->repMatch) / (psl->match + psl->repMatch + psl->misMatch),
@@ -18741,9 +18721,9 @@
 		100.0 * (psl->qEnd - psl->qStart) / psl->qSize, psl->strand[1]);
 	    printf("<A HREF=\"%s&position=%s:%d-%d&db=%s&ss=%s+%s\">",
 		   hgTracksPathAndSettings(),
 		   psl->tName, psl->tStart + 1, psl->tEnd, database,
-		   tdb->tableName, itemName);
+		   tdb->track, itemName);
 	    sprintLongWithCommas(startBuf, psl->tStart + 1);
 	    sprintLongWithCommas(endBuf, psl->tEnd);
 	    printf("%s:%s-%s</A> <BR>",psl->tName,startBuf, endBuf);
 	    if (isClicked)
@@ -18825,10 +18805,10 @@
 int rowOffset;
 int start = cartInt(cart, "o");
 
 genericHeader(tdb, NULL);
-if (!hFindSplitTable(database, seqName, tdb->tableName, fullTable, &rowOffset))
-    errAbort("No %s track in database %s", tdb->tableName, database);
+if (!hFindSplitTable(database, seqName, tdb->table, fullTable, &rowOffset))
+    errAbort("No %s table in database %s", tdb->table, database);
 safef(query, sizeof(query),
     "select * from %s where chrom = '%s' and chromStart=%d",
     fullTable, seqName, start);
 sr = sqlGetResult(conn, query);
@@ -18858,9 +18838,9 @@
 
 genericHeader(tdb, item);
 genericBedClick(conn, tdb, item, start, 4);
 safef(extra, sizeof(extra), "chromStart = %d", start);
-sr = hRangeQuery(conn, tdb->tableName, seqName, winStart, winEnd, extra,
+sr = hRangeQuery(conn, tdb->table, seqName, winStart, winEnd, extra,
 		 &rowOffset);
 if ((row = sqlNextRow(sr)) != NULL)
     {
     vntrStaticLoad(row + rowOffset, &vntr);
@@ -18900,9 +18880,9 @@
 boolean hasBin = FALSE;
 
 genericHeader(tdb, item);
 genericBedClick(conn, tdb, item, start, 4);
-hFindSplitTable(database, seqName, tdb->tableName, fullTable, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, fullTable, &hasBin);
 safef(query, sizeof(query), "select * from %s where name = '%s'",
       fullTable, item);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
@@ -18944,9 +18924,9 @@
 struct bed *bed = NULL;
 char query[512];
 
 genericHeader(tdb, item);
-hFindSplitTable(database, seqName, tdb->tableName, fullTable, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, fullTable, &hasBin);
 safef(query, sizeof(query),
       "select * from %s where chrom = '%s' and chromStart = %d",
       fullTable, seqName, start);
 sr = sqlGetResult(conn, query);
@@ -19001,9 +18981,9 @@
 num = 0;
 num = atoi(words[1]);
 
 /* get data for this item */
-sprintf(query, "select * from %s where name = '%s' and chromStart = %d", tdb->tableName, item, start);
+sprintf(query, "select * from %s where name = '%s' and chromStart = %d", tdb->table, item, start);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     bed = bedLoadN(row+hasBin, num);
 
@@ -19047,14 +19027,14 @@
 struct sqlConnection *conn = hAllocConn(database);
 int start = cartInt(cart, "o");
 struct gencodeIntron *intron, *intronList = NULL;
 char query[256];
-int rowOffset = hOffsetPastBin(database, seqName, tdb->tableName);
+int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 
 genericHeader(tdb, item);
 safef(query, sizeof query,
         "select * from %s where name='%s' and chrom='%s' and chromStart=%d",
-                tdb->tableName, item, seqName, start);
+                tdb->table, item, seqName, start);
 intronList = gencodeIntronLoadByQuery(conn, query, rowOffset);
 for (intron = intronList; intron != NULL; intron = intron->next)
     {
     printf("<B>Intron:</B> %s<BR>\n", intron->name);
@@ -19110,16 +19090,16 @@
 char query[1024];
 
 cartWebStart(cart, database, "%s", tdb->longLabel);
 genericHeader(tdb, item);
-hFindSplitTable(database, seqName, tdb->tableName, fullTable, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, fullTable, &hasBin);
 safef(query, sizeof(query),
      "select * from %s where chrom = '%s' and chromStart = %d and name = '%s'",
       fullTable, seqName, start, item);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
-    if (endsWith(tdb->tableName, "Average"))
+    if (endsWith(tdb->table, "Average"))
 	printESPAverageDetails(row+hasBin, tdb);
     else
 	printESPDetails(row+hasBin, tdb);
     }
@@ -19140,9 +19120,9 @@
 char query[1024];
 
 cartWebStart(cart, database, "%s", tdb->longLabel);
 genericHeader(tdb, item);
-hFindSplitTable(database, seqName, tdb->tableName, fullTable, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, fullTable, &hasBin);
 safef(query, sizeof(query),
      "select * from %s where chrom = '%s' and chromStart = %d and name = '%s'",
       fullTable, seqName, start, item);
 sr = sqlGetResult(conn, query);
@@ -19159,9 +19139,9 @@
 }
 
 void doEncodeHapMapAlleleFreq(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct encodeHapMapAlleleFreq alleleFreq;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -19311,9 +19291,9 @@
 			      boolean showOrtho)
 /* Use the hapmapAllelesSummary table (caller checks for existence) to display allele
  * frequencies for the 4 HapMap Phase II populations. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct hapmapAllelesSummary *summaryItem;
 struct sqlResult *sr;
 char **row;
 char query[256];
@@ -19516,9 +19496,9 @@
 
 void doHapmapSnps(struct trackDb *tdb, char *itemName)
 /* assume just one hapmap snp at a given location */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[256];
@@ -19586,9 +19566,9 @@
 
 void doHapmapOrthos(struct trackDb *tdb, char *itemName)
 /* could assume just one match */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct hapmapAllelesOrtho *ortho;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -19718,9 +19698,9 @@
 boolean hasBin = FALSE;
 char query[512];
 
 genericHeader(tdb, item);
-hFindSplitTable(database, seqName, tdb->tableName, fullTable, &hasBin);
+hFindSplitTable(database, seqName, tdb->table, fullTable, &hasBin);
 safef(query, sizeof(query),
      "select * from %s where chrom = '%s' and chromStart = %d and name = '%s'",
       fullTable, seqName, start, item);
 sr = sqlGetResult(conn, query);
@@ -19985,9 +19965,9 @@
 char **row;
 char *bayesianFiguresUrl = "../images/mammalPsg";
 
 genericHeader(tdb, itemName);
-sprintf(query, "select * from %s where name = '%s'", tdb->tableName, itemName);
+sprintf(query, "select * from %s where name = '%s'", tdb->table, itemName);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     mammalPsg = mammalPsgLoad(row);
 else
@@ -20042,9 +20022,9 @@
 boolean approx;
 enum {CONS, GAIN, LOSS} elementType;
 
 genericHeader(tdb, itemName);
-sprintf(query, "select * from %s where name = '%s'", tdb->tableName, itemName);
+sprintf(query, "select * from %s where name = '%s'", tdb->table, itemName);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     dless = dlessLoad(row);
 else
@@ -20353,9 +20333,9 @@
     }
 
 
 /* show genome sequence */
-hgcAnchorSomewhere("htcGeneInGenome", cgiEncode(info->name), tdb->tableName, seqName);
+hgcAnchorSomewhere("htcGeneInGenome", cgiEncode(info->name), tdb->track, seqName);
 printf("View DNA for this putative fragment</A><BR>\n");
 
 /* show the detail alignment */
 sprintf(query, "SELECT * FROM %s WHERE "
@@ -20402,9 +20382,9 @@
 }
 
 void doDv(struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct dvBed dvBed;
 struct dv *dv;
 struct dvXref2 *dvXref2;
 struct omimTitle *omimTitle;
@@ -20524,9 +20504,9 @@
 }
 
 void doOreganno (struct trackDb *tdb, char *itemName)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct oreganno *r = NULL;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -20638,9 +20618,9 @@
 }
 
 void doSnpArray (struct trackDb *tdb, char *itemName, char *dataSource)
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[256];
@@ -20700,9 +20680,9 @@
 /* doSnpArray2 is essential the same as doSnpArray except that the strand is blanked out */
 /* This is a temp solution for 3 Illumina SNP Arrays to blank out strand info for non-dbSnp entries */
 /* Should be removed once Illumina comes up with a clear defintion of their strand data */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
 char query[256];
@@ -21100,9 +21080,9 @@
 
 void doOmiciaOld (struct trackDb *tdb, char *itemName)
 /* this prints the detail page for the Omicia OMIM track */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct omiciaLink *link = NULL;
 struct omiciaAttr *attr = NULL;
 void *omim = NULL;
 struct sqlConnection *conn = hAllocConn(database);
@@ -21159,9 +21139,9 @@
 
 void doProtVar (struct trackDb *tdb, char *itemName)
 /* this prints the detail page for the UniProt variation track */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct protVarPos *mut = NULL;
 struct protVar *details = NULL;
 struct protVarAttr attr;
 struct sqlConnection *conn = hAllocConn(database);
@@ -21239,12 +21219,12 @@
 printTrackHtml(tdb);
 hFreeConn(&conn);
 }
 
-void doGv (struct trackDb *tdb, char *itemName)
+void doGv(struct trackDb *tdb, char *itemName)
 /* this prints the detail page for the Genome variation track */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct gvPos *mut = NULL;
 struct gv *details = NULL;
 struct gvAttr attr;
 struct gvAttrLong attrLong;
@@ -21353,9 +21333,9 @@
 /* split code from printTrackHtml */
 printTBSchemaLink(tdb);
 printDataVersion(tdb);
 printOrigAssembly(tdb);
-if ((tableName = hTableForTrack(database, tdb->tableName)) != NULL)
+if ((tableName = hTableForTrack(database, tdb->table)) != NULL)
     {
     struct sqlConnection *conn = hAllocConn(database);
     char *date = firstWordInLine(sqlTableUpdate(conn, tableName));
     if (date != NULL)
@@ -21379,9 +21359,9 @@
 
 void doPgSnp(struct trackDb *tdb, char *itemName)
 /* print detail page for personal genome track (pgSnp) */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 char *escName = sqlEscapeString(itemName);
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr;
 char **row;
@@ -21440,9 +21420,9 @@
 
 void doAllenBrain(struct trackDb *tdb, char *itemName)
 /* Put up page for Allen Brain Atlas. */
 {
-char *table = tdb->tableName;
+char *table = tdb->table;
 struct psl *pslList;
 int start = cartInt(cart, "o");
 struct sqlConnection *conn = hAllocConn(database);
 char *url, query[512];
@@ -21465,9 +21445,8 @@
 
 void doExaptedRepeats(struct trackDb *tdb, char *itemName)
 /* Respond to click on the exaptedRepeats track. */
 {
-char *track = tdb->tableName;
 struct sqlConnection *conn = hAllocConn(database);
 char query[256];
 struct sqlResult *sr;
 char **row;
@@ -21475,10 +21454,10 @@
 unsigned int chromStart, chromEnd;
 boolean blastzAln;
 
 cartWebStart(cart, database, "%s", itemName);
-sprintf(query, "select * from %s where name = '%s'", track, itemName);
-selectOneRow(conn, track, query, &sr, &row);
+sprintf(query, "select * from %s where name = '%s'", tdb->table, itemName);
+selectOneRow(conn, tdb->table, query, &sr, &row);
 chr = cloneString(row[0]);
 chromStart = sqlUnsigned(row[1]);
 chromEnd = sqlUnsigned(row[2]);
 name = cloneString(row[3]);
@@ -21516,13 +21495,13 @@
     struct sqlConnection *conn = hAllocConn(database);
     struct sqlResult *sr = NULL;
     struct dyString *query = dyStringNew(512);
     char **row = NULL;
-    int rowOffset = hOffsetPastBin(database, seqName, tdb->tableName);
+    int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
     int start = cartInt(cart, "o");
     int end = cartInt(cart, "t");
     dyStringPrintf(query, "select * from %s where tName = '%s' and ",
-		   tdb->tableName, seqName);
+		   tdb->table, seqName);
     if (rowOffset)
 	hAddBinToQuery(start, end, query);
     dyStringPrintf(query, "tStart = %d and qName = '%s'", start, itemName);
     sr = sqlGetResult(conn, query->string);
@@ -21533,9 +21512,9 @@
 		 psl->qName);
 	if (hGenBankHaveSeq(database, itemName, NULL))
 	    {
 	    printf("<H3>%s/Genomic Alignments</H3>", name);
-	    printAlignments(psl, start, "htcCdnaAli", tdb->tableName,
+	    printAlignments(psl, start, "htcCdnaAli", tdb->table,
 			    encodedName);
 	    }
 	else
 	    {
@@ -21560,9 +21539,9 @@
 struct sqlResult *sr;
 char **row;
 genericHeader(tdb, item);
 char defaultExtra[HDB_MAX_TABLE_STRING];
-safef(defaultExtra, sizeof(defaultExtra), "%sExtra", tdb->tableName);
+safef(defaultExtra, sizeof(defaultExtra), "%sExtra", tdb->table);
 char *extraTable = trackDbSettingOrDefault(tdb, "xrefTable", defaultExtra);
 boolean gotExtra = sqlTableExists(conn, extraTable);
 if (gotExtra)
     {
@@ -21608,9 +21587,9 @@
     puts("<TR><TD colspan=2>");
     sqlFreeResult(&sr);
     }
 safef(query, sizeof(query), "select chrom,chromStart,chromEnd from %s "
-      "where name = '%s'", tdb->tableName, item);
+      "where name = '%s'", tdb->table, item);
 sr = sqlGetResult(conn, query);
 char lastChr[32];
 int lastStart = -1;
 int lastEnd = -1;
@@ -21638,9 +21617,9 @@
 
 printf("<B>Name:</B> %s<BR>\n", item);
 
 /* this prints the detail page for the clinical information for Cancer Demo datasets */
-char *table = tdb->tableName;
+char *table = tdb->table;
 char *cliniTable=NULL, *key=NULL;
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr, *startSr;
@@ -21853,9 +21832,9 @@
 char confTable[128];
 
 /* create name for confidence table containing posterior probability and
    false discovery rate (FDR). */
-safef(confTable, sizeof(confTable), "%sConf", tdb->tableName);
+safef(confTable, sizeof(confTable), "%sConf", tdb->table);
 
 if (sqlTableExists(conn, confTable))
     {
     /* print the posterior probability and FDR if available */
@@ -21951,16 +21930,16 @@
 char *escapedName = sqlEscapeString(item);
 int start = cartInt(cart, "o");
 
 genericHeader(tdb, item);
-if (! startsWith(KIDD_EICHLER_DISC_PREFIX, tdb->tableName))
+if (! startsWith(KIDD_EICHLER_DISC_PREFIX, tdb->table))
     errAbort("track tableName must begin with "KIDD_EICHLER_DISC_PREFIX
-	     " but instead it is %s", tdb->tableName);
-hasBin = hOffsetPastBin(database, seqName, tdb->tableName);
+	     " but instead it is %s", tdb->table);
+hasBin = hOffsetPastBin(database, seqName, tdb->table);
 /* We don't need to add bin to this because name is indexed: */
 safef(query, sizeof(query), "select * from %s where name = '%s' "
 	       "and chrom = '%s' and chromStart = %d",
-	       tdb->tableName, escapedName, seqName, start);
+	       tdb->table, escapedName, seqName, start);
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     if (firstTime)
@@ -21975,9 +21954,9 @@
     if (endFudge && !strstr(bed->name, "OEA"))
 	endForUrl += atoi(endFudge);
     char sampleName[16];
     safecpy(sampleName, sizeof(sampleName),
-	    tdb->tableName + strlen(KIDD_EICHLER_DISC_PREFIX));
+	    tdb->table + strlen(KIDD_EICHLER_DISC_PREFIX));
     touppers(sampleName);
     char itemPlus[2048];
     safef(itemPlus, sizeof(itemPlus),
 	  "%s&o=%d&t=%d&g=%s_discordant&%s_discordant=full",
@@ -22053,9 +22032,9 @@
 if (isCustomTrack(track))
     {
     struct customTrack *ctList = getCtList();
     for (ct = ctList; ct != NULL; ct = ct->next)
-	if (sameString(track, ct->tdb->tableName))
+	if (sameString(track, ct->tdb->track))
 	    break;
     }
 
 if ((!isCustomTrack(track) && dbIsFound)  ||
@@ -22085,9 +22064,10 @@
             strncat(wigType, " ", 128 - strlen(wigType));
             }
         strncat(wigType, "\n", 128 - strlen(wigType));
         tdb->type = wigType;
-        tdb->tableName = cloneString(track);
+        tdb->track = cloneString(track);
+        tdb->table = cloneString(track);
         freeMem(typeLine);
         cartRemove(cart, "parentWigMaf");	/* ONE TIME ONLY USE !!!	*/
         }
     else