5e84c54c00824bb9ddacfd439db694906328fc61 Merge parents 5e5b469 f42dec5 kate Tue Nov 24 09:55:57 2015 -0800 Fix merge conflict diff --cc src/hg/lib/gtexUi.c index 2f89c4d,24b46ee..a050fa0 --- src/hg/lib/gtexUi.c +++ src/hg/lib/gtexUi.c @@@ -1,214 -1,70 +1,212 @@@ /* GTEx (Genotype Tissue Expression) track controls */ /* Copyright (C) 2015 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "cheapcgi.h" #include "cart.h" #include "hui.h" #include "trackDb.h" +#include "jsHelper.h" +#include "gtexTissue.h" #include "gtexUi.h" + +static char *makeTissueLabel(struct gtexTissue *tis) +{ +char buf[256]; +safef(buf, sizeof(buf), "" + " %s", + tis->color, tis->description); +return(cloneString(buf)); +} + +struct tissueSelect + { + struct tissueSelect *next; + char *name; + char *label; + boolean checked; + }; + +static void makeGroupCheckboxes(char *name, char *title, struct tissueSelect *tisSelects) +{ +if (title != NULL) + printf("%s\n", title); +int count = slCount(tisSelects); +struct tissueSelect **tisArray; +AllocArray(tisArray, count); +int i=0; +struct tissueSelect *tsel; +for (i=0, tsel = tisSelects; tsel != NULL; tsel = tsel->next, i++) + tisArray[i] = tsel; +int col=0; +int row=0; +int tableColumns=3; +for (i=0; i=count) + { + printf(""); + row++; + col = 0; + } + j = row + col*(count/tableColumns+1); + printf("" "%s\n", + name, tisArray[j]->name, tisArray[j]->checked ? "CHECKED" : "", tisArray[j]->label); + col++; + } +if ((i % tableColumns) != 0) + while ((i++ % tableColumns) != 0) + printf(""); +printf("\n"); +} + +static void makeAllTissueCheckboxes(char *name, struct gtexTissue *tissues, struct slName *checked) +{ +struct hash *checkHash = hashNew(0); +struct slName *sel; +for (sel = checked; sel != NULL; sel = sel->next) + hashAdd(checkHash, sel->name, sel->name); +puts(""); +struct tissueSelect *tsel; +struct gtexTissue *tis; +struct tissueSelect *allTissues = NULL; +for (tis = tissues; tis != NULL; tis = tis->next) + { + AllocVar(tsel); + tsel->name = tis->name; + tsel->label = makeTissueLabel(tis); + tsel->checked = (hashLookup(checkHash, tis->name) != NULL); + slAddHead(&allTissues, tsel); + } +slReverse(&allTissues); +makeGroupCheckboxes(name, NULL, allTissues); +puts("
"); +char buf[512]; +safef(buf, sizeof(buf), "%s%s", cgiMultListShadowPrefix(), name); +cgiMakeHiddenVar(buf, "0"); +} + +static void makeGroupedTissueCheckboxes(char *name, struct gtexTissue *tissues, struct slName *checked) +{ +struct hash *checkHash = hashNew(0); +struct slName *sel; +for (sel = checked; sel != NULL; sel = sel->next) + hashAdd(checkHash, sel->name, sel->name); +puts(""); +struct tissueSelect *brainTissues = NULL; +struct tissueSelect *digestiveTissues = NULL; +struct tissueSelect *reproductiveTissues = NULL; +struct tissueSelect *otherTissues = NULL; +struct tissueSelect *tsel; +struct gtexTissue *tis; +for (tis = tissues; tis != NULL; tis = tis->next) + { + AllocVar(tsel); + tsel->name = tis->name; + tsel->label = makeTissueLabel(tis); + tsel->checked = (hashLookup(checkHash, tis->name) != NULL); + if (startsWith("brain", tis->name)) + slAddHead(&brainTissues, tsel); + else if (sameString(tis->name, "uterus") || sameString(tis->name, "testis") || + sameString(tis->name, "vagina") || sameString(tis->name, "prostate") || + sameString(tis->name, "ovary") || + sameString(tis->name, "breastMamTissue") || sameString(tis->name, "ectocervix") || + sameString(tis->name, "endocervix") || sameString(tis->name, "fallopianTube")) + slAddHead(&reproductiveTissues, tsel); + else if (startsWith("esophagus", tis->name) || startsWith("colon", tis->name) || + sameString(tis->name, "stomach") || sameString("smallIntestine", tis->name)) + slAddHead(&digestiveTissues, tsel); + else + slAddHead(&otherTissues, tsel); +} +slReverse(&brainTissues); +slReverse(&digestiveTissues); +slReverse(&reproductiveTissues); +slReverse(&otherTissues); +makeGroupCheckboxes(name, "Brain", brainTissues); +makeGroupCheckboxes(name, "Gastrointestinal", digestiveTissues); +makeGroupCheckboxes(name, "Reproductive", reproductiveTissues); +makeGroupCheckboxes(name, "Other", otherTissues); +puts("
"); +char buf[512]; +safef(buf, sizeof(buf), "%s%s", cgiMultListShadowPrefix(), name); +cgiMakeHiddenVar(buf, "0"); +} void gtexGeneUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed) /* GTEx (Genotype Tissue Expression) per gene data */ { boxed = cfgBeginBoxAndTitle(tdb, boxed, title); printf("",boxed?" width='100%'":""); -char cartVarName[1024]; +char cartVar[1024]; char *selected = NULL; /* Sample selection */ printf("Samples: "); -safef(cartVarName, sizeof(cartVarName), "%s.%s", name, GTEX_SAMPLES); -selected = cartCgiUsualString(cart, cartVarName, GTEX_SAMPLES_DEFAULT); +safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_SAMPLES); +selected = cartCgiUsualString(cart, cartVar, GTEX_SAMPLES_DEFAULT); boolean isAllSamples = sameString(selected, GTEX_SAMPLES_ALL); -cgiMakeRadioButton(cartVarName, GTEX_SAMPLES_ALL, isAllSamples); +cgiMakeRadioButton(cartVar, GTEX_SAMPLES_ALL, isAllSamples); printf("All\n"); -cgiMakeRadioButton(cartVarName, GTEX_SAMPLES_COMPARE_SEX, !isAllSamples); +cgiMakeRadioButton(cartVar, GTEX_SAMPLES_COMPARE_SEX, !isAllSamples); printf("Compare by gender\n"); printf("

"); /* Comparison type */ printf("

Comparison display:\n"); -safef(cartVarName, sizeof(cartVarName), "%s.%s", name, GTEX_COMPARISON_DISPLAY); -selected = cartCgiUsualString(cart, cartVarName, GTEX_COMPARISON_DEFAULT); +safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_COMPARISON_DISPLAY); +selected = cartCgiUsualString(cart, cartVar, GTEX_COMPARISON_DEFAULT); boolean isMirror = sameString(selected, GTEX_COMPARISON_MIRROR); -cgiMakeRadioButton(cartVarName, GTEX_COMPARISON_DIFF, !isMirror); +cgiMakeRadioButton(cartVar, GTEX_COMPARISON_DIFF, !isMirror); printf("Difference graph\n"); -cgiMakeRadioButton(cartVarName, GTEX_COMPARISON_MIRROR, isMirror); +cgiMakeRadioButton(cartVar, GTEX_COMPARISON_MIRROR, isMirror); printf("Two graphs\n"); printf("

"); /* Data transform */ -printf("

Log10 transform:\n"); -safef(cartVarName, sizeof(cartVarName), "%s.%s", name, GTEX_LOG_TRANSFORM); -boolean isLogTransform = cartCgiUsualBoolean(cart, cartVarName, GTEX_LOG_TRANSFORM_DEFAULT); -cgiMakeCheckBox(cartVarName, isLogTransform); +printf("

Log10 transform:\n"); +safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_LOG_TRANSFORM); +boolean isLogTransform = cartCgiUsualBoolean(cart, cartVar, GTEX_LOG_TRANSFORM_DEFAULT); +cgiMakeCheckBox(cartVar, isLogTransform); /* Viewing limits max */ printf("  View limits maximum:\n"); -safef(cartVarName, sizeof(cartVarName), "%s.%s", name, GTEX_MAX_LIMIT); +safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_MAX_LIMIT); // TODO: set max and initial limits from gtexInfo table -int viewMax = cartCgiUsualInt(cart, cartVarName, GTEX_MAX_LIMIT_DEFAULT); -cgiMakeIntVar(cartVarName, viewMax, 4); +int viewMax = cartCgiUsualInt(cart, cartVar, GTEX_MAX_LIMIT_DEFAULT); +cgiMakeIntVar(cartVar, viewMax, 4); printf(" RPKM (range 10-180000)
\n"); printf("

"); /* Color scheme */ +// Not sure if we still want this option printf("

Tissue colors:\n"); -safef(cartVarName, sizeof(cartVarName), "%s.%s", name, GTEX_COLORS); -selected = cartCgiUsualString(cart, cartVarName, GTEX_COLORS_DEFAULT); +safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_COLORS); +selected = cartCgiUsualString(cart, cartVar, GTEX_COLORS_DEFAULT); boolean isGtexColors = sameString(selected, GTEX_COLORS_GTEX); -cgiMakeRadioButton(cartVarName, GTEX_COLORS_GTEX, isGtexColors); +cgiMakeRadioButton(cartVar, GTEX_COLORS_GTEX, isGtexColors); printf("GTEx\n"); -cgiMakeRadioButton(cartVarName, GTEX_COLORS_RAINBOW, !isGtexColors); +cgiMakeRadioButton(cartVar, GTEX_COLORS_RAINBOW, !isGtexColors); printf("Rainbow\n"); printf("

"); +/* Tissue filter */ +printf("

Tissue selection:\n"); +safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_TISSUE_SELECT); +jsMakeCheckboxGroupSetClearButton(cartVar, TRUE); +puts(" "); +jsMakeCheckboxGroupSetClearButton(cartVar, FALSE); - struct gtexTissue *tis = NULL, *tissues = gtexGetTissues(); - int i; - int count = slCount(tissues); ++struct gtexTissue *tissues = gtexGetTissues(); +struct slName *selectedValues = NULL; +if (cartListVarExistsAnyLevel(cart, tdb, FALSE, GTEX_TISSUE_SELECT)) + selectedValues = cartOptionalSlNameListClosestToHome(cart, tdb, FALSE, GTEX_TISSUE_SELECT); +if (sameString(cgiUsualString("tis", "group"), "group")) + makeGroupedTissueCheckboxes(cartVar, tissues, selectedValues); +else + makeAllTissueCheckboxes(cartVar, tissues, selectedValues); + cfgEndBox(boxed); }