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