95030f73f067d8e8f9221a09c1811784607e4e72
markd
  Fri Jul 10 17:51:29 2020 -0700
split  dynamic server genomeDataPrefix into genome and genomeDataDir.  More verbose, but clearer

diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c
index 8a8e12a..c216861 100644
--- src/hg/hgBlat/hgBlat.c
+++ src/hg/hgBlat/hgBlat.c
@@ -65,31 +65,32 @@
 /* Information about hits on a genome assembly */
     {
     struct genomeHits *next;
     char *db;		/* Database name. */
     char *genome;	/* Genome name. */
     int seqNumber;      /* Submission order */
     char *faName;       /* fasta name */
     char *dna;          /* query dna */
     int dnaSize;        /* query dna size */
     int sd;             /* Connection */
     char *type;         /* query type = query, protQuery, transQuery */
     char *xType;        /* query type = dna, prot, rnax, dnax */
     boolean queryRC;    /* is the query reverse-complemented */
     boolean complex;    /* is the query complex */
     boolean isProt;     /* is the protein query */
-    char *dynGenomeDir; /* relative genome directory for dynamic server */
+    boolean isDynamic;  /* is a dynamic server */
+    char *genomeDataDir; /* dynamic server root-relative directory */
    
     int maxGeneHits;    /* Highest gene hit-count */
     char *maxGeneChrom; /* Target Chrom for gene with max gene hits */
     int maxGeneChromSize; /* Target Chrom Size for only prot, rnax, dnax */
     int maxGeneTStart;  /* Target Start Coordinate for gene with max hits */  
     int maxGeneTEnd;    /* Target End Coordinate for gene with max hits*/
     int maxGeneExons;   /* Number of Exons in gene with max hits */
     char maxGeneStrand[3]; /* + or - or ++ +- -+ -- Strand for gene with max hits */ 
     char maxGeneTStrand;/* + or - TStrand for gene with max hits */ 
     boolean done;       /* Did the job get to finish */
     boolean error;      /* Some error happened */
     char *networkErrMsg;      /* Network layer error message */
     struct dyString *dbg;     /* Output debugging info */
     struct gfResult *gfList;  /* List of gfResult records */
     boolean hide;      /* To not show both strands, suppress the weaker-scoring one */
@@ -284,31 +285,32 @@
 
 // ==================
 
 struct serverTable
 /* Information on a server. */
     {
     char *db;		/* Database name. */
     char *genome;	/* Genome name. */
     boolean isTrans;	/* Is tranlated to protein? */
     char *host;		/* Name of machine hosting server. */
     char *port;		/* Port that hosts server. */
     char *nibDir;	/* Directory of sequence files. */
     int tileSize;       /* gfServer -tileSize */
     int stepSize;       /* gfServer -stepSize */
     int minMatch;       /* gfServer -minMatch */
-    char* dynGenomeDir; /* genome name for dynamic gfServer  */
+    boolean isDynamic;  /* is a dynamic server */
+    char* genomeDataDir; /* genome name for dynamic gfServer  */
     };
 
 char *typeList[] = {"BLAT's guess", "DNA", "protein", "translated RNA", "translated DNA"};
 char *outputList[] = {"hyperlink", "psl", "psl no header"};
 
 int minMatchShown = 0;
 
 static struct serverTable *databaseServerTable(char *db, boolean isTrans)
 /* Load blat table for a database */
 {
 struct sqlConnection *conn = hConnectCentral();
 char query[512];
 struct sqlResult *sr;
 char **row;
 char dbActualName[32];
@@ -341,64 +343,78 @@
 if ((row = sqlNextRow(sr)) == NULL)
     {
     errAbort("Can't find a server for %s database %s.  Click "
 	     "<A HREF=\"/cgi-bin/hgBlat?%s&command=start&db=%s\">here</A> "
 	     "to reset to default database.",
 	     (isTrans ? "translated" : "DNA"), db,
 	     cartSidUrlString(cart), hDefaultDb());
     }
 st->db = cloneString(row[0]);
 st->genome = cloneString(row[1]);
 st->isTrans = atoi(row[2]);
 st->host = cloneString(row[3]);
 st->port = cloneString(row[4]);
 st->nibDir = hReplaceGbdbSeqDir(row[5], st->db);
 if (haveDynamic && atoi(row[6]))
-    st->dynGenomeDir = cloneString(db);
+    {
+    st->isDynamic = TRUE;
+    st->genomeDataDir = cloneString(st->db);  // db only allows directories by database
+    }
 
 sqlFreeResult(&sr);
 hDisconnectCentral(&conn);
 return st;
 }
 
 static struct serverTable *trackHubServerTable(char *db, boolean isTrans)
 /* Load blat table for a hub */
 {
 char *host, *port;
-char *dynGenomeDir;
+char *genomeDataDir;
 
-if (!trackHubGetBlatParams(db, isTrans, &host, &port, &dynGenomeDir))
+if (!trackHubGetBlatParams(db, isTrans, &host, &port, &genomeDataDir))
     errAbort("Cannot get blat server parameters for track hub with database %s", db);
 
 struct serverTable *st;
 AllocVar(st);
 
 st->db = cloneString(db);
 st->genome = cloneString(hGenome(db));
 st->isTrans = isTrans;
 st->host = host; 
 st->port = port;
 struct trackHubGenome *genome = trackHubGetGenome(db);
 st->nibDir = cloneString(genome->twoBitPath);
 char *ptr = strrchr(st->nibDir, '/');
 // we only want the directory name
 if (ptr != NULL)
     *ptr = 0;
-st->dynGenomeDir = dynGenomeDir;
+if (genomeDataDir != NULL)
+    {
+    st->isDynamic = TRUE;
+    st->genomeDataDir = cloneString(genomeDataDir);
+    }
 return st;
 }
 
+static char *dynServerGenome(char *db)
+/* translate the database to the genome string to send to a dynamic
+ * gfServer */
+{
+return trackHubDatabase(db) ? trackHubAssemblyField(db, "genome") : db;
+}
+
 struct serverTable *findServer(char *db, boolean isTrans)
 /* Return server for given database.  Db can either be
  * database name or description. */
 {
 if (trackHubDatabase(db))
     return trackHubServerTable(db, isTrans);
 else
     return databaseServerTable(db, isTrans);
 }
 
 void findClosestServer(char **pDb, char **pOrg)
 /* If db doesn't have a blat server, look for the closest db (or org) that has one,
  * as hgPcr does. */
 {
 char *db = *pDb, *org = *pOrg;
@@ -847,49 +863,50 @@
     {
     safef(shortName, sizeof shortName, "blat %s+%d", names->name, count - 1);
     safef(description, sizeof description, "blat on %d queries (%s, %s)", count, names->name, names->next->name);
     }
 else
     {
     safef(shortName, sizeof shortName, "blat %s+%d", names->name, count - 1);
     safef(description, sizeof description, "blat on %d queries (%s, %s, ...)", count, names->name, names->next->name);
     }
 
 *pName = makeNameUnique(shortName, database, cart);
 *pDescription = cloneString(description);
 }
 
 void queryServerSetup(int conn, char *db, struct dnaSeq *seq, char *type, char *xType,
-                      boolean complex, boolean isProt, boolean queryRC, int seqNumber, char *dynGenomeDir)
+                      boolean complex, boolean isProt, boolean queryRC, int seqNumber, char *genomeDataDir)
 /* Setup query to server.
  * queryRC is true when the query has been reverse-complemented */
 {
 struct genomeHits *gH;
 AllocVar(gH);
 
 gH->db = cloneString(db);
 gH->genome = cloneString(hGenome(db));
 gH->seqNumber = seqNumber;
 gH->faName = cloneString(seq->name);
 gH->dna = cloneString(seq->dna);
 gH->dnaSize = seq->size;
 gH->type = cloneString(type);
 gH->xType = cloneString(xType);
 gH->queryRC = queryRC;
 gH->complex = complex;
 gH->isProt = isProt;
-gH->dynGenomeDir = dynGenomeDir;
+gH->isDynamic = (genomeDataDir != NULL);
+gH->genomeDataDir = genomeDataDir;
 gH->sd = conn;
 if (gH->sd == -1)
     {
     gH->error = TRUE;
     gH->networkErrMsg = "Connection to gfServer failed.";
     }
 gH->dbg = dyStringNew(256);
 slAddHead(&pfdList, gH);
 }
 
 void findBestGene(struct genomeHits *gH, int queryFrame)
 /* Find best gene-like object with multiple linked-features.
  * Remember chrom start end of best gene found and total hits in the gene. 
  * Should sort the gfResults by tStrand, chrom, tStart.
  * Filters on queryFrame */
