88485cfa7f13affa28ec5765fe9b2db90cce42b6 markd Tue Dec 8 21:02:15 2020 -0800 hgPcr working diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c index 013a9ee3..d97ce79 100644 --- src/hg/hgBlat/hgBlat.c +++ src/hg/hgBlat/hgBlat.c @@ -317,60 +317,61 @@ char dbActualName[32]; /* If necessary convert database description to name. */ sqlSafef(query, sizeof(query), "select name from dbDb where name = '%s'", db); if (!sqlExists(conn, query)) { sqlSafef(query, sizeof(query), "select name from dbDb where description = '%s'", db); if (sqlQuickQuery(conn, query, dbActualName, sizeof(dbActualName)) != NULL) db = dbActualName; } struct serverTable *st; AllocVar(st); /* Do a little join to get data to fit into the serverTable and grab - * dbDb.nibPath too. check for newer dynamic flag. sqlSafef doesn't lets us - * format in comma in field spec, so need to do this in two steps. */ -char *blatServersTbl = "blatServers"; // this can be hack to use another db.table for debugging -char queryTmpl[512]; + * dbDb.nibPath too. Check for newer dynamic flag and allow with or without + * it. + * For debugging, one set the variable blatServersTbl to some db.table to + * pick up settings from somewhere other than dbDb.blatServers. + */ +char *blatServersTbl = cfgOptionDefault("blatServersTbl", "blatServers"); boolean haveDynamic = sqlColumnExists(conn, blatServersTbl, "dynamic"); -safef(queryTmpl, sizeof(queryTmpl), "select dbDb.name, dbDb.description, blatServers.isTrans," - "blatServers.host, blatServers.port, dbDb.nibPath %s " - "from dbDb, %s blatServers where blatServers.isTrans = %%d and " - "dbDb.name = '%%s' and dbDb.name = blatServers.db", - (haveDynamic ? ", blatServers.dynamic" : ""), blatServersTbl); -sqlSafef(query, sizeof(query), queryTmpl, isTrans, db); +sqlSafef(query, sizeof(query), "select dbDb.name, dbDb.description, blatServers.isTrans," + "blatServers.host, blatServers.port, dbDb.nibPath, %s " + "from dbDb, %s blatServers where blatServers.isTrans = %d and " + "dbDb.name = '%s' and dbDb.name = blatServers.db", + (haveDynamic ? "blatServers.dynamic" : "0"), blatServersTbl, isTrans, db); sr = sqlGetResult(conn, query); 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])) +if (atoi(row[6])) { st->isDynamic = TRUE; - st->genomeDataDir = cloneString(st->db); // db only allows directories by database + st->genomeDataDir = cloneString(st->db); // directories by database name for database genomes } sqlFreeResult(&sr); hDisconnectCentral(&conn); return st; } static struct serverTable *trackHubServerTable(char *db, boolean isTrans) /* Load blat table for a hub */ { char *host, *port; char *genomeDataDir; if (!trackHubGetBlatParams(db, isTrans, &host, &port, &genomeDataDir)) errAbort("Cannot get blat server parameters for track hub with database %s", db); @@ -385,37 +386,30 @@ 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 (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; @@ -998,44 +992,44 @@ for(gfR=gH->gfList; gfR; gfR=gfR->next) { gfR->qStart = gfR->qStart * qFactor + gfR->qFrame; 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; -struct gfConnection *conn = gfMayConnect(gH->host, gH->port, gH->isDynamic); +struct gfConnection *conn = gfMayConnect(gH->host, gH->port, trackHubDatabaseToGenome(gH->db), gH->genomeDataDir); if (conn == NULL) { gH->error = TRUE; gH->networkErrMsg = "Connection to gfServer failed."; return; } dyStringPrintf(gH->dbg,"query strand %s qsize %d
\n", gH->queryRC ? "-" : "+", gH->dnaSize); /* Put together query command. */ if (gH->isDynamic) safef(buf, sizeof buf, "%s%s %s %s %d", gfSignature(), gH->type, - dynServerGenome(gH->db), gH->genomeDataDir, gH->dnaSize); + conn->genome, conn->genomeDataDir, gH->dnaSize); else safef(buf, sizeof buf, "%s%s %d", gfSignature(), gH->type, gH->dnaSize); gfBeginRequest(conn); mustWriteFd(conn->fd, buf, strlen(buf)); if (read(conn->fd, buf, 1) < 0) errAbort("queryServerFinish: read failed: %s", strerror(errno)); if (buf[0] != 'Y') errAbort("Expecting 'Y' from server, got %c", buf[0]); mustWriteFd(conn->fd, gH->dna, gH->dnaSize); // Cannot shifted earlier for speed. must wait for Y confirmation. if (gH->complex) { char *s = netRecieveString(conn->fd, buf); if (!s) @@ -1325,31 +1319,31 @@ } int findGenomeParams(struct gfConnection *conn, struct serverTable *serve) /* Send status message to server arnd report result. * Get tileSize stepSize and minMatch. */ { char buf[256]; int ret = 0; /* Put together command. */ gfBeginRequest(conn); if (serve->isDynamic) sprintf(buf, "%s%s %s %s", gfSignature(), (serve->isTrans ? "transInfo" : "untransInfo"), - dynServerGenome(serve->db), serve->genomeDataDir); + conn->genome, conn->genomeDataDir); else sprintf(buf, "%sstatus", gfSignature()); mustWriteFd(conn->fd, buf, strlen(buf)); for (;;) { if (netGetString(conn->fd, buf) == NULL) { warn("Error reading status information from %s:%s",serve->host, serve->port); ret = -1; break; } if (sameString(buf, "end")) break; else @@ -1560,31 +1554,31 @@ #else // read genome size if (trackHubDatabase(database)) { genomeSize = findGenomeSizeFromHub(database); } else { genomeSize = findGenomeSize(database); } minMatchShown = findMinMatch(genomeSize, qType == gftProt); #endif if (allResults) minMatchShown = 0; - conn = gfConnect(serve->host, serve->port, serve->isDynamic); + conn = gfConnect(serve->host, serve->port, trackHubDatabaseToGenome(serve->db), serve->genomeDataDir); // read tileSize stepSize minMatch from server status findGenomeParams(conn, 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); @@ -1620,76 +1614,71 @@ warn("Sequence %s would take us over the %d letter limit, stopping here.", seq->name, maxTotalSize); break; } if (isTx) { gvo->reportTargetStrand = TRUE; if (isTxTx) { if (allGenomes) queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber, serve->genomeDataDir); else { - gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth, - dynServerGenome(serve->db), serve->genomeDataDir); + gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth); } if (txTxBoth) { reverseComplement(seq->dna, seq->size); if (allGenomes) queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, TRUE, seqNumber, serve->genomeDataDir); else { - gfAlignTransTrans(conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE, - dynServerGenome(serve->db), serve->genomeDataDir); + gfAlignTransTrans(conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE); } } } else { if (allGenomes) queryServer(serve->host, serve->port, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber, serve->genomeDataDir); else { - gfAlignTrans(conn, serve->nibDir, seq, 5, tFileCache, gvo, - dynServerGenome(serve->db), serve->genomeDataDir); + gfAlignTrans(conn, serve->nibDir, seq, 5, tFileCache, gvo); } } } else { if (allGenomes) queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber, serve->genomeDataDir); else { - gfAlignStrand(conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo, - dynServerGenome(serve->db), serve->genomeDataDir); + gfAlignStrand(conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo); } reverseComplement(seq->dna, seq->size); if (allGenomes) queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber, serve->genomeDataDir); else { - gfAlignStrand(conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo, - dynServerGenome(serve->db), serve->genomeDataDir); + gfAlignStrand(conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo); } } gfOutputQuery(gvo, f); ++seqNumber; } carefulClose(&f); if (!allGenomes) { showAliPlaces(pslTn.forCgi, faTn.forCgi, NULL, serve->db, qType, tType, organism, feelingLucky); } if(!feelingLucky && !allGenomes) cartWebEnd();