2028f58f234220d59b228639ff4e4ead0d83d2c0
aamp
  Tue May 17 15:03:28 2011 -0700
Stuff to do with microarray subsetting.  It might need a little smoothing over
diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index d29de3f..ad017fe 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -28,30 +28,31 @@
 #include "hgConfig.h"
 #include "customTrack.h"
 #include "dbRIP.h"
 #include "tfbsConsSites.h"
 #include "hapmapSnps.h"
 #include "nonCodingUi.h"
 #include "expRecord.h"
 #include "wikiTrack.h"
 #include "hubConnect.h"
 #include "trackHub.h"
 #include "pcrResult.h"
 #include "dgv.h"
 #include "transMapStuff.h"
 #include "bbiFile.h"
 #include "ensFace.h"
+#include "microarray.h"
 
 #define MAIN_FORM "mainForm"
 #define WIGGLE_HELP_PAGE  "../goldenPath/help/hgWiggleTrackHelp.html"
 
 static char const rcsid[] = "$Id: hgTrackUi.c,v 1.527 2010/06/04 21:54:56 angie Exp $";
 
 struct cart *cart = NULL;	/* Cookie cart with UI settings */
 char *database = NULL;		/* Current database. */
 char *chromosome = NULL;        /* Chromosome. */
 struct hash *trackHash = NULL;	/* Hash of all tracks in database. */
 
 void tfbsConsSitesUi(struct trackDb *tdb)
 {
 float tfbsConsSitesCutoff =
     sqlFloat(cartUsualString(cart,TFBS_SITES_CUTOFF,TFBS_SITES_CUTOFF_DEFAULT));
@@ -1068,60 +1069,58 @@
 char *col;
 char varName[128];
 
 safef(varName, sizeof(varName), "%s.%s", tdb->track, "type");
 affyMap = cartUsualString(cart, varName, affyEnumToString(affyTissue));
 col = cartUsualString(cart, "exprssn.color", "rg");
 printf("<p><b>Experiment Display: </b> ");
 affyDropDown(varName, affyMap);
 printf(" <b>Color Scheme</b>: ");
 cgiMakeRadioButton("exprssn.color", "rg", sameString(col, "rg"));
 printf(" red/green ");
 cgiMakeRadioButton("exprssn.color", "rb", sameString(col, "rb"));
 printf(" red/blue ");
 }
 
-void expRatioCombineDropDown(char *trackName, char *groupSettings, struct hash *allGroupings)
+void expRatioCombineDropDown(struct trackDb *tdb, struct microarrayGroups *groups)
 /* Make a drop-down of all the main combinations. */
 {
+struct maGrouping *comb;
 int size = 0;
 int i;
 char **menuArray;
 char **valArray;
-char dropDownName[512];
-struct hash *groupGroup = hashMustFindVal(allGroupings, groupSettings);
-char *combineList = hashFindVal(groupGroup, "combine");
-char *allSetting = hashMustFindVal(groupGroup, "all");
-char *defaultSetting = hashFindVal(groupGroup, "combine.default");
+char *dropDownName = expRatioCombineDLName(tdb->track);
+char *defaultSelection = NULL;
 char *cartSetting = NULL;
-struct slName *combineNames = slNameListFromComma(combineList);
-struct slName *aName;
-safef(dropDownName, sizeof(dropDownName), "%s.combine", trackName);
-size = slCount(combineNames) + 1;
+if (!groups->allArrays)
+    errAbort("The \'all\' stanza must be set in the microarrayGroup settings for track %s", tdb->track);
+if (groups->defaultCombine)
+    defaultSelection = groups->defaultCombine->name;
+else
+    defaultSelection = groups->allArrays->name;
+size = groups->numCombinations + 1;
 AllocArray(menuArray, size);
 AllocArray(valArray, size);
-slNameAddHead(&combineNames, allSetting);
-for (i = 0, aName = combineNames; i < size && aName != NULL; i++, aName = aName->next)
+menuArray[0] = groups->allArrays->description;
+valArray[0] = groups->allArrays->name;
+for (i = 1, comb = groups->combineSettings; (i < size) && (comb != NULL); i++, comb = comb->next)
     {
-    struct hash *oneGroupSetting = hashMustFindVal(allGroupings, aName->name);
-    char *descrip = hashMustFindVal(oneGroupSetting, "description");
-    menuArray[i] = descrip;
-    valArray[i] = aName->name;
+    menuArray[i] = cloneString(comb->description);
+    valArray[i] = cloneString(comb->name);
     }
-if (defaultSetting == NULL)
-    defaultSetting = allSetting;
-cartSetting = cartUsualString(cart, dropDownName, defaultSetting);
+cartSetting = cartUsualString(cart, dropDownName, defaultSelection);
 printf(" <b>Combine arrays</b>: ");
 cgiMakeDropListWithVals(dropDownName, menuArray, valArray,
                          size, cartSetting);
 }
 
 void expRatioDrawExonOption(struct trackDb *tdb)
 /* Add option to show exons if possible. */
 {
 char checkBoxName[512];
 char *drawExons = trackDbSetting(tdb, "expDrawExons");
 boolean checked = FALSE;
 if (!drawExons || differentWord(drawExons, "on"))
     return;
 safef(checkBoxName, sizeof(checkBoxName), "%s.expDrawExons", tdb->track);
 checked = cartCgiUsualBoolean(cart, checkBoxName, FALSE);
@@ -1139,42 +1138,83 @@
 safef(radioName, sizeof(radioName), "%s.color", tdb->track);
 colorSetting = cartUsualString(cart, radioName, tdbSetting);
 puts("<BR><B>Color: </B><BR> ");
 cgiMakeRadioButton(radioName, "redGreen", sameString(colorSetting, "redGreen"));
 puts("red/green<BR>");
 cgiMakeRadioButton(radioName, "redBlue", sameString(colorSetting, "redBlue"));
 puts("red/blue<BR>");
 cgiMakeRadioButton(radioName, "yellowBlue", sameString(colorSetting, "yellowBlue"));
 puts("yellow/blue<BR>\n");
 cgiMakeRadioButton(radioName, "redBlueOnWhite", sameString(colorSetting, "redBlueOnWhite"));
 puts("red/blue on white background<BR>");
 cgiMakeRadioButton(radioName, "redBlueOnYellow", sameString(colorSetting, "redBlueOnYellow"));
 puts("red/blue on yellow background<BR>");
 }
 
