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 <A HREF=\"../FAQ/FAQblat.html\">FAQ</A>. </P> \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("<HR><P><EM><B>Note:</B> BLAT search is not available for %s %s; "
 	       "defaulting to %s %s</EM></P><HR>\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;
 }