@@ -987,34 +1004,35 @@
     gfR->qEnd   = gfR->qEnd   * qFactor + gfR->qFrame;
     gfR->tStart = gfR->tStart * tFactor + gfR->tFrame;
     gfR->tEnd   = gfR->tEnd   * tFactor + gfR->tFrame;
     }
 }
 
 void queryServerFinish(struct genomeHits *gH)
 /* Report results from gfServer. */
 {
 char buf[256];
 int matchCount = 0;
 
 dyStringPrintf(gH->dbg,"query strand %s qsize %d<br>\n", gH->queryRC ? "-" : "+", gH->dnaSize);
 
 /* Put together query command. */
-if (gH->dynGenomeDir == NULL)
-    safef(buf, sizeof buf, "%s%s %d", gfSignature(), gH->type, gH->dnaSize);
+if (gH->isDynamic)
+    safef(buf, sizeof buf, "%s%s %d %s %s", gfSignature(), gH->type, gH->dnaSize,
+          dynServerGenome(gH->db), gH->genomeDataDir);
 else
-    safef(buf, sizeof buf, "%s%s %d %s", gfSignature(), gH->type, gH->dnaSize, gH->dynGenomeDir);
+    safef(buf, sizeof buf, "%s%s %d", gfSignature(), gH->type, gH->dnaSize);
 mustWriteFd(gH->sd, buf, strlen(buf));
 
 if (read(gH->sd, buf, 1) < 0)
     errAbort("queryServerFinish: read failed: %s", strerror(errno));
 if (buf[0] != 'Y')
     errAbort("Expecting 'Y' from server, got %c", buf[0]);
 mustWriteFd(gH->sd, gH->dna, gH->dnaSize);
 
 if (gH->complex)
     {
     char *s = netRecieveString(gH->sd, buf);
     if (!s)
 	errAbort("expected response from gfServer with tileSize");
     dyStringPrintf(gH->dbg,"%s<br>\n", s);  // from server: tileSize 4
     }
@@ -1305,43 +1323,42 @@
 for (index = genome->tbf->indexList; index != NULL; index = index->next)
     {
     genomeSize += twoBitSeqSize(genome->tbf, index->name);
     }
 
 twoBitClose(&genome->tbf);
 
 return genomeSize;
 }
 
 
 int findGenomeParams(struct serverTable *serve)
 /* Send status message to server arnd report result.
  * Get tileSize stepSize and minMatch.
  */
