c99b62d7865a828f8f41c6e82dd36cbd2dd26780
markd
  Wed Jul 1 21:45:43 2020 -0700
hgBlat mostly works

diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c
index 1883a66..cef6e0c 100644
--- src/hg/hgBlat/hgBlat.c
+++ src/hg/hgBlat/hgBlat.c
@@ -283,60 +283,64 @@
 
 // ==================
 
 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* dynGenome;    /* 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 *trackHubServerTable(char *db, boolean isTrans)
 /* Find out if database is a track hub with a blat server */
 {
 char *host, *port;
+boolean dynamic;
 
-if (!trackHubGetBlatParams(db, isTrans, &host, &port))
+if (!trackHubGetBlatParams(db, isTrans, &host, &port, &dynamic))
     return NULL;
 
 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;
+if (dynamic)
+    st->dynGenome = cloneString(trackHubAssemblyField(db, "genome"));
 return st;
 }
 
 struct serverTable *findServer(char *db, boolean isTrans)
 /* Return server for given database.  Db can either be
  * database name or description. */
 {
 if (trackHubDatabase(db))
     {
     struct serverTable *hubSt = trackHubServerTable(db, isTrans);
     if (hubSt != NULL)
 	return hubSt;
     errAbort("Cannot get blat server parameters for track hub with database %s\n", db);
     }
 
@@ -832,33 +836,33 @@
 else if (count == 2)
     {
     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 queryServer(int conn, char *db, struct dnaSeq *seq, char *type, char *xType,
+void queryServerSetup(int conn, char *db, struct dnaSeq *seq, char *type, char *xType,
     boolean complex, boolean isProt, boolean queryRC, int seqNumber)
-/* Send simple query to server and report results.
+/* 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;
@@ -1328,30 +1332,64 @@
 	    }
 	if (startsWith("stepSize ", buf))
 	    {
             serve->stepSize = atoi(buf+strlen("stepSize "));
 	    }
 	if (startsWith("minMatch ", buf))
 	    {
             serve->minMatch = atoi(buf+strlen("minMatch "));
 	    }
         }
     }
 close(sd);
 return(ret); 
 }
 
+int findGenomeParamsDynamic(struct serverTable *serve)
+/* read genome params from dynamic server, which follow "end" in response trailer.
+ */
+{
+char buf[256];
+for (;;)
+    {
+    if (netGetString(STDIN_FILENO, buf) == NULL)
+	{
+	warn("Error reading status information from dynamic server");
+	return -1;
+	}
+    if (sameString(buf, "trailerEnd"))
+        return 0;
+    else
+        {
+	if (startsWith("tileSize ", buf))
+	    {
+            serve->tileSize = atoi(buf+strlen("tileSize "));
+	    }
+	if (startsWith("stepSize ", buf))
+	    {
+            serve->stepSize = atoi(buf+strlen("stepSize "));
+	    }
+	if (startsWith("minMatch ", buf))
+	    {
+            serve->minMatch = atoi(buf+strlen("minMatch "));
+	    }
+        }
+    }
+}
+
+
+
 void blatSeq(char *userSeq, char *organism, char *database, int dbCount)
 /* Blat sequence user pasted in. */
 {
 FILE *f;
 struct dnaSeq *seqList = NULL, *seq;
 struct tempName pslTn, faTn;
 int maxSingleSize, maxTotalSize, maxSeqCount;
 char *genome, *db;
 char *type = cgiString("type");
 char *seqLetters = cloneString(userSeq);
 struct serverTable *serve;
 int conn;
 int oneSize, totalSize = 0, seqCount = 0;
 boolean isTx = FALSE;
 boolean isTxTx = FALSE;
@@ -1526,30 +1564,33 @@
     // read genome size
     if (trackHubDatabase(database))
 	{
 	genomeSize = findGenomeSizeFromHub(database);
 	}
     else
 	{
 	genomeSize = findGenomeSize(database);
 	}
     minMatchShown = findMinMatch(genomeSize, qType == gftProt);
     #endif
     if (allResults)
 	minMatchShown = 0;
 
     // read tileZize stepSize minMatch from server status
+    if (serve->dynGenome != NULL)
+        findGenomeParamsDynamic(serve);
+    else
         findGenomeParams(serve);
 
     int minLucky = (serve->minMatch * serve->stepSize + (serve->tileSize - serve->stepSize)) * xlat;
 
     minSuggested = max(minMatchShown,minLucky);
     }
 
 int seqNumber = 0;
 /* Loop through each sequence. */
 for (seq = seqList; seq != NULL; seq = seq->next)
     {
     printf(" "); fflush(stdout);  /* prevent apache cgi timeout by outputting something */
     oneSize = realSeqSize(seq, !isTx);
     // Impose half the usual bot delay per sequence
     
@@ -1581,63 +1622,68 @@
     if (totalSize > maxTotalSize)
         {
 	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)
-		queryServer(conn, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber);
+		queryServerSetup(conn, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber);
 	    else
-		gfAlignTransTrans(&conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth, NULL);
+		gfAlignTransTrans(&conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth,
+                                  serve->dynGenome);
 	    if (txTxBoth)
 		{
 		reverseComplement(seq->dna, seq->size);
 		conn = gfConnectEx(serve->host, serve->port);
 		if (allGenomes)
-		    queryServer(conn, db, seq, "transQuery", xType, TRUE, FALSE, TRUE, seqNumber);
+		    queryServerSetup(conn, db, seq, "transQuery", xType, TRUE, FALSE, TRUE, seqNumber);
 		else
-		    gfAlignTransTrans(&conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE, NULL);
+		    gfAlignTransTrans(&conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE,
+                                      serve->dynGenome);
 		}
 	    }
 	else
 	    {
 	    if (allGenomes)
-		queryServer(conn, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber);
+		queryServerSetup(conn, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber);
 	    else
-		gfAlignTrans(&conn, serve->nibDir, seq, 5, tFileCache, gvo, NULL);
+		gfAlignTrans(&conn, serve->nibDir, seq, 5, tFileCache, gvo,
+                             serve->dynGenome);
 	    }
 	}
     else
 	{
 	if (allGenomes)
-	    queryServer(conn, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber);
+	    queryServerSetup(conn, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber);
 	else
-	    gfAlignStrand(&conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo, NULL);
+	    gfAlignStrand(&conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo,
+                          serve->dynGenome);
 	reverseComplement(seq->dna, seq->size);
 	conn = gfConnectEx(serve->host, serve->port);
 	if (allGenomes)
-	    queryServer(conn, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber);
+	    queryServerSetup(conn, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber);
 	else
-	    gfAlignStrand(&conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo, NULL);
+	    gfAlignStrand(&conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo,
+                          serve->dynGenome);
 	}
     gfOutputQuery(gvo, f);
     ++seqNumber;
     }
 carefulClose(&f);
 
 if (!allGenomes)
     {
     showAliPlaces(pslTn.forCgi, faTn.forCgi, NULL, serve->db, qType, tType, 
               organism, feelingLucky);
     }
 
 if(!feelingLucky && !allGenomes)
     cartWebEnd();