src/hg/hgTracks/simpleTracks.c 1.139

1.139 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/hgTracks/simpleTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/simpleTracks.c,v
retrieving revision 1.138
retrieving revision 1.139
diff -b -B -U 4 -r1.138 -r1.139
--- src/hg/hgTracks/simpleTracks.c	7 May 2010 05:07:57 -0000	1.138
+++ src/hg/hgTracks/simpleTracks.c	11 May 2010 01:43:28 -0000	1.139
@@ -503,18 +503,18 @@
 if(toggleGroup != NULL && tdbIsCompositeChild(toggleGroup->tdb))
     {
     int vis = toggleGroup->visibility;
     struct trackDb *tdbParent = trackDbCompositeParent(toggleGroup->tdb);
-    char *parentName = tdbParent->tableName;
+    char *parentName = tdbParent->track;
     // Find parent track (as opposed to trackDb)
     struct track *tgParent = trackList;
     for (;tgParent != NULL; tgParent = tgParent->next)
         {
-        if (sameString(tgParent->mapName,parentName))
+        if (sameString(tgParent->track,parentName))
             break;
         }
     // should be assertable assert(tgParent!=NULL);
-    char *encodedTableName = cgiEncode(toggleGroup->tdb->parent->tableName);
+    char *encodedTableName = cgiEncode(toggleGroup->tdb->parent->track);
     char *view = NULL;
     boolean setView = subgroupFind(toggleGroup->tdb,"view",&view);
     if(tgParent!=NULL && tvCompare(tgParent->visibility,vis) > 0)
         {
@@ -549,9 +549,9 @@
     {
     if (toggleGroup != NULL)
         {
         int vis = toggleGroup->visibility;
-        char *encodedMapName = cgiEncode(toggleGroup->mapName);
+        char *encodedMapName = cgiEncode(toggleGroup->track);
         if (vis == tvDense)
             {
             if(!toggleGroup->canPack || (tdbIsComposite(toggleGroup->tdb) && subgroupingExists(toggleGroup->tdb,"view")))
                 vis = tvFull;
@@ -610,9 +610,9 @@
 struct dyString *ui = uiStateUrlPart(toggleGroup);
 struct dyString *id = dyStringNew(0);
 if(toggleGroup)
     {
-    dyStringPrintf(id, " id='%s'", toggleGroup->mapName);
+    dyStringPrintf(id, " id='%s'", toggleGroup->track);
     }
 x = hvGfxAdjXW(hvg, x, width);
 
 if (extra != NULL)
@@ -654,9 +654,9 @@
     //#ifdef IMAGEv2_SHORT_MAPITEMS
     //    if(x < insideX && x+width > insideX)
     //        warn("mapBoxReinvoke(%s) map item spanning slices. LX:%d TY:%d RX:%d BY:%d  link:[%s]",hStringFromTv(toggleGroup->visibility),x, y, x+width, y+height, link);
     //#endif//def IMAGEv2_SHORT_MAPITEMS
-    imgTrackAddMapItem(curImgTrack,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height, toggleGroup != NULL ? toggleGroup->mapName : NULL);
+    imgTrackAddMapItem(curImgTrack,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height, toggleGroup != NULL ? toggleGroup->track : NULL);
     }
 else
     {
     hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
@@ -1522,9 +1522,9 @@
     }
 /* load as linked list once, outside of loop */
 srcList = gvSrcLoadByQuery(conn, "select * from hgFixed.gvSrc");
 /* load part need from gv table, outside of loop (load in hash?) */
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct gv *details = NULL;
     char query[256], *escId;
@@ -1634,9 +1634,9 @@
 struct sqlResult *sr;
 char **row;
 int rowOffset;
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd,
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,
                  NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct oreganno *el = oregannoLoad(row);
@@ -1823,24 +1823,24 @@
 if (end > start)
     for ( ; sizeWanted > 0 && sizeWanted < BIGNUM; )
 	{
 #ifndef GBROWSE
-	if (sameWord(tg->mapName, WIKI_TRACK_TABLE))
-	    items = wikiTrackGetBedRange(tg->mapName, chromName, start, end);
-	else if (sameWord(tg->mapName, "gvPos"))
+	if (sameWord(tg->table, WIKI_TRACK_TABLE))
+	    items = wikiTrackGetBedRange(tg->table, chromName, start, end);
+	else if (sameWord(tg->table, "gvPos"))
 	    items = loadGvAsBed(tg, chromName, start, end);
-	else if (sameWord(tg->mapName, "oreganno"))
+	else if (sameWord(tg->table, "oreganno"))
 	    items = loadOregannoAsBed(tg, chromName, start, end);
 	else
 #endif /* GBROWSE */
 	    {
-	    if (isCustomTrack(tg->mapName))
+	    if (isCustomTrack(tg->table))
 		{
 		struct customTrack *ct = tg->customPt;
 		items = hGetCtBedRange(CUSTOM_TRASH, database, ct->dbTableName, chromName, start, end, NULL);
 		}
 	    else
-		items = hGetBedRange(database, tg->mapName, chromName, start, end, NULL);
+		items = hGetBedRange(database, tg->table, chromName, start, end, NULL);
 	    }
 	/* If we got something, or weren't able to search as big as we wanted to */
 	/* (in case we're at the end of the chrom).  */
 	if ((items != NULL) || (size < sizeWanted))
@@ -1974,9 +1974,9 @@
 char **row;
 int rowOffset;
 struct linkedFeatures *lfList = NULL;
 char extraWhere[256] ;
-/* Use tg->tdb->tableName because subtracks inherit composite track's tdb
+/* Use tg->tdb->track because subtracks inherit composite track's tdb
  * by default, and the variable is named after the composite track. */
 if ((scoreColumn != NULL) && (cartVarExistsAnyLevel(cart, tg->tdb, FALSE, SCORE_FILTER)))
     {
     char *scoreFilterClause = getScoreFilterClause(cart, tg->tdb,scoreColumn);
@@ -1986,13 +1986,13 @@
         safef(extraWhere, sizeof(extraWhere), "%s and %s", scoreFilterClause, moreWhere);
         else
         safef(extraWhere, sizeof(extraWhere), "%s", scoreFilterClause);
         freeMem(scoreFilterClause);
-        sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, extraWhere, &rowOffset);
+        sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, extraWhere, &rowOffset);
         }
     }
 else
-    sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, moreWhere, &rowOffset);
+    sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, moreWhere, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct slList *item = itemLoader(row + rowOffset);
     if ((itemFilter == NULL) || (itemFilter(item) == TRUE))
@@ -2374,9 +2374,9 @@
 else if (tg->colorShades)
     {
     boolean isXeno = (tg->subType == lfSubXeno)
 				|| (tg->subType == lfSubChain)
-                                || startsWith("mrnaBla", tg->mapName);
+                                || startsWith("mrnaBla", tg->table);
     *retColor =  tg->colorShades[lf->grayIx+isXeno];
     *retBarbColor =  tg->colorShades[lf->grayIx];
     }
 else
@@ -2562,9 +2562,9 @@
 				drawOpt == baseColorDrawGenomicCodons);
 if (psl && baseColorNeedsCodons)
     {
     boolean isXeno = ((tg->subType == lfSubXeno) || (tg->subType == lfSubChain) ||
-		      startsWith("mrnaBla", tg->mapName));
+		      startsWith("mrnaBla", tg->table));
     int sizeMul = pslIsProtein(psl) ? 3 : 1;
     lf->codons = baseColorCodonsFromPsl(lf, psl, sizeMul, isXeno, maxShade, drawOpt, tg);
     }
 else if (drawOpt > baseColorDrawOff)
