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 "
"here "
"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
\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
\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();