36650b61875fa047f2c9ebc3657d1a9d10ec77e6
braney
  Fri Nov 12 14:42:17 2021 -0800
Give developers a way to map sequence names to labels in maf display refs #28495

diff --git src/hg/hgTracks/wigMafTrack.c src/hg/hgTracks/wigMafTrack.c
index b76564c..e822295 100644
--- src/hg/hgTracks/wigMafTrack.c
+++ src/hg/hgTracks/wigMafTrack.c
@@ -78,50 +78,59 @@
 {
 struct wigMafItem *mi = (struct wigMafItem *)item;
 if (sameString(mi->name, GAP_ITEM_LABEL))
     return getOrangeColor();
 return (((struct wigMafItem *)item)->group % 2 ?
                         tg->ixAltColor : tg->ixColor);
 }
 
 static struct mafAli *wigMafLoadInRegion(struct sqlConnection *conn,
     struct sqlConnection *conn2, char *table, char *chrom, int start, int end, char *file)
 /* Load mafs from region */
 {
     return mafLoadInRegion2(conn, conn2, table, chrom, start, end, file);
 }
 
-static struct wigMafItem *newMafItem(char *s, int g, boolean lowerFirstChar)
+static struct wigMafItem *newMafItem(char *s, int g, boolean lowerFirstChar, struct hash *labelHash)
 /* Allocate and initialize a maf item. Species param can be a db or name */
 {
 struct wigMafItem *mi;
 char *val;
 
 AllocVar(mi);
+if (labelHash)
+    {
+    mi->db = cloneString(hubConnectSkipHubPrefix(s));
+    mi->name = hashFindVal(labelHash, mi->db);
+    }
+
+if (mi->name == NULL)
+    {
     if ((val = hGenome(s)) != NULL)
         {
         /* it's a database name */
         mi->db = cloneString(hubConnectSkipHubPrefix(s));
         mi->name = val;
         }
     else
         {
         mi->db = cloneString(s);
         mi->name = cloneString(s);
         }
+    }
 mi->name = hgDirForOrg(mi->name);
-if (lowerFirstChar)
+if (lowerFirstChar && labelHash == NULL )
     *mi->name = tolower(*mi->name);
 mi->height = tl.fontHeight;
 mi->group = g;
 return mi;
 }
 
 struct wigMafItem *getSpeciesFromMaf(struct track *track, int height)
 {
 struct wigMafItem *mi = NULL, *miList = NULL;
 struct hash *hash = newHash(8);	/* keyed by database. */
 struct mafPriv *mp = getMafPriv(track);
 struct mafAli *maf;
 char buf[64];
 char *otherOrganism;
 
@@ -160,41 +169,42 @@
 char *species[MAX_SP_SIZE];
 char *groups[20];
 char *defaultOff[MAX_SP_SIZE];
 char sGroup[MAX_SP_SIZE];
 int group;
 int i;
 int speciesCt = 0, groupCt = 1;
 int speciesOffCt = 0;
 struct hash *speciesOffHash = newHash(0);
 char *speciesUseFile = trackDbSetting(track->tdb, SPECIES_USE_FILE);
 
 /* either speciesOrder or speciesGroup is specified in trackDb */
 char *speciesOrder = trackDbSetting(track->tdb, SPECIES_ORDER_VAR);
 char *speciesGroup = trackDbSetting(track->tdb, SPECIES_GROUP_VAR);
 char *speciesOff = trackDbSetting(track->tdb, SPECIES_DEFAULT_OFF_VAR);
+struct hash *labelHash = mafGetLabelHash(track->tdb);
 
 bool lowerFirstChar = TRUE;
 char *firstCase;
 
 firstCase = trackDbSetting(track->tdb, ITEM_FIRST_CHAR_CASE);
 if (firstCase != NULL)
     {
     if (sameWord(firstCase, "noChange")) lowerFirstChar = FALSE;
     }
 
-if (speciesOrder == NULL && speciesGroup == NULL && speciesUseFile == NULL)
+if (speciesOrder == NULL && speciesGroup == NULL && speciesUseFile == NULL && labelHash == NULL)
     return getSpeciesFromMaf(track, height);
 
 if (speciesGroup)
     groupCt = chopLine(cloneString(speciesGroup), groups);
 
 if (speciesUseFile)
     {
     if ((speciesGroup != NULL) || (speciesOrder != NULL))
 	errAbort("Can't specify speciesUseFile and speciesGroup or speciesOrder");
     speciesOrder = cartGetOrderFromFile(database, cart, speciesUseFile);
     speciesOff = NULL;
     }
 
 /* keep track of species configured off initially for track */
 if (speciesOff)
@@ -210,31 +220,31 @@
 for (group = 0; group < groupCt; group++)
     {
     if (groupCt != 1 || !speciesOrder)
         {
         safef(sGroup, sizeof sGroup, "%s%s",
                                 SPECIES_GROUP_PREFIX, groups[group]);
         speciesOrder = trackDbRequiredSetting(track->tdb, sGroup);
         }
     speciesCt = chopLine(cloneString(speciesOrder), species);
     for (i = 0; i < speciesCt; i++)
         {
 	boolean defaultOn = (hashLookup(speciesOffHash, species[i]) == NULL);
 
 	if (cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, species[i],defaultOn))
 	    {
-	    mi = newMafItem(species[i], group, lowerFirstChar);
+	    mi = newMafItem(species[i], group, lowerFirstChar, labelHash);
 	    mi->height = height;
 	    slAddHead(&miList, mi);
 	    }
         }
     }
 
 return miList;
 }
 
 static struct wigMafItem *scoreItem(int scoreHeight, char *label)
 /* Make up item that will show the score */
 {
 struct wigMafItem *mi;
 
 AllocVar(mi);
@@ -328,57 +338,59 @@
 static struct wigMafItem *loadBaseByBaseItems(struct track *track)
 /* Make up base-by-base track items. */
 {
 struct wigMafItem *miList = NULL, *speciesList = NULL, *mi;
 int scoreHeight = 0;
 
 bool lowerFirstChar = TRUE;
 char *firstCase;
 
 firstCase = trackDbSetting(track->tdb, ITEM_FIRST_CHAR_CASE);
 if (firstCase != NULL)
     {
     if (sameWord(firstCase, "noChange")) lowerFirstChar = FALSE;
     }
 
+struct hash *labelHash = mafGetLabelHash(track->tdb);
+
 loadMafsToTrack(track);
 
 /* NOTE: we are building up the item list backwards */
 
 /* Add items for conservation wiggles */
 struct track *wigTrack = track->subtracks;
 if (wigTrack)
     {
     enum trackVisibility wigVis = (wigTrack->limitedVis == tvDense ? tvDense : tvFull);
     while (wigTrack !=  NULL)
         {
         scoreHeight = wigTotalHeight(wigTrack, wigVis);
         mi = scoreItem(scoreHeight, wigTrack->shortLabel);
         slAddHead(&miList, mi);
         wigTrack = wigTrack->next;
         }
     }
 
 /* Make up item that will show gaps in this organism. */
 AllocVar(mi);
 
 mi->name = GAP_ITEM_LABEL;
 mi->height = tl.fontHeight;
 slAddHead(&miList, mi);
 
 /* Make up item for this organism. */
-mi = newMafItem(database, 0, lowerFirstChar);
+mi = newMafItem(database, 0, lowerFirstChar, labelHash);
 slAddHead(&miList, mi);
 speciesList = newSpeciesItems(track, tl.fontHeight);
 /* Make items for other species */
 miList = slCat(speciesList, miList);
 
 slReverse(&miList);
 return miList;
 }
 
 static char *summarySetting(struct track *track)
 /* Return the setting for the MAF summary table
  * or NULL if none set  */
 {
 return trackDbSetting(track->tdb, SUMMARY_VAR);
 }