c28867b853a769949049ae459cee687bcad25aca
kate
  Fri Jul 24 13:07:01 2015 -0700
Add support for comparison graphs (2 graphs, one top and one below inverted, based on splitting samples by sex or age).  First cut of display only. refs #15645

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index f61c200..1d02452 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -6700,41 +6700,73 @@
 /* LRG Transcripts: Locus Reference Genomic transcript sequences mapped to assembly. */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 printf("<TABLE%s><TR><TD>",boxed?" width='100%'":"");
 baseColorDrawOptDropDown(cart, tdb);
 indelShowOptionsWithNameExt(cart, tdb, name, "LRG transcript sequence", FALSE, FALSE);
 cfgEndBox(boxed);
 }
 
 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];
+
 // Color scheme
 printf("<B>Tissue color scheme:</B>\n");
-char cartVarName[1024];
 safef(cartVarName, sizeof(cartVarName), "%s." GTEX_COLORS, name);
 char *selected = cartCgiUsualString(cart, cartVarName, GTEX_COLORS_DEFAULT); 
 boolean isGtexColors = sameString(selected, GTEX_COLORS_GTEX);
 cgiMakeRadioButton(cartVarName, GTEX_COLORS_GTEX, isGtexColors);
 printf("GTEx\n");
 cgiMakeRadioButton(cartVarName, GTEX_COLORS_RAINBOW, !isGtexColors);
 printf("rainbow\n");
 
+// Graph type
+printf("<p><b>Expression graph:</b><br>\n");
+safef(cartVarName, sizeof(cartVarName), "%s." GTEX_GRAPH, name);
+char *graphType = cartCgiUsualString(cart, cartVarName, GTEX_GRAPH_DEFAULT); 
+
+boolean isRaw = differentString(graphType, GTEX_GRAPH_NORMAL);
+printf("&nbsp;&nbsp;&nbsp;\n");
+cgiMakeRadioButton(cartVarName, GTEX_GRAPH_RAW, isRaw);
+printf("raw<br>\n");
+
+boolean isSex = sameString(graphType, GTEX_GRAPH_SEX);
+printf("&nbsp;&nbsp;&nbsp;\n");
+printf("&nbsp;&nbsp;&nbsp;\n");
+cgiMakeRadioButton(cartVarName, GTEX_GRAPH_SEX, isSex);
+printf("compare by sex<br>\n");
+
+boolean isAge = sameString(graphType, GTEX_GRAPH_AGE);
+printf("&nbsp;&nbsp;&nbsp;\n");
+printf("&nbsp;&nbsp;&nbsp;\n");
+cgiMakeRadioButton(cartVarName, GTEX_GRAPH_SEX, isAge);
+printf("compare by age\n");
+
+char cartVarAge[1024];
+safef(cartVarAge, sizeof(cartVarAge), "%s." GTEX_GRAPH_AGE_YEARS, name);
+cgiMakeIntVarInRange(cartVarAge, GTEX_GRAPH_AGE_DEFAULT, "age range is 20-70 years", 2, "20", "70");
+printf("years<br>\n");
+
+printf("&nbsp;&nbsp;&nbsp;\n");
+cgiMakeRadioButton(cartVarName, GTEX_GRAPH_NORMAL, !isRaw);
+printf("normalized\n");
+
 cfgEndBox(boxed);
 }
 
 struct trackDb *rFindView(struct trackDb *forest, char *view)
 // Return the trackDb on the list that matches the view tag. Prefers ancestors before decendents
 {
 struct trackDb *tdb;
 for (tdb = forest; tdb != NULL; tdb = tdb->next)
     {
     char *viewSetting = trackDbSetting(tdb, "view");
     if (sameOk(viewSetting, view) || sameOk(tagEncode(viewSetting), view))
         return tdb;
     }
 for (tdb = forest; tdb != NULL; tdb = tdb->next)
     {