src/hg/archaeStuff/tooltip/tooltip.c 1.7

1.7 2010/02/12 18:03:12 markd
integrated archae tool tip changes from Andrew Holmes
Index: src/hg/archaeStuff/tooltip/tooltip.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/archaeStuff/tooltip/tooltip.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 1000000 -r1.6 -r1.7
--- src/hg/archaeStuff/tooltip/tooltip.c	2 Dec 2009 20:08:20 -0000	1.6
+++ src/hg/archaeStuff/tooltip/tooltip.c	12 Feb 2010 18:03:12 -0000	1.7
@@ -1,840 +1,876 @@
 
 #include "common.h"
 #include "errabort.h"
 #include "bed.h"
 #include "cart.h"
 #include "cheapcgi.h"
 #include "hPrint.h"
 #include "hui.h"
 #include "jksql.h"
 #include "web.h"
 #include "minGeneInfo.h"
 #include "hdb.h"
 #include "cddInfo.h"
 #include "alignInfo.h"
 #include "gcPercent.h"
 #include "wiggle.h"
 #include "blastTab.h"
 #include "lowelabPfamHit.h"
 #include "tRNAs.h"
 #include "snoRNAs.h"
 #include "tigrCmrGene.h"
 #include "hgConfig.h"
 #include "loweutils.h"
 #include "cddDesc.h"
 #include "arcogdesc.h"
 #include "arCOGs.h"
 #include "megablastInfo.h"
 
 
 static char const rcsid[] = "$Id$";
 
 
 /* ---- Global variables. ---- */
 struct cart *cart;           /* This holds cgi and other variables between clicks. */
 struct hash *oldVars = NULL;
 char *database;      /* Name of mySQL database. */
 char *organism;
