b423dda290a9461dd3f41ec127031cc6acfb8c91
Merge parents a8ad5a3 1d7c00a
kate
  Tue Jul 7 11:25:21 2015 -0700
Merge branch 'master' into gtex

diff --cc src/hg/hgc/hgc.c
index 9848c5d,6b58cb4..dc348fb
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@@ -24445,119 -24443,52 +24445,126 @@@
  {
  char *table = cartString(cart, "table");
  struct trackDb *tdb = hashFindVal(trackHash, table);
  if (tdb == NULL)
      errAbort("no trackDb entry for %s", table);
  return tdb;
  }
  
  void doQPCRPrimers(struct trackDb *tdb, char *itemName)
  /* Put up page for QPCRPrimers. */
  {
  genericHeader(tdb, itemName);
  doBedDetail(tdb, NULL, itemName);
  } /* end of doQPCRPrimers */
  
 +void doGtexGeneExpr(struct trackDb *tdb, char *item)
 +/* Details of GTEX gene expression item */
 +{
 +// Load item from table */
 +
 +// TODO:  Get full details from Data table 
 +struct dyString *dy = dyStringNew(0);
 +//char sampleTable[128];
 +//safef(sampleTable, sizeof(able), "%sSampleData", tdb->table);
 +
 +struct sqlConnection *conn = hAllocConn(database);
 +char **row;
 +struct gtexGeneBed *gtexGene = NULL;
 +int expCount = 0;
 +if (sqlTableExists(conn, tdb->table))
 +    {
 +    char query[512];
 +    sqlSafef(query, sizeof(query), "select * from %s where name = '%s'", tdb->table, item);
 +    struct sqlResult *sr = sqlGetResult(conn, query);
 +    row = sqlNextRow(sr);
 +    if (row != NULL)
 +        {
 +        gtexGene = gtexGeneBedLoad(row);
 +        expCount = gtexGene->expCount;
 +        }
 +    sqlFreeResult(&sr);
 +    }
 +hFreeConn(&conn);
 +
 +genericHeader(tdb, item);
 +
 +if (gtexGene != NULL)
 +    {
 +    printf("<b>Gene name:</b> %s<br>\n", gtexGene->name);
 +    printf("<b>Ensembl gene:</b> %s<br>\n", gtexGene->geneId);
 +    printf("<b>Ensembl transcript:</b> %s<br>\n", gtexGene->transcriptId);
 +    }
 +printTrackHtml(tdb);
 +
 +// Print out tissue table with color assignments
 +conn = hAllocConn("hgFixed");
 +char *tissueTable = "gtexTissue";
 +if (sqlTableExists(conn, tissueTable))
 +    {
 +    dyStringPrintf(dy, "<table>");
 +    dyStringPrintf(dy, "<tr><td><b>Color<b></td><td><b>Tissue<b></td></tr>\n");
 +    int i;
 +    double invExpCount = 1.0/expCount;
 +    char query[512];
 +    sqlSafef(query, sizeof(query), "select * from %s", tissueTable);
 +    struct sqlResult *sr = sqlGetResult(conn, query);
 +    for (i=0; i<expCount; i++)
 +        {
 +        row = sqlNextRow(sr);
 +        if (row == NULL)
 +            break;
 +        struct gtexTissue *tissue = gtexTissueLoad(row);
 +        double colPos = invExpCount * i;
 +        struct rgbColor color = saturatedRainbowAtPos(colPos);
 +        dyStringPrintf(dy, "<tr><td bgcolor='#%02X%02X%02X'></td><td>%s</td></tr>\n",
 +                    color.r, color.g, color.b, tissue->description);
 +        }
 +    sqlFreeResult(&sr);
 +    }
 +hFreeConn(&conn);
 +dyStringPrintf(dy, "</table>");
 +puts(dy->string);
 +
 +//cartWebStart(cart, database, "List of items assayed in %s", clusterTdb->shortLabel);
 +
 +//genericClickHandlerPlus(tdb, item, item, dy->string);
 +dyStringFree(&dy);
 +}
 +
  void doSnakeClick(struct trackDb *tdb, char *itemName)
  /* Put up page for snakes. */
  {
  genericHeader(tdb, itemName);
  char *otherSpecies = trackHubSkipHubName(tdb->table) + strlen("snake");
  char *hubName = cloneString(database);
- char *ptr = strchr(hubName + 4, '_');
- *ptr = 0;
  char otherDb[4096];
  char *qName = cartOptionalString(cart, "qName");
  int qs = atoi(cartOptionalString(cart, "qs"));
  int qe = atoi(cartOptionalString(cart, "qe"));
  int qWidth = atoi(cartOptionalString(cart, "qWidth"));
- safef(otherDb, sizeof otherDb, "%s_%s", hubName, otherSpecies);
  
+ if(trackHubDatabase(database))
+     {
+     char *ptr = strchr(hubName + 4, '_');
+     *ptr = 0;
+     safef(otherDb, sizeof otherDb, "%s_%s", hubName, otherSpecies);
+     }
+ else
+     {
+     safef(otherDb, sizeof otherDb, "%s", otherSpecies);
+     }
  
  printf("<A HREF=\"hgTracks?db=%s&position=%s:%d-%d&%s_snake%s=full\" TARGET=_BLANK><B>Link to block in other assembly</A><BR>\n", otherDb, qName, qs, qe,hubName,trackHubSkipHubName(database));
  
  int qCenter = (qs + qe) / 2;
  int newQs = qCenter - qWidth/2;
  int newQe = qCenter + qWidth/2;
  printf("<A HREF=\"hgTracks?db=%s&position=%s:%d-%d&%s_snake%s=full\" TARGET=\"_blank\"><B>Link to same window size in other assembly</A><BR>\n", otherDb, qName, newQs, newQe,hubName,trackHubSkipHubName(database));
  } 
  
  bool vsameWords(char *a, va_list args)
  /* returns true if a is sameWord as any arg, all args must be char*  */
  {
  bool found = FALSE;
  char *b;
  while ((b = va_arg(args, char *)) != NULL)