d26f11fb046f1b9db6d3f39eaf1a60003f8d8f1e braney Tue Dec 16 17:26:03 2014 -0800 blat support on assembly hubs diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c index d4e1a4f..876187d 100644 --- src/hg/hgBlat/hgBlat.c +++ src/hg/hgBlat/hgBlat.c @@ -11,62 +11,97 @@ #include "dnautil.h" #include "fa.h" #include "psl.h" #include "genoFind.h" #include "cheapcgi.h" #include "htmshell.h" #include "hdb.h" #include "hui.h" #include "cart.h" #include "dbDb.h" #include "blatServers.h" #include "web.h" #include "hash.h" #include "botDelay.h" #include "trashDir.h" +#include "trackHub.h" struct cart *cart; /* The user's ui state. */ struct hash *oldVars = NULL; boolean orgChange = FALSE; boolean dbChange = FALSE; 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. */ }; char *typeList[] = {"BLAT's guess", "DNA", "protein", "translated RNA", "translated DNA"}; char *sortList[] = {"query,score", "query,start", "chrom,score", "chrom,start", "score"}; char *outputList[] = {"hyperlink", "psl", "psl no header"}; #ifdef LOWELAB int minMatchShown = 14; #else int minMatchShown = 20; #endif +static struct serverTable *trackHubServerTable(char *db, boolean isTrans) +/* Find out if database is a track hub with a blat server */ +{ +char *host, *port; + +if (!trackHubGetBlatParams(db, isTrans, &host, &port)) + 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; +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); + } + static struct serverTable st; struct sqlConnection *conn = hConnectCentral(); char query[256]; struct sqlResult *sr; char **row; 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; } @@ -91,30 +126,38 @@ st.isTrans = atoi(row[2]); st.host = cloneString(row[3]); st.port = cloneString(row[4]); st.nibDir = hReplaceGbdbSeqDir(row[5], st.db); sqlFreeResult(&sr); hDisconnectCentral(&conn); return &st; } 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; + +if (trackHubDatabase(db) && (trackHubServerTable(db, FALSE) != NULL)) + { + *pDb = db; + *pOrg = hGenome(db); + return; + } + struct sqlConnection *conn = hConnectCentral(); char query[256]; sqlSafef(query, sizeof(query), "select db from blatServers where db = '%s'", db); if (!sqlExists(conn, query)) { sqlSafef(query, sizeof(query), "select blatServers.db from blatServers,dbDb " "where blatServers.db = dbDb.name and dbDb.genome = '%s'", org); char *db = sqlQuickString(conn, query); if (db == NULL) { sqlSafef(query, sizeof(query), "select blatServers.db from blatServers,dbDb " "where blatServers.db = dbDb.name order by dbDb.orderKey,dbDb.name desc"); char *db = sqlQuickString(conn, query); if (db == NULL) errAbort("central database tables blatServers and dbDb are disjoint/empty"); @@ -773,72 +816,72 @@ else printf(" or see the Genome Browser FAQ.

\n"); } void doMiddle(struct cart *theCart) /* Write header and body of html page. */ { char *userSeq; char *db, *organism; boolean clearUserSeq = cgiBoolean("Clear"); cart = theCart; dnaUtilOpen(); +orgChange = sameOk(cgiOptionalString("changeInfo"),"orgChange"); +if (orgChange) + { + cgiVarSet("db", hDefaultDbForGenome(cgiOptionalString("org"))); + } getDbAndGenome(cart, &db, &organism, oldVars); char *oldDb = cloneString(db); findClosestServer(&db, &organism); /* Get sequence - from userSeq variable, or if * that is empty from a file. */ if (clearUserSeq) { cartSetString(cart, "userSeq", ""); cartSetString(cart, "seqFile", ""); } userSeq = cartUsualString(cart, "userSeq", ""); if (isEmpty(userSeq)) { userSeq = cartOptionalString(cart, "seqFile"); } if (isEmpty(userSeq) || orgChange) { - cartWebStart(theCart, db, "%s BLAT Search", organism); + cartWebStart(theCart, db, "%s BLAT Search", trackHubSkipHubName(organism)); if (differentString(oldDb, db)) printf("

Note: BLAT search is not available for %s %s; " "defaulting to %s %s


\n", hGenome(oldDb), hFreezeDate(oldDb), organism, hFreezeDate(db)); askForSeq(organism,db); cartWebEnd(); } else { blatSeq(skipLeadingSpaces(userSeq), organism); } } /* Null terminated list of CGI Variables we don't want to save * permanently. */ char *excludeVars[] = {"Submit", "submit", "Clear", "Lucky", "type", "userSeq", "seqFile", "showPage", "changeInfo", NULL}; int main(int argc, char *argv[]) /* Process command line. */ { long enteredMainTime = clock1000(); oldVars = hashNew(10); cgiSpoof(&argc, argv); setUdcCacheDir(); /* org has precedence over db when changeInfo='orgChange' */ -orgChange = sameOk(cgiOptionalString("changeInfo"),"orgChange"); -if (orgChange) - { - cgiVarSet("db", hDefaultDbForGenome(cgiOptionalString("org"))); - } cartEmptyShell(doMiddle, hUserCookie(), excludeVars, oldVars); cgiExitTime("hgBlat", enteredMainTime); return 0; }