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();