244bcc8165458cea7030fbe22f7a8974ba1f78ce kate Wed Jan 13 16:51:51 2016 -0800 First cut sortable table to select tissues. refs #15645 diff --git src/hg/lib/gtexUi.c src/hg/lib/gtexUi.c index 588f91c..c770950 100644 --- src/hg/lib/gtexUi.c +++ src/hg/lib/gtexUi.c @@ -1,218 +1,333 @@ /* 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" +#define SYSTEM_BRAIN "Brain" +#define SYSTEM_REPRODUCTIVE "Reproductive" +#define SYSTEM_GASTRO "Digestive" + +#define SYSTEM_ENDOCRINE "Endocrine" +#define SYSTEM_CARDIO "Cardiovascular" +#define SYSTEM_OTHER "Other" + + +static char *makeTissueColorPatch(struct gtexTissue *tis) +{ +char buf[256]; +safef(buf, sizeof(buf), "", tis->color); +return(cloneString(buf)); +} static char *makeTissueLabel(struct gtexTissue *tis) { char buf[256]; -safef(buf, sizeof(buf), "" +safef(buf, sizeof(buf), "" " %s", tis->color, tis->description); return(cloneString(buf)); } +static char *getSystem(struct gtexTissue *tis) +{ +if (startsWith("brain", tis->name)) + return(SYSTEM_BRAIN); +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")) + return(SYSTEM_REPRODUCTIVE); +else if (startsWith("esophagus", tis->name) || startsWith("colon", tis->name) || + sameString(tis->name, "stomach") || sameString("smallIntestine", tis->name) || + sameString("pancreas", tis->name) || sameString("liver", tis->name)) + return(SYSTEM_GASTRO); +else if (sameString("adrenalGland", tis->name) || sameString("pituitary", tis->name) || + sameString("thyroid", tis->name)) + return(SYSTEM_ENDOCRINE); +else if (startsWith("heart", tis->name) || startsWith("artery", tis->name)) + return(SYSTEM_CARDIO); +else + return(SYSTEM_OTHER); +} + 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); if (hashNumEntries(checkHash) == 0) tsel->checked = TRUE; else 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 makeTableTissueCheckboxes(char *name, struct gtexTissue *tissues, + struct slName *checked, boolean isPopup) +{ +char *onClick = ""; +// Sortable table can't be activated when in activated from right-click (popup mode) +if (!isPopup) + { + jsIncludeFile("hui.js", NULL); + onClick = "'tableSortAtButtonPress(this);"; + } +struct hash *checkHash = hashNew(0); +struct slName *sel; +for (sel = checked; sel != NULL; sel = sel->next) + hashAdd(checkHash, sel->name, sel->name); +//puts(""); +puts("\n
"); + +/* table header */ +puts("\n"); +puts("\n"); +printf("\n\n", + "gtexGene.sortOrder", "tissue=+ samples=+ organ=+ system=+"); +puts(""); + +printf("", onClick); + +printf("", onClick); + +printf("", onClick); + +printf("", onClick); +puts("\n"); +puts(""); + +/* table body */ +puts(""); +struct hash *tscHash = gtexGetTissueSampleCount(); +struct gtexTissue *tis; +boolean isChecked = FALSE; +for (tis = tissues; tis != NULL; tis = tis->next) + { + puts("\n"); + + // checkbox + if (hashNumEntries(checkHash) == 0) + isChecked = TRUE; + else + isChecked = (hashLookup(checkHash, tis->name) != NULL); + printf("", + name, tis->name, isChecked ? "CHECKED" : ""); + // color patch + printf("\n%s", makeTissueColorPatch(tis)); + // tissue name + printf("\n", tis->description); + // sample count + int samples = hashIntValDefault(tscHash, tis->name, 0); + printf("\n", samples, samples); + // organ + printf("\n", tis->organ); + // system + printf("\n", getSystem(tis)); + puts("\n"); + } +puts(""); +puts("
      Tissue Samples Organ System
 %s %d %s %s
"); +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); if (hashNumEntries(checkHash) == 0) tsel->checked = TRUE; else tsel->checked = (hashLookup(checkHash, tis->name) != NULL); - if (startsWith("brain", tis->name)) + char *system = getSystem(tis); + if (sameString(SYSTEM_BRAIN, system)) 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")) + else if (sameString(SYSTEM_REPRODUCTIVE, system)) slAddHead(&reproductiveTissues, tsel); - else if (startsWith("esophagus", tis->name) || startsWith("colon", tis->name) || - sameString(tis->name, "stomach") || sameString("smallIntestine", tis->name)) + else if (sameString(SYSTEM_GASTRO, system)) 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 */ { +boolean isPopup = FALSE; +if (cartVarExists(cart, "ajax")) + isPopup = TRUE; boxed = cfgBeginBoxAndTitle(tdb, boxed, title); printf("",boxed?" width='100%'":""); char cartVar[1024]; char *selected = NULL; /* Sample selection */ printf("Samples: "); safef(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_SAMPLES); selected = cartCgiUsualString(cart, cartVar, GTEX_SAMPLES_DEFAULT); boolean isAllSamples = sameString(selected, GTEX_SAMPLES_ALL); cgiMakeRadioButton(cartVar, GTEX_SAMPLES_ALL, isAllSamples); printf("All\n"); cgiMakeRadioButton(cartVar, GTEX_SAMPLES_COMPARE_SEX, !isAllSamples); printf("Compare by gender\n"); printf("

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

Comparison display:\n"); 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(cartVar, GTEX_COMPARISON_DIFF, !isMirror); printf("Difference graph\n"); cgiMakeRadioButton(cartVar, GTEX_COMPARISON_MIRROR, isMirror); printf("Two graphs\n"); printf("

"); /* Data transform */ 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(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_MAX_LIMIT); // TODO: set max and initial limits from gtexInfo table 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(cartVar, sizeof(cartVar), "%s.%s", name, GTEX_COLORS); selected = cartCgiUsualString(cart, cartVar, GTEX_COLORS_DEFAULT); boolean isGtexColors = sameString(selected, GTEX_COLORS_GTEX); cgiMakeRadioButton(cartVar, GTEX_COLORS_GTEX, isGtexColors); printf("GTEx\n"); 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 *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")) +char *selectType = cgiUsualString("tis", "table"); +if (sameString(selectType, "group")) makeGroupedTissueCheckboxes(cartVar, tissues, selectedValues); +else if (sameString(selectType, "table")) + makeTableTissueCheckboxes(cartVar, tissues, selectedValues, isPopup); else makeAllTissueCheckboxes(cartVar, tissues, selectedValues); cfgEndBox(boxed); }