-
 {
 char buf[256];
 int sd = 0;
 int ret = 0;
 
 /* Put together command. */
 sd = gfConnectEx(serve->host, serve->port);
-if (serve->dynGenomeDir == NULL)
-    sprintf(buf, "%sstatus", gfSignature());
+if (serve->isDynamic)
+    sprintf(buf, "%s%s %s %s", gfSignature(), (serve->isTrans ? "transInfo" : "untransInfo"),
+            dynServerGenome(serve->db), serve->genomeDataDir);
 else
-    sprintf(buf, "%s%s %s", gfSignature(), (serve->isTrans ? "transInfo" : "untransInfo"),
-            serve->dynGenomeDir);
+    sprintf(buf, "%sstatus", gfSignature());
 mustWriteFd(sd, buf, strlen(buf));
 
 for (;;)
     {
     if (netGetString(sd, buf) == NULL)
 	{
 	warn("Error reading status information from %s:%s",serve->host, serve->port);
 	ret = -1;
         break;
 	}
     if (sameString(buf, "end"))
         break;
     else
         {
 	if (startsWith("tileSize ", buf))
@@ -1604,72 +1621,72 @@
         {
 	warn("Sequence %s would take us over the %d letter limit, stopping here.",
 	     seq->name, maxTotalSize);
 	break;
 	}
 
     conn = gfConnectEx(serve->host, serve->port);
 
     if (isTx)
 	{
 	gvo->reportTargetStrand = TRUE;
 	if (isTxTx)
 	    {
 	    if (allGenomes)
 		queryServerSetup(conn, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber,
-                                 serve->dynGenomeDir);
+                                 serve->genomeDataDir);
 	    else
 		gfAlignTransTrans(&conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth,
-                                  serve->dynGenomeDir);
+                                  dynServerGenome(serve->db), serve->genomeDataDir);
 	    if (txTxBoth)
 		{
 		reverseComplement(seq->dna, seq->size);
 		conn = gfConnectEx(serve->host, serve->port);
 		if (allGenomes)
 		    queryServerSetup(conn, db, seq, "transQuery", xType, TRUE, FALSE, TRUE, seqNumber,
-                                     serve->dynGenomeDir);
+                                     serve->genomeDataDir);
 		else
 		    gfAlignTransTrans(&conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE,
-                                      serve->dynGenomeDir);
+                                      dynServerGenome(serve->db), serve->genomeDataDir);
 		}
 	    }
 	else
 	    {
 	    if (allGenomes)
 		queryServerSetup(conn, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber,
-                                 serve->dynGenomeDir);
+                                 serve->genomeDataDir);
 	    else
 		gfAlignTrans(&conn, serve->nibDir, seq, 5, tFileCache, gvo,
-                             serve->dynGenomeDir);
+                             dynServerGenome(serve->db), serve->genomeDataDir);
 	    }
 	}
     else
 	{
 	if (allGenomes)
 	    queryServerSetup(conn, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber,
-                             serve->dynGenomeDir);
+                             serve->genomeDataDir);
 	else
 	    gfAlignStrand(&conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo,
-                          serve->dynGenomeDir);
+                          dynServerGenome(serve->db), serve->genomeDataDir);
 	reverseComplement(seq->dna, seq->size);
 	conn = gfConnectEx(serve->host, serve->port);
 	if (allGenomes)
 	    queryServerSetup(conn, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber,
-                             serve->dynGenomeDir);
+                             serve->genomeDataDir);
 	else
 	    gfAlignStrand(&conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo,
-                          serve->dynGenomeDir);
+                          dynServerGenome(serve->db), serve->genomeDataDir);
 	}
     gfOutputQuery(gvo, f);
     ++seqNumber;
     }
 carefulClose(&f);
 
 if (!allGenomes)
     {
     showAliPlaces(pslTn.forCgi, faTn.forCgi, NULL, serve->db, qType, tType, 
               organism, feelingLucky);
     }
 
 if(!feelingLucky && !allGenomes)
     cartWebEnd();