+char* getseqname()
+{
+	char *seqName;
+	boolean dbIsFound = sqlDatabaseExists(database);
+
+	if (dbIsFound)
+	    seqName = hgOfficialChromName(database, cartString(cart, "c"));
+	else
+    	seqName = cartString(cart, "c");
 
+    char* position = cartOptionalString(cart, "position");
+    int i = 0;
+    while(position[i] != '\0' && position[i] != ':')
+    {
+		i++;
+	}
+	if(position[i] == ':')
+	{
+		position[i] = '\0';
+		seqName = position;
+	}
+	return seqName;
+}
 
 
 void toolTipGeneQuery()
 {
     struct sqlResult *sr;
     struct minGeneInfo ginfo;
     char **row;
     char query[256];
     //struct sqlConnection *hAllocConn
     struct sqlConnection *conn = hAllocConn(database);
     sprintf(query, "select * from %s where name = '%s'", "gbProtCodeXra", cartOptionalString(cart, "i"));
     sr = sqlGetResult(conn, query);
     hPrintf("<B>Gene Name:</B> %s<br>",cartOptionalString(cart, "i"));
     if ((row = sqlNextRow(sr)) != NULL)
     {
         minGeneInfoStaticLoad(row, &ginfo);
         if (ginfo.product != NULL && differentString(ginfo.product,"none"))
         {
             if(strlen(ginfo.product) > 70)
             {
                 hPrintf("<B>Product:</B> %.70s<BR>",ginfo.product);
             }
             else
             {
                 hPrintf("<B>Product:</B> %s<BR>",ginfo.product);
             }
         }
 
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 
 }
 void arCOGTip()
 {
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
     int end = cartInt(cart, "t");
     struct sqlResult *sr;
     char **row;
     char **descrow;
     char query[256];
     int rowOffset;
 
     struct sqlConnection *conn = hAllocConn(database);
     struct arcogdesc *description = NULL;
     if(hTableExists("mgCommonDb","arcogdesc"))
     {
         sprintf(query, "select * from mgCommonDb.arcogdesc where name = '%s'", itemName);
         //sprintf(query, "select * from %s where query = '%s'", blastpHitsTable, queryName);
         struct sqlResult *srarcogdesc = sqlGetResult(conn, query);
         while ((descrow = sqlNextRow(srarcogdesc)) != NULL)
         {
             struct arcogdesc *element;
             element = arcogdescLoad(descrow);
             slAddTail(&description, element);
         }
         sqlFreeResult(&srarcogdesc);
     }
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
 
     sr = sqlGetResult(conn, query);
     struct arCOGs *infoload = NULL;
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = arCOGsLoad(row+rowOffset);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         if(!hTableExists("mgCommonDb","arcogdesc"))
         {
         }
         else if(strlen(description->description) > 70)
         {
             hPrintf("<B>Description:</B> %.70s...<BR>\n", description->description);
         }
         else
         {
             hPrintf("<B>Description:</B> %s<BR>\n", description->description);
         }
         hPrintf("<B>Code:</B> %s<BR>\n", description->code);
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 void cddInfoTip()
 {
+    	
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
-    int end = cartInt(cart, "t");
+    int end = cartInt(cart,"t");
     struct sqlResult *sr;
     char **row;
     char **descrow;
     char query[256];
     int rowOffset;
 
     struct sqlConnection *conn = hAllocConn(database);
     struct cddDesc *description = NULL;
     if(hTableExists("mgCommonDb","cddDesc"))
     {
         sprintf(query, "select * from mgCommonDb.cddDesc where accession = '%s'", itemName);
         //sprintf(query, "select * from %s where query = '%s'", blastpHitsTable, queryName);
         struct sqlResult *srCddDesc = sqlGetResult(conn, query);
 
 
 
         while ((descrow = sqlNextRow(srCddDesc)) != NULL)
         {
             struct cddDesc *element;
             element = cddDescLoad(descrow);
             slAddTail(&description, element);
         }
         sqlFreeResult(&srCddDesc);
     }
 
 
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
-
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
+	//printf("%s\n",query);
     sr = sqlGetResult(conn, query);
     struct cddInfo *infoload = NULL;
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = cddInfoLoad(row+rowOffset);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->fullname);
         if(!hTableExists("mgCommonDb","cddDesc"))
         {
         }
         else if(strlen(description->name) > 70)
         {
             hPrintf("<B>Description:</B> %.70s...<BR>\n", description->name);
         }
         else
         {
             hPrintf("<B>Description:</B> %s<BR>\n", description->name);
         }
 
         hPrintf("<B>E-value:</B> %0.0e<BR>\n", infoload->evalue);
         hPrintf("<B>Percent Positive:</B> %u%%<BR>\n", infoload->percentident);
         hPrintf("<B>Percent Length:</B> %u%%<BR>\n", infoload->percentlength);
 
 
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 void megablastInfoTip()
 {
-    char *track =  cartOptionalString(cart, "g");
+    char *track =  cartOptionalString(cart,"g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
-    int start = cartInt(cart, "o");
-    int end = cartInt(cart, "t");
+    int start = cartInt(cart,"o");
+    int end = cartInt(cart,"t");
     struct sqlResult *sr;
     char **row;
     char query[256];
     int rowOffset;
 
     struct sqlConnection *conn = hAllocConn(database);
 
 
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
-
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
+	//printf("%s",query);
     sr = sqlGetResult(conn, query);
     struct megablastInfo *infoload = NULL;
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = megablastInfoLoad(row+rowOffset);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         if(strlen(infoload->fullname) > 70)
         {
             hPrintf("<B>Product:</B> %.70s...<BR>",infoload->fullname);
         }
         else
         {
             hPrintf("<B>Product:</B> %s<BR>",infoload->fullname);
         }
         hPrintf("<B>E-value:</B> %0.0e<BR>\n", infoload->evalue);
         hPrintf("<B>Identity:</B> %u%%<BR>\n", infoload->percentident);
 
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 
 
 
 void gcPercentTip()
 {
     /*
     //char *track =  cartOptionalString(cart, "g");
 
     hPrintf("<B>Name:</B> %s",cartOptionalString(cart, "i"));
 
     //char *itemName =  cartOptionalString(cart, "i");
     //char *group = cartOptionalString(cart, "g");
 
     bits64 iCount = 0;
     struct bbiInterval *bb;
 
     struct lm *lm = lmInit(0);
     double sum = 0.0;
     //struct bbiInterval *bigWigIntervalQuery
     // /data/gbdb/pyrAer1/bed/gc20Base/gc20Base.wig
 
     struct bbiFile *bbi = bigWigFileOpen("/data/gbdb/pyrAer1/bed/gc20Base/gc20Base.wib");
     struct bbiInterval *bbList = bigWigIntervalQuery(bbi, chrom, winStart, winEnd, lm);
     for (bb = bbList; bb != NULL; bb = bb->next)
     {
         iCount += 1;
         double val = bb->val;
         sum += val;
     }
     hPrintf("<B>GC Percentage:</B> %f<BR>\n", sum/iCount);*/
     char *seqName = cartString(cart, "c");
     char *table = cartString(cart, "g");
     struct hash *trackHash = makeTrackHashWithComposites(database, seqName, TRUE);
     struct trackDb *tdb = hashFindVal(trackHash, table);
     struct sqlConnection *conn = hAllocConn(database);
     char *chrom =  cartOptionalString(cart, "c");
     int winStart = cartInt(cart, "o");
     int winEnd = cartInt(cart, "t");
     struct wiggleDataStream *wds = wiggleDataStreamNew();
     unsigned span = 0;
     boolean hasBin;
     hFindSplitTable(database, seqName, tdb->tableName, table, &hasBin);
     span = minSpan(conn, table, chrom, winStart, winEnd, cart, tdb);
     wds->setSpanConstraint(wds, span);
     wds->setChromConstraint(wds, chrom);
     wds->setPositionConstraint(wds, winStart, winEnd);
     wds->getData(wds, database, table, 8);
     //hPrintf("<B>Mean:</B>%s <BR>\n",tdb->tableName);
     hPrintf("<B>Window Mean:</B> %f<BR>\n", wds->stats->mean);
 }
 void alignInfoTip()
 {
 
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
-    int end = cartInt(cart, "t");
+    int end = cartInt(cart,"t");
     struct sqlResult *sr;
 
     char query[256];
     int rowOffset;
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
     struct sqlConnection *conn = hAllocConn(database);
     sr = sqlGetResult(conn, query);
     rowOffset = hOffsetPastBin(database, seqName, track);
 
     struct alignInfo *infoload = NULL;
     char **row;
     while ((row = sqlNextRow(sr)) != NULL)
     {
         struct alignInfo *element;
 
         element = alignInfoLoad(row+rowOffset);
         slAddTail(&infoload, element);
     }
     sqlFreeResult(&sr);
 
     if (infoload != NULL)
     {
         char genome[50] = "";
         char clade[50] = "";
         memset(genome, 0, 50);
         memset(clade, 0, 50);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
 
         struct minGeneInfo *ginfo;
         ginfo = getGbProtCodeInfo(conn, infoload->orgn,infoload->name);
         hPrintf("<B>Product:</B> %s<BR>\n", ginfo->product);
 
         getGenomeClade(conn, infoload->orgn, genome, clade);
         hPrintf("<B>Genome:</B> %s<BR>\n", genome);
         infoload = infoload->next;
     }
 
     hFreeConn(&conn);
 }
 void blastpTip()
 {
     char query[512];
     char *genename =  cartOptionalString(cart, "i");
 
 
     char *blastpTarget[2];
     parseDelimitedString(genename, ':', blastpTarget, 2);
     //hPrintf("<B>Query:</B> %s<BR>\n", genename);
 
 
     struct sqlConnection *conn = hAllocConn(database);
 
 
 
     struct sqlResult *srRefSeq;
     char refSeq[] = "refSeq";
     sprintf(query, "select name, cdsStart, cdsEnd,  strand from %s where chrom = '%s' and cdsStart <= %i and cdsEnd >= %i",
-            refSeq, cartOptionalString(cart, "c"),  cartInt(cart, "o"), cartInt(cart, "t"));
+            refSeq, cartOptionalString(cart, "c"),  cartInt(cart,"o"), cartInt(cart, "t"));
     srRefSeq = sqlGetResult(conn, query);
 
     //char queryName[50];
     char **buffer = NULL;
     char **row;
     unsigned int querySeqLength = 0;
     unsigned int queryStart = 0;
     unsigned int queryEnd = 0;
     int postrand = 1;
     if ((row = sqlNextRow(srRefSeq)) != NULL)
     {
         strcpy(genename, row[0]);
         queryStart = strtoul(row[1], buffer, 10);
         queryEnd = strtoul(row[2], buffer, 10);
         querySeqLength = queryEnd - queryStart;
         if (row[3][0] != '+')
             postrand = 0;
     }
     hPrintf("<B>Query:</B> %s<BR>\n", genename);
     hPrintf("<B>Target:</B> %s<BR>\n", blastpTarget[0]);
 
 
     sqlFreeResult(&srRefSeq);
 
     struct sqlResult *srBlastpHits = NULL;
     char blastpHitsTable[] = "blastpHits";
     int start;
     int end;
     if(postrand)
     {
         start = cartInt(cart, "o") - queryStart;
-        end = cartInt(cart, "t") - queryStart;
+        end = cartInt(cart,"t") - queryStart;
     }
     else
     {
 
         start =  queryEnd - cartInt(cart, "t");
         end =  queryEnd - cartInt(cart, "o");
     }
 
 
 
         /* Get species info */
     //sprintf(query, "select * from %s where query = '%s' and target like '%%:%s'", blastpHitsTable, queryName,gene);
     sprintf(query, "select * from %s where query = '%s' and qStart*3 = %d and qEnd*3 = %d and target like '%%:%s'", blastpHitsTable, genename,start, end,blastpTarget[0]);
     //sprintf(query, "select * from %s where query = '%s'", blastpHitsTable, queryName);
     srBlastpHits = sqlGetResult(conn, query);
 
 
     struct blastTab *blastpHits = NULL;
     if ((row = sqlNextRow(srBlastpHits)) != NULL)
     {
         struct blastTab *element;
         element = blastTabLoad(row);
         slAddTail(&blastpHits, element);
     }
     sqlFreeResult(&srBlastpHits);
     if (blastpHits != NULL)
     {
         char *blastpTarget[2];
 
         parseDelimitedString(blastpHits->target, ':', blastpTarget, 2);
         /*
         hPrintf("<B>Start:</B> %d<br>", start);
         hPrintf("<B>End:</B> %d<br>", end);
         hPrintf("<B>qStart:</B> %u<br>", blastpHits->qStart*3);
         hPrintf("<B>qEnd:</B> %u<br>", blastpHits->qEnd*3);*/
         struct minGeneInfo *ginfo;
         ginfo = getGbProtCodeInfo(conn, blastpTarget[0], blastpTarget[1]);
         if(strlen(ginfo->product) > 70)
         {
             hPrintf("<B>Product:</B> %.70s...<BR>",ginfo->product);
         }
         else
         {
             hPrintf("<B>Product:</B> %s<BR>",ginfo->product);
         }
         //hPrintf("<B>Product:</B> %s<BR>\n", ginfo->product);
 
         /*char productquery[512];
         struct sqlResult *srProduct;
         char **product;
         sprintf(productquery, "select product from %s.gbProtCodeXra where name = '%s'",blastpTarget[0], blastpTarget[1]);
         srProduct = sqlGetResult(conn, productquery);
         if ((product = sqlNextRow(srProduct)) != NULL)
             hPrintf("<B>Product:</B> %s<BR>\n", product[0]);
         sqlFreeResult(&srProduct);*/
         char genome[50] = "";
         char clade[50] = "";
         memset(genome, 0, 50);
         memset(clade, 0, 50);
         getGenomeClade(conn, blastpTarget[0], genome, clade);
 
         hPrintf("<B>Organism:</B> %s<br>",genome );
         hPrintf("<B>E-value:</B> e%0.0f<br>", (blastpHits->eValue == 0)? 0 : log(blastpHits->eValue) / log(10));
         hPrintf("<B>Protein identity:</B> %0.1f<BR>\n", blastpHits->identity);
         hPrintf("<B>Percent length:</B> %0.f<BR>\n", ((double) (blastpHits->qEnd - blastpHits->qStart) / ((double) (querySeqLength-3) / 3.0f)) * 100.0f);
         free(blastpTarget[0]);
         free(blastpTarget[1]);
         blastpHits = blastpHits->next;
     }
 
     sqlFreeResult(&srBlastpHits);
     hFreeConn(&conn);
 }
 void blastxTip()
 {
     char query[512];
     char *genename =  cartOptionalString(cart, "i");
 
     char *blastxTarget[2];
     parseDelimitedString(genename, ':', blastxTarget, 2);
 
 
     struct sqlConnection *conn = hAllocConn(database);
     //hPrintf("<B>Query:</B> %s<BR>\n", genome);
 
     char *lookuptable;
 
 
     if(hTableExists(database,"igenics"))
     {
 
         lookuptable = "igenics";
     }
     else if(hTableExists(database,"scaffolds"))
     {
         lookuptable = "scaffolds";
     }
     else
     {
         hFreeConn(&conn);
         return;
     }
 
     sprintf(query, "select name, chromStart, chromEnd,  strand from %s where chrom = '%s' and chromStart <= %i and chromEnd >= %i",
             lookuptable, cartOptionalString(cart, "c"),  cartInt(cart, "o"), cartInt(cart, "t"));
     struct sqlResult *srRefSeq;
     srRefSeq = sqlGetResult(conn, query);
 
 
     //char queryName[50];
     char **buffer = NULL;
     char **row;
     unsigned int querySeqLength = 0;
     unsigned int queryStart = 0;
     unsigned int queryEnd = 0;
     int postrand = 1;
     if ((row = sqlNextRow(srRefSeq)) != NULL)
     {
         strcpy(genename, row[0]);
         queryStart = strtoul(row[1], buffer, 10);
         queryEnd = strtoul(row[2], buffer, 10);
         querySeqLength = queryEnd - queryStart;
         //hPrintf("<B>Query:</B> %s<BR>\n", genename);
         if (row[3][0] != '+')
             postrand = 0;
     }
 
     hPrintf("<B>Target:</B> %s<BR>\n", blastxTarget[0]);
     sqlFreeResult(&srRefSeq);
 
 
     char blastxHitsTable[] = "blastxHits";
     int start;
     int end;
     int revstart;
     int revend;
     if(postrand)
     {
         start = cartInt(cart, "o") - queryStart;
         end = cartInt(cart, "t") - queryStart;
         revstart = cartInt(cart, "t") - queryStart-1;
         revend = cartInt(cart, "o") - queryStart+1;
     }
     else
     {
         start =  queryEnd - cartInt(cart, "t");
         end =  queryEnd - cartInt(cart, "o");
         revstart =  queryEnd - cartInt(cart, "o")-1;
         revend =  queryEnd - cartInt(cart, "t")+1;
     }
 
 
     sprintf(query, "select * from %s where query = '%s' and ((qStart = %d and qEnd = %d) or (qStart = %d and qEnd = %d)) and target like '%%:%s'", blastxHitsTable, genename,start,end,revstart, revend,blastxTarget[0]);
     //sprintf(query, "select * from %s where query = '%s'", blastxHitsTable,genename);
 
     struct sqlResult *srBlastxHits;
     srBlastxHits = sqlGetResult(conn, query);
 
     struct blastTab *blastxHits = NULL;
     if ((row = sqlNextRow(srBlastxHits)) != NULL)
     {
         //hPrintf("**");
         struct blastTab *element;
         element = blastTabLoad(row);
         slAddTail(&blastxHits, element);
     }
     sqlFreeResult(&srBlastxHits);
 
 
 
 
     unsigned int targetProteinStart = 0;
     unsigned int targetProteinEnd = 0;
     unsigned int hitStart = 0;
     unsigned int hitEnd = 0;
     if (blastxHits != NULL)
     {
         char *blastxTarget[2];
 
         parseDelimitedString(blastxHits->target, ':', blastxTarget, 2);
         struct minGeneInfo *ginfo;
 
         ginfo = getGbProtCodeInfo(conn, blastxTarget[0], blastxTarget[1]);
 
         if(strlen(ginfo->product) > 70)
         {
             hPrintf("<B>Product:</B> %.70s...<BR>",ginfo->product);
         }
         else
         {
             hPrintf("<B>Product:</B> %s<BR>",ginfo->product);
         }
 //        hPrintf("<B>Product:</B> %s<BR>\n", ginfo->product);
         char genome[50] = "";
         char clade[50] = "";
         memset(genome, 0, 50);
         memset(clade, 0, 50);
         getGenomeClade(conn, blastxTarget[0], genome, clade);
         struct sqlResult *sr;
         if (hDbExists(blastxTarget[0]) && hTableExists(blastxTarget[0], "refSeq"))
         {
             sprintf(query, "select chrom, cdsStart, cdsEnd from %s.%s where name = '%s'",
                     blastxTarget[0],"refSeq", blastxTarget[1]);
             sr = sqlGetResult(conn, query);
             if ((row = sqlNextRow(sr)) != NULL)
             {
                 targetProteinStart = strtoul(row[1], buffer, 10);
                 targetProteinEnd = strtoul(row[2], buffer, 10);
                 hitStart = targetProteinStart + blastxHits->tStart * 3 + 1;
                 hitEnd = targetProteinStart + blastxHits->tEnd * 3;
             }
             else
                 printf("<td>%s</td>\n", blastxTarget[1]);
             sqlFreeResult(&sr);
         }
 
         hPrintf("<B>Organism:</B> %s<br>",genome );
         hPrintf("<B>E-value:</B> e%0.0f<br>", (blastxHits->eValue == 0)? 0 : log(blastxHits->eValue) / log(10));
         hPrintf("<B>Protein identity:</B> %0.1f<BR>\n", blastxHits->identity);
         //hPrintf("<B>Percent length:</B> %0.f<BR>\n", ((double) (blastxHits->qEnd - blastxHits->qStart) / ((double) (querySeqLength-3) / 3.0f)) * 100.0f);
         hPrintf("<B>Percent length:</B> %0.f<BR>\n", ((double) (blastxHits->tEnd - blastxHits->tStart) / ((double) (targetProteinEnd - targetProteinStart -3) / 3.0f)) * 100.0f);
         free(blastxTarget[0]);
         free(blastxTarget[1]);
         blastxHits = blastxHits->next;
     }
     hFreeConn(&conn);
 }
 void lowelabPfamHitsTip()
 {
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
-    int end = cartInt(cart, "t");
+    int end = cartInt(cart,"t");
     struct sqlResult *sr;
     char **row;
     char query[256];
     int rowOffset;
     struct lowelabPfamHits *infoload;
     struct sqlConnection *conn = hAllocConn(database);
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
     sr = sqlGetResult(conn, query);
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = lowelabPfamHitsLoad(row+rowOffset);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         hPrintf("<B>Identity:</B> %d%%<BR>\n", infoload->ident);
         hPrintf("<B>Percent length:</B> %d%%<BR>\n", infoload->percLen);
 
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 void TrnasTip()
 {
     struct sqlConnection *conn = hAllocConn(database);
-    char *track =  cartOptionalString(cart, "g");
+    char *track =  cartOptionalString(cart,"g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
     int end = cartInt(cart, "t");
     struct sqlResult *sr;
     char **row;
     char query[256];
     int rowOffset;
     struct tRNAs *infoload;
 
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
     sr = sqlGetResult(conn, query);
     rowOffset = hOffsetPastBin(database, seqName, track);
 
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = tRNAsLoad(row+rowOffset);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         hPrintf("<B>Amino Acid:</B> %s<BR>\n", infoload->aa);
         hPrintf("<B>Anticodon:</B> %s<BR>\n", infoload->ac);
         hPrintf("<B>Score:</B> %f<BR>\n", infoload->trnaScore);
 
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 void MultizTip()
 {
     hPrintf("<B>Name:</B> %s","MultiZ Alignment Track");
 }
 void SnornaTip()
 {
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
     int end = cartInt(cart, "t");
     struct sqlResult *sr;
     char **row;
     char query[256];
     int rowOffset;
     struct snoRNAs *infoload;
     struct sqlConnection *conn = hAllocConn(database);
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
     sr = sqlGetResult(conn, query);
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = snoRNAsLoad(row+rowOffset);
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         hPrintf("<B>snoScore:</B> %f<BR>\n", infoload->snoScore);
         hPrintf("<B>hmmScore:</B> %f<BR>\n", infoload->hmmScore);
         hPrintf("<B>C box:</B> %s<BR>\n", infoload->cBox);
         hPrintf("<B>D box:</B> %s<BR>\n", infoload->dBox);
         hPrintf("<B>C-Prime box:</B> %s<BR>\n", infoload->cpBox);
         hPrintf("<B>D-Prime box:</B> %s<BR>\n", infoload->dpBox);
 
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 void tigrCmrTip()
 {
     struct sqlConnection *conn = hAllocConn(database);
 
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
-    int end = cartInt(cart, "t");
+    int end = cartInt(cart,"t");
 
 
     char query[256];
 
 
 
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
 
     int rowOffset;
     struct sqlResult *sr;
     char **row;
     struct tigrCmrGene *infoload;
     sr = sqlGetResult(conn, query);
 
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = tigrCmrGeneLoad(row+0);
 
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         hPrintf("<B>Common Name:</B> %s<BR>\n", infoload->tigrCommon);
         if(infoload->tigrMainRole[0] != '\0')
         {
             hPrintf("<B>Main Role:</B> %s<BR>\n", infoload->tigrMainRole);
             if(infoload->tigrSubRole[0] != '\0')
             {
                 hPrintf("<B>Sub Role:</B> %s<BR>\n", infoload->tigrSubRole);
             }
         }
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }
 /*void allpredictionsTip()
 {
     struct sqlConnection *conn = hAllocConn(database);
 
     char *track =  cartOptionalString(cart, "g");
     char *seqName =  cartOptionalString(cart, "c");
     char *itemName =  cartOptionalString(cart, "i");
     int start = cartInt(cart, "o");
     int end = cartInt(cart, "t");
 
 
     char query[256];
 
-    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", track, itemName,seqName,start, end);
+    sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d;", track, itemName,seqName,start, end);
 
     int rowOffset;
     struct sqlResult *sr;
     char **row;
     struct allpredictions *infoload;
     sr = sqlGetResult(conn, query);
 
     rowOffset = hOffsetPastBin(database, seqName, track);
     if ((row = sqlNextRow(sr)) != NULL)
     {
         infoload = allpredictionsLoad(row+1);
 
         hPrintf("<B>Name:</B> %s<BR>\n", infoload->name);
         hPrintf("<B>Sources:</B> %s<BR>\n", infoload->source);
     }
     sqlFreeResult(&sr);
     hFreeConn(&conn);
 }*/
 void anyGeneQuery()
 {
     hPrintf("<B>Name:</B> %s",cartOptionalString(cart, "i"));
 }
 void customGeneQuery()
 {
     char* name = cartOptionalString(cart, "i");
     char *parts[2];
     parseDelimitedString(name, ' ', parts, 2);
     hPrintf("<B>Name:</B> %s",parts[1]);
     free(parts[0]);
     free(parts[1]);
 }
-
+//This is a debugging function that runs a incorrect SQL query
+//Use this for testing error handling
+void badgenequery()
+{
+	char query[256];
+	struct sqlConnection *conn = hAllocConn(database);
+	sprintf(query, "select * from mgComsmonDb.cddDesc where accession = 'foo'");
+	sqlGetResult(conn, query);
+}
 void ToolTipQuery()
 {
     char *track =  cartOptionalString(cart, "g");
     //char *dataset = cgiString("g");
     //printf("**%s**\n", track);
+    //badgenequery();
     if (sameString(track, "refSeq"))
         toolTipGeneQuery();
-    if (startsWith("ct_UserTrack", track)) // ct_UserTrack_3545
+    else if (startsWith("ct_UserTrack", track)) // ct_UserTrack_3545
         customGeneQuery();
     else if (sameString(track, "cddInfo"))
         cddInfoTip();
     else if (sameString(track, "gc20Base"))
         gcPercentTip();
     else if (startsWith("BlastP_", track))
         blastpTip();
     else if (startsWith("BlastX_", track))
         blastxTip();
     else if (sameString("lowelabPfamHits", track))
         lowelabPfamHitsTip();
     else if (sameString("tRNAs", track))
         TrnasTip();
     else if (startsWith("multiz", track))
         MultizTip();
     else if (sameString("snoRNAs", track))
         SnornaTip();
     else if (sameString("tigrCmrORFs", track))
         tigrCmrTip();
     else if (sameString("alignInfo", track))
         alignInfoTip();
     else if (sameString("arCOGs", track))
         arCOGTip();
     else if (sameString("megablastInfo", track) || sameWord(track,"vecScreenInfo"))
         megablastInfoTip();
     else
         anyGeneQuery();
 
 }
 
 
 void cartDoMiddle(struct cart *theCart)
 /* Save cart*/
 {
     cart = theCart;
     getDbAndGenome(cart, &database, &organism, oldVars);
     ToolTipQuery();
 }
 
 char *excludeVars[] = {"hgSeq.revComp", "bool.hcg.dna.rc", "Submit", "submit", "g", "i", "aliTrack", "addp", "pred", NULL};
 int main(int argc, char *argv[])
 {
     cgiSpoof(&argc,argv);
     //dispatchRoutines();
-    cartEmptyShell(cartDoMiddle, hUserCookie(), excludeVars, NULL);
+    //cartEmptyShell(cartDoMiddle, hUserCookie(), excludeVars, NULL);
+    
+    cart = cartAndCookie(hUserCookie(), excludeVars, NULL);
+    cartDoMiddle(cart);
+    
     //printf("Hello, world!\n");
 
     return 0;
 }