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), "<td style='width:20px; font-size:75%%;' bgcolor=%X></td>" + "<td style='font-size:75%%'> %s</td>", + 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("<tr><td colspan=10 style='font-size:75%%'><i><b>%s</b></i></td></tr><tr>\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; i++) + { + int j = row + col*(count/tableColumns+1); + if (j>=count) + { + printf("</tr><tr>"); + row++; + col = 0; + } + j = row + col*(count/tableColumns+1); + printf("<td><INPUT TYPE=CHECKBOX NAME=\"%s\" VALUE=\"%s\" %s></td>" "<td>%s</td>\n", + name, tisArray[j]->name, tisArray[j]->checked ? "CHECKED" : "", tisArray[j]->label); + col++; + } +if ((i % tableColumns) != 0) + while ((i++ % tableColumns) != 0) + printf("<td></td>"); +printf("</tr><tr><td></td></tr>\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("<TABLE BORDERWIDTH=0><TR>"); +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("</TR></TABLE>"); +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("<TABLE BORDERWIDTH=0><TR>"); +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("</TR></TABLE>"); +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("<table%s><tr><td>",boxed?" width='100%'":""); -char cartVarName[1024]; +char cartVar[1024]; char *selected = NULL; /* Sample selection */ printf("<b>Samples:</b> "); -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("</p>"); /* Comparison type */ printf("<p><b>Comparison display:</b>\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("</p>"); /* Data transform */ -printf("<p><p>Log10 transform:</B>\n"); -safef(cartVarName, sizeof(cartVarName), "%s.%s", name, GTEX_LOG_TRANSFORM); -boolean isLogTransform = cartCgiUsualBoolean(cart, cartVarName, GTEX_LOG_TRANSFORM_DEFAULT); -cgiMakeCheckBox(cartVarName, isLogTransform); +printf("<p><b>Log10 transform:</b>\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(" <b>View limits maximum:</b>\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)<br>\n"); printf("</p>"); /* Color scheme */ +// Not sure if we still want this option printf("<p><b>Tissue colors:</b>\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("</p>"); +/* Tissue filter */ +printf("<p><b>Tissue selection:</b>\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); }