@@ -2579,9 +2579,9 @@
     baseColorSetCdsBounds(lf, psl, tg);
 
 tallStart = lf->tallStart;
 tallEnd = lf->tallEnd;
-if ((tallStart == 0 && tallEnd == 0) && !sameWord(tg->mapName, "jaxQTL3"))
+if ((tallStart == 0 && tallEnd == 0) && !sameWord(tg->table, "jaxQTL3"))
     {
     // sometimes a bed <8 will get passed off as a bed 8, tsk tsk
     tallStart = lf->start;
     tallEnd   = lf->end;
@@ -2758,17 +2758,17 @@
 mapName = tg->mapItemName(tg, item);
 name = tg->itemName(tg, item);
 
 /* special process for KG, because of "hgg_prot" piggy back */
-if (sameWord(tg->mapName, "knownGene"))
+if (sameWord(tg->table, "knownGene"))
     {
     mapName = cloneString(mapName);
     chp = strstr(mapName, "&hgg_prot");
     if (chp != NULL) *chp = '\0';
     }
 #ifndef GBROWSE
 /* special case for PCR Results (may have acc+name mapItemName): */
-else if (sameString(tg->mapName, PCR_RESULT_TRACK_NAME))
+else if (sameString(tg->table, PCR_RESULT_TRACK_NAME))
     mapName = pcrResultItemAccession(mapName);
 #endif /* GBROWSE */
 
 /* Only highlight if names are in the hgFindMatches hash with
@@ -2803,9 +2803,9 @@
 #endif//def FLAT_TRACK_LIST
     {
     char *directUrl = trackDbSetting(tg->tdb, "directUrl");
     boolean withHgsid = (trackDbSetting(tg->tdb, "hgsid") != NULL);
-    mapBoxHgcOrHgGene(hvg, start, end, x, y, width, height, tg->mapName,
+    mapBoxHgcOrHgGene(hvg, start, end, x, y, width, height, tg->track,
                     mapItemName, itemName, directUrl, withHgsid, NULL);
     }
 }
 
@@ -3637,9 +3637,9 @@
 
 if (needJoin)
     {
     dyStringPrintf(query, "select %s.* from %s,polyGenotype where ",
-	tg->mapName, tg->mapName);
+	tg->table, tg->table);
 
     if (differentString(option,ETHNIC_GROUP_DEFAULT))
 	{
 	char *optionNot =
@@ -3647,15 +3647,15 @@
 	if (sameWord(optionNot,"include"))
 	    {
 	    dyStringPrintf(query, "%s.name=polyGenotype.name and "
 		"polyGenotype.ethnicGroup=\"%s\" and ",
-		    tg->mapName, option);
+		    tg->table, option);
 	    }
 	    else
 	    {
 	    dyStringPrintf(query, "%s.name=polyGenotype.name and "
 		"polyGenotype.ethnicGroup!=\"%s\" and ",
-		    tg->mapName, option);
+		    tg->table, option);
 	    }
 	}
     if ((freqLow > 0.0) || (freqHi < 1.0))
 	{
@@ -3666,9 +3666,9 @@
 	}
     }
 else
     {
-    dyStringPrintf(query, "select * from %s where ", tg->mapName);
+    dyStringPrintf(query, "select * from %s where ", tg->table);
     }
 
 hAddBinToQuery(winStart, winEnd, query);
 dyStringPrintf(query,
@@ -3705,9 +3705,9 @@
     else
 	dyStringPrintf(query, " and disease!=\"NA\"");
     }
 
-dyStringPrintf(query, " group by %s.name", tg->mapName);
+dyStringPrintf(query, " group by %s.name", tg->table);
 
 sr = sqlGetResult(conn, dyStringCannibalize(&query));
 rowOffset=1;
 
@@ -3919,12 +3919,12 @@
 struct genePred *gp = NULL;
 boolean nmdTrackFilter = sameString(trackDbSettingOrDefault(tg->tdb, "nmdFilter", "off"), "on");
 char varName[SMALLBUF];
 safef(varName, sizeof(varName), "%s.%s", table, HIDE_NONCODING_SUFFIX);
-boolean hideNoncoding = cartUsualBoolean(cart, varName, HIDE_NONCODING_DEFAULT);  // TODO: Use cartUsualBooleanClosestToHome if tableName == tg->tdb->tableName
+boolean hideNoncoding = cartUsualBoolean(cart, varName, HIDE_NONCODING_DEFAULT);  // TODO: Use cartUsualBooleanClosestToHome if tableName == tg->tdb->track
 boolean doNmd = FALSE;
 char buff[256];
-safef(buff, sizeof(buff), "hgt.%s.nmdFilter",  tg->mapName);
+safef(buff, sizeof(buff), "hgt.%s.nmdFilter",  tg->track);
 
 /* Should we remove items that appear to be targets for nonsense
  * mediated decay? */
 if(nmdTrackFilter)
@@ -4039,9 +4039,8 @@
 /* Returns true if an item should be added to the filter. */
 {
 struct linkedFeatures *lf = item;
 char *classString;
-char *table = tg->mapName;
 char *classType = NULL;
 enum acemblyOptEnum ct;
 struct sqlConnection *conn = NULL;
 char query[1024];
@@ -4079,10 +4078,10 @@
         filterBySetFree(&filterBySet);
         return passesThroughFilter;
         }
 
-    classString = addSuffix(table, ".type");
-    if (sameString(table, "acembly"))
+    classString = addSuffix(tg->table, ".type");
+    if (sameString(tg->table, "acembly"))
         {
         classType = cartUsualString(cart, classString, acemblyEnumToString(0));
         ct = acemblyStringToEnum(classType);
         if (ct == acemblyAll)
@@ -4112,9 +4111,9 @@
 /* Convert gene pred in window to linked feature. Include alternate name
  * in "extra" field (usually gene name)*/
 {
 struct sqlConnection *conn = hAllocConn(database);
-tg->items = connectedLfFromGenePredInRangeExtra(tg, conn, tg->mapName,
+tg->items = connectedLfFromGenePredInRangeExtra(tg, conn, tg->table,
                                         chromName, winStart, winEnd, TRUE);
 hFreeConn(&conn);
 /* filter items on selected criteria if filter is available */
 filterItems(tg, genePredClassFilter, "include");
@@ -4479,11 +4478,11 @@
 {
 struct trackDb *tdb = tg->tdb;
 loadGenePredWithName2(tg);
 char varName[SMALLBUF];
-safef(varName, sizeof(varName), "%s.show.noncoding", tdb->tableName);
+safef(varName, sizeof(varName), "%s.show.noncoding", tdb->track);
 boolean showNoncoding = cartUsualBoolean(cart, varName, TRUE);
-safef(varName, sizeof(varName), "%s.show.spliceVariants", tdb->tableName);
+safef(varName, sizeof(varName), "%s.show.spliceVariants", tdb->track);
 boolean showSpliceVariants = cartUsualBoolean(cart, varName, TRUE);
 if (!showNoncoding)
     tg->items = stripShortLinkedFeatures(tg->items);
 if (!showSpliceVariants)
@@ -4871,9 +4870,9 @@
 	    hvGfxTextCentered(hvg, x1, y, w, heightPer, textColor, font, s);
 	    }
 	}
     mapBoxHc(hvg, bed->chromStart, bed->chromEnd, x1, y, x2 - x1, heightPer,
-	     tg->mapName, tg->mapItemName(tg, bed), sLong);
+	     tg->track, tg->mapItemName(tg, bed), sLong);
     }
 if (tg->subType == lfWithBarbs)
     {
     int dir = 0;
@@ -4896,9 +4895,9 @@
         MgFont *font, Color color, enum trackVisibility vis)
 /* Draw superfamily items. */
 {
 if (!tg->drawItemAt)
-    errAbort("missing drawItemAt in track %s", tg->mapName);
+    errAbort("missing drawItemAt in track %s", tg->track);
 genericDrawItems(tg, seqStart, seqEnd, hvg, xOff, yOff, width,
 	font, color, vis);
 }
 
@@ -5064,9 +5063,9 @@
 	    hvGfxTextCentered(hvg, x1, y, w, heightPer, textColor, font, s);
 	    }
 	}
     mapBoxHc(hvg, bed->chromStart, bed->chromEnd, x1, y, x2 - x1, heightPer,
-	     tg->mapName, tg->mapItemName(tg, bed), sDiseases);
+	     tg->track, tg->mapItemName(tg, bed), sDiseases);
     }
 if (tg->subType == lfWithBarbs)
     {
     int dir = 0;
@@ -5166,9 +5165,9 @@
 	    hvGfxTextCentered(hvg, x1, y, w, heightPer, textColor, font, s);
 	    }
 	}
     mapBoxHc(hvg, bed->chromStart, bed->chromEnd, x1, y, x2 - x1, heightPer,
-	     tg->mapName, tg->mapItemName(tg, bed), sPhenotypes);
+	     tg->track, tg->mapItemName(tg, bed), sPhenotypes);
     }
 if (tg->subType == lfWithBarbs)
     {
     int dir = 0;
@@ -5228,9 +5227,9 @@
 	/* get description from rgdQtlLink table */
 	struct sqlConnection *conn = hAllocConn(database);
 	char cond_str[256];
 	char linkTable[256];
-	safef(linkTable, sizeof(linkTable), "%sLink", tg->mapName);
+	safef(linkTable, sizeof(linkTable), "%sLink", tg->table);
 	safef(cond_str, sizeof(cond_str), "name='%s'", tg->itemName(tg, bed));
         char *s = sqlGetField(database, linkTable, "description", cond_str);
 	hFreeConn(&conn);
 	if (s == NULL)
@@ -5258,14 +5257,14 @@
 	/* enable mouse over */
 	char *directUrl = trackDbSetting(tdb, "directUrl");
 	boolean withHgsid = (trackDbSetting(tdb, "hgsid") != NULL);
 	mapBoxHgcOrHgGene(hvg, bed->chromStart, bed->chromEnd, x1, y, x2 - x1,
-			  heightPer, tg->mapName, tg->mapItemName(tg, bed),
+			  heightPer, tg->track, tg->mapItemName(tg, bed),
 			  s, directUrl, withHgsid, NULL);
 	}
     }
 else
