06d7be056190c14b85e71bc12523f18ea6815b5e
markd
  Mon Dec 7 00:50:29 2020 -0800
BLAT mmap index support merge with master

diff --git src/hg/hgPcr/hgPcr.c src/hg/hgPcr/hgPcr.c
index d772ff3..cf9eaf9 100644
--- src/hg/hgPcr/hgPcr.c
+++ src/hg/hgPcr/hgPcr.c
@@ -15,30 +15,32 @@
 #include "psl.h"
 #include "gfPcrLib.h"
 #include "cheapcgi.h"
 #include "htmshell.h"
 #include "hdb.h"
 #include "hui.h"
 #include "cart.h"
 #include "dbDb.h"
 #include "blatServers.h"
 #include "targetDb.h"
 #include "pcrResult.h"
 #include "trashDir.h"
 #include "web.h"
 #include "botDelay.h"
 #include "oligoTm.h"
+#include "trackHub.h"
+#include "hubConnect.h"
 
 
 struct cart *cart;	/* The user's ui state. */
 struct hash *oldVars = NULL;
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "hgPcr - In-silico PCR CGI for UCSC\n"
   "usage:\n"
   "   hgPcr XXX\n"
   "options:\n"
   "   -xxx=XXX\n"
   );
@@ -54,38 +56,66 @@
    char *host;		/* Name of machine hosting server. */
    char *port;		/* Port that hosts server. */
    char *seqDir;	/* Directory of sequence files. */
    };
 
 struct targetPcrServer
 /* Information on a server running on non-genomic sequence, e.g. mRNA,
  * that has been aligned to a particular genomic assembly. */
    {
    struct targetPcrServer *next;  /* Next in list. */
    char *host;		/* Name of machine hosting server. */
    char *port;		/* Port that hosts server. */
    struct targetDb *targetDb;     /* All of the info about the target. */
    };
 
+struct pcrServer *getTrackHubServers()
+/* Get the list of track hubs that have PCR services. */
+{
+struct pcrServer *serverList = NULL, *server;
+
+struct dbDb *dbDbList = trackHubGetPcrServers();
+
+for(; dbDbList; dbDbList = dbDbList->next)
+    {
+    AllocVar(server);
+    server->db = dbDbList->name;
+    server->genome = dbDbList->organism;
+    server->description = dbDbList->description;
+    trackHubGetPcrParams(server->db, &server->host, &server->port);
+    struct trackHubGenome *genome = trackHubGetGenome(server->db);
+    server->seqDir = cloneString(genome->twoBitPath);
+    char *ptr = strrchr(server->seqDir, '/');
+    // we only want the directory name
+    if (ptr != NULL)
+         *ptr = 0;
+    slAddHead(&serverList, server);
+    }
+
+return serverList;
+}
+
 struct pcrServer *getServerList()
 /* Get list of available servers. */
 {
 struct pcrServer *serverList = NULL, *server;
 struct sqlConnection *conn = hConnectCentral();
 struct sqlResult *sr;
 char **row;
 
+serverList = getTrackHubServers();
+
 /* Do a little join to get data to fit into the pcrServer. */
 sr = sqlGetResult(conn, 
    NOSQLINJ "select dbDb.name,dbDb.genome,dbDb.description,blatServers.host,"
    "blatServers.port,dbDb.nibPath "
    "from dbDb,blatServers where "
    "dbDb.name = blatServers.db "
    "and blatServers.canPcr = 1 order by dbDb.orderKey" );
 while ((row = sqlNextRow(sr)) != NULL)
     {
     AllocVar(server);
     server->db = cloneString(row[0]);
     server->genome = cloneString(row[1]);
     server->description = cloneString(row[2]);
     server->host = cloneString(row[3]);
     server->port = cloneString(row[4]);
@@ -106,30 +136,32 @@
 {
 struct pcrServer *server;
 for (server = serverList; server != NULL; server = server->next)
     {
     if (sameString(db, server->db))
         return server;
     }
 errAbort("Can't find a server for PCR database %s\n", db);
 return NULL;
 }
 
 struct targetPcrServer *getTargetServerList(char *db, char *name)
 /* Get list of available non-genomic-assembly target pcr servers associated 
  * with db (and name, if not NULL).  There may be none -- that's fine. */
 {
+if (trackHubDatabase(db))
+    return NULL;
 struct targetPcrServer *serverList = NULL, *server;
 struct sqlConnection *conn = hConnectCentral();
 struct sqlConnection *conn2 = hAllocConn(db);
 struct sqlResult *sr;
 char **row;
 struct dyString *dy = dyStringNew(0);
 
 sqlDyStringPrintf(dy, 
       "select b.host, b.port, t.* from targetDb as t, blatServers as b "
       "where b.db = t.name and t.db = '%s' and b.canPcr = 1 ",
       db);
 if (isNotEmpty(name))
     sqlDyStringPrintf(dy, "and t.name = '%s' ", name);
 dyStringAppend(dy, "order by t.priority");
 sr = sqlGetResult(conn, dy->string);
@@ -225,31 +257,31 @@
     ORGFORM_KEEP_ORG
     ORGFORM_RESET_DB
     ORGFORM_RESET_TARGET
     ORGFORM_SUBMIT 
     ;
 
 printf("<SELECT NAME=\"org\" id='org'>\n");
 jsOnEventById("change", "org", onChangeText);
 for (server = serverList; server != NULL; server = server->next)
     {
     if (!hashLookup(uniqHash, server->genome))
         {
 	hashAdd(uniqHash, server->genome, NULL);
 	printf("  <OPTION%s VALUE=\"%s\">%s</OPTION>\n", 
 	    (sameWord(genome, server->genome) ? " SELECTED" : ""), 
-	    server->genome, server->genome);
+	    server->genome, hubConnectSkipHubPrefix(server->genome));
 	}
     }
 printf("</SELECT>\n");
 hashFree(&uniqHash);
 }
 
 void showAssemblies(char *genome, char *db, struct pcrServer *serverList,
 		    boolean submitOnClick)
 /* Put up drop-down list with assemblies on it. */
 {
 struct pcrServer *server;
 char *onChangeText =
     ORGFORM_KEEP_PARAMS 
     ORGFORM_KEEP_ORG
     ORGFORM_KEEP_DB