64d9809600ba9cf12c331e053533886817523405 kate Thu Jun 29 18:19:09 2017 -0700 Add trackUi (body map and right-click versions) and implement filters in hgTracks. refs #15646 diff --git src/hg/lib/gtexUi.c src/hg/lib/gtexUi.c index 986c326..4c90ef3 100644 --- src/hg/lib/gtexUi.c +++ src/hg/lib/gtexUi.c @@ -22,38 +22,43 @@ #define SYSTEM_OTHER "Other" /* Restrict features on right-click (popup) version */ static boolean isPopup = FALSE; /* Path to Body Map-based track configuration */ static char *_hgGtexTrackSettingsName = "../cgi-bin/hgGtexTrackSettings"; boolean gtexIsGeneTrack(char *trackName) /* Identify GTEx gene track so custom trackUi CGI can be launched */ { return startsWith(GTEX_GENE_TRACK_BASENAME, trackName); } -char *gtexGeneTrackUiName() +boolean gtexIsEqtlTrack(char *trackName) +/* Identify GTEx eQTL track so custom trackUi CGI can be launched */ +{ +return startsWith(GTEX_EQTL_TRACK_BASENAME, trackName); +} + +char *gtexTrackUiName() /* Refer to Body Map CGI if suitable */ { // Display body map configuration page if user is on a browser we've tested enum browserType bt = cgiBrowser(); if (bt == btChrome || bt == btFF || bt == btSafari) return(_hgGtexTrackSettingsName); - return hgTrackUiName(); } /* Convenience functions for tissue filter controls */ static char *makeTissueColorPatch(struct gtexTissue *tis) /* Display a box colored by defined tissue color */ { char buf[256]; safef(buf, sizeof(buf), "", tis->color); return(cloneString(buf)); } static char *makeTissueLabel(struct gtexTissue *tis) { @@ -471,15 +476,117 @@ struct gtexTissue *tissues = gtexGetTissues(version); struct slName *selectedValues = NULL; if (cartListVarExistsAnyLevel(cart, tdb, FALSE, GTEX_TISSUE_SELECT)) selectedValues = cartOptionalSlNameListClosestToHome(cart, tdb, FALSE, GTEX_TISSUE_SELECT); char *selectType = cgiUsualString("tis", "table"); if (sameString(selectType, "group")) makeGroupedTissueCheckboxes(cartVar, tissues, selectedValues); else if (sameString(selectType, "table")) makeTableTissueCheckboxes(cartVar, tissues, selectedValues, cart, track, version); else makeAllTissueCheckboxes(cartVar, tissues, selectedValues); puts("\n\n"); cfgEndBox(boxed); } + +/* GTEx eQTL track configuration */ + +void gtexEqtlGene(struct cart *cart, char *track, struct trackDb *tdb) +/* Limit to selected gene */ +// TODO: autocomplete +{ +char cartVar[1024]; +puts("Limit to eQTLs for gene: \n"); +safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_EQTL_GENE); +char *gene = cartCgiUsualString(cart, cartVar, ""); +cgiMakeTextVar(cartVar, gene, 20); +} + +#define GTEX_EQTL_EFFECT_MAX 15362.9 +// Maximum V6p effect size for CAVIAR 95% eQTLs +// TODO: add to gtexInfo table + +void gtexEqtlEffectSize(struct cart *cart, char *track, struct trackDb *tdb) +/* Limit to items with absolute value of effect size >= threshold. Use largest + * effect size in tissue list */ +{ +char cartVar[1024]; +puts("Effect size minimum: +-\n"); +safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_EQTL_EFFECT); +double effectMin = cartCgiUsualDouble(cart, cartVar, 0.0); +cgiMakeDoubleVar(cartVar, effectMin, 7); +printf(" FPKM (range 0-%0.1f)\n", GTEX_EQTL_EFFECT_MAX); +} + +void gtexEqtlProbability(struct cart *cart, char *track, struct trackDb *tdb) +/* Limit to items with specified probability. Use largest probability in tissue list, + * which is score/1000, so use that */ +{ +char cartVar[1024]; +puts("Probability minimum:\n"); +safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_EQTL_PROBABILITY); +double probMin = cartCgiUsualDouble(cart, cartVar, 0); +cgiMakeDoubleVar(cartVar, probMin, 3); +printf(" (range 0-1.0)\n"); +} + +void gtexEqtlClusterUi(struct cart *cart, struct trackDb *tdb, char *track, char *title, + boolean boxed) +/* GTEx (Genotype Tissue Expression) eQTL clusters. Use this on right-click, + * (when hgGtexTrackSettings can't be) */ +{ +if (cartVarExists(cart, "ajax")) + isPopup = TRUE; + +boxed = cfgBeginBoxAndTitle(tdb, boxed, title); +printf("\n\n
", + isPopup ? 75 : 100, boxed ?" width='100%'":""); + +char cartVar[1024]; + +/* Gene filter */ +puts("
"); +gtexEqtlGene(cart, track, tdb); +puts("
\n"); + +/* Absolute value of effect size */ +puts("
"); +gtexEqtlEffectSize(cart, track, tdb); + +/* Probability eQTL is in CAVIAR 95% causal set */ +puts("  "); +gtexEqtlProbability(cart, track, tdb); +puts("
"); + +/* Tissue filter */ +printf("
"); +printf("
Tissues:\n"); +safef(cartVar, sizeof(cartVar), "%s.%s", track, GTEX_TISSUE_SELECT); +if (isPopup) + { + printf("", + hTrackUiForTrack(track), track); + } +else + { + jsMakeCheckboxGroupSetClearButton(cartVar, TRUE); + puts(" "); + jsMakeCheckboxGroupSetClearButton(cartVar, FALSE); + } +printf("
"); +char *version = gtexVersion(tdb->table); +struct gtexTissue *tissues = gtexGetTissues(version); +struct slName *selectedValues = NULL; +if (cartListVarExistsAnyLevel(cart, tdb, FALSE, GTEX_TISSUE_SELECT)) + selectedValues = cartOptionalSlNameListClosestToHome(cart, tdb, FALSE, GTEX_TISSUE_SELECT); +char *selectType = cgiUsualString("tis", "table"); +if (sameString(selectType, "group")) + makeGroupedTissueCheckboxes(cartVar, tissues, selectedValues); +else if (sameString(selectType, "table")) + makeTableTissueCheckboxes(cartVar, tissues, selectedValues, cart, track, version); +else + makeAllTissueCheckboxes(cartVar, tissues, selectedValues); + +puts("\n
\n"); +cfgEndBox(boxed); +}