-    errAbort("No color for track %s in rgdQtlDrawAt.", tg->mapName);
+    errAbort("No color for track %s in rgdQtlDrawAt.", tg->track);
 }
 
 void rgdQtlMethods(struct track *tg)
 /* Fill in methods for rgdQtl track. */
@@ -5377,9 +5376,9 @@
 /* This converts the refSeq accession to a gene name where possible. */
 {
 struct linkedFeatures *lf;
 struct sqlConnection *conn = hAllocConn(database);
-boolean isNative = sameString(tg->mapName, "refGene");
+boolean isNative = sameString(tg->table, "refGene");
 boolean labelStarted = FALSE;
 boolean useGeneName = FALSE;
 boolean useAcc =  FALSE;
 boolean useMim =  FALSE;
@@ -5466,12 +5465,12 @@
 char *blastRef;
 char *buffer;
 char *table = NULL;
 
-safef(geneName, sizeof(geneName), "%s.geneLabel", tg->tdb->tableName);
-safef(accName, sizeof(accName), "%s.accLabel", tg->tdb->tableName);
-safef(sprotName, sizeof(sprotName), "%s.sprotLabel", tg->tdb->tableName);
-safef(posName, sizeof(posName), "%s.posLabel", tg->tdb->tableName);
+safef(geneName, sizeof(geneName), "%s.geneLabel", tg->tdb->track);
+safef(accName, sizeof(accName), "%s.accLabel", tg->tdb->track);
+safef(sprotName, sizeof(sprotName), "%s.sprotLabel", tg->tdb->track);
+safef(posName, sizeof(posName), "%s.posLabel", tg->tdb->track);
 useGene= cartUsualBoolean(cart, geneName, TRUE);
 useAcc= cartUsualBoolean(cart, accName, FALSE);
 useSprot= cartUsualBoolean(cart, sprotName, FALSE);
 usePos= cartUsualBoolean(cart, posName, FALSE);
@@ -5500,9 +5499,9 @@
 		buffer = needMem(strlen(lf->name) + 1);
 		strcpy(buffer, lf->name);
 		if ((char *)NULL != (ptr = strchr(buffer, '.')))
 		    *ptr = 0;
-		if (!startsWith("blastDm", tg->tdb->tableName))
+		if (!startsWith("blastDm", tg->tdb->track))
 		    safef(query, sizeof(query), "select geneId, refPos, extra1 from %s where acc = '%s'", blastRef, buffer);
 		else
 		    safef(query, sizeof(query), "select geneId, refPos from %s where acc = '%s'", blastRef, buffer);
 		sr = sqlGetResult(conn, query);
@@ -5566,9 +5565,9 @@
 void loadRefGene(struct track *tg)
 /* Load up RefSeq known genes. */
 {
 enum trackVisibility vis = tg->visibility;
-tg->items = lfFromGenePredInRange(tg, tg->mapName, chromName, winStart, winEnd);
+tg->items = lfFromGenePredInRange(tg, tg->table, chromName, winStart, winEnd);
 if (vis != tvDense)
     {
     lookupRefNames(tg);
     }
@@ -5590,9 +5589,9 @@
 
 if (baseColorGetDrawOpt(tg) > baseColorDrawOff)
     return tg->ixColor;
 
-safef(cMode, sizeof(cMode), "%s.cmode", tg->tdb->tableName);
+safef(cMode, sizeof(cMode), "%s.cmode", tg->tdb->track);
 colorMode = cartUsualInt(cart, cMode, 0);
 
 switch(colorMode)
     {
@@ -5766,9 +5765,9 @@
     {
     nonCodingTypeIncludeCart[i] = cartUsualBoolean(cart, nonCodingTypeIncludeStrings[i], nonCodingTypeIncludeDefault[i]);
     }
 /* Convert genePred in window to linked feature */
-tg->items = lfFromGenePredInRange(tg, tg->mapName, chromName, winStart, winEnd);
+tg->items = lfFromGenePredInRange(tg, tg->table, chromName, winStart, winEnd);
 /* filter items on selected criteria if filter is available */
 filterItems(tg, filterNonCoding, "include");
 }
 
@@ -5808,9 +5807,9 @@
 
 void ensGeneNonCodingMethods(struct track *tg)
 /* Make track of Ensembl predictions. */
 {
-tg->items = lfFromGenePredInRange(tg, tg->mapName, chromName, winStart, winEnd);
+tg->items = lfFromGenePredInRange(tg, tg->table, chromName, winStart, winEnd);
 tg->itemColor = ensGeneNonCodingColor;
 tg->loadItems = loadEnsGeneNonCoding;
 }
 
@@ -6019,9 +6018,9 @@
 {
 struct linkedFeatures *lf = item;
 char *name = cloneString(lf->name);
 char infoTable[128];
-safef(infoTable, sizeof(infoTable), "%sInfo", tg->mapName);
+safef(infoTable, sizeof(infoTable), "%sInfo", tg->table);
 if (hTableExists(database,  infoTable))
     {
     struct sqlConnection *conn = hAllocConn(database);
     char *symbol = NULL;
@@ -6119,18 +6118,18 @@
 static int scoreMinGrayLevel = 0;
 static int cartMinGrayLevel = 0; /* from cart, or trackDb setting */
 static float newScoreMin = 0;
 
-if (tdb->tableName != prevTrackName)
+if (tdb->track != prevTrackName)
     {
     scoreMinGrayLevel = scoreMin * maxShade/scoreMax;
     if (scoreMinGrayLevel <= 0)
         scoreMinGrayLevel = 1;
     char *setting = trackDbSettingClosestToHome(tdb, MIN_GRAY_LEVEL);
     cartMinGrayLevel = cartUsualIntClosestToHome(cart, tdb, FALSE, MIN_GRAY_LEVEL,
                                 setting ? atoi(setting) : scoreMinGrayLevel);
     newScoreMin = cartMinGrayLevel * scoreMax/maxShade;
-    prevTrackName = tdb->tableName;
+    prevTrackName = tdb->track;
     }
 if (cartMinGrayLevel != scoreMinGrayLevel)
     {
     float realScore = (float)(bed->score - scoreMin) / (scoreMax - scoreMin);
@@ -6235,9 +6234,9 @@
 	    Color textColor = hvGfxContrastingColor(hvg, color);
 	    hvGfxTextCentered(hvg, x1, y, w, heightPer, textColor, font, s);
 	    }
 	mapBoxHgcOrHgGene(hvg, bed->chromStart, bed->chromEnd, x1, y, x2 - x1, heightPer,
-                          tg->mapName, tg->mapItemName(tg, bed), NULL, directUrl, withHgsid, NULL);
+                          tg->track, tg->mapItemName(tg, bed), NULL, directUrl, withHgsid, NULL);
 	}
     }
 }
 #endif /* GBROWSE */
