9a3d804d4836f8508ed10a5372e3cc50c4c5ff64 kate Thu Nov 3 20:50:16 2016 -0700 Finish connection to hgTracks; create form and submit button, and get tissues into cart. refs #17369 diff --git src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c index 359410b..520f9c0 100644 --- src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c +++ src/hg/hgGtexTrackSettings/hgGtexTrackSettings.c @@ -1,436 +1,449 @@ /* hgGtexTrackSettings: Configure GTEx track * * 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 "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 "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); } static void printTrackHeader() /* Print top banner with track labels */ { 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; puts( " " "
" "
Tissues
" "
" " Click label below or in Body Map to set or clear a tissue" "
" "
" - "
set all
" - "
clear all
" + "
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); + boolean isChecked = all || (hashLookup(selectedHash, tis->name) != NULL); printf("" - "", + ""); col++; if (col > cols-1) { puts("\n"); col = 0; } } puts("\n"); puts("
%s%s", 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"); } static void printBodyMap() { puts( " " " " " Body Map illustration not found" " " ); } static void printVisSelect() { enum trackVisibility vis = tdb->visibility; vis = hTvFromString(cartUsualString(cart, tdb->track, hStringFromTv(vis))); boolean canPack = TRUE; hTvDropDownClassVisOnlyAndExtra(tdb->track, vis, canPack, "gbSelect normalText visDD", trackDbSetting(tdb, "onlyVisibility"), NULL); } static void printConfigPanel() /* Controls for track configuration (except for tissues) */ { char cartVar[1024]; char buf[512]; char *track = tdb->track; puts( " \n" /* Blue section header and track vis dropdown */ "
\n" "
Configuration
\n" "
\n" ); printVisSelect(); puts( "
\n" ); puts( "
\n" ); /* First row of config controls */ 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); puts( "
\n" ); puts( "
\n" ); /* Row 2 */ puts( " \n" "
\n" ); /* Log transform. When selected, the next control (view limits max) is disabled */ 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); puts( "
\n" ); /* Viewing limits max. This control is disabled if log transform is selected */ // construct class so JS can toggle 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))); puts( "
\n" ); puts( "
\n" ); /* Row 3 */ puts( " \n" "
\n" ); /* Filter on coding genes */ 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); puts( "
\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); printf( " (range %d-%d)\n", minScore, maxScore); puts( "
\n" ); puts( "
\n" ); puts( " \n" ); } 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" ); // TODO: remove bodyMap id here puts( "
\n" ); printBodyMap(); puts( "
\n" ); puts( "
\n" ); printConfigPanel(); printTissueTable(); puts( "
\n" ); puts( "
\n" ); } static void printTrackDescription() { puts(""); puts("
"); puts("
Track Description
"); puts("
" "" "" //"" "
"); puts("
"); if (tdb->html != NULL) { puts("
"); puts("
"); puts(tdb->html); } puts("
"); puts(""); } static void doMainPage() /* Send HTML with javascript to bootstrap the user interface. */ { // Start web page with new banner webStartJWestNoBanner(cart, db, "Genome Browser GTEx Track Settings"); 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); // 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); +printf("
\n\n", + hgTracksName(), cartUsualString(cart, "formMethod", "POST")); puts( "
\n" ); printTrackHeader(); printTrackConfig(); +puts( + "" +); + printTrackDescription(); puts("
"); // end panel, section and body layout container // Track description // JS libraries doJsIncludes(); // Main JS 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. */ /* TODO: check these */ char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,}; //char *excludeVars[] = {CARTJSON_COMMAND, NULL}; long enteredMainTime = clock1000(); cgiSpoof(&argc, argv); oldVars = hashNew(10); cartEmptyShellNoContent(doMiddle, hUserCookie(), excludeVars, oldVars); cgiExitTime("hgGtexTrackSettings", enteredMainTime); return 0; }