747eae7a2f3f12196fe59f6b2340f2c61eedac45
kate
Tue Nov 15 14:44:59 2016 -0800
Add last updated and schema link. refs #17369
diff --git src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c
index 060c1d5..cbb7ff9 100644
--- src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c
+++ src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c
@@ -1,339 +1,370 @@
/* hgGtexTrackSettings: Configure GTEx track, with tissues selected from Body Map or list
*
* Copyright (C) 2016 The Regents of the University of California
*/
#include "common.h"
#include "trackDb.h"
#include "cart.h"
#include "portable.h"
#include "cheapcgi.h"
#include "web.h"
#include "hCommon.h"
#include "hui.h"
#include "gtexUi.h"
#include "gtexInfo.h"
#include "gtexTissue.h"
/* Global Variables */
struct cart *cart = NULL; /* CGI and other variables */
struct hash *oldVars = NULL; /* Old contents of cart before it was updated by CGI */
char *db = NULL;
char *version; /* GTEx release */
struct trackDb *trackDb = NULL;
static void printTrackHeader()
/* Print top banner with track labels */
// TODO: Try to simplify layout
{
char *assembly = stringBetween("(", ")", hFreezeFromDb(db));
puts(
" \n"
"
\n"
"
\n"
);
printf(
"
\n"
" %s Track\n"
" %s \n"
" \n"
" %s \n"
, trackDb->shortLabel, assembly, trackDb->longLabel);
puts(
-"
\n"
+"
\n"
"
\n"
"
\n"
"
\n");
}
static void printBodyMap()
{
puts(
" \n"
" \n"
" GTEx Body Map illustration not found\n"
" \n");
}
static void printVisSelect()
/* Track visibility dropdown */
{
enum trackVisibility vis = trackDb->visibility;
vis = hTvFromString(cartUsualString(cart, trackDb->track, hStringFromTv(vis)));
boolean canPack = TRUE;
hTvDropDownClassVisOnlyAndExtra(trackDb->track, vis, canPack, "gbSelect normalText visDD",
trackDbSetting(trackDb, "onlyVisibility"), NULL);
}
static void printScoreFilter(struct cart *cart, char *track)
/* Filter on overall gene expression score */
{
char buf[512];
puts("Limit to genes scored at or above: \n");
safef(buf, sizeof(buf), "%s.%s", trackDb->track, SCORE_FILTER);
int score = cartUsualInt(cart, buf, 0);
int minScore = 0, maxScore = 1000;
cgiMakeIntVarWithLimits(buf, score, "Minimum score", 0, minScore, maxScore);
printf(
" (range %d-%d)\n", minScore, maxScore);
}
static void printConfigPanel()
/* Controls for track configuration (except for tissues) */
{
char *track = trackDb->track;
puts(
" \n"
" \n"
"
Configuration
\n"
"
\n");
/* Track vis dropdown */
printVisSelect();
puts(
"
\n"
"
\n");
/* GTEx-specific track controls, layout in 3 rows */
puts(
" \n"
" \n"
"
\n");
gtexGeneUiGeneLabel(cart, track, trackDb);
puts(
"
\n"
"
\n");
gtexGeneUiGeneModel(cart, track, trackDb);
puts(
"
\n"
"
\n");
puts(
" \n"
" \n"
"
\n");
gtexGeneUiLogTransform(cart, track, trackDb);
puts(
"
\n");
puts(
"
\n");
gtexGeneUiViewLimits(cart, track, trackDb);
puts(
"
\n"
"
\n");
puts(
" \n"
" \n");
puts(
"
\n");
gtexGeneUiCodingFilter(cart, track, trackDb);
puts(
"
\n");
/* Filter on score */
puts(
"
\n");
printScoreFilter(cart, track);
puts(
"
\n"
"
\n");
puts(
" \n");
}
static void printTissueTable()
/* Output HTML with tissue labels and colors, in 2 columns, to fit next to body map */
{
struct gtexTissue *tis, *tissues = gtexGetTissues(version);
char var[512];
safef(var, sizeof var, "%s.%s", trackDb->track, GTEX_TISSUE_SELECT);
struct hash *selectedHash = cartHashList(cart, var);
struct gtexTissue **tisTable = NULL;
int count = slCount(tissues);
AllocArray(tisTable, count);
int i=0, col=0;
int cols = 2;
int last = count/2 + 1;
puts(
" \n"
"\n"
"
Tissues
\n"
"
\n"
" Click label below or in Body Map to set or clear a tissue\n"
"
\n"
"
\n"
"
\n"
);
puts(
"");
char buf[512];
safef(buf, sizeof(buf), "%s%s.%s", cgiMultListShadowPrefix(), trackDb->track, GTEX_TISSUE_SELECT);
cgiMakeHiddenVar(buf, "0");
}
static void printTrackConfig()
/* Print track configuration panels, including Body Map.
The layout is 2-column. Left column is body map SVG.
Right column has a top panel for configuration settings (non-tissue),
and a lower panel with a tissue selection list.
*/
{
puts(
"\n"
" \n"
"
\n");
printBodyMap();
puts(
"
\n"
"
\n");
printConfigPanel();
printTissueTable();
puts(
"
\n"
"
\n");
}
+static void printDataInfo()
+{
+puts(
+" \n"
+" \n"
+"
Data Information
\n"
+"
\n"
+"
\n"
+);
+puts(
+" \n"
+"
\n");
+puts("
");
+printUpdateTime(db, trackDb, NULL);
+puts("
");
+
+puts("
");
+makeSchemaLink(db, trackDb, "View table schema");
+puts("
");
+
+puts(
+"
\n"
+"
\n");
+}
+
static void printTrackDescription()
{
puts(
" \n"
" \n"
"
Track Description
\n"
"
\n"
"
\n"
" \n"
"
\n");
puts(trackDb->html);
puts(
"
\n"
"
\n");
}
static struct trackDb *getTrackDb(char *database, char *track)
/* Check if this is an assembly with GTEx track and get trackDb */
{
struct sqlConnection *conn = sqlConnect(db);
if (conn == NULL)
errAbort("Can't connect to database %s\n", db);
char where[256];
safef(where, sizeof(where), "tableName='%s'", track);
// TODO: use hdb, hTrackDbList to get table names of trackDb,
struct trackDb *tdb = trackDbLoadWhere(conn, "trackDb", where);
+trackDbAddTableField(tdb);
sqlDisconnect(&conn);
return tdb;
}
static void doMiddle(struct cart *theCart)
/* Send HTML with javascript to display the user interface. */
{
cart = theCart;
// Start web page with new-style header
webStartJWestNoBanner(cart, db, "Genome Browser GTEx Track Settings");
puts(" ");
puts(" ");
char *genome = NULL, *clade = NULL;
getDbGenomeClade(cart, &db, &genome, &clade, oldVars);
char *track = cartString(cart, "g");
trackDb = getTrackDb(db, track);
if (!trackDb)
errAbort("No GTEx track %s found in database %s\n", track, db);
version = gtexVersion(track);
// Container for bootstrap grid layout
puts(
"\n");
// Print form with configuration HTML, and track description
printf(
"");
+printDataInfo();
if (trackDb->html)
printTrackDescription();
puts(
"
");
// Initialize illustration display and handle mouseover and clicks
puts("");
webIncludeFile("inc/jWestFooter.html");
webEndJWest();
}
int main(int argc, char *argv[])
/* Process CGI / command line. */
{
/* Null terminated list of CGI Variables we don't want to save to cart */
/* TODO: check these */
char *excludeVars[] = {"submit", "Submit", "g", NULL};
long enteredMainTime = clock1000();
cgiSpoof(&argc, argv);
oldVars = hashNew(10);
cartEmptyShellNoContent(doMiddle, hUserCookie(), excludeVars, oldVars);
cgiExitTime("hgGtexTrackSettings", enteredMainTime);
return 0;
}