@@ -6318,9 +6317,9 @@
 
 tfbsConsSitesCutoff =
     sqlFloat(cartUsualString(cart,TFBS_SITES_CUTOFF,TFBS_SITES_CUTOFF_DEFAULT));
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     ro = tfbsConsSitesLoad(row+rowOffset);
     if (tfbsConsSitesWeightFilterItem(tg,ro,tfbsConsSitesCutoff))
@@ -6340,9 +6339,9 @@
 int rowOffset;
 char *lastName = NULL;
 struct tfbsCons *tfbs, *list = NULL;
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     tfbs = tfbsConsLoad(row+rowOffset);
     if ((lastName == NULL) || !sameString(lastName, tfbs->name))
@@ -6413,9 +6412,9 @@
     color = shadesOfGray[grayInRange(item->gcPpt, 340, 617)];
     if (w < 1)
 	w = 1;
     hvGfxBox(hvg, x1, y, w, heightPer, color);
-    mapBoxHc(hvg, item->chromStart, item->chromEnd, x1, y, w, heightPer, tg->mapName,
+    mapBoxHc(hvg, item->chromStart, item->chromEnd, x1, y, w, heightPer, tg->track,
 	item->name, item->name);
     if (isFull)
 	y += lineHeight;
     }
@@ -6712,9 +6711,9 @@
 
 static void loadSimpleNucDiff(struct track *tg)
 /* Load up simple diffs from database table to track items. */
 {
-bedLoadItem(tg, tg->mapName, (ItemLoader)simpleNucDiffLoad);
+bedLoadItem(tg, tg->table, (ItemLoader)simpleNucDiffLoad);
 }
 
 static char *simpleNucDiffName(struct track *tg, void *item)
 /* Return name of simpleDiff item. */
