f42aedac7eaf850e2df8200dfbded43936b9dc76
braney
  Thu Apr 8 14:34:25 2021 -0700
fix chain click-throughs from assembly hubs to native assemblies and
vice-versa

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 28ec94c..0be7d1d 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -49,30 +49,31 @@
 #include "htmshell.h"
 #include "bigBedFind.h"
 #include "customComposite.h"
 #include "interactUi.h"
 #include "bedTabix.h"
 #include "hic.h"
 #include "hui.h"
 #include "chromAlias.h"
 
 #ifdef USE_HAL
 #include "halBlockViz.h"
 #endif
 
 static struct hash *hubCladeHash;  // mapping of clade name to hub pointer
 static struct hash *hubAssemblyHash; // mapping of assembly name to genome struct
+static struct hash *hubAssemblyUndecoratedHash; // mapping of undecorated assembly name to genome struct
 static struct hash *hubOrgHash;   // mapping from organism name to hub pointer
 static struct trackHub *globalAssemblyHubList; // list of trackHubs in the user's cart
 static struct hash *trackHubHash;
 
 char *trackHubRelativeUrl(char *hubUrl, char *path)
 /* Return full path (in URL form if it's a remote hub) given
  * path possibly relative to hubUrl. Do a freeMem of result
  * when done. */
 {
 /* If path itself is a URL then just return a copy of it. */
 if (hasProtocol(path))
     return cloneString(path);
 
 /* If it's a remote hub, let html path expander handle it. */
 if (hasProtocol(hubUrl))
@@ -94,31 +95,46 @@
 /* Given a track hub clade(hub name) return the default genome. */
 {
 if (hubCladeHash == NULL)
     return FALSE;
 struct hashEl *hel = hashLookup(hubCladeHash, clade);
 if (hel == NULL)
     return FALSE;
 struct trackHub *trackHub = hel->val;
 struct trackHubGenome *hubGenome = trackHub->genomeList;
 for(; hubGenome; hubGenome=hubGenome->next)
     if (hubGenome->twoBitPath != NULL)
 	return hubGenome->organism ;
 return NULL;
 }
 
+struct trackHubGenome *trackHubGetGenomeUndecorated(char *database)
+/* Get the genome structure for an undecorated genome name. */
+{
+if (hubAssemblyUndecoratedHash == NULL)
+    return NULL;
+
+struct hashEl *hel = hashLookup(hubAssemblyUndecoratedHash, database);
+
+if (hel == NULL)
+    return NULL;
+
+return (struct trackHubGenome *)hel->val;
+}
+
 struct trackHubGenome *trackHubGetGenome(char *database)
+/* get genome structure for an assembly in a trackHub */
 {
 if (hubAssemblyHash == NULL)
     errAbort("requesting hub genome with no hubs loaded");
 
 struct hashEl *hel = hashLookup(hubAssemblyHash, database);
 
 if (hel == NULL)
     return NULL;
 
 return (struct trackHubGenome *)hel->val;
 }
 
 boolean trackHubDatabase(char *database)
 /* Is this an assembly from an Assembly Data hub? */
 {
@@ -607,30 +623,35 @@
     hashAdd(hubCladeHash, hub->name, hub);
     slAddHead(&globalAssemblyHubList, hub);
     }
 
 if (hubOrgHash == NULL)
     hubOrgHash = newHash(5);
 if ((hel = hashLookup(hubOrgHash, genome->organism)) == NULL)
     {
     hashAdd(hubOrgHash, genome->organism, hub);
     }
 
 if (hubAssemblyHash == NULL)
     hubAssemblyHash = newHash(5);
 if ((hel = hashLookup(hubAssemblyHash, genome->name)) == NULL)
     hashAdd(hubAssemblyHash, genome->name, genome);
+
+if (hubAssemblyUndecoratedHash == NULL)
+    hubAssemblyUndecoratedHash = newHash(5);
+if ((hel = hashLookup(hubAssemblyUndecoratedHash, trackHubSkipHubName(genome->name))) == NULL)
+    hashAdd(hubAssemblyUndecoratedHash, trackHubSkipHubName(genome->name), genome);
 }
 
 static char *addHubName(char *base, char *hubName)
 {
 if (base == NULL)
     return NULL;
 
 char buffer[4096];
 
 if (isNotEmpty(hubName))
     safef(buffer, sizeof(buffer), "%s_%s", hubName, base);
 else
     safef(buffer, sizeof(buffer), "%s", base);
 
 return cloneString(buffer);