88485cfa7f13affa28ec5765fe9b2db90cce42b6
markd
  Tue Dec 8 21:02:15 2020 -0800
hgPcr working

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index e06488c..9661ca0 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -116,30 +116,37 @@
 if (hel == NULL)
     return NULL;
 
 return (struct trackHubGenome *)hel->val;
 }
 
 boolean trackHubDatabase(char *database)
 /* Is this an assembly from an Assembly Data hub? */
 {
 if (hubAssemblyHash == NULL)
     return FALSE;
 
 return trackHubGetGenome(database) != NULL;
 }
 
+char *trackHubDatabaseToGenome(char *db)
+/* get a database name that is either a genome database or a trackHub
+ * database, return the genome assembly */
+{
+return trackHubDatabase(db) ? trackHubAssemblyField(db, "genome") : db;
+}
+
 char *trackHubAssemblyField(char *database, char *field)
 /* Get data field from a assembly data hub. */
 {
 struct trackHubGenome *genome = trackHubGetGenome(database);
 
 if (genome == NULL)
     return NULL;
 
 char *ret = hashFindVal(genome->settingsHash, field);
 
 return cloneString(ret);
 }
 
 static struct dbDb *makeDbDbFromAssemblyGenome(struct trackHubGenome *hubGenome)
 /* Make a dbdb struture from a single assembly hub database. */
@@ -1299,84 +1306,69 @@
 void trackHubFindPos(struct cart *cart, char *db, char *term, struct hgPositions *hgp)
 /* Look for term in track hubs.  Update hgp if found */
 {
 struct trackDb *tdbList = NULL;
 if (trackHubDatabase(db))
     {
     struct trackHubGenome *genome = trackHubGetGenome(db);
     tdbList = trackHubTracksForGenome(genome->trackHub, genome);
     }
 else
     tdbList = hubCollectTracks(db, NULL);
 
 findBigBedPosInTdbList(cart, db, tdbList, term, hgp, NULL);
 }
 
-boolean trackHubGetPcrParams(char *database, char **pHost, char **pPort)
-/* Get the isPcr params from a trackHub genome. */
-{
-char *hostPort;
-
-hostPort = trackHubAssemblyField(database, "isPcr");
-
-if (hostPort == NULL)
-    return FALSE;
-   
-hostPort = cloneString(hostPort);
-
-*pHost = nextWord(&hostPort);
-if (hostPort == NULL)
-    return FALSE;
-*pPort = hostPort;
-
-return TRUE;
-}
-
-boolean trackHubGetBlatParams(char *database, boolean isTrans, char **pHost, char **pPort, char **pGenomeDataDir)
-{
-char *setting;
-
-if (isTrans)
+static void parseBlatPcrParams(char *database, char *type, char *setting,
+                               char **pHost, char **pPort, char **pGenomeDataDir)
+/* parser parameters for either blat or pcr */
 {
-    setting = trackHubAssemblyField(database, "transBlat");
-    }
-else
-    {
-    setting = trackHubAssemblyField(database, "blat");
-    }
-
-if (setting == NULL)
-    return FALSE;
-   
 char *conf = trimSpaces(cloneString(setting));
 int numWords = chopByWhite(conf, NULL, 5);
 if ((numWords < 2) || (numWords > 4))
-    errAbort("invalid configuration for hub BLAT server, expect 2 or 4 arguments: %s", setting);
+    errAbort("invalid configuration for hub %s server, expect 2 or 4 arguments: %s", type, setting);
 char *words[4];
 chopByWhite(conf, words, numWords);
 
 *pHost = words[0];
 *pPort = words[1];
 if (numWords > 2)
     {
     if (!sameString(words[2], "dynamic"))
-        errAbort("invalid configuration for hub BLAT server, third argument should be 'dynamic' or omitted, got: %s", words[2]);
+        errAbort("invalid configuration for hub %s server, third argument should be 'dynamic' or omitted, got: %s", type, words[2]);
     *pGenomeDataDir = words[3];
     }
 else
     *pGenomeDataDir = NULL;
+}
 
+boolean trackHubGetPcrParams(char *database, char **pHost, char **pPort, char **pGenomeDataDir)
+/* Get the isPcr params from a trackHub genome. */
+{
+char *type = "isPcr";
+char *setting = trackHubAssemblyField(database, type);
+parseBlatPcrParams(database, type, setting, pHost, pPort, pGenomeDataDir);
+return TRUE;
+}
+
+boolean trackHubGetBlatParams(char *database, boolean isTrans, char **pHost, char **pPort, char **pGenomeDataDir)
+{
+char *type = isTrans ? "transBlat" : "blat";
+char *setting = trackHubAssemblyField(database, type);
+if (setting == NULL)
+    return FALSE;
+parseBlatPcrParams(database, type, setting, pHost, pPort, pGenomeDataDir);
 return TRUE;
 }
 
 void hubCheckBigDataUrl(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb)
 /* Check remote file exists and is of correct type. Wrap this in error catcher */
 {
 char *relativeUrl = trackDbSetting(tdb, "bigDataUrl");
 if (relativeUrl != NULL)
     {
     char *type = trackDbRequiredSetting(tdb, "type");
     char *bigDataUrl = trackHubRelativeUrl(genome->trackDbFile, relativeUrl);
 
     char *bigDataIndex = NULL;
     char *relIdxUrl = trackDbSetting(tdb, "bigDataIndex");
     if (relIdxUrl != NULL)