@@ -6755,9 +6754,9 @@
 
 void loadSimpleRepeats(struct track *tg)
 /* Load up simpleRepeats from database table to track items. */
 {
-bedLoadItem(tg, tg->mapName, (ItemLoader)simpleRepeatLoad);
+bedLoadItem(tg, tg->table, (ItemLoader)simpleRepeatLoad);
 }
 
 void freeSimpleRepeats(struct track *tg)
 /* Free up isochore items. */
@@ -6782,9 +6781,9 @@
 
 void loadCpgIsland(struct track *tg)
 /* Load up simpleRepeats from database table to track items. */
 {
-bedLoadItem(tg, tg->mapName, (ItemLoader)cpgIslandLoad);
+bedLoadItem(tg, tg->table, (ItemLoader)cpgIslandLoad);
 }
 
 void freeCpgIsland(struct track *tg)
 /* Free up isochore items. */
@@ -6829,9 +6828,9 @@
 char **row;
 struct gcPercent *itemList = NULL, *item;
 char query[256];
 
-sprintf(query, "select * from %s where chrom = '%s' and chromStart<%u and chromEnd>%u", tg->mapName,
+sprintf(query, "select * from %s where chrom = '%s' and chromStart<%u and chromEnd>%u", tg->table,
     chromName, winEnd, winStart);
 
 /* Get the frags and load into tg->items. */
 sr = sqlGetResult(conn, query);
@@ -7356,9 +7355,9 @@
 void xenoMrnaMethods(struct track *tg)
 /* Fill in custom parts of xeno mrna alignments. */
 {
 tg->itemName = xenoMrnaName;
-tg->extraUiData = newMrnaUiData(tg->mapName, TRUE);
+tg->extraUiData = newMrnaUiData(tg->track, TRUE);
 tg->totalHeight = tgFixedTotalHeightUsingOverflow;
 }
 
 void xenoRefGeneMethods(struct track *tg)
@@ -7372,9 +7371,9 @@
 
 void mrnaMethods(struct track *tg)
 /* Make track of mRNA methods. */
 {
-tg->extraUiData = newMrnaUiData(tg->mapName, FALSE);
+tg->extraUiData = newMrnaUiData(tg->track, FALSE);
 }
 
 char *interProName(struct track *tg, void *item)
 {
@@ -7399,9 +7398,9 @@
 void estMethods(struct track *tg)
 /* Make track of EST methods - overrides color handler. */
 {
 tg->drawItems = linkedFeaturesAverageDenseOrientEst;
-tg->extraUiData = newMrnaUiData(tg->mapName, FALSE);
+tg->extraUiData = newMrnaUiData(tg->track, FALSE);
 tg->totalHeight = tgFixedTotalHeightUsingOverflow;
 }
 #endif /* GBROWSE */
 
@@ -8093,9 +8092,9 @@
 }
 
 void loadSynteny(struct track *tg)
 {
-bedLoadItem(tg, tg->mapName, (ItemLoader)synteny100000Load);
+bedLoadItem(tg, tg->table, (ItemLoader)synteny100000Load);
 slSort(&tg->items, bedCmp);
 }
 
 void freeSynteny(struct track *tg)
@@ -8140,9 +8139,9 @@
 char *optionStr ;
 tg->loadItems = loadMouseOrtho;
 tg->freeItems = freeMouseOrtho;
 
-safef( option, sizeof(option), "%s.color", tg->mapName);
+safef( option, sizeof(option), "%s.color", tg->track);
 optionStr = cartUsualString(cart, option, "on");
 if( sameString( optionStr, "on" )) /*use anti-aliasing*/
     tg->itemColor = mouseOrthoItemColor;
 else
@@ -8187,9 +8186,9 @@
 char *optionStr ;
 tg->loadItems = loadHumanParalog;
 tg->freeItems = freeHumanParalog;
 
-safef( option, sizeof(option), "%s.color", tg->mapName);
+safef( option, sizeof(option), "%s.color", tg->track);
 optionStr = cartUsualString(cart, option, "on");
 if( sameString( optionStr, "on" )) /*use anti-aliasing*/
     tg->itemColor = humanParalogItemColor;
 else
@@ -8349,9 +8348,9 @@
 struct ensPhusionBlast *epb;
 char *ptr;
 char buf[16];
 
-bedLoadItem(tg, tg->mapName, (ItemLoader)ensPhusionBlastLoad);
+bedLoadItem(tg, tg->table, (ItemLoader)ensPhusionBlastLoad);
 // for name, append abbreviated starting position to the xeno chrom:
 for (epb=tg->items;  epb != NULL;  epb=epb->next)
     {
     ptr = strchr(epb->name, '.');
@@ -8412,9 +8411,9 @@
 struct bactigPos *bactigList = NULL, *bactig;
 int rowOffset;
 
 /* Get the bactigs and load into tg->items. */
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd,
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,
 		 NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     bactig = bactigPosLoad(row+rowOffset);
@@ -8936,9 +8935,9 @@
 
 static struct trackDb *rGetTdbNamed(struct trackDb *tdb, char *name)
 /* Return tdb of given name in self or children. */
 {
-if (sameString(name, tdb->tableName))
+if (sameString(name, tdb->track))
     return tdb;
 struct trackDb *child;
 for (child = tdb->subtracks; child != NULL; child = child->next)
     {
@@ -8952,12 +8951,12 @@
 static struct trackDb *getSubtrackTdb(struct track *subtrack)
 /* If subtrack->tdb is actually the composite tdb, return the tdb for
  * the subtrack so we can see its settings. */
 {
-struct trackDb *subTdb = rGetTdbNamed(subtrack->tdb, subtrack->mapName);
+struct trackDb *subTdb = rGetTdbNamed(subtrack->tdb, subtrack->track);
 if (subTdb == NULL)
     errAbort("Can't find tdb for subtrack %s -- was getSubtrackTdb called on "
-	     "non-subtrack?", subtrack->mapName);
+	     "non-subtrack?", subtrack->track);
 return subTdb;
 }
 
 static bool subtrackEnabledInTdb(struct track *subtrack)
@@ -8985,9 +8984,9 @@
 if (subtrack->limitedVisSet && subtrack->limitedVis == tvHide)
     return FALSE;
 bool enabledInTdb = subtrackEnabledInTdb(subtrack);
 char option[SMALLBUF];
-safef(option, sizeof(option), "%s_sel", subtrack->mapName);
+safef(option, sizeof(option), "%s_sel", subtrack->track);
 boolean enabled = cartUsualBoolean(cart, option, enabledInTdb);
 /* Remove redundant cart settings to avoid cart bloat. */
 if (enabled == enabledInTdb)
     {
@@ -9085,9 +9084,9 @@
 struct sqlResult *sr;
 char **row;
 int rowOffset;
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     bed = bedLoadN(row+rowOffset, 15);
     slAddHead(&list, bed);
@@ -9418,9 +9417,9 @@
 /* Load up pgSnp (personal genome SNP) type tracks */
 {
 char query[256];
 struct sqlConnection *conn = hAllocConn(database);
-safef(query, sizeof(query), "select * from %s where chrom = '%s' and chromStart < %d and chromEnd > %d", tg->mapName, chromName, winEnd, winStart);
+safef(query, sizeof(query), "select * from %s where chrom = '%s' and chromStart < %d and chromEnd > %d", tg->table, chromName, winEnd, winStart);
 tg->items = pgSnpLoadByQuery(conn, query);
 /* base coloring/display decision on count of items */
 tg->customInt = slCount(tg->items);
 hFreeConn(&conn);
@@ -9450,9 +9449,9 @@
     if (sameString(el->alleleFreq, "") || sameString(freq[i], "0"))
         freq[i] = "?";
     dyStringPrintf(ds, "%s:%s ", all[i], freq[i]);
     }
-mapBoxHgcOrHgGene(hvg, start, end, x, y, width, height, tg->mapName,
+mapBoxHgcOrHgGene(hvg, start, end, x, y, width, height, tg->track,
                   mapItemName, ds->string, directUrl, withHgsid, NULL);
 freeDyString(&ds);
 }
 
@@ -9579,19 +9578,19 @@
 char **row;
 int rowOffset;
 struct bed *bed;
 struct linkedFeaturesSeries *lfsList = NULL, *lfs;
-/* Use tg->tdb->tableName because subtracks inherit composite track's tdb
+/* Use tg->tdb->track because subtracks inherit composite track's tdb
  * by default, and the variable is named after the composite track. */
 char *scoreFilterClause = getScoreFilterClause(cart, tg->tdb,NULL);
 if (scoreFilterClause != NULL)
     {
-    sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd,scoreFilterClause, &rowOffset);
+    sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,scoreFilterClause, &rowOffset);
     freeMem(scoreFilterClause);
     }
 else
     {
-    sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
+    sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset);
     }
 while ((row = sqlNextRow(sr)) != NULL)
     {
     bed = bedLoadN(row+rowOffset, 14);
@@ -9668,16 +9667,16 @@
 struct linkedFeatures *lf = item;
 struct sqlConnection *conn = hAllocConn(database);
 char query[512];
 safef(query, sizeof(query), "select pubmedId from %s where name = '%s'",
-      tg->tdb->tableName, lf->name);
+      tg->tdb->table, lf->name);
 char buf[32];
 char *pmId = sqlQuickQuery(conn, query, buf, sizeof(buf));
 hFreeConn(&conn);
 if (filterPmIds == NULL)
     {
     char cartVarName[256];
-    safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterPmId", tg->tdb->tableName);
+    safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterPmId", tg->tdb->track);
     filterPmIds = cartOptionalSlNameList(cart, cartVarName);
     }
 return slNameInList(filterPmIds, pmId);
 }
