7ada5bd6ec329c0f5540573f11ae809ad1c33db0
hiram
  Thu Mar 20 14:59:29 2014 -0700
allow selection of gene name to display on ensGene tracks refs #12870
diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 2271ac5..01bd7c2 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -10073,30 +10073,100 @@
 void dgvMethods(struct track *tg)
 /* Database of Genomic Variants. */
 {
 linkedFeaturesMethods(tg);
 tg->loadItems = loadDgv;
 }
 
 void loadGenePred(struct track *tg)
 /* Convert gene pred in window to linked feature. */
 {
 tg->items = lfFromGenePredInRange(tg, tg->table, chromName, winStart, winEnd);
 /* filter items on selected criteria if filter is available */
 filterItems(tg, genePredClassFilter, "include");
 }
 
+static char *ensGeneName(struct track *tg, void *item)
+{
+static char cat[128];
+struct linkedFeatures *lf = item;
+if (lf->extra != NULL)
+    {
+    safef(cat, sizeof(cat), "%s", (char *)lf->extra);
+    return cat;
+    }
+else
+    return lf->name;
+}
+
+static void ensGeneAssignConfiguredName(struct track *tg)
+/* Set name on genePred in "extra" field to gene name, accession, or both,
+ * depending, on UI on all items in track */
+{
+char *geneLabel = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "label","accession");
+boolean otherGeneName =  sameString(geneLabel, "gene");
+boolean useGeneName =  sameString(geneLabel, "ensembl");
+boolean useAcc = sameString(geneLabel, "accession");
+struct sqlConnection *conn = NULL;
+if (otherGeneName)
+   conn = hAllocConn(database);
+
+struct linkedFeatures *lf;
+for (lf = tg->items; lf != NULL; lf = lf->next)
+    {
+    struct dyString *name = dyStringNew(SMALLDYBUF);
+    if (otherGeneName)
+        {
+        char buf[256];
+        char query[256];
+        sqlSafef(query, sizeof(query),
+          "select value from ensemblToGeneName where name = \"%s\"", lf->name);
+        char *ret = sqlQuickQuery(conn, query, buf, sizeof(buf));
+        if (isNotEmpty(ret))
+            dyStringAppend(name, ret);
+        else
+            dyStringAppend(name, lf->name);
+        }
+    else if (useGeneName)
+        {
+        if (isNotEmpty((char*)lf->extra))
+            dyStringAppend(name, lf->extra);
+        else
+            dyStringAppend(name, lf->name);
+        }
+    else if (useAcc)
+        {
+        dyStringAppend(name, lf->name);
+        }
+    else
+        lf->extra = NULL;
+    if (dyStringLen(name))
+        lf->extra = dyStringCannibalize(&name);
+    dyStringFree(&name);
+    }
+if (otherGeneName)
+    hFreeConn(&conn);
+}
+
+static void loadGenePredEnsGene(struct track *tg)
+/* Convert gene pred in window to linked feature. */
+{
+loadGenePredWithName2(tg);
+ensGeneAssignConfiguredName(tg);
+tg->itemName = ensGeneName;
+}
+
 void genePredAssignConfiguredName(struct track *tg)
 /* Set name on genePred in "extra" field to gene name, accession, or both,
  * depending, on UI on all items in track */
 {
 char *geneLabel = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "label","gene");
 boolean useGeneName =  sameString(geneLabel, "gene")
     || sameString(geneLabel, "name")
     || sameString(geneLabel, "both");
 boolean useAcc = sameString(geneLabel, "accession") || sameString(geneLabel, "both");
 
 struct linkedFeatures *lf;
 for (lf = tg->items; lf != NULL; lf = lf->next)
     {
     struct dyString *name = dyStringNew(SMALLDYBUF);
     if (useGeneName && !isEmpty((char*)lf->extra))
@@ -12144,30 +12214,33 @@
     {
     wigMethods(track, tdb, wordCount, words);
     }
 else if (startsWith("wigMaf", type))
     {
     wigMafMethods(track, tdb, wordCount, words);
     }
 #ifndef GBROWSE
 else if (sameWord(type, "sample"))
     {
     sampleMethods(track, tdb, wordCount, words);
     }
 else if (sameWord(type, "genePred"))
     {
     linkedFeaturesMethods(track);
+    if (startsWith("ensGene", track->track))
+        track->loadItems = loadGenePredEnsGene;
+    else
         track->loadItems = loadGenePred;
     track->colorShades = NULL;
     if (track->itemAttrTbl != NULL)
         track->itemColor = genePredItemAttrColor;
     else if (trackDbSetting(track->tdb, GENEPRED_CLASS_TBL) !=NULL)
         track->itemColor = genePredItemClassColor;
     }
 else if (sameWord(type, "logo"))
     {
     logoMethods(track, tdb, wordCount, words);
     }
 #endif /* GBROWSE */
 else if (sameWord(type, "psl"))
     {
     pslMethods(track, tdb, wordCount, words);