1888f6dd81f220f2ccd0e49c9b8a9a817ae0618c kate Thu Nov 10 15:59:18 2016 -0800 Cleanup C code. refs #17369 diff --git src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c index 285e616..8d33927 100644 --- src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c +++ src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c @@ -1,451 +1,340 @@ -/* hgGtexTrackSettings: Configure GTEx track +/* 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 "gtexUi.h" - -/* TODO: prune */ -#include "cartJson.h" #include "cheapcgi.h" -#include "errCatch.h" -#include "googleAnalytics.h" +#include "web.h" #include "hCommon.h" -#include "hgConfig.h" -#include "hdb.h" -#include "htmshell.h" -#include "hubConnect.h" #include "hui.h" -#include "jsHelper.h" -#include "jsonParse.h" -#include "obscure.h" // for readInGulp -#include "web.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 *tdb = NULL; - -static void doCartJson() -/* Perform UI commands to update the cart and/or retrieve cart vars & metadata. */ -{ -struct cartJson *cj = cartJsonNew(cart); -//e.g. cartJsonRegisterHandler(cj, "setTaxId", setTaxId); -cartJsonExecute(cj); -} - -static void doJsIncludes() -/* Include JS libraries. From hgGateway (think about libifying) */ -{ -//puts(""); -//puts(""); -//puts(""); -puts(""); - -webIncludeResourceFile("jquery-ui.css"); -jsIncludeFile("jquery-ui.js", NULL); -jsIncludeFile("jquery.watermarkinput.js", NULL); -jsIncludeFile("utils.js",NULL); -} +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" -, tdb->shortLabel, assembly, tdb->longLabel); - -puts( -" " -" " -"
" -"
" -"
" -"
GO
" -" " -"
" -"
" -"
" -); -} - -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", tdb->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; - +, trackDb->shortLabel, assembly, trackDb->longLabel); puts( - " " - "
" - "
Tissues
" - "
" - " Click label below or in Body Map to set or clear a tissue" - "
" - "
" - "
set all
" - "
clear all
" - "
" - "
" - ); - -puts(""); -puts(""); -for (tis = tissues; tis != NULL; tis = tis->next) - { - if (tis->id < last) - i = tis->id * 2; - else - i = (tis->id - last) * 2 + 1; - tisTable[i] = tis; - } -boolean all = (hashNumEntries(selectedHash) == 0) ? TRUE : FALSE; -for (i=0; iname) != NULL); - printf("" - ""); - col++; - if (col > cols-1) - { - puts("\n"); - col = 0; - } - } -puts("\n"); -puts("
%s", - isChecked ? "" : "tissueNotSelectedColor", tis->color, - isChecked ? tis->color : 0xFFFFFF, tis->color, - isChecked ? "tissueSelected" : "", tis->name, tis->description); - - printf("", - var, tis->name, isChecked ? "checked" : ""); - puts("
"); -char buf[512]; -safef(buf, sizeof(buf), "%s%s.%s", cgiMultListShadowPrefix(), tdb->track, GTEX_TISSUE_SELECT); -cgiMakeHiddenVar(buf, "0"); +" \n" +" \n" +"
\n" +"
\n" +"
GO
\n" +" \n" +"
\n" +"
\n" +" \n"); } static void printBodyMap() { puts( -" " -" " -" Body Map illustration not found" -" " -); +" \n" +" \n" +" Body Map illustration not found\n" +" \n"); } static void printVisSelect() +/* Track visibility dropdown */ { -enum trackVisibility vis = tdb->visibility; -vis = hTvFromString(cartUsualString(cart, tdb->track, hStringFromTv(vis))); +enum trackVisibility vis = trackDb->visibility; +vis = hTvFromString(cartUsualString(cart, trackDb->track, hStringFromTv(vis))); boolean canPack = TRUE; -hTvDropDownClassVisOnlyAndExtra(tdb->track, vis, canPack, "gbSelect normalText visDD", - trackDbSetting(tdb, "onlyVisibility"), NULL); +hTvDropDownClassVisOnlyAndExtra(trackDb->track, vis, canPack, "gbSelect normalText visDD", + trackDbSetting(trackDb, "onlyVisibility"), NULL); } -static void printConfigPanel() -/* Controls for track configuration (except for tissues) */ +static void printScoreFilter(struct cart *cart, char *track) +/* Filter on overall gene expression score */ { -char cartVar[1024]; 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); +} -char *track = tdb->track; - +static void printConfigPanel() +/* Controls for track configuration (except for tissues) */ +{ +char *track = trackDb->track; puts( " \n" - -/* Blue section header and track vis dropdown */ "
\n" "
Configuration
\n" -"
\n" -); +"
\n"); + +/* Track vis dropdown */ printVisSelect(); puts( "
\n" -); -puts( -"
\n" -); +"
\n"); -/* First row of config controls */ +/* GTEx-specific track controls, layout in 3 rows */ puts( " \n" "
\n" - -/* Gene labels */ "
\n" -"Label:  " -); -char *geneLabel = cartUsualStringClosestToHome(cart, tdb, isNameAtParentLevel(tdb, track), - GTEX_LABEL, GTEX_LABEL_DEFAULT); -safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_LABEL); -cgiMakeRadioButton(cartVar, GTEX_LABEL_SYMBOL , sameString(GTEX_LABEL_SYMBOL, geneLabel)); -printf("%s ", "gene symbol"); -cgiMakeRadioButton(cartVar, GTEX_LABEL_ACCESSION, sameString(GTEX_LABEL_ACCESSION, geneLabel)); -printf("%s ", "accession"); -cgiMakeRadioButton(cartVar, GTEX_LABEL_BOTH, sameString(GTEX_LABEL_BOTH, geneLabel)); -printf("%s ", "both"); -puts( -"
\n" - -/* Show exons in gene model */ -"
\n" -); -puts("Show GTEx gene model\n"); -safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_SHOW_EXONS); -boolean showExons = cartCgiUsualBoolean(cart, cartVar, GTEX_SHOW_EXONS_DEFAULT); -cgiMakeCheckBox(cartVar, showExons); +"Label:  "); +gtexGeneUiGeneLabel(cart, track, trackDb); puts( "
\n" -); +"
\n"); +gtexGeneUiGeneModel(cart, track, trackDb); puts( "
\n" -); - -/* Row 2 */ +"
\n"); puts( " \n" "
\n" -); - -/* Log transform. When selected, the next control (view limits max) is disabled */ +"
\n"); +gtexGeneUiLogTransform(cart, track, trackDb); puts( -"
\n" -); -puts("Log10 transform:\n"); -safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_LOG_TRANSFORM); -boolean isLogTransform = cartCgiUsualBoolean(cart, cartVar, GTEX_LOG_TRANSFORM_DEFAULT); -safef(buf, sizeof buf, "onchange='gtexTransformChanged(\"%s\")'", track); -cgiMakeCheckBoxJS(cartVar, isLogTransform, buf); +"
\n"); +puts( +"
\n"); +gtexGeneUiViewLimits(cart, track, trackDb); puts( "
\n" -); -/* Viewing limits max. This control is disabled if log transform is selected */ -// construct class so JS can toggle +"
\n"); puts( -"
\n" -); -safef(buf, sizeof buf, "%sViewLimitsMaxLabel %s", track, isLogTransform ? "disabled" : ""); -printf("View limits maximum:\n", buf); -safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_MAX_LIMIT); -int viewMax = cartCgiUsualInt(cart, cartVar, GTEX_MAX_LIMIT_DEFAULT); -cgiMakeIntVarWithExtra(cartVar, viewMax, 4, isLogTransform ? "disabled" : ""); -char *version = gtexVersion(tdb->table); -printf(" RPKM (range 0-%d)\n", buf, round(gtexMaxMedianScore(version))); +" \n" +"
\n"); puts( -"
\n" -); +"
\n"); +gtexGeneUiCodingFilter(cart, track, trackDb); puts( -"
\n" -); +"
\n"); -/* Row 3 */ +/* Filter on score */ puts( -" \n" -"
\n" -); -/* Filter on coding genes */ +"
\n"); +printScoreFilter(cart, track); puts( -"
\n" -); -puts("Limit to protein coding genes:\n"); -safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_CODING_GENE_FILTER); -boolean isCodingOnly = cartCgiUsualBoolean(cart, cartVar, GTEX_CODING_GENE_FILTER_DEFAULT); -cgiMakeCheckBox(cartVar, isCodingOnly); +"
\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" + "
set all
\n" + "
clear all
\n" + "
\n" "
\n" ); -/* Filter on score */ puts( -"
\n" -); -puts(" Limit to genes scored at or above:\n"); -safef(buf, sizeof(buf), "%s.%s", tdb->track, SCORE_FILTER); -int score = cartUsualInt(cart, buf, 0); -int minScore = 0, maxScore = 1000; -cgiMakeIntVarWithLimits(buf, score, "Minimum score", 0, minScore, maxScore); +"\n"); +puts( +"\n"); +for (tis = tissues; tis != NULL; tis = tis->next) + { + if (tis->id < last) + i = tis->id * 2; + else + i = (tis->id - last) * 2 + 1; + tisTable[i] = tis; + } +boolean all = (hashNumEntries(selectedHash) == 0) ? TRUE : FALSE; +for (i=0; iname) != NULL); printf( - " (range %d-%d)\n", - minScore, maxScore); + "\n", + isChecked ? tis->color : 0xFFFFFF, tis->color); + printf( + ""); + col++; + if (col > cols-1) + { + puts("\n"); + col = 0; + } + } puts( -" \n" -); +"\n"); puts( -" \n" -); +"
color); + printf( + "style='background-color: #%06X;" + "border-style: solid; border-width: 2px;" + "border-color: #%06X;'>%s", + isChecked ? "tissueSelected" : "", tis->name, tis->description); + printf( + "", + var, tis->name, isChecked ? "checked" : ""); puts( -" \n" -); + "
"); +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" -); - -// TODO: remove bodyMap id here -puts( -"
\n" -); +"
\n"); printBodyMap(); puts( "
\n" -); -puts( -"
\n" -); +"
\n"); printConfigPanel(); printTissueTable(); puts( "
\n" -); -puts( -"
\n" -); +"
\n"); } static void printTrackDescription() { -puts(""); -puts("
"); -puts("
Track Description
"); -puts(""); -puts("
"); -if (tdb->html != NULL) - { - puts("
"); - puts("
"); -puts(tdb->html); +puts( +"\n" +"
\n" +"
Track Description
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n"); +puts(trackDb->html); +puts( +"
\n" +"
\n"); } -puts("
"); -puts("
"); + +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); +sqlDisconnect(&conn); +return tdb; } -static void doMainPage() -/* Send HTML with javascript to bootstrap the user interface. */ +static void doMiddle(struct cart *theCart) +/* Send HTML with javascript to display the user interface. */ { -// Start web page with new banner +cart = theCart; +// Start web page with new-style header webStartJWestNoBanner(cart, db, "Genome Browser GTEx Track Settings"); -puts(""); -puts(""); +puts(""); +puts(""); char *genome = NULL, *clade = NULL; -// char *chromosome = cartUsualString(cart, "c", hDefaultChrom(database)); -//char *track = cartString(cart, "g"); 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); -// Check if this is an assembly with GTEx track -struct sqlConnection *conn = sqlConnect(db); -if (conn == NULL) - errAbort("Can't connect to database %s\n", db); - -char *table = "gtexGene"; -version = gtexVersion(table); - -// TODO: use hdb, hTrackDbList to get table names of trackDb, -tdb = trackDbLoadWhere(conn, "trackDb", "tableName = 'gtexGene'"); -sqlDisconnect(&conn); -if (!tdb) - errAbort("No GTEx track found in database %s\n", db); +// Container for bootstrap grid layout +puts( +"
\n"); -printf("
\n\n", +// Print form with configuration HTML, and track description +printf( +"\n\n", hgTracksName(), cartUsualString(cart, "formMethod", "POST")); -puts( - "
\n" -); printTrackHeader(); printTrackConfig(); puts( - "" -); - +""); +if (trackDb->html) printTrackDescription(); -puts("
"); - -// end panel, section and body layout container - -// Track description - -// JS libraries -doJsIncludes(); +puts( +"
"); -// Main JS +// Initialize illustration display and handle mouseover and clicks puts(""); webIncludeFile("inc/jWestFooter.html"); - webEndJWest(); } -void doMiddle(struct cart *theCart) -/* Display the main page or execute a command and update the page */ -{ -cart = theCart; -if (cgiOptionalString(CARTJSON_COMMAND)) - doCartJson(); -else - doMainPage(); -} - int main(int argc, char *argv[]) /* Process CGI / command line. */ { -/* Null terminated list of CGI Variables we don't want to save - * permanently. */ +/* Null terminated list of CGI Variables we don't want to save to cart */ /* TODO: check these */ -char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,}; -//char *excludeVars[] = {CARTJSON_COMMAND, NULL}; +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; }