@@ -9686,11 +9685,11 @@
 /* Load Database of Genomic Variants items, filtering by pubmedId if specified. */
 {
 loadBed9(tg);
 char cartVarName[256];
-safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterType", tg->tdb->tableName);
+safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterType", tg->tdb->track);
 char *incOrExc = cartUsualString(cart, cartVarName, NULL);
-safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterPmId", tg->tdb->tableName);
+safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterPmId", tg->tdb->track);
 struct slName *filterPmIds = cartOptionalSlNameList(cart, cartVarName);
 if (isNotEmpty(incOrExc) && filterPmIds != NULL)
     filterItems(tg, dgvFilter, incOrExc);
 }
@@ -9704,9 +9703,9 @@
 
 void loadGenePred(struct track *tg)
 /* Convert gene pred in window to linked feature. */
 {
-tg->items = lfFromGenePredInRange(tg, tg->mapName, chromName, winStart, winEnd);
+tg->items = lfFromGenePredInRange(tg, tg->table, chromName, winStart, winEnd);
 /* filter items on selected criteria if filter is available */
 filterItems(tg, genePredClassFilter, "include");
 }
 
@@ -9771,9 +9770,9 @@
 char *sep = ",";
 
 if (geneClasses == NULL)
    errAbort(
-      "Track %s missing required trackDb setting: geneClasses", tg->mapName);
+      "Track %s missing required trackDb setting: geneClasses", tg->track);
 if (geneClasses)
    {
    gClassesClone = cloneString(geneClasses);
    classCt = chopLine(gClassesClone, classes);
@@ -9856,9 +9855,9 @@
 
 static void gencodeIntronLoadItems(struct track *tg)
 /* Load up track items. */
 {
-bedLoadItem(tg, tg->mapName, (ItemLoader)gencodeIntronLoad);
+bedLoadItem(tg, tg->table, (ItemLoader)gencodeIntronLoad);
 }
 
 static void gencodeIntronMethods(struct track *tg)
 /* Load up custom methods for ENCODE Gencode intron validation track */
@@ -9889,9 +9888,9 @@
 struct sqlResult *sr;
 char **row;
 int rowOffset;
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd,
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,
                  NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     dless = dlessLoad(row+rowOffset);
@@ -10198,9 +10197,9 @@
 Color omiciaColor(struct track *tg, void *item, struct hvGfx *hvg)
 /* color by confidence score */
 {
 struct bed *el = item;
-if (sameString(tg->mapName, "omiciaHand"))
+if (sameString(tg->table, "omiciaHand"))
     return hvGfxFindColorIx(hvg, 0, 0, 0);
 else if (el->score < 200)
     return MG_BLACK;
 else if (el->score < 600)
@@ -10247,9 +10246,9 @@
 struct sqlResult *sr;
 char **row;
 int rowOffset;
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     el = protVarPosLoad(row);
     slAddHead(&list, el);
@@ -10437,9 +10436,9 @@
 struct sqlResult *sr = NULL;
 char **row = NULL;
 int rowOffset = 0;
 
-sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd,
+sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,
                  NULL, &rowOffset);
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct bed12Source *el = bed12SourceLoad(row+rowOffset);
@@ -10594,9 +10593,9 @@
 	return;
 
 conn = hAllocConn(database);
 safef(query, sizeof(query),
-	"select offset,fileName from %s where chrom = '%s'", tg->mapName,chromName);
+	"select offset,fileName from %s where chrom = '%s'", tg->table,chromName);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) != NULL)
     {
     offset = sqlLongLong(row[0]);
@@ -10769,9 +10768,9 @@
     }
 else if (sameWord(type, "axt"))
     {
     if (wordCount < 2)
-        errAbort("Expecting 2 words in axt track type for %s", tdb->tableName);
+        errAbort("Expecting 2 words in axt track type for %s", tdb->track);
     axtMethods(track, words[1]);
     }
 else if (sameWord(type, "expRatio"))
     {
@@ -10835,9 +10834,9 @@
 	( limitedVisFromComposite(subtrack) != tvHide))
 	{
 	lastTime = clock1000();
 	if (!subtrack->loadItems) // This could happen if track type has no handler (eg, for new types)
-	    errAbort("Error: No loadItems() handler for subtrack (%s) of composite track (%s) (is this a new track 'type'?)\n", subtrack->mapName, track->mapName);
+	    errAbort("Error: No loadItems() handler for subtrack (%s) of composite track (%s) (is this a new track 'type'?)\n", subtrack->track, track->track);
         subtrack->loadItems(subtrack);
 	if (measureTiming)
 	    {
 	    thisTime = clock1000();
@@ -10913,9 +10912,9 @@
     (compositeTrack != NULL && rStringIn("smart", compositeTrack)))
         smart = TRUE;
 
 /* setup function handlers for composite track */
-handler = lookupTrackHandler(tdb->tableName);
+handler = lookupTrackHandler(tdb->table);
 if (smart && handler != NULL)
     /* handles it's own load and height */
     handler(track);
 else
@@ -10948,21 +10947,22 @@
 	 * edits to trackDb.ra files - that is putting in an explicit setting when you want
 	 * this behavior rather than relying on absence of an overloaded setting. */
 	subtrack = trackFromTrackDb(tdb);
 	subtrack->tdb = subTdb;
-	handler = lookupTrackHandler(tdb->tableName);
+	handler = lookupTrackHandler(tdb->table);
 	}
     else
 	{
 	subtrack = trackFromTrackDb(subTdb);
-	handler = lookupTrackHandler(subTdb->tableName);
+	handler = lookupTrackHandler(subTdb->table);
 	}
     if (handler != NULL)
         handler(subtrack);
 
     /* Add subtrack settings (table, colors, labels, vis & pri).  This is only
      * needed in the "not noInherit" case that hopefully will go away soon. */