+void expRatioSubsetDropDown(struct maGrouping *ss, char *varName, char *offset)
+/* because setting up the droplist is a bit involved... this is just called */
+/* from expRatioSubsetOptions() */
+{
+char **menu;
+char **values;
+int i;
+AllocArray(menu, ss->numGroups);
+AllocArray(values, ss->numGroups);
+for (i = 0; i < ss->numGroups; i++)
+    {
+    char num[4];
+    safef(num, sizeof(num), "%d", i);
+    menu[i] = cloneString(ss->names[i]);
+    values[i] = cloneString(num);
+    }
+cgiMakeDropListWithVals(varName, menu, values, ss->numGroups, offset);
+}
+
+void expRatioSubsetOptions(struct trackDb *tdb, struct microarrayGroups *groups)
+/* subsetting options for a microarray track */
+{
+char *radioVarName = expRatioSubsetRadioName(tdb->track, groups);
+char *subSetting = NULL;
+struct maGrouping *subsets = groups->subsetSettings;
+struct maGrouping *ss;
+subSetting = cartUsualString(cart, radioVarName, NULL);
+puts("<BR><B>Subset:</B><BR>");
+cgiMakeRadioButton(radioVarName, "none", (subSetting == NULL) || sameString(subSetting, "none"));
+puts("no subset<BR>\n");
+for (ss = subsets; ss != NULL; ss = ss->next)
+    {
+    char *dropVarName = expRatioSubsetDLName(tdb->track, ss);
+    char *offS = NULL;
+    offS = cartUsualString(cart, dropVarName, "-1");
+    cgiMakeRadioButton(radioVarName, ss->name, (subSetting) && sameString(ss->name, subSetting));
+    printf("%s \n", ss->description);
+    expRatioSubsetDropDown(ss, dropVarName, offS);
+    printf("<BR>\n");
+    }
+}
+
 void expRatioUi(struct trackDb *tdb)
 /* UI options for the expRatio tracks. */
 {
-char *groupings = trackDbRequiredSetting(tdb, "groupings");
-struct hash *gHashOfHashes = NULL;
-struct hash *ret =
-    hgReadRa(hGenome(database), database, "hgCgiData",
-	     "microarrayGroups.ra", &gHashOfHashes);
-if ((ret == NULL) && (gHashOfHashes == NULL))
+struct microarrayGroups *groups = maGetTrackGroupings(database, tdb);
+if (groups == NULL)
     errAbort("Could not get group settings for track.");
 expRatioDrawExonOption(tdb);
-expRatioCombineDropDown(tdb->track, groupings, gHashOfHashes);
+if (groups->numCombinations > 0)
+    expRatioCombineDropDown(tdb, groups);
+if (groups->numSubsets > 0)
+    expRatioSubsetOptions(tdb, groups);
 expRatioColorOption(tdb);
 }
 
 void expRatioCtUi(struct trackDb *tdb)
 /* UI options for array custom tracks. */
 {
 expRatioColorOption(tdb);
 }
 
 void affyAllExonUi(struct trackDb *tdb)
 /* put up UI for the affy all exon tracks. */
 {
 char *affyAllExonMap;
 char *col;
 char varName[128];