-    subtrack->mapName = subTdb->tableName;
+    subtrack->track = subTdb->track;
+    subtrack->table = subTdb->table;
     subtrack->shortLabel = subTdb->shortLabel;
     subtrack->longLabel = subTdb->longLabel;
     subtrack->priority = subTdb->priority;
 
@@ -11002,9 +11002,10 @@
 
 if (!tdb)
     return NULL;
 track = trackNew();
-track->mapName = cloneString(tdb->tableName);
+track->track = cloneString(tdb->track);
+track->table = cloneString(tdb->table);
 track->visibility = tdb->visibility;
 track->shortLabel = cloneString(tdb->shortLabel);
 track->longLabel = cloneString(tdb->longLabel);
 track->color.r = tdb->colorR;
@@ -11017,9 +11018,9 @@
 track->heightPer = track->lineHeight - 1;
 track->private = tdb->private;
 track->defaultPriority = tdb->priority;
 char lookUpName[256];
-safef(lookUpName, sizeof(lookUpName), "%s.priority", tdb->tableName);
+safef(lookUpName, sizeof(lookUpName), "%s.priority", tdb->track);
 tdb->priority = cartUsualDouble(cart, lookUpName, tdb->priority);
 track->priority = tdb->priority;
 track->groupName = cloneString(tdb->grp);
 /* save default priority and group so we can reset it later */