30c30147c744aa9a6e9115a67ec50e918759204a
tdreszer
  Tue Jul 10 16:44:21 2012 -0700
Next batch of many checkins as dictated by Jim.  Formatting space after if and limiting lines to 100 chars.  Changes limited to lines last touched by tdreszer (git blame) so as not to ruin history.  This checkin also includes removal of SUBTRACK_CFG ifdefs, and a bug fix for downloads link.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index b694e0c..18a6d59 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -33,233 +33,272 @@
 #include "vcf.h"
 #include "errCatch.h"
 #include "samAlignment.h"
 #include "makeItemsItem.h"
 #include "bedDetail.h"
 #include "pgSnp.h"
 #include "memgfx.h"
 
 #define SMALLBUF 128
 #define MAX_SUBGROUP 9
 #define ADD_BUTTON_LABEL        "add"
 #define CLEAR_BUTTON_LABEL      "clear"
 #define JBUFSIZE 2048
 
 #ifdef BUTTONS_BY_CSS
-#define BUTTON_PM  "<span class='pmButton' onclick=\"setCheckBoxesThatContain('%s',%s,true,'%s','','%s')\">%c</span>"
-#define BUTTON_DEF "<span class='pmButton' onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); " \
-                                                    "setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');\" style='width:56px;font-weight:normal; font-family:default;'>default</span>"
-#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) printf(BUTTON_DEF,(nameOrId),        (beg),(contains),(nameOrId),(beg),(contains))
-#define    PLUS_BUTTON(nameOrId,anc,beg,contains) printf(BUTTON_PM, (nameOrId),"true", (beg),(contains),'+')
-#define   MINUS_BUTTON(nameOrId,anc,beg,contains) printf(BUTTON_PM, (nameOrId),"false",(beg),(contains),'-')
+#define BUTTON_PM  "<span class='pmButton' " \
+                   "onclick=\"setCheckBoxesThatContain('%s',%s,true,'%s','','%s')\">%c</span>"
+#define BUTTON_DEF "<span class='pmButton' " \
+                   "onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); " \
+                   "setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');\" " \
+                   "style='width:56px;font-weight:normal; font-family:default;'>default</span>"
+#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) \
+        printf(BUTTON_DEF,(nameOrId),        (beg),(contains),(nameOrId),(beg),(contains))
+#define PLUS_BUTTON(nameOrId,anc,beg,contains) \
+        printf(BUTTON_PM, (nameOrId),"true", (beg),(contains),'+')
+#define MINUS_BUTTON(nameOrId,anc,beg,contains) \
+        printf(BUTTON_PM, (nameOrId),"false",(beg),(contains),'-')
 #else///ifndef BUTTONS_BY_CSS
-#define PM_BUTTON  "<IMG height=18 width=18 onclick=\"setCheckBoxesThatContain('%s',%s,true,'%s','','%s');\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
-#define DEF_BUTTON "<IMG onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
-#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) printf(DEF_BUTTON,(nameOrId),        (beg),(contains),(nameOrId),(beg),(contains),(anc),"defaults_sm.png","default")
-#define    PLUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (nameOrId),"true", (beg),(contains),(anc),"add_sm.gif",   "+")
-#define   MINUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-")
+#define PM_BUTTON  "<IMG height=18 width=18 onclick=\"setCheckBoxesThatContain(" \
+                   "'%s',%s,true,'%s','','%s');\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
+#define DEF_BUTTON "<IMG onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); " \
+                   "setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');\" " \
+                   "id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
+#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) \
+        printf(DEF_BUTTON,(nameOrId),(beg),(contains),(nameOrId),(beg),(contains),(anc), \
+              "defaults_sm.png","default")
+#define PLUS_BUTTON(nameOrId,anc,beg,contains) \
+        printf(PM_BUTTON, (nameOrId),"true", (beg),(contains),(anc),"add_sm.gif",   "+")
+#define MINUS_BUTTON(nameOrId,anc,beg,contains) \
+        printf(PM_BUTTON, (nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-")
 #endif///ndef BUTTONS_BY_CSS
 
-static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb,char *name,boolean nameIsFile)
+static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb,
+                                        char *name,boolean nameIsFile)
 // Returns an HTML string for a downloads link
 {
 // If has fileSortOrder, then link to new hgFileUi
 if (!nameIsFile && trackDbSetting(tdb, FILE_SORT_ORDER) != NULL)
     {
     char * link = needMem(PATH_LEN); // 512 should be enough
-    safef(link,PATH_LEN,"<A HREF='%s?db=%s&g=%s' title='Downloadable Files...'>%s</A>", //  NOTE: TARGET=ucscDownloads   ??
-        hgFileUiName(), database, /*cartSessionVarName(), cartSessionId(cart),*/ tdb->track, name); // Note the hgsid would be needed if downloads page ever saved fileSortOrder to cart.
+    safef(link,PATH_LEN,"<A HREF='%s?db=%s&g=%s' title='Downloadable Files...'>%s</A>",
+                                                        //  NOTE: TARGET=ucscDownloads   ??
+          hgFileUiName(),database, /*cartSessionVarName(),cartSessionId(cart),*/ tdb->track, name);
+          // Note the hgsid would be needed if downloads page ever saved fileSortOrder to cart.
     return link;
     }
 else if(trackDbSetting(tdb, "wgEncode") != NULL)  // Downloads directory if this is ENCODE
     {
     const char *compositeDir = metadataFindValue(tdb, MDB_OBJ_TYPE_COMPOSITE);
+    if (compositeDir == NULL && tdbIsComposite(tdb))
+        compositeDir = tdb->track;
     if (compositeDir != NULL)
         {
-        struct dyString *dyLink = dyStringCreate("<A HREF=\"http://%s/goldenPath/%s/%s/%s/%s\" title='Download %s' class='file' TARGET=ucscDownloads>%s</A>",
-                hDownloadsServer(), database,
-                ENCODE_DCC_DOWNLOADS, compositeDir, (nameIsFile?name:""), nameIsFile?"file":"files",name);
+        struct dyString *dyLink =
+                dyStringCreate("<A HREF=\"http://%s/goldenPath/%s/%s/%s/%s\" title='Download %s' "
+                               "class='file' TARGET=ucscDownloads>%s</A>",
+                               hDownloadsServer(), database, ENCODE_DCC_DOWNLOADS, compositeDir,
+                               (nameIsFile?name:""), nameIsFile?"file":"files",name);
         return dyStringCannibalize(&dyLink);
         }
     }
 return NULL;
 }
 
 static boolean makeNamedDownloadsLink(char *database, struct trackDb *tdb,char *name)
 // Make a downloads link (if appropriate and then returns TRUE)
 {
 char *htmlString = htmlStringForDownloadsLink(database,trackDbTopLevelSelfOrParent(tdb),name,FALSE);
 if (htmlString == NULL)
     return FALSE;
 
 printf("%s", htmlString);
 freeMem(htmlString);
 return TRUE;
 }
 
 boolean makeDownloadsLink(char *database, struct trackDb *tdb)
 // Make a downloads link (if appropriate and then returns TRUE)
 {
 return makeNamedDownloadsLink(database, tdb,"Downloads");
 }
 
 void makeTopLink(struct trackDb *tdb)
-/* Link to top of UI page */
+// Link to top of UI page
 {
 if (trackDbSetting(tdb, "dimensions"))
     {
     char *upArrow = "&uArr;";
     enum browserType browser = cgiBrowser();
     if (browser == btIE || browser == btFF)
         upArrow = "&uarr;";
-    // Note: the nested spans are so that javascript can determine position and selectively display the link when appropriate
-    printf("<span class='navUp' style='float:right; display:none'>&nbsp;&nbsp;<A HREF='#' TITLE='Return to top of page'>Top%s</A></span>",upArrow);
+    // Note: the nested spans are so that javascript can determine position
+    // and selectively display the link when appropriate
+    printf("<span class='navUp' style='float:right; display:none'>&nbsp;&nbsp;"
+           "<A HREF='#' TITLE='Return to top of page'>Top%s</A></span>",upArrow);
     }
 }
 
 boolean makeSchemaLink(char *db,struct trackDb *tdb,char *label)
 // Make a table schema link (if appropriate and then returns TRUE)
 {
-#define SCHEMA_LINKED "<A HREF=\"../cgi-bin/hgTables?db=%s&hgta_group=%s&hgta_track=%s&hgta_table=%s&hgta_doSchema=describe+table+schema\" TARGET=ucscSchema%s>%s</A>"
+#define SCHEMA_LINKED "<A HREF=\"../cgi-bin/hgTables?db=%s&hgta_group=%s&hgta_track=%s" \
+                      "&hgta_table=%s&hgta_doSchema=describe+table+schema\" " \
+                      "TARGET=ucscSchema%s>%s</A>"
 if (hTableOrSplitExists(db, tdb->table))
     {
     char *tbOff = trackDbSetting(tdb, "tableBrowser");
     if (isNotEmpty(tbOff) && sameString(nextWord(&tbOff), "off"))
 	return FALSE;
     char *hint = " title='Open table schema in new window'";
     if( label == NULL)
         label = " View table schema";
     struct trackDb *topLevel = trackDbTopLevelSelfOrParent(tdb);
     printf(SCHEMA_LINKED, db, topLevel->grp, topLevel->track, tdb->table, hint, label);
     return TRUE;
     }
 return FALSE;
 }
 
 char *controlledVocabLink(char *file,char *term,char *value,char *title, char *label,char *suffix)
 // returns allocated string of HTML link to controlled vocabulary term
 {
-#define VOCAB_LINK_WITH_FILE "<A HREF='hgEncodeVocab?ra=%s&%s=\"%s\"' title='%s details' class='cv' TARGET=ucscVocab>%s</A>"
-#define VOCAB_LINK "<A HREF='hgEncodeVocab?%s=\"%s\"' title='%s details' class='cv' TARGET=ucscVocab>%s</A>"
+#define VOCAB_LINK_WITH_FILE "<A HREF='hgEncodeVocab?ra=%s&%s=\"%s\"' title='%s details' " \
+                             "class='cv' TARGET=ucscVocab>%s</A>"
+#define VOCAB_LINK "<A HREF='hgEncodeVocab?%s=\"%s\"' title='%s details' class='cv' " \
+                   "TARGET=ucscVocab>%s</A>"
 struct dyString *dyLink = NULL;
 char *encTerm = cgiEncode(term);
 char *encValue = cgiEncode(value);
 if (file != NULL)
     {
     char *encFile = cgiEncode(file);
     dyLink = dyStringCreate(VOCAB_LINK_WITH_FILE,encFile,encTerm,encValue,title,label);
     freeMem(encFile);
     }
 else
     dyLink = dyStringCreate(VOCAB_LINK,encTerm,encValue,title,label);
 if (suffix != NULL)
     dyStringAppend(dyLink,suffix);  // Don't encode since this may contain HTML
 
 freeMem(encTerm);
 freeMem(encValue);
 return dyStringCannibalize(&dyLink);
 }
 
 char *metadataAsHtmlTable(char *db,struct trackDb *tdb,boolean showLongLabel,boolean showShortLabel)
-/* If metadata from metaDb exists, return string of html with table definition */
+// If metadata from metaDb exists, return string of html with table definition
 {
 const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL);
 if (safeObj == NULL || safeObj->vars == NULL)
 return NULL;
 
 //struct dyString *dyTable = dyStringCreate("<table id='mdb_%s'>",tdb->table);
 struct dyString *dyTable = dyStringCreate("<table style='display:inline-table;'>");
 if(showLongLabel)
     dyStringPrintf(dyTable,"<tr valign='bottom'><td colspan=2 nowrap>%s</td></tr>",tdb->longLabel);
 if(showShortLabel)
-    dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap><i>shortLabel:</i></td><td nowrap>%s</td></tr>",tdb->shortLabel);
+    dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap><i>shortLabel:</i></td>"
+                           "<td nowrap>%s</td></tr>",tdb->shortLabel);
 
 // Get the hash of mdb and cv term types
 struct hash *cvTermTypes = (struct hash *)cvTermTypeHash();
 
 struct mdbObj *mdbObj = mdbObjClone(safeObj); // Important if we are going to remove vars!
-mdbObjRemoveVars(mdbObj,MDB_OBJ_TYPE_COMPOSITE " " MDB_VAR_PROJECT " " MDB_OBJ_TYPE " " MDB_VAR_MD5SUM); // Don't bother showing these (NOTE: composite,objType should be added to cv.ra typeOfTerms as hidden)
+// Don't bother showing these
+mdbObjRemoveVars(mdbObj,MDB_OBJ_TYPE_COMPOSITE " " MDB_VAR_PROJECT " " MDB_OBJ_TYPE " "
+                        MDB_VAR_MD5SUM);
 mdbObjRemoveHiddenVars(mdbObj);
 mdbObjReorderByCv(mdbObj,FALSE);// Use cv defined order for visible vars
 struct mdbVar *mdbVar;
 for (mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next)
     {
     if ((sameString(mdbVar->var,MDB_VAR_FILENAME) || sameString(mdbVar->var,MDB_VAR_FILEINDEX) )
     && trackDbSettingClosestToHome(tdb,MDB_VAL_ENCODE_PROJECT) != NULL)
         {
-        dyStringPrintf(dyTable,"<tr valign='top'><td align='right' nowrap><i>%s:</i></td><td nowrap>",mdbVar->var);
+        dyStringPrintf(dyTable,"<tr valign='top'><td align='right' nowrap><i>%s:</i></td>"
+                               "<td nowrap>",mdbVar->var);
 
         struct slName *fileSet = slNameListFromComma(mdbVar->val);
         while (fileSet != NULL)
             {
             struct slName *file = slPopHead(&fileSet);
             dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, file->name, TRUE));
             if (fileSet != NULL)
                 dyStringAppend(dyTable,"<BR>");
             slNameFree(&file);
             }
         dyStringAppend(dyTable,"</td></tr>");
         }
     else
-        {
-        if (cvTermTypes && differentString(mdbVar->var,MDB_VAR_TABLENAME)) // Don't bother with tableName
+        {                                           // Don't bother with tableName
+        if (cvTermTypes && differentString(mdbVar->var,MDB_VAR_TABLENAME))
             {
             struct hash *cvTerm = hashFindVal(cvTermTypes,mdbVar->var);
-            if (cvTerm != NULL) // even if cvTerm isn't used, it proves that it exists and a link is desirable
-                {
+            if (cvTerm != NULL) // even if cvTerm isn't used,
+                {               // it proves that it exists and a link is desirable
                 if(!cvTermIsHidden(mdbVar->var))
                     {
                     char *label = (char *)cvLabel(NULL,mdbVar->var);
-                    char *linkOfType = controlledVocabLink(NULL,CV_TYPE,mdbVar->var,label,label,NULL);
+                    char *linkOfType = controlledVocabLink(NULL,CV_TYPE,mdbVar->var,label,
+                                                           label,NULL);
                     if (cvTermIsCvDefined(mdbVar->var))
                         {
                         label = (char *)cvLabel(mdbVar->var,mdbVar->val);
-                        char *linkOfTerm = controlledVocabLink(NULL,CV_TERM,mdbVar->val,label,label,NULL);
-                        dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,linkOfTerm);
+                        char *linkOfTerm = controlledVocabLink(NULL,CV_TERM,mdbVar->val,label,
+                                                               label,NULL);
+                        dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap>"
+                                               "<i>%s:</i></td><td nowrap>%s</td></tr>",
+                                               linkOfType,linkOfTerm);
                         freeMem(linkOfTerm);
                         }
                     else
-                        dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,mdbVar->val);
+                        dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap>"
+                                               "<i>%s:</i></td><td nowrap>%s</td></tr>",
+                                               linkOfType,mdbVar->val);
                     freeMem(linkOfType);
                     continue;
                     }
                 }
             }
-        dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val);
+        dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right' nowrap><i>%s:</i></td>"
+                               "<td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val);
         }
     }
 dyStringAppend(dyTable,"</table>");
 //mdbObjsFree(&mdbObj); // spill some memory
 return dyStringCannibalize(&dyTable);
 }
 
 boolean compositeMetadataToggle(char *db,struct trackDb *tdb,char *title,
         boolean embeddedInText,boolean showLongLabel)
-/* If metadata from metaTbl exists, create a link that will allow toggling it's display */
+// If metadata from metaTbl exists, create a link that will allow toggling it's display
 {
 const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL);
 if(safeObj == NULL || safeObj->vars == NULL)
 return FALSE;
 
-printf("%s<A HREF='#a_meta_%s' onclick='return metadataShowHide(\"%s\",%s,true);' title='Show metadata details...'>%s<img src='../images/downBlue.png'/></A>",
-        (embeddedInText?"&nbsp;":"<P>"),tdb->track,tdb->track, showLongLabel?"true":"false", (title?title:""));
+printf("%s<A HREF='#a_meta_%s' onclick='return metadataShowHide(\"%s\",%s,true);' "
+       "title='Show metadata details...'>%s<img src='../images/downBlue.png'/></A>",
+       (embeddedInText?"&nbsp;":"<P>"),tdb->track,tdb->track, showLongLabel?"true":"false",
+       (title?title:""));
 printf("<DIV id='div_%s_meta' style='display:none;'></div>",tdb->track);
 return TRUE;
 }
 
 void extraUiLinks(char *db,struct trackDb *tdb)
-/* Show downlaods, schema and metadata links where appropriate */
+// Show downlaods, schema and metadata links where appropriate
 {
 boolean schemaLink = (!tdbIsDownloadsOnly(tdb)
                   && isCustomTrack(tdb->table) == FALSE)
                   && (hTableOrSplitExists(db, tdb->table));
 boolean metadataLink = (!tdbIsComposite(tdb)
                   && metadataForTable(db, tdb, NULL) != NULL);
 boolean downloadLink = (trackDbSetting(tdb, "wgEncode") != NULL && !tdbIsSuperTrack(tdb));
 int links = 0;
 if (schemaLink)
     links++;
 if (metadataLink)
     links++;
 if (downloadLink)
     links++;
 
@@ -472,89 +511,88 @@
 
 /******  Some stuff for hide/dense/full controls ******/
 
 static char *hTvStrings[] =
 /* User interface strings for track visibility controls. */
     {
     "hide",
     "dense",
     "full",
     "pack",
     "squish"
     };
 #define hTvStringShowSameAsFull "show"
 
 enum trackVisibility hTvFromStringNoAbort(char *s)
-/* Given a string representation of track visibility, return as
- * equivalent enum. */
+// Given a string representation of track visibility, return as equivalent enum.
 {
 int vis = stringArrayIx(s, hTvStrings, ArraySize(hTvStrings));
 if (vis < 0)
     {
     if (sameString(hTvStringShowSameAsFull,s))
         return tvShow;  // Show is the same as full!
     vis = 0;  // don't generate bogus value on invalid input
     }
 return vis;
 }
 
 enum trackVisibility hTvFromString(char *s)
-/* Given a string representation of track visibility, return as
- * equivalent enum. */
+// Given a string representation of track visibility, return as equivalent enum.
 {
 enum trackVisibility vis = hTvFromStringNoAbort(s);
 if ((int)vis < 0)
    errAbort("Unknown visibility %s", s);
 return vis;
 }
 
 char *hStringFromTv(enum trackVisibility vis)
-/* Given enum representation convert to string. */
+// Given enum representation convert to string.
 {
 return hTvStrings[vis];
 }
 
-void hTvDropDownClassWithJavascript(char *varName, enum trackVisibility vis, boolean canPack, char *class,char * javascript)
-/* Make track visibility drop down for varName with style class */
+void hTvDropDownClassWithJavascript(char *varName, enum trackVisibility vis, boolean canPack,
+                                    char *class,char * javascript)
+// Make track visibility drop down for varName with style class
 {
 static char *noPack[] =
     {
     "hide",
     "dense",
     "full",
     };
 static char *pack[] =
     {
     "hide",
     "dense",
     "squish",
     "pack",
     "full",
     };
 static int packIx[] = {tvHide,tvDense,tvSquish,tvPack,tvFull};
 if (canPack)
     cgiMakeDropListClassWithStyleAndJavascript(varName, pack, ArraySize(pack),
-                            pack[packIx[vis]], class, TV_DROPDOWN_STYLE,javascript);
+                                               pack[packIx[vis]], class, TV_DROPDOWN_STYLE,
+                                               javascript);
 else
     cgiMakeDropListClassWithStyleAndJavascript(varName, noPack, ArraySize(noPack),
                             noPack[vis], class, TV_DROPDOWN_STYLE,javascript);
 }
 
 void hTvDropDownClassVisOnlyAndExtra(char *varName, enum trackVisibility vis,
 	boolean canPack, char *class, char *visOnly,char *extra)
-/* Make track visibility drop down for varName with style class,
-	and potentially limited to visOnly */
+// Make track visibility drop down for varName with style class, and potentially limited to visOnly
 {
 static char *denseOnly[] =
     {
     "hide",
     "dense",
     };
 static char *squishOnly[] =
     {
     "hide",
     "squish",
     };
 static char *packOnly[] =
     {
     "hide",
     "pack",
@@ -599,31 +637,31 @@
 	cgiMakeDropListClassWithStyleAndJavascript(varName, denseOnly, ArraySize(denseOnly),
 		denseOnly[visIx], class, TV_DROPDOWN_STYLE,extra);
     }
     else
     {
     if (canPack)
 	cgiMakeDropListClassWithStyleAndJavascript(varName, pack, ArraySize(pack),
                             pack[packIx[vis]], class, TV_DROPDOWN_STYLE,extra);
     else
 	cgiMakeDropListClassWithStyleAndJavascript(varName, noPack, ArraySize(noPack),
                             noPack[vis], class, TV_DROPDOWN_STYLE,extra);
     }
 }
 
 void hideShowDropDownWithClassAndExtra(char *varName, boolean show, char *class, char *extra)
-/* Make hide/show dropdown for varName */
+// Make hide/show dropdown for varName
 {
 static char *hideShow[] =
     {
     "hide",
     "show"
     };
 cgiMakeDropListClassWithStyleAndJavascript(varName, hideShow, ArraySize(hideShow),
                             hideShow[show], class, TV_DROPDOWN_STYLE,extra);
 }
 
 
 /****** Some stuff for stsMap related controls *******/
 
 static char *stsMapOptions[] = {
     "All Genetic",
@@ -1093,31 +1131,32 @@
 				    BASE_COLOR_DRAW_OFF);
 stringVal = cartUsualStringClosestToHome(cart, tdb, FALSE, BASE_COLOR_VAR_SUFFIX,stringVal);
 
 return baseColorDrawOptStringToEnum(stringVal);
 }
 
 
 /*** Control of fancy indel display code: ***/
 
 static boolean tdbOrCartBoolean(struct cart *cart, struct trackDb *tdb,
                                 char *settingName, char *defaultOnOff)
 /* Query cart & trackDb to determine if a boolean variable is set. */
 {
 boolean alreadySet;
 alreadySet = !sameString("off",trackDbSettingOrDefault(tdb, settingName, defaultOnOff));
-alreadySet = cartUsualBooleanClosestToHome(cart, tdb, FALSE, settingName, alreadySet); // NOTE: parentLevel=FALSE because tdb param already is at appropriate level
+alreadySet = cartUsualBooleanClosestToHome(cart, tdb, FALSE, settingName, alreadySet);
+             // NOTE: parentLevel=FALSE because tdb param already is at appropriate level
 return alreadySet;
 }
 
 static boolean indelAppropriate(struct trackDb *tdb)
 /* Return true if it makes sense to offer indel display options for tdb. */
 {
 return (tdb && (startsWith("psl", tdb->type) || sameString("bam", tdb->type)) &&
 	(cfgOptionDefault("browser.indelOptions", NULL) != NULL));
 }
 
 static void indelEnabledByName(struct cart *cart, struct trackDb *tdb, char *name,
                   float basesPerPixel, boolean *retDoubleInsert, boolean *retQueryInsert,
                   boolean *retPolyA)
 /* Query cart & trackDb to determine what indel display (if any) is enabled. Set
  * basesPerPixel to 0.0 to disable check for zoom level.  */
@@ -1162,31 +1201,32 @@
 if (indelAppropriate(tdb))
     {
     boolean showDoubleInsert, showQueryInsert, showPolyA;
     char var[512];
     indelEnabledByName(cart, tdb, name, 0.0, &showDoubleInsert, &showQueryInsert, &showPolyA);
     printf("<TABLE><TR><TD colspan=2><B>Alignment Gap/Insertion Display Options</B>");
     printf("&nbsp;<A HREF=\"%s\">Help on display options</A>\n<TR valign='top'><TD>",
            INDEL_HELP_PAGE);
     safef(var, sizeof(var), "%s.%s", name, INDEL_DOUBLE_INSERT);
     cgiMakeCheckBox(var, showDoubleInsert);
     printf("</TD><TD>Draw double horizontal lines when both genome and query have "
            "an insertion</TD></TR>\n<TR valign='top'><TD>");
     safef(var, sizeof(var), "%s.%s", name, INDEL_QUERY_INSERT);
     cgiMakeCheckBox(var, showQueryInsert);
     printf("</TD><TD>Draw a vertical purple line for an insertion at the beginning or "
-           "end of the <BR>query, orange for insertion in the middle of the query</TD></TR>\n<TR valign='top'><TD>");
+           "end of the <BR>query, orange for insertion in the middle of the query</TD></TR>\n"
+           "<TR valign='top'><TD>");
     safef(var, sizeof(var), "%s.%s", name, INDEL_POLY_A);
     /* We can highlight valid polyA's only if we have query sequence --
      * so indelPolyA code piggiebacks on baseColor code: */
     if (baseColorGotSequence(tdb))
         {
         cgiMakeCheckBox(var, showPolyA);
         printf("</TD><TD>Draw a vertical green line where query has a polyA tail "
                "insertion</TD></TR>\n");
         }
 
     printf("</TABLE>\n");
     }
 }
 
 void indelShowOptions(struct cart *cart, struct trackDb *tdb)
@@ -1552,32 +1592,31 @@
 int x = stringIx(string, wiggleGraphOptions);
 if (x < 0)
    errAbort("hui::wiggleGraphStringToEnum() - Unknown option %s", string);
 return x;
 }
 
 char *wiggleGraphEnumToString(enum wiggleGraphOptEnum x)
 /* Convert from enum to string representation. */
 {
 return wiggleGraphOptions[x];
 }
 
 void wiggleGraphDropDown(char *var, char *curVal)
 /* Make drop down of options. */
 {
-cgiMakeDropList(var, wiggleGraphOptions, ArraySize(wiggleGraphOptions),
-	curVal);
+cgiMakeDropList(var, wiggleGraphOptions, ArraySize(wiggleGraphOptions), curVal);
 }
 
 static char *aggregateLabels[] =
     {
     "none",
     "transparent",
     "solid",
     };
 
 static char *aggregateValues[] =
     {
     WIG_AGGREGATE_NONE,
     WIG_AGGREGATE_TRANSPARENT,
     WIG_AGGREGATE_SOLID,
     };
@@ -1794,40 +1833,39 @@
 if (isXeno)
     addMrnaFilter(mud, track, "organism", "org", "organism");
 addMrnaFilter(mud, track, "accession", "acc", "acc");
 addMrnaFilter(mud, track, "author", "aut", "author");
 addMrnaFilter(mud, track, "library", "lib", "library");
 addMrnaFilter(mud, track, "tissue", "tis", "tissue");
 addMrnaFilter(mud, track, "cell", "cel", "cell");
 addMrnaFilter(mud, track, "keyword", "key", "keyword");
 addMrnaFilter(mud, track, "gene", "gen", "geneName");
 addMrnaFilter(mud, track, "product", "pro", "productName");
 addMrnaFilter(mud, track, "description", "des", "description");
 return mud;
 }
 
 int trackNameAndLabelCmp(const void *va, const void *vb)
-/* Compare to sort on label. */
+// Compare to sort on label.
 {
 const struct trackNameAndLabel *a = *((struct trackNameAndLabel **)va);
 const struct trackNameAndLabel *b = *((struct trackNameAndLabel **)vb);
 return strcmp(a->label, b->label);
 }
 
 char *trackFindLabel(struct trackNameAndLabel *list, char *label)
-/* Try to find label in list. Return NULL if it's
- * not there. */
+// Try to find label in list. Return NULL if it's not there.
 {
 struct trackNameAndLabel *el;
 for (el = list; el != NULL; el = el->next)
     {
     if (sameString(el->label, label))
         return label;
     }
 return NULL;
 }
 
 char *genePredDropDown(struct cart *cart, struct hash *trackHash,
                                         char *formName, char *varName)
 /* Make gene-prediction drop-down().  Return track name of
  * currently selected one.  Return NULL if no gene tracks.
  * If formName isn't NULL, it's the form for auto submit (onchange attr).
@@ -1889,32 +1927,31 @@
     int i;
 
     AllocArray(menu, nameCount);
     for (name = nameList, i=0; name != NULL; name = name->next, ++i)
 	{
 	menu[i] = name->label;
 	}
     if (formName == NULL)
         autoSubmit = NULL;
     else
         {
         safef(javascript, sizeof(javascript),
                 "onchange=\"document.%s.submit();\"", formName);
         autoSubmit = javascript;
         }
-    cgiMakeDropListFull(varName, menu, menu,
-    	                        nameCount, selectedName, autoSubmit);
+    cgiMakeDropListFull(varName, menu, menu, nameCount, selectedName, autoSubmit);
     freez(&menu);
     }
 
 /* Convert to track name */
 for (name = nameList; name != NULL; name = name->next)
     {
     if (sameString(selectedName, name->label))
         trackName = name->name;
     }
 
 /* Clean up and return. */
 slFreeList(&nameList);
 slFreeList(&trackList);
 return trackName;
 }
@@ -1923,31 +1960,32 @@
 	boolean leafOnly)
 /* Recursively add trackList to trackHash */
 {
 struct trackDb *tdb;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     if (hTrackOnChrom(tdb, chrom))
 	{
 	if (tdb->subtracks == NULL || !leafOnly)
 	    hashAdd(trackHash, tdb->track, tdb);
 	}
     rAddTrackListToHash(trackHash, tdb->subtracks, chrom, leafOnly);
     }
 }
 
-struct hash *trackHashMakeWithComposites(char *db,char *chrom,struct trackDb **tdbList,bool withComposites)
+struct hash *trackHashMakeWithComposites(char *db,char *chrom,struct trackDb **tdbList,
+                                         bool withComposites)
 // Make hash of trackDb items for this chromosome, including composites, not just the subtracks.
 // May pass in prepopulated trackDb list, or may receive the trackDb list as an inout.
 {
 struct trackDb *theTdbs = NULL;
 if (tdbList == NULL || *tdbList == NULL)
     {
     theTdbs = hTrackDb(db);
     if (tdbList != NULL)
         *tdbList = theTdbs;
     }
 else
     theTdbs = *tdbList;
 struct hash *trackHash = newHash(7);
 rAddTrackListToHash(trackHash, theTdbs, chrom, !withComposites);
 return trackHash;
@@ -2007,98 +2045,139 @@
     for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
 	{
 	struct trackDb *subtrack = tdbRef->val;
 	if (sameString(subtrack->track, primarySubtrack))
 	    {
 	    type = subtrack->type;
 	    break;
 	    }
 	}
     slFreeList(&tdbRefList);
     }
 return type;
 }
 
 boolean hSameTrackDbType(char *type1, char *type2)
-/* Compare type strings: require same string unless both are wig tracks. */
+// Compare type strings: identical first word or allowed compatibilities
 {
-return (sameString(type1, type2) ||
-	(startsWith("wig ", type1) && startsWith("wig ", type2)));
+// OLD_CODE
+//return (sameString(type1, type2) ||
+//        (startsWith("wig ", type1) && startsWith("wig ", type2)));
+int wordLength = strlen(type1);
+
+// Many types have additional args which should not interfere (e.g. "bigWig 0 20")
+// Note: beds of different size are ok
+char *firstWhite = skipToSpaces(type1);
+if (firstWhite != NULL)
+    wordLength = (firstWhite - type1) + 1; // include white space
+
+if (sameStringN(type1, type2,wordLength))
+    return TRUE;
+
+// Allow these cross overs?  Why not?  (see redmine #7588)
+if (startsWith("wig ",type1) && startsWith("bigWig ",type2))  // tested
+    return TRUE;
+if (startsWith("bigWig ",type1) && startsWith("wig ",type2))  // tested
+    return TRUE;
+
+// Many flavors of bed that could be merged...
+if ((   startsWith("bed ",type1)  // bed to Peak and vis-versa tested
+     || startsWith("broadPeak",type1)
+     || startsWith("narrowPeak",type1))
+&&  (   startsWith("bed ",type2)
+     || startsWith("broadPeak",type2)
+     || startsWith("narrowPeak",type2)))
+    return TRUE;
+// bigBed to bed and vis-versa fails!
+//if ((   startsWith("bed ",type1)
+//     || startsWith("bigBed ",type1)
+//     || startsWith("broadPeak",type1)
+//     || startsWith("narrowPeak",type1))
+//&&  (   startsWith("bed ",type2)
+//     || startsWith("bigBed ",type2)
+//     || startsWith("broadPeak",type2)
+//     || startsWith("narrowPeak",type2)))
+//    return TRUE;
+
+return FALSE;
 }
 
 static char *labelRoot(char *label, char** suffix)
 /* Parses a label which may be split with a &nbsp; into root and suffix
    Always free labelRoot.  suffix, which may be null does not need to be freed. */
 {
 char *root = cloneString(label);
 char *extra=strstrNoCase(root,"&nbsp;"); // &nbsp; mean don't include the reset as part of the link
 if ((long)(extra)==-1)
     extra=NULL;
 if (extra!=NULL)
     {
     *extra='\0';
     if(suffix != NULL)
         {
         extra+=5;
         *extra=' '; // Converts the &nbsp; to ' ' and include the ' '
         *suffix = extra;
         }
     }
 return root;
 }
 
-typedef struct _dividers {
+typedef struct _dividers
+    {
     int count;
     char**subgroups;
     char* setting;
 } dividers_t;
 
 static dividers_t *dividersSettingGet(struct trackDb *parentTdb)
-/* Parses any dividers setting in parent of subtracks */
+// Parses any dividers setting in parent of subtracks
 {
 dividers_t *dividers = needMem(sizeof(dividers_t));
 dividers->setting    = cloneString(trackDbSetting(parentTdb, "dividers"));
 if(dividers->setting == NULL)
     {
     freeMem(dividers);
     return NULL;
     }
 dividers->subgroups  = needMem(24*sizeof(char*));
 dividers->count      = chopByWhite(dividers->setting, dividers->subgroups,24);
 return dividers;
 }
+
 static void dividersFree(dividers_t **dividers)
-/* frees any previously obtained dividers setting */
+// frees any previously obtained dividers setting
 {
 if(dividers && *dividers)
     {
     freeMem((*dividers)->subgroups);
     freeMem((*dividers)->setting);
     freez(dividers);
     }
 }
 
-typedef struct _hierarchy {
+typedef struct _hierarchy
+    {
     int count;
     char* subgroup;
     char**membership;
     int*  indents;
     char* setting;
 } hierarchy_t;
 
 static hierarchy_t *hierarchySettingGet(struct trackDb *parentTdb)
-/* Parses any list hierachy instructions setting in parent of subtracks */
+// Parses any list hierachy instructions setting in parent of subtracks
 {
 hierarchy_t *hierarchy = needMem(sizeof(hierarchy_t));
 hierarchy->setting     = cloneString(trackDbSetting(parentTdb, "hierarchy"));  // To be freed later
 if(hierarchy->setting == NULL)
     {
     freeMem(hierarchy);
     return NULL;
     }
 int cnt,ix;
 char *words[SMALLBUF];
 cnt = chopLine(hierarchy->setting, words);
 assert(cnt<=ArraySize(words));
 if(cnt <= 1)
     {
     freeMem(hierarchy->setting);
@@ -2109,140 +2188,139 @@
 hierarchy->membership  = needMem(cnt*sizeof(char*));
 hierarchy->indents     = needMem(cnt*sizeof(int));
 hierarchy->subgroup    = words[0];
 char *name,*value;
 for (ix = 1,hierarchy->count=0; ix < cnt; ix++)
     {
     if (parseAssignment(words[ix], &name, &value))
         {
         hierarchy->membership[hierarchy->count]  = name;
         hierarchy->indents[hierarchy->count] = sqlUnsigned(value);
         hierarchy->count++;
         }
     }
 return hierarchy;
 }
+
 static void hierarchyFree(hierarchy_t **hierarchy)
-/* frees any previously obtained hierachy settings */
+// frees any previously obtained hierachy settings
 {
 if(hierarchy && *hierarchy)
     {
     freeMem((*hierarchy)->setting);
     freeMem((*hierarchy)->membership);
     freeMem((*hierarchy)->indents);
     freez(hierarchy);
     }
 }
 
 // Four State checkboxes can be checked/unchecked by enable/disabled
-// NOTE: fourState is not a bitmap because it is manipulated in javascript and int seemed easier at the time
+// NOTE: fourState is not a bitmap because it is manipulated in javascript and
+//       int seemed easier at the time
 #define FOUR_STATE_EMPTY             TDB_EXTRAS_EMPTY_STATE
 //#define FOUR_STATE_UNCHECKED         0
 //#define FOUR_STATE_CHECKED           1
 //#define FOUR_STATE_CHECKED_DISABLED  -1
 #define FOUR_STATE_DISABLE(val)      {while((val) >= 0) (val) -= 2;}
 #define FOUR_STATE_ENABLE(val)       {while((val) < 0) (val) += 2;}
 
 int subtrackFourStateChecked(struct trackDb *subtrack, struct cart *cart)
-/* Returns the four state checked state of the subtrack */
+// Returns the four state checked state of the subtrack
 {
 char * setting = NULL;
 char objName[SMALLBUF];
 int fourState = (int)tdbExtrasFourState(subtrack);
 if(fourState != FOUR_STATE_EMPTY)
     return fourState;
 
 fourState = FOUR_STATE_UNCHECKED;  // default to unchecked, enabled
 if ((setting = trackDbLocalSetting(subtrack, "parent")) != NULL)
     {
     if(findWordByDelimiter("off",' ',setting) == NULL)
         fourState = FOUR_STATE_CHECKED;
     }
 
 // Now check visibility
 enum trackVisibility vis = tdbLocalVisibility(cart, subtrack, NULL);
 if (vis == tvHide)
     {
     if(tdbIsCompositeView(subtrack->parent))
         {
         if(tdbLocalVisibility(cart, subtrack->parent, NULL) == tvHide)
             FOUR_STATE_DISABLE(fourState);
         }
     }
 
 safef(objName, sizeof(objName), "%s_sel", subtrack->track);
 setting = cartOptionalString(cart, objName);
 if (setting != NULL)
     {
-    if (sameWord("on",setting)) // ouch! cartUsualInt was interpreting "on" as 0, which was a bad bug!
+    if (sameWord("on",setting)) // ouch! cartUsualInt was interpreting "on" as 0, which was bad bug!
         fourState = 1;
     else
         fourState = atoi(setting);
     }
 tdbExtrasFourStateSet(subtrack,fourState);
 return fourState;
 }
 
-void subtrackFourStateCheckedSet(struct trackDb *subtrack, struct cart *cart,boolean checked, boolean enabled)
-/* Sets the fourState Checked in the cart and updates cached state */
+void subtrackFourStateCheckedSet(struct trackDb *subtrack, struct cart *cart,boolean checked,
+                                 boolean enabled)
+// Sets the fourState Checked in the cart and updates cached state
 {
 int fourState = ( checked ? FOUR_STATE_CHECKED : FOUR_STATE_UNCHECKED );
 if (!enabled)
     FOUR_STATE_DISABLE(fourState);
 
 char objName[SMALLBUF];
 char objVal[5];
 safef(objName, sizeof(objName), "%s_sel", subtrack->track);
 safef(objVal, sizeof(objVal), "%d", fourState);
 cartSetString(cart, objName, objVal);
 tdbExtrasFourStateSet(subtrack,fourState);
 }
 
 
 static char *tagEncode(char *name)
 // Turns out css classes cannot begin with a number.  So prepend 'A'
 // If this were more widely used, could move to cheapcgi.c.
 {
 if (!isdigit(*name))
      return name;
 
 char *newName = needMem(strlen(name)+2);
 *newName = 'A';
 strcpy(newName+1,name);
 return newName;
 }
 
-typedef struct _dimensions {
+typedef struct _dimensions
+    {
     int count;
     char**names;
     char**subgroups;
     char* setting;
 } dimensions_t;
 
 boolean dimensionsExist(struct trackDb *parentTdb)
-/* Does this parent track contain dimensions? */
+// Does this parent track contain dimensions?
 {
     return (trackDbSetting(parentTdb, "dimensions") != NULL);
 }
-//static boolean dimensionsSubtrackOf(struct trackDb *childTdb)
-///* Does this child belong to a parent  with dimensions? */
-//{
-//    return (tdbIsCompositeChild(childTdb) && dimensionsExist(childTdb->parent));
-//}
 
 static dimensions_t *dimensionSettingsGet(struct trackDb *parentTdb)
-/* Parses any dimemnions setting in parent of subtracks */
+// Parses any dimemnions setting in parent of subtracks
 {
 dimensions_t *dimensions = needMem(sizeof(dimensions_t));
 dimensions->setting = cloneString(trackDbSetting(parentTdb, "dimensions"));  // To be freed later
 if(dimensions->setting == NULL)
     {
     freeMem(dimensions);
     return NULL;
     }
 int cnt,ix;
 char *words[SMALLBUF];
 cnt = chopLine(dimensions->setting,words);
 assert(cnt<=ArraySize(words));
 if(cnt <= 0)
     {
     freeMem(dimensions->setting);
@@ -2254,118 +2332,120 @@
 dimensions->subgroups = needMem(cnt*sizeof(char*));
 char *name,*value;
 for (ix = 0,dimensions->count=0; ix < cnt; ix++)
     {
     if (parseAssignment(words[ix], &name, &value))
         {
         dimensions->names[dimensions->count]     = name;
         dimensions->subgroups[dimensions->count] = tagEncode(value);
         dimensions->count++;
         }
     }
 return dimensions;
 }
 
 static void dimensionsFree(dimensions_t **dimensions)
-/* frees any previously obtained dividers setting */
+// frees any previously obtained dividers setting
 {
 if(dimensions && *dimensions)
     {
     freeMem((*dimensions)->setting);
     freeMem((*dimensions)->names);
     freeMem((*dimensions)->subgroups);
     freez(dimensions);
     }
 }
 
 #define SUBGROUP_MAX 9
 
 enum filterCompositeType
 // Filter composites are drop-down checkbix-lists for selecting subtracks (eg hg19::HAIB TFBS)
     {
     fctNone=0,      // do not offer filter for this dimension
     fctOne=1,       // filter composite by one or all
     fctOneOnly=2,   // filter composite by only one
     fctMulti=3,     // filter composite by multiselect: all, one or many
     };
 
-typedef struct _members {
+typedef struct _members
+    {
     int count;
     char * groupTag;
     char * groupTitle;
     char **tags;
     char **titles;
     boolean *selected;
     char * setting;
     int *subtrackCount;              // count of subtracks
     int *currentlyVisible;           // count of visible subtracks
     struct slRef **subtrackList;     // set of subtracks belonging to each subgroup member
     enum filterCompositeType fcType; // fctNone,fctOne,fctMulti
 } members_t;
 
 int subgroupCount(struct trackDb *parentTdb)
-/* How many subGroup setting does this parent have? */
+// How many subGroup setting does this parent have?
 {
 int ix;
 int count = 0;
 for(ix=1;ix<=SUBGROUP_MAX;ix++)
     {
     char subGrp[16];
     safef(subGrp, ArraySize(subGrp), "subGroup%d",ix);
     if(trackDbSetting(parentTdb, subGrp) != NULL)
         count++;
     }
 return count;
 }
 
 char * subgroupSettingByTagOrName(struct trackDb *parentTdb, char *groupNameOrTag)
-/* look for a subGroup by name (ie subGroup1) or tag (ie view) and return an unallocated char* */
+// look for a subGroup by name (ie subGroup1) or tag (ie view) and return an unallocated char*
 {
 struct trackDb *ancestor;
 for (ancestor = parentTdb; ancestor != NULL; ancestor = ancestor->parent)
     {
     int ix;
     char *setting = NULL;
     if(startsWith("subGroup",groupNameOrTag))
 	{
 	setting = trackDbSetting(ancestor, groupNameOrTag);
 	if(setting != NULL)
 	    return setting;
 	}
     for(ix=1;ix<=SUBGROUP_MAX;ix++)
 	{
 	char subGrp[16];
 	safef(subGrp, ArraySize(subGrp), "subGroup%d",ix);
 	setting = trackDbSetting(ancestor, subGrp);
 	if(setting != NULL)  // Doesn't require consecutive subgroups
 	    {
 	    if(startsWithWord(groupNameOrTag,setting))
 		return setting;
 	    }
 	}
     }
 return NULL;
 }
 
 boolean subgroupingExists(struct trackDb *parentTdb, char *groupNameOrTag)
-/* Does this parent track contain a particular subgrouping? */
+// Does this parent track contain a particular subgrouping?
 {
     return (subgroupSettingByTagOrName(parentTdb,groupNameOrTag) != NULL);
 }
 
 static members_t *subgroupMembersGet(struct trackDb *parentTdb, char *groupNameOrTag)
-/* Parse a subGroup setting line into tag,title, names(optional) and values(optional), returning the count of members or 0 */
+// Parse a subGroup setting line into tag,title, names(optional) and values(optional),
+// returning the count of members or 0
 {
 int ix,count;
 char *setting = subgroupSettingByTagOrName(parentTdb, groupNameOrTag);
 if(setting == NULL)
     return NULL;
 members_t *members = needMem(sizeof(members_t));
 members->setting = cloneString(setting);
 char *words[SMALLBUF];
 count = chopLine(members->setting, words);
 assert(count <= ArraySize(words));
 if(count <= 1)
     {
     freeMem(members->setting);
     freeMem(members);
     return NULL;
@@ -2375,89 +2455,66 @@
 members->tags       = needMem(count*sizeof(char*));
 members->titles     = needMem(count*sizeof(char*));
 for (ix = 2,members->count=0; ix < count; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))
         {
         members->tags[members->count]  = tagEncode(name);
         members->titles[members->count] = strSwapChar(value,'_',' ');
         members->count++;
         }
     }
 return members;
 }
 
-// No longer used, but it could come back!
-//static members_t *subgroupMembersGetByDimension(struct trackDb *parentTdb, char dimension)
-///* Finds the dimension requested and return its associated
-// * subgroupMembership, returning the count of members or 0 */
-//{
-//int ix;
-//dimensions_t *dimensions = dimensionSettingsGet(parentTdb);
-//if(dimensions!=NULL)
-//    {
-//    for(ix=0;ix<dimensions->count;ix++)
-//        {
-//        if(lastChar(dimensions->names[ix]) != dimension)
-//            continue;
-//        if((strlen(dimensions->names[ix]) == 10 && startsWith("dimension",dimensions->names[ix]))
-//        || (strlen(dimensions->names[ix]) == 4  && startsWith("dim",dimensions->names[ix])))
-//            {
-//            members_t *members = subgroupMembersGet(parentTdb, dimensions->subgroups[ix]);
-//            dimensionsFree(&dimensions);
-//            return members;
-//            }
-//        }
-//    dimensionsFree(&dimensions);
-//    }
-//return NULL;
-//}
-
 static int membersSubGroupIx(members_t* members, char *tag)
-{ // Returns the index of the subgroup within the members struct (or -1)
+// Returns the index of the subgroup within the members struct (or -1)
+{
 int ix = 0;
 for(ix=0;ix<members->count;ix++)
     {
     if (members->tags[ix] != NULL && sameString(members->tags[ix],tag))
         return ix;
     }
 return -1;
 }
 
 
 static void subgroupMembersFree(members_t **members)
-/* frees memory for subgroupMembers lists */
+// frees memory for subgroupMembers lists
 {
 if(members && *members)
     {
     // This should only get set through membersForAll which should not be freed.
     if((*members)->selected != NULL || (*members)->subtrackList != NULL)
     	return;
     freeMem((*members)->setting);
     freeMem((*members)->tags);
     freeMem((*members)->titles);
     freez(members);
     }
 }
 
-static members_t *subgroupMembersWeedOutEmpties(struct trackDb *parentTdb, members_t *members, struct cart *cart)
+static members_t *subgroupMembersWeedOutEmpties(struct trackDb *parentTdb, members_t *members,
+                                                struct cart *cart)
 // Weed out members of a subgroup without any subtracks, alters memory in place!
 {
 // First tally all subtrack counts
 int ixIn=0;
-struct slRef *subtrackRef, *subtrackRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
+struct slRef *subtrackRef, *subtrackRefList =
+                                        trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
 struct trackDb *subtrack;
 members->subtrackCount    = needMem(members->count * sizeof(int));
 members->currentlyVisible = needMem(members->count * sizeof(int));
 members->subtrackList     = needMem(members->count * sizeof(struct slRef *));
 for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
     {
     subtrack = subtrackRef->val;
     char *belongsTo =NULL;
     if(subgroupFind(subtrack,members->groupTag,&belongsTo))
         {
         if (-1 != (ixIn = stringArrayIx(belongsTo, members->tags, members->count)))
             {
             members->subtrackCount[ixIn]++;
             if(cart && fourStateVisible(subtrackFourStateChecked(subtrack,cart)))
                 members->currentlyVisible[ixIn]++;
@@ -2504,232 +2561,256 @@
     subgroupMembersFree(&members);
     return NULL;
     }
 
 return members;
 }
 
 enum
 {
     dimV=0, // View first
     dimX=1, // X & Y next
     dimY=2,
     dimA=3, // dimA is start of first of the optional non-matrix, non-view dimensions
 };
 
-typedef struct _membersForAll {
+typedef struct _membersForAll
+    {
     int abcCount;
-    int dimMax;               // Arrays of "members" structs will be ordered as [view][dimX][dimY][dimA]... with first 3 in fixed spots and rest as found (and non-empty)
+    int dimMax;               // Arrays of "members" structs will be ordered as
+                              //    [view][dimX][dimY][dimA]... with first 3 in fixed spots
+                              //    and rest as found (and non-empty)
     boolean filters;          // ABCs use filterComp boxes (as upposed to check boxes
-    dimensions_t *dimensions; // One struct describing "deimensions" setting"  (e.g. dimX:cell dimY:antibody dimA:treatment)
-    members_t* members[27];   // One struct for each dimension describing groups in dimension (e.g. cell: GM12878,K562)
-    char* checkedTags[27];  // FIXME: Should move checkedTags into membersForAll->members[ix]->selected;
+    dimensions_t *dimensions; // One struct describing "deimensions" setting"
+                              //    (e.g. dimX:cell dimY:antibody dimA:treatment)
+    members_t* members[27];   // One struct for each dimension describing groups in dimension
+                              //    (e.g. cell: GM12878,K562)
+    char* checkedTags[27];  // FIXME: Should move checkedTags into
+                            // membersForAll->members[ix]->selected;
     char letters[27];
 } membersForAll_t;
 
-static char* abcMembersChecked(struct trackDb *parentTdb, struct cart *cart, members_t* members, char letter)
-/* returns a string of subGroup tags which are currently checked */
+
+static char* abcMembersChecked(struct trackDb *parentTdb, struct cart *cart, members_t* members,
+                               char letter)
+// returns a string of subGroup tags which are currently checked
 {
 char settingName[SMALLBUF];
 int mIx;
 if (members->selected == NULL)
     members->selected = needMem(members->count * sizeof(boolean));
 safef(settingName, sizeof(settingName), "%s.filterComp.%s",parentTdb->track,members->groupTag);
 struct slName *options = cartOptionalSlNameList(cart,settingName);
 if(options != NULL)
     {
-    if (sameWord(options->name,"All")) // filterComp returns "All" which means every option selected
+    if (sameWord(options->name,"All")) // filterComp returns "All" meaning every option selected
         {
         slNameFreeList(&options);
         options = slNameListFromStringArray(members->tags, members->count);
         assert(options != NULL);
         }
     struct slName *option;
     for(option=options;option!=NULL;option=option->next)
         {
         mIx = membersSubGroupIx(members, option->name);
         if(mIx >= 0)
             members->selected[mIx] = TRUE;
         }
     return slNameListToString(options,',');
     }
 struct dyString *currentlyCheckedTags = NULL;
 // Need a string of subGroup tags which are currently checked
 safef(settingName,sizeof(settingName),"dimension%cchecked",letter);
 char *dimCheckedDefaults = trackDbSettingOrDefault(parentTdb,settingName,"All");
 char *checkedDefaults[12];
 int defaultCount = 0;
 if (dimCheckedDefaults != NULL
 && differentWord(dimCheckedDefaults,"All") && differentWord(dimCheckedDefaults,"Any"))
     {
     defaultCount = chopCommas(dimCheckedDefaults, checkedDefaults);
     int dIx = 0;
     for (;dIx < defaultCount;dIx++)
-        checkedDefaults[dIx] = tagEncode(checkedDefaults[dIx]); // Need to encode these before compare!
+        checkedDefaults[dIx] = tagEncode(checkedDefaults[dIx]); // encode these before compare!
     }                                                           // Will leak, but this is a tiny amount
 for(mIx=0;mIx<members->count;mIx++)
     {
-    safef(settingName, sizeof(settingName), "%s.mat_%s_dim%c_cb",parentTdb->track,members->tags[mIx],letter);
+    safef(settingName, sizeof(settingName), "%s.mat_%s_dim%c_cb",
+          parentTdb->track,members->tags[mIx],letter);
     members->selected[mIx] = TRUE;
     if (defaultCount > 0)
-        members->selected[mIx] = (-1 != stringArrayIx(members->tags[mIx],checkedDefaults,defaultCount));
+        members->selected[mIx] =
+                (-1 != stringArrayIx(members->tags[mIx],checkedDefaults,defaultCount));
     members->selected[mIx] = cartUsualBoolean(cart,settingName,members->selected[mIx]);
     if(members->selected[mIx])
         {
         if(currentlyCheckedTags == NULL)
             currentlyCheckedTags = dyStringCreate(members->tags[mIx]);
         else
             dyStringPrintf(currentlyCheckedTags,",%s",members->tags[mIx]);
         }
     }
 if(currentlyCheckedTags)
     return dyStringCannibalize(&currentlyCheckedTags);
 return NULL;
 }
 
-static membersForAll_t *membersForAllSubGroupsWeedOutEmpties(struct trackDb *parentTdb, membersForAll_t *membersForAll, struct cart *cart)
+static membersForAll_t *membersForAllSubGroupsWeedOutEmpties(struct trackDb *parentTdb,
+                                                membersForAll_t *membersForAll, struct cart *cart)
 // Weed through members, tossing those without subtracks
 {
 // View is always first
 if (membersForAll->members[dimV] != NULL)
-    membersForAll->members[dimV] = subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[dimV],cart);
+    membersForAll->members[dimV] =
+                    subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[dimV],cart);
 
 // X and Y are special
 if (membersForAll->members[dimX] != NULL)
-    membersForAll->members[dimX] = subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[dimX],cart);
+    membersForAll->members[dimX] =
+                    subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[dimX],cart);
 if (membersForAll->members[dimY] != NULL)
-    membersForAll->members[dimY] = subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[dimY],cart);
+    membersForAll->members[dimY] =
+                    subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[dimY],cart);
 
 // Handle the ABC dimensions
 int ixIn,ixOut=dimA;
 for(ixIn=ixOut;ixIn<membersForAll->dimMax;ixIn++)
     {
     if(membersForAll->members[ixIn] != NULL)
-        membersForAll->members[ixIn] = subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[ixIn],cart);
+        membersForAll->members[ixIn] =
+                    subgroupMembersWeedOutEmpties(parentTdb, membersForAll->members[ixIn],cart);
     if(membersForAll->members[ixIn] == NULL)
         membersForAll->checkedTags[ixOut] = NULL;
     else
         {
         if(ixOut < ixIn)  // Collapse if necessary
             { // NOTE: Don't I wish I had made these as an slList ages ago! (tim)
             membersForAll->members[ixOut]     = membersForAll->members[ixIn];
             membersForAll->checkedTags[ixOut] = membersForAll->checkedTags[ixIn];
             membersForAll->letters[ixOut]     = membersForAll->letters[ixIn];
             }
         ixOut++;
         }
     }
 membersForAll->dimMax   = ixOut;
 membersForAll->abcCount = membersForAll->dimMax - dimA;
 
 return membersForAll;
 }
 
 static membersForAll_t* membersForAllSubGroupsGet(struct trackDb *parentTdb, struct cart *cart)
-/* Returns all the parents subGroups and members */
+// Returns all the parents subGroups and members
 {
 membersForAll_t *membersForAll = tdbExtrasMembersForAll(parentTdb);
 if(membersForAll != NULL)
     return membersForAll;  // Already retrieved, so don't do it again
 
 int ix;
 membersForAll = needMem(sizeof(membersForAll_t));
 if (tdbIsCompositeView(parentTdb->subtracks))  // view must have viewInMidle tdb in tree
     membersForAll->members[dimV]=subgroupMembersGet(parentTdb,"view");
 membersForAll->letters[dimV]='V';
 membersForAll->dimMax=dimA;  // This can expand, depending upon ABC dimensions
 membersForAll->dimensions = dimensionSettingsGet(parentTdb);
 if(membersForAll->dimensions != NULL)
     {
     for(ix=0;ix<membersForAll->dimensions->count;ix++)
         {
         char letter = lastChar(membersForAll->dimensions->names[ix]);
         if(letter != 'X' && letter != 'Y')
             {
-            membersForAll->members[membersForAll->dimMax]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
+            membersForAll->members[membersForAll->dimMax] =
+                        subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
             membersForAll->letters[membersForAll->dimMax]=letter;
             if(cart != NULL)
-                membersForAll->checkedTags[membersForAll->dimMax] = abcMembersChecked(parentTdb,cart,membersForAll->members[membersForAll->dimMax],letter);
+                membersForAll->checkedTags[membersForAll->dimMax] = abcMembersChecked(
+                            parentTdb,cart,membersForAll->members[membersForAll->dimMax],letter);
             membersForAll->dimMax++;
             }
         else if(letter == 'X')
             {
-            membersForAll->members[dimX]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
+            membersForAll->members[dimX] =
+                        subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
             membersForAll->letters[dimX]=letter;
             }
         else
             {
-            membersForAll->members[dimY]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
+            membersForAll->members[dimY] =
+                        subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
             membersForAll->letters[dimY]=letter;
             }
         }
     }
 else // No 'dimensions" setting: treat any subGroups as abc dimensions
     {
     char letter = 'A';
     // walk through numbered subgroups
     for (ix=1;ix<SUBGROUP_MAX;ix++)  // how many do we support?
         {
         char group[32];
         safef(group, sizeof group,"subGroup%d",ix);
         char *setting = subgroupSettingByTagOrName(parentTdb, group);
         if (setting != NULL)
             {
             char *tag = cloneFirstWord(setting);
             if (membersForAll->members[dimV] && sameWord(tag,"view"))
                 continue; // View should have already been handled. NOTE: extremely unlikely case
             membersForAll->members[membersForAll->dimMax]=subgroupMembersGet(parentTdb, tag);
             membersForAll->letters[membersForAll->dimMax]=letter;
             if(cart != NULL)
-                membersForAll->checkedTags[membersForAll->dimMax] = abcMembersChecked(parentTdb,cart,membersForAll->members[membersForAll->dimMax],letter);
+                membersForAll->checkedTags[membersForAll->dimMax] = abcMembersChecked(
+                            parentTdb,cart,membersForAll->members[membersForAll->dimMax],letter);
             membersForAll->dimMax++;
             letter++;
             }
         }
     }
 membersForAll->abcCount = membersForAll->dimMax - dimA;
 
 membersForAll = membersForAllSubGroupsWeedOutEmpties(parentTdb, membersForAll, cart);
 
-// NOTE: Dimensions must be defined for filterComposite.  Filter dimensioms are all and only ABCs.  Use dimensionAchecked to define selected
+// NOTE: Dimensions must be defined for filterComposite.  Filter dimensioms are all and only ABCs.
+//       Use dimensionAchecked to define selected
 char *filtering = trackDbSettingOrDefault(parentTdb,"filterComposite",NULL);
 if(filtering && !sameWord(filtering,"off"))
     {
     if(membersForAll->dimensions == NULL)
         errAbort("If 'filterComposite' defined, must define 'dimensions' also.");
 
     membersForAll->filters = TRUE;
     // Default all to multi
     for(ix=dimA;ix<membersForAll->dimMax;ix++)
         {
         if(membersForAll->members[ix] != NULL)
             membersForAll->members[ix]->fcType = fctMulti;
         }
     if(!sameWord(filtering,"on"))
         {
-        // Example tdb setting: "filterComposite on" OR "filterComposite dimA=one dimB=multi dimC=onlyOne"
+        // Example tdb setting: "filterComposite on" OR
+        //                      "filterComposite dimA=one dimB=multi dimC=onlyOne"
         // FIXME: do we even support anything but multi???
         char *filterGroups[27];
         int count = chopLine(filtering,filterGroups);
         for(ix=0;ix<count;ix++)
             {
             char *dim = cloneNextWordByDelimiter(&filterGroups[ix],'=');
             char letter = lastChar(dim);
             int abcIx = dimA;
-            for (;abcIx < membersForAll->dimMax && membersForAll->letters[abcIx] != letter;abcIx++) ; // Advance to correct letter
+            for (;abcIx < membersForAll->dimMax && membersForAll->letters[abcIx] != letter;abcIx++)
+                ; // Advance to correct letter
             if (abcIx >= membersForAll->dimMax)
-                errAbort("Invalid 'filterComposite' trackDb setting. Dimension '%s' not found.",dim);
+                errAbort("Invalid 'filterComposite' trackDb setting. Dimension '%s' not found.",
+                         dim);
             if (sameWord(filterGroups[ix],"one"))
                 membersForAll->members[abcIx]->fcType = fctOne;
             else if (sameWord(filterGroups[ix],"onlyOne") || sameWord(filterGroups[ix],"oneOnly"))
                 membersForAll->members[abcIx]->fcType = fctOneOnly;
             }
         }
     }
 
 if(cart != NULL) // Only save this if it is fully populated!
     tdbExtrasMembersForAllSet(parentTdb,membersForAll);
 
 return membersForAll;
 }
 
 static int membersForAllFindSubGroupIx(membersForAll_t* membersForAll, char *tag)
@@ -2743,82 +2824,84 @@
 return -1;
 }
 
 const members_t*membersFindByTag(struct trackDb *parentTdb, char *tag)
 { // Uses membersForAll which may be in tdbExtraCache.  Do not free
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,NULL);
 if(membersForAll == NULL)
     return NULL;
 
 int ix = membersForAllFindSubGroupIx(membersForAll,tag);
 if(ix >= 0)
     return membersForAll->members[ix];
 return NULL;
 }
 
-static void membersForAllSubGroupsFree(struct trackDb *parentTdb, membersForAll_t** membersForAllPtr)
-/* frees memory for membersForAllSubGroups struct */
+static void membersForAllSubGroupsFree(struct trackDb *parentTdb,
+                                       membersForAll_t** membersForAllPtr)
+// frees memory for membersForAllSubGroups struct
 {
 if(membersForAllPtr && *membersForAllPtr)
     {
     if(parentTdb != NULL)
         {
         if(*membersForAllPtr == tdbExtrasMembersForAll(parentTdb))
             return;  // Don't free something saved to the tdbExtras!
         }
     membersForAll_t* membersForAll = *membersForAllPtr;
     subgroupMembersFree(&(membersForAll->members[dimX]));
     subgroupMembersFree(&(membersForAll->members[dimY]));
     subgroupMembersFree(&(membersForAll->members[dimV]));
     int ix;
     for(ix=dimA;ix<membersForAll->dimMax;ix++)
         {
         //ASSERT(membersForAll->members[ix] != NULL);
         subgroupMembersFree(&(membersForAll->members[ix]));
         if(membersForAll->checkedTags[ix])
             freeMem(membersForAll->checkedTags[ix]);
         }
     dimensionsFree(&(membersForAll->dimensions));
     freez(membersForAllPtr);
     }
 }
 
 int multViewCount(struct trackDb *parentTdb)
-/* returns the number of multiView views declared */
+// returns the number of multiView views declared
 {
 char *setting = subgroupSettingByTagOrName(parentTdb,"view");
 if(setting == NULL)
     return 0;
 
 setting = cloneString(setting);
 int cnt;
 char *words[32];
 cnt = chopLine(setting, words);
 freeMem(setting);
 return (cnt - 1);
 }
 
-typedef struct _membership {
+typedef struct _membership
+    {
     int count;
     char **subgroups;    // Ary of Tags in parentTdb->subGroupN and in childTdb->subGroups (ie view)
     char **membership;   // Ary of Tags of subGroups that child belongs to (ie PK)
     char **titles;       // Ary of Titles of subGroups a child belongs to (ie Peak)
     char * setting;
 } membership_t;
 
 static membership_t *subgroupMembershipGet(struct trackDb *childTdb)
-/* gets all the subgroup membership for a child track */
+// gets all the subgroup membership for a child track
 {
 membership_t *membership = tdbExtrasMembership(childTdb);
 if(membership != NULL)
     return membership;  // Already retrieved, so don't do it again
 
 membership = needMem(sizeof(membership_t));
 membership->setting = cloneString(trackDbSetting(childTdb, "subGroups"));
 if(membership->setting == NULL)
     {
     freeMem(membership);
     return NULL;
     }
 
 int ix,cnt;
 char *words[SMALLBUF];
@@ -2827,262 +2910,272 @@
 if(cnt <= 0)
     {
     freeMem(membership->setting);
     freeMem(membership);
     return NULL;
     }
 membership->subgroups  = needMem(cnt*sizeof(char*));
 membership->membership = needMem(cnt*sizeof(char*));
 membership->titles     = needMem(cnt*sizeof(char*));
 for (ix = 0,membership->count=0; ix < cnt; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))
         {
         membership->subgroups[membership->count]  = name;
-        membership->membership[membership->count] = tagEncode(value); // tags will be used as classes by js
+        membership->membership[membership->count] = tagEncode(value);
+                                                    // tags will be used as classes by js
         members_t* members = subgroupMembersGet(childTdb->parent, name);
         membership->titles[membership->count] = NULL; // default
         if(members != NULL)
             {
-            int ix2 = stringArrayIx(membership->membership[membership->count],members->tags,members->count);
+            int ix2 = stringArrayIx(membership->membership[membership->count],members->tags,
+                                    members->count);
             if(ix2 != -1)
-                membership->titles[membership->count] = strSwapChar(cloneString(members->titles[ix2]),'_',' ');
+                membership->titles[membership->count] =
+                                        strSwapChar(cloneString(members->titles[ix2]),'_',' ');
             subgroupMembersFree(&members);
             }
         membership->count++;
         }
     }
 tdbExtrasMembershipSet(childTdb,membership);
 return membership;
 }
 
 
 static boolean membershipInAllCurrentABCs(membership_t *membership,membersForAll_t*membersForAll)
-/* looks for a match between a membership set and ABC dimensions currently checked */
+// looks for a match between a membership set and ABC dimensions currently checked
 {
 int mIx,aIx,tIx;
 for (aIx = dimA; aIx < membersForAll->dimMax; aIx++)  // for each ABC subGroup
     {
     assert(membersForAll->members[aIx]->selected);
 
     // must find atleast one selected tag that we have membership in
     boolean matched = FALSE;
     for (mIx = 0; mIx <membersForAll->members[aIx]->count;mIx++) // for each tag of that subgroup
         {
         if(membersForAll->members[aIx]->selected[mIx])  // The particular subgroup tag is selected
             {
             for(tIx=0;tIx<membership->count;tIx++)  // what we are members of
                 {
-                if(sameString(membersForAll->members[aIx]->groupTag, membership->subgroups[tIx])   // subTrack belongs to subGroup
-                &&   sameWord(membersForAll->members[aIx]->tags[mIx],membership->membership[tIx])) // and tags match
+                // subTrack belongs to subGroup and tags match
+                if (sameString(membersForAll->members[aIx]->groupTag, membership->subgroups[tIx])
+                &&   sameWord(membersForAll->members[aIx]->tags[mIx],membership->membership[tIx]))
                     {
                     matched = TRUE;
                     break;
                     }
                 }
             }
         }
         if(!matched)
             return FALSE;
     }
 return TRUE; // passed all tests so must be on all
 }
 
 char *compositeGroupLabel(struct trackDb *tdb, char *group, char *id)
-/* Given ID from group, return corresponding label,  looking through parent's subGroupN's */
-/* Given group ID, return group label,  looking through parent's subGroupN's */
+// Given ID from group, return corresponding label,  looking through parent's subGroupN's
+// Given group ID, return group label,  looking through parent's subGroupN's
 {
 members_t *members = subgroupMembersGet(tdb, group);
 char *result = NULL;
 int i;
 for (i=0; i<members->count; ++i)
     {
     if (sameString(members->tags[i], id))
 	result = cloneString(members->titles[i]);
     }
 subgroupMembersFree(&members);
 return result;
 }
 
 char *compositeGroupId(struct trackDb *tdb, char *group, char *label)
-/* Given label, return id,  looking through parent's subGroupN's */
+// Given label, return id,  looking through parent's subGroupN's
 {
 members_t *members = subgroupMembersGet(tdb, group);
 char *result = NULL;
 int i;
 for (i=0; i<members->count; ++i)
     {
     if (sameString(members->titles[i], label))
 	result = cloneString(members->tags[i]);
     }
 subgroupMembersFree(&members);
 return result;
 }
 
 
 static boolean subtrackInAllCurrentABCs(struct trackDb *childTdb,membersForAll_t*membersForAll)
-/* looks for a match between a membership set and ABC dimensions currently checked */
+// looks for a match between a membership set and ABC dimensions currently checked
 {
 membership_t *membership = subgroupMembershipGet(childTdb);
 if(membership == NULL)
     return FALSE;
 boolean found = membershipInAllCurrentABCs(membership,membersForAll);
 return found;
 }
 
 
 boolean subgroupFind(struct trackDb *childTdb, char *name,char **value)
-/* looks for a single tag in a child track's subGroups setting */
+// looks for a single tag in a child track's subGroups setting
 {
 if(value != NULL)
     *value = NULL;
 membership_t *membership = subgroupMembershipGet(childTdb);
 if(membership != NULL)
     {
     int ix;
     for(ix=0;ix<membership->count;ix++)
         {
         if(sameString(name,membership->subgroups[ix]))
             {
             if(value != NULL)
                 *value = cloneString(membership->membership[ix]);
             return TRUE;
             }
         }
     }
 return FALSE;
 }
 
 boolean subgroupFindTitle(struct trackDb *parentTdb, char *name,char **value)
-/* looks for a a subgroup matching the name and returns the title if found */
+// looks for a a subgroup matching the name and returns the title if found
 {
 if(value != (void*)NULL)
     *value = NULL;
 members_t*members=subgroupMembersGet(parentTdb, name);
-//const members_t *members = membersFindByTag(parentTdb,name); // Can't use because of dimension dependence
+//const members_t *members = membersFindByTag(parentTdb,name);
+//                           Can't use because of dimension dependence
 if(members==NULL)
     return FALSE;
 *value = cloneString(members->groupTitle);
 //subgroupMembersFree(&members);
 return TRUE;
 }
 
 void subgroupFree(char **value)
-/* frees subgroup memory */
+// frees subgroup memory
 {
 if(value && *value)
     freez(value);
 }
+
 #define SORT_ON_TRACK_NAME "trackName"
 #define SORT_ON_RESTRICTED "dateUnrestricted"
 
 sortOrder_t *sortOrderGet(struct cart *cart,struct trackDb *parentTdb)
-/* Parses any list sort order instructions for parent of subtracks (from cart or trackDb)
-   Some trickiness here.  sortOrder->sortOrder is from cart (changed by user action), as is sortOrder->order,
-   But columns are in original tdb order (unchanging)!  However, if cart is null, all is from trackDb.ra */
+// Parses any list sort order instructions for parent of subtracks (from cart or trackDb)
+// Some trickiness here.  sortOrder->sortOrder is from cart (changed by user action),
+// as is sortOrder->order, But columns are in original tdb order (unchanging)!
+// However, if cart is null, all is from trackDb.ra
 {
 int ix;
 char *setting = trackDbSetting(parentTdb, "sortOrder");
 if(setting == NULL) // Must be in trackDb or not a sortable table
     return NULL;
 
 sortOrder_t *sortOrder = needMem(sizeof(sortOrder_t));
 sortOrder->htmlId = needMem(strlen(parentTdb->track)+15);
 safef(sortOrder->htmlId, (strlen(parentTdb->track)+15), "%s.sortOrder", parentTdb->track);
 char *cartSetting = NULL;
 if(cart != NULL)
     cartSetting = cartCgiUsualString(cart, sortOrder->htmlId, setting);
-if(cart != NULL && strlen(cartSetting) > strlen(setting)) // If setting is bigger, then it may be due to a trackDb change
+// If setting is bigger than cartSetting, then it may be due to a trackDb change
+if (cart != NULL && strlen(cartSetting) > strlen(setting))
     sortOrder->sortOrder = cloneString(cartSetting);  // cart order
 else
     sortOrder->sortOrder = cloneString(setting);      // old cart value is abandoned!
 
 sortOrder->setting = cloneString(setting);
 sortOrder->count   = chopByWhite(sortOrder->setting,NULL,0);  // Get size
 if (cart && !stringIn(SORT_ON_TRACK_NAME,setting))
     sortOrder->count += 1;
 if (cart && !stringIn(SORT_ON_RESTRICTED,setting))
     sortOrder->count += 1;
 sortOrder->column  = needMem(sortOrder->count*sizeof(char*));
 int foundColumns = chopByWhite(sortOrder->setting, sortOrder->column,sortOrder->count);
 sortOrder->title   = needMem(sortOrder->count*sizeof(char*));
 sortOrder->forward = needMem(sortOrder->count*sizeof(boolean));
 sortOrder->order   = needMem(sortOrder->count*sizeof(int));
 if (cart && foundColumns < sortOrder->count)
     {
     int columnCount = foundColumns;
     int size = 0;
     char *moreOrder = NULL;
     if (cart && columnCount < sortOrder->count && !stringIn(SORT_ON_TRACK_NAME,setting))
         {
         assert(sortOrder->column[columnCount] == NULL);
         sortOrder->column[columnCount] = cloneString(SORT_ON_TRACK_NAME "=+");
         if (!stringIn(SORT_ON_TRACK_NAME,sortOrder->sortOrder))
-            {
-            size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5; // little bit more
+            {                                                                    // little bit more
+            size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5;
             moreOrder = needMem(size);
             safef(moreOrder,size,"%s %s",sortOrder->sortOrder, sortOrder->column[columnCount]);
             freeMem(sortOrder->sortOrder);
             sortOrder->sortOrder = moreOrder;
             }
         columnCount++;
         }
     if (cart && columnCount < sortOrder->count && !stringIn(SORT_ON_RESTRICTED,setting))
         {
         assert(sortOrder->column[columnCount] == NULL);
         sortOrder->column[columnCount] = cloneString(SORT_ON_RESTRICTED "=+");
         if (!stringIn(SORT_ON_RESTRICTED,sortOrder->sortOrder))
             {
-            size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5; // little bit more
+            size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5;
             moreOrder = needMem(size);
             safef(moreOrder,size,"%s %s",sortOrder->sortOrder, sortOrder->column[columnCount]);
             freeMem(sortOrder->sortOrder);
             sortOrder->sortOrder = moreOrder;
             }
         columnCount++;
         }
     }
 for (ix = 0; ix<sortOrder->count; ix++)
     {
     strSwapChar(sortOrder->column[ix],'=',0);  // Don't want 'CEL=+' but 'CEL' and '+'
-    char *pos = stringIn(sortOrder->column[ix], sortOrder->sortOrder);// find tdb substr in cart current order string
+    // find tdb substr in cart current order string
+    char *pos = stringIn(sortOrder->column[ix], sortOrder->sortOrder);
     //assert(pos != NULL && pos[strlen(sortOrder->column[ix])] == '=');
     if(pos != NULL && pos[strlen(sortOrder->column[ix])] == '=')
         {
         int ord=1;
         char* pos2 = sortOrder->sortOrder;
         for(;*pos2 && pos2 < pos;pos2++)
             {
             if(*pos2 == '=') // Discovering sort order in cart
                 ord++;
             }
         sortOrder->forward[ix] = (pos[strlen(sortOrder->column[ix]) + 1] == '+');
         sortOrder->order[ix] = ord;
         }
     else  // give up on cartSetting
         {
         sortOrder->forward[ix] = TRUE;
         sortOrder->order[ix] = ix+1;
         }
     if (ix < foundColumns)
         subgroupFindTitle(parentTdb,sortOrder->column[ix],&(sortOrder->title[ix]));
     }
-return sortOrder;  // NOTE cloneString:words[0]==*sortOrder->column[0] and will be freed when sortOrder is freed
-}
+return sortOrder;  // NOTE cloneString:words[0]==*sortOrder->column[0]
+}                  // and will be freed when sortOrder is freed
+
 void sortOrderFree(sortOrder_t **sortOrder)
-/* frees any previously obtained sortOrder settings */
+// frees any previously obtained sortOrder settings
 {
 if(sortOrder && *sortOrder)
     {
     int ix;
     for(ix=0;ix<(*sortOrder)->count;ix++) { subgroupFree(&((*sortOrder)->title[ix])); }
     freeMem((*sortOrder)->sortOrder);
     freeMem((*sortOrder)->htmlId);
     freeMem((*sortOrder)->column);
     freeMem((*sortOrder)->forward);
     freeMem((*sortOrder)->order);
     freeMem((*sortOrder)->setting);
     freez(sortOrder);
     }
 }
 
@@ -3164,97 +3257,101 @@
 if(items != NULL && *items != NULL)
     {
     sortableTdbItem *item;
     for (item = *items; item != NULL; item = item->next)
         {
         sortColumn *column;
         for (column = item->columns; column != NULL; column = column->next)
             freeMem(column->value);
         slFreeList(&(item->columns));
         }
     slFreeList(items);
     }
 }
 
 static boolean colonPairToStrings(char * colonPair,char **first,char **second)
-{ // Will set *first and *second to NULL.  Must free any string returned!  No colon: value goes to *first
+// Will set *first and *second to NULL.  Must free any string returned!
+// No colon: value goes to *first
+{
 if(first)
     *first =NULL; // default to NULL !
 if(second)
     *second=NULL;
 if(colonPair != NULL)
     {
     if(strchr(colonPair,':'))
         {
         if(second)
             *second = cloneString(strchr(colonPair,':') + 1);
         if(first)
             *first = strSwapChar(cloneString(colonPair),':',0);
         }
     else if(first)
         *first = cloneString(colonPair);
     return (*first != NULL || *second != NULL);
     }
 return FALSE;
 }
+
 static boolean colonPairToInts(char * colonPair,int *first,int *second)
 { // Non-destructive. Only sets values if found. No colon: value goes to *first
 char *a=NULL;
 char *b=NULL;
 if(colonPairToStrings(colonPair,&a,&b))
     {
     if(a!=NULL)
         {
         if(first)
             *first = atoi(a);
         freeMem(a);
         }
     if(b!=NULL)
         {
         if(second)
             *second = atoi(b);
         freeMem(b);
         }
     return TRUE;
     }
 return FALSE;
 }
+
 static boolean colonPairToDoubles(char * colonPair,double *first,double *second)
 { // Non-destructive. Only sets values if found. No colon: value goes to *first
 char *a=NULL;
 char *b=NULL;
 if(colonPairToStrings(colonPair,&a,&b))
     {
     if(a!=NULL)
         {
         if(first)
             *first = strtod(a,NULL);
         freeMem(a);
         }
     if(b!=NULL)
         {
         if(second)
             *second = strtod(b,NULL);
         freeMem(b);
         }
     return TRUE;
     }
 return FALSE;
 }
 
 filterBy_t *filterBySetGet(struct trackDb *tdb, struct cart *cart, char *name)
-/* Gets one or more "filterBy" settings (ClosestToHome).  returns NULL if not found */
+// Gets one or more "filterBy" settings (ClosestToHome).  returns NULL if not found
 {
 filterBy_t *filterBySet = NULL;
 
 char *setting = trackDbSettingClosestToHome(tdb, FILTER_BY);
 if(setting == NULL)
     return NULL;
 if( name == NULL )
     name = tdb->track;
 
 setting = cloneString(setting);
 char *filters[10];
 // multiple filterBys are delimited by space but spaces inside filter can be protected "by quotes"
 int filterCount = chopByWhiteRespectDoubleQuotes(setting, filters, ArraySize(filters));
 int ix;
 for(ix=0;ix<filterCount;ix++)
@@ -3312,86 +3409,87 @@
             }
         else if (filterBy->styleFollows)
             errAbort("filterBy values either all end in {CSS style} or none do.");
 
         if (filterBy->useIndex)
             strSwapChar(val->name,'_',' '); // value is a label so swap underscores
         else
             {
             // now chip the label off the end of value name
             chipper =strchr(val->name,'|');
             if (chipper != NULL)
                 {
                 if (val == filterBy->slValues) // First one
                     filterBy->valueAndLabel = TRUE;
                 if (filterBy->valueAndLabel == FALSE)
-                    errAbort("filterBy values either all have labels (as value|label) or none do.");
-                *chipper++ = 0;  // The label is found inside the filters->svValues as the next string
+                    errAbort("filterBy values either all have labels (as value|label) "
+                             "or none do.");
+                *chipper++ = 0;  // The label is found inside filters->svValues as the next string
                 strSwapChar(chipper,'_',' '); // Title does not have underscores
                 }
             else if (filterBy->valueAndLabel)
-                errAbort("filterBy values either all have labels in form of value|label or none do.");
+                errAbort("filterBy values either all have labels in form of value|label "
+                         "or none do.");
         }
         }
 
     slAddTail(&filterBySet,filterBy); // Keep them in order (only a few)
 
     if(cart != NULL)
         {
         char suffix[256];
         safef(suffix, sizeof(suffix), "filterBy.%s", filterBy->column);
         boolean parentLevel = isNameAtParentLevel(tdb,name);
         if(cartLookUpVariableClosestToHome(cart,tdb,parentLevel,suffix,&(filterBy->htmlName)))
             {
             filterBy->slChoices = cartOptionalSlNameList(cart,filterBy->htmlName);
             freeMem(filterBy->htmlName);
             }
         }
 
     // Note: cannot use found name above because that may be at a higher (composite/view) level
     int len = strlen(name) + strlen(filterBy->column) + 15;
     filterBy->htmlName = needMem(len);
     safef(filterBy->htmlName, len, "%s.filterBy.%s", name,filterBy->column);
     }
 freeMem(setting);
 
 return filterBySet;
 }
 
 void filterBySetFree(filterBy_t **filterBySet)
-/* Free a set of filterBy structs */
+// Free a set of filterBy structs
 {
 if(filterBySet != NULL)
     {
     while(*filterBySet != NULL)
         {
         filterBy_t *filterBy = slPopHead(filterBySet);
         if(filterBy->slValues != NULL)
             slNameFreeList(filterBy->slValues);
         if(filterBy->slChoices != NULL)
             slNameFreeList(filterBy->slChoices);
         if(filterBy->htmlName != NULL)
             freeMem(filterBy->htmlName);
         freeMem(filterBy->column);
         freeMem(filterBy);
         }
     }
 }
 
 static char *filterByClauseStd(filterBy_t *filterBy)
-/* returns the SQL where clause for a single filterBy struct in
- * the standard cases */
+// returns the SQL where clause for a single filterBy struct in the standard cases
 {
 int count = slCount(filterBy->slChoices);
 struct dyString *dyClause = newDyString(256);
 dyStringAppend(dyClause, filterBy->column);
 if(count == 1)
     dyStringPrintf(dyClause, " = ");
 else
     dyStringPrintf(dyClause, " in (");
 
 struct slName *slChoice = NULL;
 boolean first = TRUE;
 for(slChoice = filterBy->slChoices;slChoice != NULL;slChoice=slChoice->next)
     {
     if(!first)
         dyStringAppend(dyClause, ",");
@@ -3401,358 +3499,341 @@
     else
         dyStringPrintf(dyClause, "\"%s\"",slChoice->name);
     }
 if(dyStringLen(dyClause) == 0)
     {
     dyStringFree(&dyClause);
     return NULL;
     }
 if(count > 1)
     dyStringPrintf(dyClause, ")");
 
 return dyStringCannibalize(&dyClause);
 }
 
 char *filterByClause(filterBy_t *filterBy)
-/* returns the SQL where clause for a single filterBy struct */
+// returns the SQL where clause for a single filterBy struct
 {
 if ((filterBy->slChoices == NULL) || (slNameInList(filterBy->slChoices,"All")))
     return NULL;
 else
     return filterByClauseStd(filterBy);
 }
 
 struct dyString *dyAddFilterByClause(struct cart *cart, struct trackDb *tdb,
        struct dyString *extraWhere,char *column, boolean *and)
-/* creates the where clause condition to support a filterBy setting.
-   Format: filterBy column:Title=value,value [column:Title=value|label,value|label,value|label])
-   filterBy filters are multiselect's so could have multiple values selected.
-   thus returns the "column1 in (...) and column2 in (...)" clause.
-   if 'column' is provided, and there are multiple filterBy columns, only the named column's clause is returned.
-   The 'and' param and dyString in/out allows stringing multiple where clauses together
-*/
+// creates the where clause condition to support a filterBy setting.
+// Format: filterBy column:Title=value,value [column:Title=value|label,value|label,value|label])
+// filterBy filters are multiselect's so could have multiple values selected.
+// thus returns the "column1 in (...) and column2 in (...)" clause.
+// if 'column' is provided, and there are multiple filterBy columns, only the named column's
+// clause is returned.
+// The 'and' param and dyString in/out allows stringing multiple where clauses together
 {
 filterBy_t *filterBySet = filterBySetGet(tdb, cart,NULL);
 if(filterBySet== NULL)
     return extraWhere;
 
 filterBy_t *filterBy = filterBySet;
 for(;filterBy != NULL; filterBy = filterBy->next)
     {
     if(column != NULL && differentString(column,filterBy->column))
         continue;
 
     char *clause = filterByClause(filterBy);
     if(clause != NULL)
         {
         if(*and)
             dyStringPrintf(extraWhere, " AND ");
         dyStringAppend(extraWhere, clause);
         freeMem(clause);
         *and = TRUE;
         }
     }
 filterBySetFree(&filterBySet);
 return extraWhere;
 }
 
 char *filterBySetClause(filterBy_t *filterBySet)
-/* returns the "column1 in (...) and column2 in (...)" clause for a set of filterBy structs */
+// returns the "column1 in (...) and column2 in (...)" clause for a set of filterBy structs
 {
 struct dyString *dyClause = newDyString(256);
 boolean notFirst = FALSE;
 filterBy_t *filterBy = NULL;
 
 for(filterBy = filterBySet;filterBy != NULL; filterBy = filterBy->next)
     {
     char *clause = filterByClause(filterBy);
     if(clause != NULL)
         {
         if(notFirst)
             dyStringPrintf(dyClause, " AND ");
         dyStringAppend(dyClause, clause);
         freeMem(clause);
         notFirst = TRUE;
         }
     }
 if(dyStringLen(dyClause) == 0)
     {
     dyStringFree(&dyClause);
     return NULL;
     }
 return dyStringCannibalize(&dyClause);
 }
 
 void filterBySetCfgUi(struct cart *cart, struct trackDb *tdb,
                       filterBy_t *filterBySet, boolean onOneLine)
-/* Does the UI for a list of filterBy structure */
+// Does the UI for a list of filterBy structure
 {
 if(filterBySet == NULL)
     return;
 
 #define FILTERBY_HELP_LINK  "<A HREF=\"../goldenPath/help/multiView.html\" TARGET=ucscHelp>help</A>"
 int count = slCount(filterBySet);
 if(count == 1)
     puts("<TABLE cellpadding=3><TR valign='top'>");
 else
-    printf("<B>Filter items by:</B> (select multiple categories and items - %s)<TABLE cellpadding=3><TR valign='top'>\n",FILTERBY_HELP_LINK);
+    printf("<B>Filter items by:</B> (select multiple categories and items - %s)"
+           "<TABLE cellpadding=3><TR valign='top'>\n",FILTERBY_HELP_LINK);
 
 filterBy_t *filterBy = NULL;
 if(cartOptionalString(cart, "ajax") == NULL)
     {
     webIncludeResourceFile("ui.dropdownchecklist.css");
     jsIncludeFile("ui.dropdownchecklist.js",NULL);
     jsIncludeFile("ddcl.js",NULL);
     }
 
 int ix=0;
 for(filterBy = filterBySet;filterBy != NULL; filterBy = filterBy->next)
     {
     puts("<TD>");
     if(count == 1)
-        printf("<B>Filter by %s</B> (select multiple items - %s)",filterBy->title,FILTERBY_HELP_LINK);
+        printf("<B>Filter by %s</B> (select multiple items - %s)",
+               filterBy->title,FILTERBY_HELP_LINK);
     else
         printf("<B>%s</B>",filterBy->title);
     printf("<BR>\n");
 
     // TODO: columnCount (Number of filterBoxes per row) should be configurable through tdb setting
-    #define FILTER_BY_FORMAT "<SELECT id='fbc%d' name='%s' multiple style='display: none; font-size:.9em;' class='filterBy'><BR>\n"
+    #define FILTER_BY_FORMAT "<SELECT id='fbc%d' name='%s' multiple style='display: none; " \
+                             "font-size:.9em;' class='filterBy'><BR>\n"
     printf(FILTER_BY_FORMAT,ix,filterBy->htmlName);
     ix++;
-    printf("<OPTION%s>All</OPTION>\n",(filterBy->slChoices == NULL || slNameInList(filterBy->slChoices,"All")?" SELECTED":""));
+    printf("<OPTION%s>All</OPTION>\n",
+           (filterBy->slChoices == NULL || slNameInList(filterBy->slChoices,"All") ? " SELECTED"
+                                                                                   : ""));
     struct slName *slValue;
 
     int ix=1;
     for(slValue=filterBy->slValues;slValue!=NULL;slValue=slValue->next,ix++)
         {
         char varName[32];
         char *label = NULL;
         char *name = NULL;
         if (filterBy->useIndex)
             {
             safef(varName, sizeof(varName), "%d",ix);
             name = varName;
             label = slValue->name;
             }
         else
             {
-            label = (filterBy->valueAndLabel? slValue->name + strlen(slValue->name)+1: slValue->name);
+            label = (filterBy->valueAndLabel ? slValue->name + strlen(slValue->name)+1
+                                             : slValue->name);
             name = slValue->name;
             }
         printf("<OPTION");
         if (filterBy->slChoices != NULL && slNameInList(filterBy->slChoices,name))
             printf(" SELECTED");
         if (filterBy->useIndex || filterBy->valueAndLabel)
             printf(" value='%s'",name);
         if (filterBy->styleFollows)
             {
             char *styler = label + strlen(label)+1;
             if (*styler != '\0')
                 {
                 if (*styler == '#') // Legacy: just the color that follows
                     printf(" style='color: %s;'",styler);
                 else
                     printf(" style='%s'",styler);
                 }
             }
         printf(">%s</OPTION>\n",label);
         }
     }
     printf("</SELECT>\n");
 
 puts("</TR></TABLE>");
 
 return;
 }
 
 #define COLOR_BG_DEFAULT_IX     0
 #define COLOR_BG_ALTDEFAULT_IX  1
-#define DIVIDING_LINE "<TR valign=\"CENTER\" line-height=\"1\" BGCOLOR=\"%s\"><TH colspan=\"5\" align=\"CENTER\"><hr noshade color=\"%s\" width=\"100%%\"></TD></TR>\n"
+#define DIVIDING_LINE "<TR valign=\"CENTER\" line-height=\"1\" BGCOLOR=\"%s\"><TH colspan=\"5\" " \
+                      "align=\"CENTER\"><hr noshade color=\"%s\" width=\"100%%\"></TD></TR>\n"
 #define DIVIDER_PRINT(color) printf(DIVIDING_LINE,COLOR_BG_DEFAULT,(color))
 
-static char *checkBoxIdMakeForTrack(struct trackDb *tdb,members_t** dims,int dimMax,membership_t *membership)
-/* Creates an 'id' string for subtrack checkbox in style that matrix understand: "cb_dimX_dimY_view_cb" */
+static char *checkBoxIdMakeForTrack(struct trackDb *tdb,members_t** dims,int dimMax,
+                                    membership_t *membership)
+// Creates an 'id' string for subtrack checkbox in style that matrix understand:
+//     "cb_dimX_dimY_view_cb"
 {
-#ifdef SUBTRACK_CFG
 int len = strlen(tdb->track) + 10;
 char *id = needMem(len);
 safef(id,len,"%s_sel",tdb->track);
 return id;
-#else///#ifndef SUBTRACK_CFG
-int ix;
-#define CHECKBOX_ID_SZ 128
-// What is wanted: id="cb_ES_K4_SIG_cb"
-struct dyString *id = newDyString(CHECKBOX_ID_SZ);
-dyStringPrintf(id,"cb_%s_", tdb->track);
-int dimIx=1; // Skips over view dim for now
-for(;dimIx<dimMax;dimIx++)
-    {
-    if(dims[dimIx] != NULL)
-        {
-        ix = stringArrayIx(dims[dimIx]->groupTag, membership->subgroups, membership->count);
-        if(ix >= 0)
-            dyStringPrintf(id,"%s_", membership->membership[ix]);
-        }
-    }
-if(dims[0] != NULL) // The view is saved for last
-    {
-    ix = stringArrayIx("view", membership->subgroups, membership->count);   // view is a known tagname
-    if(ix >= 0)
-        dyStringPrintf(id,"%s_", membership->membership[ix]);
-    }
-dyStringAppend(id,"cb");
-return dyStringCannibalize(&id);
-#endif///ndef SUBTRACK_CFG
 }
 
 static void checkBoxIdFree(char**id)
-/* Frees 'id' string */
+// Frees 'id' string 
 {
 if(id && *id)
     freez(id);
 }
 
 static boolean divisionIfNeeded(char **lastDivide,dividers_t *dividers,membership_t *membership)
-/* Keeps track of location within subtracks in order to provide requested division lines */
+// Keeps track of location within subtracks in order to provide requested division lines
 {
 boolean division = FALSE;
 if(dividers)
     {
     if(lastDivide != NULL)
         {
         int ix;
         for(ix=0;ix<dividers->count;ix++)
             {
-            int sIx = stringArrayIx(dividers->subgroups[ix],membership->subgroups, membership->count);
+            int sIx = stringArrayIx(dividers->subgroups[ix],membership->subgroups,
+                                    membership->count);
             if((lastDivide[ix] == (void*)NULL && sIx >= 0)
             || (lastDivide[ix] != (void*)NULL && sIx <  0)
             || (strcmp(lastDivide[ix],membership->membership[sIx]) != 0) )
                 {
                 division = TRUE;
                 if(lastDivide[ix] != (void*)NULL)
                     freeMem(lastDivide[ix]);
                 lastDivide[ix] = ( sIx<0 ? (void*)NULL : cloneString(membership->membership[sIx]) );
                 }
             }
         }
     //if(division)
     //    DIVIDER_PRINT(COLOR_DARKGREEN);
     }
 return division;
 }
 
 static void indentIfNeeded(hierarchy_t*hierarchy,membership_t *membership)
-/* inserts any needed indents */
+// inserts any needed indents
 {
 int indent = 0;
 if(hierarchy && hierarchy->count>0)
     {
     int ix;
     for(ix=0;ix<membership->count;ix++)
         {
-        int iIx = stringArrayIx(membership->membership[ix], hierarchy->membership, hierarchy->count);
+        int iIx = stringArrayIx(membership->membership[ix], hierarchy->membership,
+                                hierarchy->count);
         if(iIx >= 0)
             {
             indent = hierarchy->indents[iIx];
             break;  // Only one
             }
         }
     }
 for(;indent>0;indent--)
     puts ("&nbsp;&nbsp;&nbsp;");
 }
 
 // FIXME FIXME Should be able to use membersForAll struct to set default sort order from subGroups
-// FIXME FIXME This should be done in hgTrackDb at load time and should change tag values to ensure js still works
+// FIXME FIXME This should be done in hgTrackDb at load time and should change tag values to
+// FIXME FIXME ensure js still works
 boolean tdbAddPrioritiesFromCart(struct cart *cart, struct trackDb *tdbList)
-/* Updates the tdb->priority from cart for all tracks in list and their
- * descendents. */
+// Updates the tdb->priority from cart for all tracks in list and their descendents.
 {
 char htmlIdentifier[128];
 struct trackDb *tdb;
 boolean cartPriorities = FALSE;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     safef(htmlIdentifier, sizeof(htmlIdentifier), "%s.priority", tdb->track);
     char *cartHas = cartOptionalString(cart,htmlIdentifier);
     if(cartHas != NULL)
 	{
 	tdb->priority = atof(cartHas);
 	cartPriorities = TRUE;
 	}
     if (tdbAddPrioritiesFromCart(cart, tdb->subtracks))
         cartPriorities = TRUE;
     }
 return cartPriorities;
 }
 
 boolean tdbSortPrioritiesFromCart(struct cart *cart, struct trackDb **tdbList)
-/* Updates the tdb->priority from cart then sorts the list anew.
-   Returns TRUE if priorities obtained from cart */
+// Updates the tdb->priority from cart then sorts the list anew.
+// Returns TRUE if priorities obtained from cart
 {
 boolean cartPriorities = tdbAddPrioritiesFromCart(cart, *tdbList);
 slSort(tdbList, trackDbCmp);
 return cartPriorities;
 }
 
 boolean tdbRefSortPrioritiesFromCart(struct cart *cart, struct slRef **tdbRefList)
-/* Updates the tdb->priority from cart then sorts the list anew.
-   Returns TRUE if priorities obtained from cart */
+// Updates the tdb->priority from cart then sorts the list anew.
+// Returns TRUE if priorities obtained from cart
 {
 char htmlIdentifier[128];
 struct slRef *tdbRef;
 boolean cartPriorities = FALSE;
 for (tdbRef = *tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
     {
     struct trackDb *tdb = tdbRef->val;
     safef(htmlIdentifier, sizeof(htmlIdentifier), "%s.priority", tdb->track);
     char *cartHas = cartOptionalString(cart,htmlIdentifier);
     if(cartHas != NULL)
 	{
 	tdb->priority = atof(cartHas);
 	cartPriorities = TRUE;
 	}
     }
 slSort(tdbRefList, trackDbRefCmp);
 return cartPriorities;
 }
 
-void cfgByCfgType(eCfgType cType,char *db, struct cart *cart, struct trackDb *tdb,char *prefix, char *title, boolean boxed)
-// Methods for putting up type specific cfgs used by composites/subtracks in hui.c and exported for common use
+void cfgByCfgType(eCfgType cType,char *db, struct cart *cart, struct trackDb *tdb,char *prefix,
+                  char *title, boolean boxed)
+// Methods for putting up type specific cfgs used by composites/subtracks in hui.c
 {
-#ifdef SUBTRACK_CFG
 // When only one subtrack, then show it's cfg settings instead of composite/view level settings
 // This simplifies the UI where hgTrackUi won't have 2 levels of cfg,
 // while hgTracks still supports rightClick cfg of the subtrack.
 
-if (configurableByAjax(tdb,cType) > 0) // Only if subtrack's configurable by ajax do we consider this option
-    {
+if (configurableByAjax(tdb,cType) > 0) // Only if subtrack's configurable by ajax do we
+    {                                  // consider this option
     if (tdbIsComposite(tdb)                       // called for the composite
     && !tdbIsCompositeView(tdb->subtracks)        // and there is no view level
     && slCount(tdb->subtracks) == 1)              // and there is only one subtrack
         {
-        //warn("What do you mean by having a composite (%s) with only one subtrack (%s) ???",tdb->track,tdb->subtracks->track);
         tdb = tdb->subtracks; // show subtrack cfg instead
         prefix = tdb->track;
         }
     else if (tdbIsSubtrack(tdb)                   // called with subtrack
          && tdbIsCompositeView(tdb->parent)       // subtrack has view
          && differentString(prefix,tdb->track)    // and this has been called FOR the view
          && slCount(tdb->parent->subtracks) == 1) // and view has only one subtrack
         prefix = tdb->track; // removes reference to view level
     }
-#endif///def SUBTRACK_CFG
 
 // Cfg could be explicitly blocked, but if tdb is example subtrack
 // then blocking should have occurred before we got here.
 if (!tdbIsSubtrack(tdb) && trackDbSettingBlocksConfiguration(tdb,FALSE))
     return;
 
 // composite/view must pass in example subtrack
 // NOTE: if subtrack types vary then there shouldn't be cfg at composite/view level!
 while (tdb->subtracks)
     tdb = tdb->subtracks;
 
 switch(cType)
     {
     case cfgBedScore:
                         {
@@ -3772,93 +3853,86 @@
                         break;
     case cfgChain:      chainCfgUi(db,cart,tdb,prefix,title,boxed, NULL);
                         break;
     case cfgNetAlign:   netAlignCfgUi(db,cart,tdb,prefix,title,boxed);
                         break;
     case cfgBedFilt:    bedFiltCfgUi(cart,tdb,prefix,title, boxed);
                         break;
 #ifdef USE_BAM
     case cfgBam:        bamCfgUi(cart, tdb, prefix, title, boxed);
                         break;
 #endif
     case cfgVcf:        vcfCfgUi(cart, tdb, prefix, title, boxed);
                         break;
     case cfgPsl:        pslCfgUi(db,cart,tdb,prefix,title,boxed);
                         break;
-    default:            warn("Track type is not known to multi-view composites. type is: %d ", cType);
+    default:            warn("Track type is not known to multi-view composites. type is: %d ",
+                             cType);
                         break;
     }
 }
 
 char *encodeRestrictionDate(char *db,struct trackDb *trackDb,boolean excludePast)
-/* Create a string for ENCODE restriction date of this track
-   if return is not null, then free it after use */
+// Create a string for ENCODE restriction date of this track
+// if return is not null, then free it after use
 {
 if (!trackDb)
     return NULL;
 
 char *date = NULL;
 
 if(metadataForTable(db,trackDb,NULL) != NULL)
     {
     date = cloneString((char *)metadataFindValue(trackDb,"dateUnrestricted"));
     if (date != NULL)
         date = strSwapChar(date, ' ', 0);   // Truncate time (not expected, but just in case)
 
     if (excludePast && !isEmpty(date) && dateIsOld(date,"%F"))
         freez(&date);
     }
 return date;
 }
 
-#ifndef SUBTRACK_CFG
-static void cfgLinkToDependentCfgs(struct cart *cart, struct trackDb *tdb,char *prefix)
-/* Link composite or view level controls to all associateled lower level controls */
-{
-if (!cartVarExists(cart, "ajax") && tdbIsComposite(tdb))
-    printf("<script type='text/javascript'>compositeCfgRegisterOnchangeAction(\"%s\")</script>\n",prefix);
-}
-#endif///ndef SUBTRACK_CFG
-
 static void compositeUiSubtracks(char *db, struct cart *cart, struct trackDb *parentTdb)
-/* Display list of subtracks and descriptions with checkboxes to control visibility and possibly other
- * nice things including links to schema and metadata and a release date. */
+// Display list of subtracks and descriptions with checkboxes to control visibility and
+// possibly other nice things including links to schema and metadata and a release date.
 {
 struct trackDb *subtrack;
 struct dyString *dyHtml = newDyString(SMALLBUF);
 //char *colors[2]   = { COLOR_BG_DEFAULT,
 //                      COLOR_BG_ALTDEFAULT };
 char *colors[2]   = { "bgLevel1",
                       "bgLevel1" };
 int colorIx = COLOR_BG_DEFAULT_IX; // Start with non-default allows alternation
-#ifndef SUBTRACK_CFG
-boolean dependentCfgsNeedBinding = FALSE;
-#endif///ndef SUBTRACK_CFG
 
 // Get list of leaf subtracks to work with
 struct slRef *subtrackRef, *subtrackRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
 
 // Look for dividers, heirarchy, dimensions, sort and dragAndDrop!
 char **lastDivide = NULL;
 dividers_t *dividers = dividersSettingGet(parentTdb);
 if (dividers)
     lastDivide = needMem(sizeof(char*)*dividers->count);
 hierarchy_t *hierarchy = hierarchySettingGet(parentTdb);
 
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,NULL);
 int dimCount=0,di;
-for(di=0;di<membersForAll->dimMax;di++) { if (membersForAll->members[di]) dimCount++; }
+for(di=0;di<membersForAll->dimMax;di++)
+    {
+    if (membersForAll->members[di])
+        dimCount++;
+    }
 sortOrder_t* sortOrder = sortOrderGet(cart,parentTdb);
 boolean preSorted = FALSE;
 boolean useDragAndDrop = sameOk("subTracks",trackDbSetting(parentTdb, "dragAndDrop"));
 char buffer[SMALLBUF];
 char *displaySubs = NULL;
 int subCount = slCount(subtrackRefList);
 #define LARGE_COMPOSITE_CUTOFF 30
 if (subCount > LARGE_COMPOSITE_CUTOFF)
     {
     safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track);
     displaySubs = cartUsualString(cart, buffer,"some");              // track specific defaults to only selected
     }
 else
     {
     displaySubs = cartUsualString(cart, "displaySubtracks", "all");  // browser wide defaults to all
@@ -3873,42 +3947,45 @@
     (void)metadataForTable(db,subtrack,NULL);
     if (NULL != metadataFindValue(subtrack,"dateUnrestricted"))
         {
         restrictions = TRUE;
         break;
         }
     }
 
 // Table wraps around entire list so that "Top" link can float to the correct place.
 cgiDown(0.7);
 printf("<table><tr><td class='windowSize'>");
 printf("<A NAME='DISPLAY_SUBTRACKS'></A>");
 if (sortOrder != NULL)
     {
     // First table row contains the display "selected/visible" or "all" radio buttons
-    // NOTE: list subtrack radio buttons are inside tracklist table header if there are no sort columns
-    //       The reason is to ensure spacing of lines column headers when the only column header is "Restricted Until"
+    // NOTE: list subtrack radio buttons are inside tracklist table header if
+    //       there are no sort columns.  The reason is to ensure spacing of lines
+    //       column headers when the only column header is "Restricted Until"
     printf("<B>List subtracks:&nbsp;");
     char javascript[JBUFSIZE];
-    safef(javascript, sizeof(javascript), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(true);'");
+    safef(javascript, sizeof(javascript),
+          "class='allOrOnly' onclick='showOrHideSelectedSubtracks(true);'");
     if (subCount > LARGE_COMPOSITE_CUTOFF)
         safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track);
     else
         safecpy(buffer,SMALLBUF,"displaySubtracks");
     cgiMakeOnClickRadioButton(buffer, "selected", !displayAll,javascript);
     puts("only selected/visible &nbsp;&nbsp;");
-    safef(javascript, sizeof(javascript), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(false);'");
+    safef(javascript, sizeof(javascript),
+          "class='allOrOnly' onclick='showOrHideSelectedSubtracks(false);'");
     cgiMakeOnClickRadioButton(buffer, "all", displayAll,javascript);
     printf("all</B>");
     if (slCount(subtrackRefList) > 5)
         printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
     makeTopLink(parentTdb);
     printf("</td></tr></table>");
     }
 else
     makeTopLink(parentTdb);
 
 // Now we can start in on the table of subtracks  It may be sortable and/or dragAndDroppable
 printf("\n<TABLE CELLSPACING='2' CELLPADDING='0' border='0'");
 dyStringClear(dyHtml);
 if (sortOrder != NULL)
     dyStringPrintf(dyHtml, "sortable");
@@ -3921,361 +3998,368 @@
 printf(" class='subtracks");
 if (dyStringLen(dyHtml) > 0)
     {
     printf(" bglevel1 %s'",dyStringContents(dyHtml));
     colorIx = COLOR_BG_ALTDEFAULT_IX;
     }
 if (sortOrder != NULL)
     puts("'><THEAD class=sortable>");
 else
     puts("'><THEAD>");
 
 boolean doColorPatch = trackDbSettingOn(parentTdb, "showSubtrackColorOnUi");
 int colspan = 3;
 if (sortOrder != NULL)
     colspan = sortOrder->count+2;
-#ifdef SUBTRACK_CFG
 else if (!tdbIsMultiTrack(parentTdb)) // An extra column for subVis/wrench so dragAndDrop works
     colspan++;
-#endif///def SUBTRACK_CFG
 if (doColorPatch)
     colspan += 1;
 int columnCount = 0;
 if (sortOrder != NULL)
     printf("<TR id=\"subtracksHeader\" class='sortable%s'>\n",useDragAndDrop?" nodrop nodrag":"");
 else
     {
     printf("<TR%s>",useDragAndDrop?" id='noDrag' class='nodrop nodrag'":"");
     // First table row contains the display "selected/visible" or "all" radio buttons
-    // NOTE: list subtrack radio buttons are inside tracklist table header if there are no sort columns
-    //       The reason is to ensure spacing of lines column headers when the only column header is "Restricted Until"
+    // NOTE: list subtrack radio buttons are inside tracklist table header if
+    //       there are no sort columns.  The reason is to ensure spacing of lines
+    //       column headers when the only column header is "Restricted Until"
     printf("<TD colspan='%d'><B>List subtracks:&nbsp;", colspan);
     char javascript[JBUFSIZE];
-    safef(javascript, sizeof(javascript), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(true);'");
+    safef(javascript, sizeof(javascript),
+          "class='allOrOnly' onclick='showOrHideSelectedSubtracks(true);'");
     if (subCount > LARGE_COMPOSITE_CUTOFF)
         safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track);
     else
         safecpy(buffer,SMALLBUF,"displaySubtracks");
     cgiMakeOnClickRadioButton(buffer, "selected", !displayAll,javascript);
     puts("only selected/visible &nbsp;&nbsp;");
-    safef(javascript, sizeof(javascript), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(false);'");
+    safef(javascript, sizeof(javascript),
+          "class='allOrOnly' onclick='showOrHideSelectedSubtracks(false);'");
     cgiMakeOnClickRadioButton(buffer, "all", displayAll,javascript);
     printf("all</B>");
     if (slCount(subtrackRefList) > 5)
         printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
     puts("</TD>");
     columnCount = colspan;
     }
 
 // Add column headers which are sort button links
 if (sortOrder != NULL)
     {
-    printf("<TH>&nbsp;<INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder
+    printf("<TH>&nbsp;<INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n",
+           sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder
     columnCount++;
-#ifdef SUBTRACK_CFG
     if (!tdbIsMultiTrack(parentTdb))  // An extra column for subVis/wrench so dragAndDrop works
         {
         printf("<TH></TH>\n");
         columnCount++;
         }
-#endif///def SUBTRACK_CFG
     // Columns in tdb order (unchanging), sort in cart order (changed by user action)
     int sIx=0;
     for(sIx=0;sIx<sortOrder->count;sIx++)
         {
         if (sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
         if (sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
-        printf("<TH id='%s' class='sortable%s sort%d' abbr='use' onclick='tableSortAtButtonPress(this);'>%s",
-            sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx],sortOrder->title[sIx]);
+        printf("<TH id='%s' class='sortable%s sort%d' abbr='use' "
+               "onclick='tableSortAtButtonPress(this);'>%s", sortOrder->column[sIx],
+               (sortOrder->forward[sIx] ? "" : " sortRev"),sortOrder->order[sIx],
+               sortOrder->title[sIx]);
         printf("<sup>%s",(sortOrder->forward[sIx]?"&darr;":"&uarr;"));
         if (sortOrder->count > 1)
             printf ("%d",sortOrder->order[sIx]);
         printf("</sup>");
         puts ("</TH>");
         columnCount++;
         }
 
     // longLabel column
     assert(sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx]));
-    printf("<TH id='%s' class='sortable%s sort%d' onclick='tableSortAtButtonPress(this);' align='left'>&nbsp;&nbsp;Track Name",
+    printf("<TH id='%s' class='sortable%s sort%d' onclick='tableSortAtButtonPress(this);' "
+           "align='left'>&nbsp;&nbsp;Track Name",
            sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]);
     printf("<sup>%s%d</sup>",(sortOrder->forward[sIx]?"&darr;":"&uarr;"),sortOrder->order[sIx]);
     puts ("</TH>");
     columnCount++;
     }
 puts("<TH>&nbsp;</TH>"); // schema column
 columnCount++;
 
 // Finally there may be a restricted until column
 if (restrictions)
     {
     if (sortOrder != NULL)
         {
         int sIx=sortOrder->count-1;
         assert(sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx]));
-        printf("<TH id='%s' class='sortable%s sort%d' onclick='tableSortAtButtonPress(this);' align='left'>&nbsp;Restricted Until",
-            sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]);
-        printf("<sup>%s%d</sup>",(sortOrder->forward[sIx]?"&darr;":"&uarr;"),sortOrder->order[sIx]);
-        //printf("<span class='bgLevel1' style='height:100%%;'><A HREF=\'%s\' TARGET=BLANK>&nbsp;?&nbsp;</A></span>", ENCODE_DATA_RELEASE_POLICY);
+        printf("<TH id='%s' class='sortable%s sort%d' onclick='tableSortAtButtonPress(this);' "
+                "align='left'>&nbsp;Restricted Until", sortOrder->column[sIx],
+                (sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]);
+        printf("<sup>%s%d</sup>",(sortOrder->forward[sIx] ? "&darr;" : "&uarr;"),
+               sortOrder->order[sIx]);
         puts ("</TH>");
         }
     else
         {
         printf("<TH align='center'>&nbsp;");
         printf("<A HREF=\'%s\' TARGET=BLANK>Restricted Until</A>", ENCODE_DATA_RELEASE_POLICY);
         puts("&nbsp;</TH>");
         }
     columnCount++;
     }
 puts("</TR></THEAD>"); // The end of the header section.
 
-// The subtracks need to be sorted by priority but only sortable and dragable will have non-default (cart) priorities to sort on
+// The subtracks need to be sorted by priority but only sortable and dragable will have
+// non-default (cart) priorities to sort on
 if (sortOrder != NULL || useDragAndDrop)
     {
-    preSorted = tdbRefSortPrioritiesFromCart(cart, &subtrackRefList); // preserves user's prev sort/drags
+    // preserves user's prev sort/drags
+    preSorted = tdbRefSortPrioritiesFromCart(cart, &subtrackRefList);
     printf("<TBODY class='%saltColors'>\n",(sortOrder != NULL ? "sortable " : "") );
     }
 else
     {
     slSort(&subtrackRefList, trackDbRefCmp);  // straight from trackDb.ra
     preSorted = TRUE;
     puts("<TBODY>");
     }
 
 // Finally the big "for loop" to list each subtrack as a table row.
 printf("\n<!-- ----- subtracks list ----- -->\n");
 for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
     {
     subtrack = subtrackRef->val;
     int ix;
 
     // Determine whether subtrack is checked, visible, configurable, has group membership, etc.
     int fourState = subtrackFourStateChecked(subtrack,cart);
     boolean checkedCB = fourStateChecked(fourState);
     boolean enabledCB = fourStateEnabled(fourState);
     boolean visibleCB = fourStateVisible(fourState);
     membership_t *membership = subgroupMembershipGet(subtrack);
     eCfgType cType = cfgNone;
     if (!tdbIsMultiTrack(parentTdb))  // MultiTracks never have configurable subtracks!
         cType = cfgTypeFromTdb(subtrack,FALSE);
     if (cType != cfgNone)
         {
-    #ifdef SUBTRACK_CFG
         // Turn off configuring for certain track type or if explicitly turned off
         int cfgSubtrack = configurableByAjax(subtrack,cType);
         if (cfgSubtrack <= cfgNone)
             cType = cfgNone;
-        else if (membersForAll->members[dimV]) // subtrack only configurable if more than one subtrack in view
-            {                                  // find "view" in subgroup membership: e.g. "signal"
-            if (-1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count)))
+        else if (membersForAll->members[dimV])
+            {  // subtrack only configurable if more than one subtrack in view
+               // find "view" in subgroup membership: e.g. "signal"
+            if (-1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag,
+                                          membership->subgroups, membership->count)))
                 {
                 int ix2;                       // find "signal" in set of all views
-                if (-1 != (ix2 = stringArrayIx(membership->membership[ix], membersForAll->members[dimV]->tags, membersForAll->members[dimV]->count)))
+                if (-1 != (ix2 = stringArrayIx(membership->membership[ix],
+                                               membersForAll->members[dimV]->tags,
+                                               membersForAll->members[dimV]->count)))
                     {
                     if (membersForAll->members[dimV]->subtrackCount[ix2] < 2)
                         cType = cfgNone;
                     }
                 }
             }
-        else if (slCount(subtrackRefList) < 2 && cfgTypeFromTdb(parentTdb,FALSE) != cfgNone)
-            cType = cfgNone;  // don't bother if there is a single subtrack but the composite is configurable.
-    #else///ifndef SUBTRACK_CFG
-        if (trackDbSettingClosestToHomeOn(subtrack, "configurable") == FALSE)
+        else if (slCount(subtrackRefList) < 2   // don't bother if there is a single subtrack
+             && cfgTypeFromTdb(parentTdb,FALSE) != cfgNone) // but the composite is configurable.
             cType = cfgNone;
-    #endif///ndef SUBTRACK_CFG
         }
 
     if (sortOrder == NULL && !useDragAndDrop)
         {
         if ( divisionIfNeeded(lastDivide,dividers,membership) )
-            colorIx = (colorIx == COLOR_BG_DEFAULT_IX ? COLOR_BG_ALTDEFAULT_IX : COLOR_BG_DEFAULT_IX);
+            colorIx = (colorIx == COLOR_BG_DEFAULT_IX ? COLOR_BG_ALTDEFAULT_IX
+                                                      : COLOR_BG_DEFAULT_IX);
         }
 
     // Start the TR which must have an id that is directly related to the checkBox id
-    char *id = checkBoxIdMakeForTrack(subtrack,membersForAll->members,membersForAll->dimMax,membership); // view is known tag
+    char *id = checkBoxIdMakeForTrack(subtrack,membersForAll->members,membersForAll->dimMax,
+                                      membership); // view is known tag
     printf("<TR valign='top' class='%s%s'",colors[colorIx],(useDragAndDrop?" trDraggable":""));
     printf(" id=tr_%s%s>\n",id,(!visibleCB && !displayAll?" style='display:none'":""));
 
     // Now the TD that holds the checkbox
     printf("<TD%s%s>",
            (enabledCB?"":" title='view is hidden'"),
            (useDragAndDrop?" class='dragHandle' title='Drag to reorder'":""));
 
     // A hidden field to keep track of subtrack order if it could change
     if (sortOrder != NULL || useDragAndDrop)
         {
         safef(buffer, sizeof(buffer), "%s.priority", subtrack->track);
         float priority = (float)cartUsualDouble(cart, buffer, subtrack->priority);
-        printf("<INPUT TYPE=HIDDEN NAME='%s' class='trPos' VALUE=\"%.0f\">", buffer, priority); // keeing track of priority
+        printf("<INPUT TYPE=HIDDEN NAME='%s' class='trPos' VALUE=\"%.0f\">",
+               buffer, priority); // keeing track of priority
         }
 
-    // The checkbox has identifying classes including subCB and the tag for each dimension (e.g. class='subCB GM12878 CTCF Peak')
+    // The checkbox has identifying classes including subCB and the tag for each dimension
+    //  (e.g. class='subCB GM12878 CTCF Peak')
     dyStringClear(dyHtml);
     dyStringAppend(dyHtml, "subCB"); // always first
     if (membersForAll->dimensions)
         {
         for(di=dimX;di<membersForAll->dimMax;di++)
             {
-            if (membersForAll->members[di] && -1 != (ix = stringArrayIx(membersForAll->members[di]->groupTag, membership->subgroups, membership->count)))
+            if (membersForAll->members[di] && -1 !=
+                                (ix = stringArrayIx(membersForAll->members[di]->groupTag,
+                                                    membership->subgroups, membership->count)))
                 dyStringPrintf(dyHtml," %s",membership->membership[ix]);
             }
         }
-     else if (membersForAll->abcCount) // "dimensions" don't exist but there may be subgroups anyway
+    else if (membersForAll->abcCount) // "dimensions" don't exist but may be subgroups anyway
         {
         for(di=dimA;di<membersForAll->dimMax;di++)
             {
-            if (membersForAll->members[di] && -1 != (ix = stringArrayIx(membersForAll->members[di]->groupTag, membership->subgroups, membership->count)))
+            if (membersForAll->members[di] && -1 !=
+                                (ix = stringArrayIx(membersForAll->members[di]->groupTag,
+                                                    membership->subgroups, membership->count)))
                 dyStringPrintf(dyHtml," %s",membership->membership[ix]);
             }
         }
-    if (membersForAll->members[dimV] && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count)))
+    if (membersForAll->members[dimV] && -1 !=
+                                (ix = stringArrayIx(membersForAll->members[dimV]->groupTag,
+                                                    membership->subgroups, membership->count)))
         dyStringPrintf(dyHtml, " %s",membership->membership[ix]);  // Saved view for last
 
     // And finally the checkBox is made!
     safef(buffer, sizeof(buffer), "%s_sel", subtrack->track);
-#ifdef SUBTRACK_CFG
     if (!enabledCB)
         {
         dyStringAppend(dyHtml, " disabled");
-        cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),"onclick='matSubCbClick(this);' style='cursor:pointer' title='view is hidden'");
+        cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),
+                "onclick='matSubCbClick(this);' style='cursor:pointer' title='view is hidden'");
         }
     else
-#endif///def SUBTRACK_CFG
-        cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),"onclick='matSubCbClick(this);' style='cursor:pointer'");
+        cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),
+                               "onclick='matSubCbClick(this);' style='cursor:pointer'");
     if (useDragAndDrop)
         printf("&nbsp;");
 
-#ifdef SUBTRACK_CFG
     if (!tdbIsMultiTrack(parentTdb))  // MultiTracks never have independent vis
         {
         printf("</TD><TD>"); // An extra column for subVis/wrench so dragAndDrop works
         enum trackVisibility vis = tdbVisLimitedByAncestors(cart,subtrack,FALSE,FALSE);
         char *view = NULL;
         if (membersForAll->members[dimV]
-        && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count)))
+        && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups,
+                                     membership->count)))
             view = membership->membership[ix];
             char classList[256];
             if (view != NULL)
-                safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD %s",(visibleCB ? "":" disabled"),view); // view should be last!
+            safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD %s",
+                            (visibleCB ? "":" disabled"),view); // view should be last!
             else
-                safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD",(visibleCB ? "":" disabled"));
-            #define SUBTRACK_CFG_VIS "<div id= '%s_faux' class='%s' style='width:65px;' onclick='return subCfg.replaceWithVis(this,\"%s\",true);'>%s</div>\n"
+            safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD",
+                            (visibleCB ? "":" disabled"));
+        #define SUBTRACK_CFG_VIS "<div id= '%s_faux' class='%s' style='width:65px;' " \
+                                 "onclick='return subCfg.replaceWithVis(this,\"%s\",true);'>" \
+                                 "%s</div>\n"
             printf(SUBTRACK_CFG_VIS,subtrack->track,classList,subtrack->track,hStringFromTv(vis));
         if (cType != cfgNone)  // make a wrench
             {
-            #define SUBTRACK_CFG_WRENCH "<span class='clickable%s' onclick='return subCfg.cfgToggle(this,\"%s\");' title='Configure this subtrack'><img src='../images/wrench.png'></span>\n"
+            #define SUBTRACK_CFG_WRENCH "<span class='clickable%s' onclick='return " \
+                                        "subCfg.cfgToggle(this,\"%s\");' title='Configure this " \
+                                        "subtrack'><img src='../images/wrench.png'></span>\n"
             printf(SUBTRACK_CFG_WRENCH,(visibleCB ? "":" disabled"),subtrack->track);
             }
         }
     printf("</TD>");
-#endif///def SUBTRACK_CFG
 
     // A color patch which helps distinguish subtracks in some types of composites
     if (doColorPatch)
         {
         printf("<TD BGCOLOR='#%02X%02X%02X'>&nbsp;&nbsp;&nbsp;&nbsp;</TD>",
                 subtrack->colorR, subtrack->colorG, subtrack->colorB);
         }
 
     // If sortable, then there must be a column per sortable dimension
     if (sortOrder != NULL)
         {
         int sIx=0;
         for(sIx=0;sIx<sortOrder->count;sIx++)
             {
-            ix = stringArrayIx(sortOrder->column[sIx], membership->subgroups, membership->count); // TODO: Sort needs to expand from subGroups to labels as well
+            ix = stringArrayIx(sortOrder->column[sIx], membership->subgroups, membership->count);
+                                // TODO: Sort needs to expand from subGroups to labels as well
             if (ix >= 0)
                 {
                 char *titleRoot=NULL;
                 if (cvTermIsEmpty(sortOrder->column[sIx],membership->titles[ix]))
                     titleRoot = cloneString(" &nbsp;");
                 else
                     titleRoot = labelRoot(membership->titles[ix],NULL);
-                // Each sortable column requires hidden goop (in the "abbr" field currently) which is the actual sort on value
-                printf ("<TD id='%s_%s' abbr='%s' align='left'>&nbsp;",subtrack->track,sortOrder->column[sIx],membership->membership[ix]);
-            #ifndef SUBTRACK_CFG
-                #define CFG_SUBTRACK_LINK  "<A HREF='#a_cfg_%s' onclick='return subtrackCfgShow(\"%s\");' title='Subtrack Configuration'>%s</A>"
-                #define MAKE_CFG_SUBTRACK_LINK(table,title) printf(CFG_SUBTRACK_LINK, (table),(table),(title))
-                if (cType != cfgNone && sameString("view",sortOrder->column[sIx])) // configure link is on view currently
-                    MAKE_CFG_SUBTRACK_LINK(subtrack->track,titleRoot);
-                else
-            #endif///ndef SUBTRACK_CFG
+                // Each sortable column requires hidden goop (in the "abbr" field currently)
+                // which is the actual sort on value
+                printf("<TD id='%s_%s' abbr='%s' align='left'>&nbsp;",
+                       subtrack->track,sortOrder->column[sIx],membership->membership[ix]);
                     printf("%s",titleRoot);
                 puts ("</TD>");
                 freeMem(titleRoot);
                 }
             }
         }
-    else  // Non-sortable tables do not have sort by columns but will display a short label (which may be a configurable link)
-        {
+    else  // Non-sortable tables do not have sort by columns but will display a short label
+        { // (which may be a configurable link)
         printf ("<TD>&nbsp;");
         indentIfNeeded(hierarchy,membership);
-    #ifndef SUBTRACK_CFG
-        if (cType != cfgNone)
-            MAKE_CFG_SUBTRACK_LINK(subtrack->track,subtrack->shortLabel);
-        else
-    #endif///ndef SUBTRACK_CFG
             printf("%s",subtrack->shortLabel);
         puts ("</TD>");
         }
 
-    // The long label column (note that it may have a "..." that allows getting at all the metadata)
+    // The long label column (note that it may have a metadata dropdown)
     printf ("<TD title='select to copy'>&nbsp;%s", subtrack->longLabel);
     if (trackDbSetting(parentTdb, "wgEncode") && trackDbSetting(subtrack, "accession"))
         printf (" [GEO:%s]", trackDbSetting(subtrack, "accession"));
     compositeMetadataToggle(db,subtrack,NULL,TRUE,FALSE);
     printf("&nbsp;");
 
-    // Embedded cfg dialogs are within the TD that contains the longLabel.  This allows a wide item to be embedded in the table
+    // Embedded cfg dialogs are within the TD that contains the longLabel.
+    //  This allows a wide item to be embedded in the table
     if (cType != cfgNone)
         {
-    #ifdef SUBTRACK_CFG
         // How to make this thing float to the left?  Container is overflow:visible
         // and contained (made in js) is position:relative; left: -{some pixels}
-        #define CFG_SUBTRACK_DIV "<DIV id='div_cfg_%s' class='subCfg %s' style='display:none; overflow:visible;'></DIV>"
-        #define MAKE_CFG_SUBTRACK_DIV(table,view) printf(CFG_SUBTRACK_DIV,(table),(view)?(view):"noView")
+        #define CFG_SUBTRACK_DIV "<DIV id='div_cfg_%s' class='subCfg %s' style='display:none; " \
+                                 "overflow:visible;'></DIV>"
+        #define MAKE_CFG_SUBTRACK_DIV(table,view) \
+                                        printf(CFG_SUBTRACK_DIV,(table),(view)?(view):"noView")
         char * view = NULL;
-        if (membersForAll->members[dimV] && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count)))
+        if (membersForAll->members[dimV] && -1 !=
+                            (ix = stringArrayIx(membersForAll->members[dimV]->groupTag,
+                                                membership->subgroups, membership->count)))
             view = membership->membership[ix];
         MAKE_CFG_SUBTRACK_DIV(subtrack->track,view);
-    #else///ifndef SUBTRACK_CFG
-        dependentCfgsNeedBinding = TRUE; // configurable subtrack needs to be bound to composite settings
-        #define CFG_SUBTRACK_DIV "<DIV id='div_%s_cfg'%s><INPUT TYPE=HIDDEN NAME='%s' value='%s'>\n"
-        #define MAKE_CFG_SUBTRACK_DIV(table,cfgVar,open) printf(CFG_SUBTRACK_DIV,(table),((open)?"":" style='display:none'"),(cfgVar),((open)?"on":"off"))
-        safef(buffer,sizeof(buffer),"%s.childShowCfg",subtrack->track);
-        boolean open = cartUsualBoolean(cart, buffer,FALSE);
-        MAKE_CFG_SUBTRACK_DIV(subtrack->track,buffer,open);
-        cfgByCfgType(cType,db,cart,subtrack,subtrack->track,"Subtrack",TRUE);
-        printf("</DIV>");
-    #endif///ndef SUBTRACK_CFG
         }
 
     // A schema link for each track
     printf("</td>\n<TD>&nbsp;");
     makeSchemaLink(db,subtrack,"schema");
     printf("&nbsp;");
 
     // Do we have a restricted until date?
     if (restrictions)
         {
         char *dateDisplay = encodeRestrictionDate(db,subtrack,FALSE); // includes dates in the past
         if (dateDisplay)
             {
             if (dateIsOld(dateDisplay,"%F"))
-                printf("</TD>\n<TD align='center' nowrap style='color: #BBBBBB;'>&nbsp;%s&nbsp;", dateDisplay);
+                printf("</TD>\n<TD align='center' nowrap style='color: #BBBBBB;'>&nbsp;%s&nbsp;",
+                       dateDisplay);
             else
                 printf("</TD>\n<TD align='center'>&nbsp;%s&nbsp;", dateDisplay);
             }
         }
 
     // End of row and free ourselves of this subtrack
     puts("</TD></TR>\n");
     checkBoxIdFree(&id);
     }
 
 // End of the table
 puts("</TBODY>");
 if (slCount(subtrackRefList) > 5 || (restrictions && sortOrder != NULL))
     {
     printf("<TFOOT style='background-color:%s;'><TR valign='top'>", COLOR_BG_DEFAULT_DARKER);
@@ -4287,59 +4371,58 @@
     // Count of subtracks is filled in by javascript.
     if (slCount(subtrackRefList) > 5)
         printf("<span class='subCBcount'></span>\n");
 
     // Restriction policy needs a link
     if (restrictions && sortOrder != NULL)
         printf("</TD><TH><A HREF='%s' TARGET=BLANK style='font-size:.9em;'>Restriction Policy</A>",
                ENCODE_DATA_RELEASE_POLICY);
 
     printf("</TD></TR></TFOOT>\n");
     }
 puts("</TABLE>");
 if (sortOrder == NULL)
     printf("</td></tr></table>");
 
-#ifndef SUBTRACK_CFG
-if (dependentCfgsNeedBinding)
-    cfgLinkToDependentCfgs(cart,parentTdb,parentTdb->track);
-#endif//ndef SUBTRACK_CFG
-
 // Finally we are free of all this
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 dyStringFree(&dyHtml)
 sortOrderFree(&sortOrder);
 dividersFree(&dividers);
 hierarchyFree(&hierarchy);
 }
 
-static void compositeUiSubtracksMatchingPrimary(char *db, struct cart *cart, struct trackDb *parentTdb,char *primarySubtrack)
-/* Display list of subtracks associated with a primary subtrack for the hgTables merge function */
+static void compositeUiSubtracksMatchingPrimary(char *db, struct cart *cart,
+                                                struct trackDb *parentTdb,char *primarySubtrack)
+// Display list of subtracks associated with a primary subtrack for the hgTables merge function
 {
 assert(primarySubtrack != NULL);
 char *primaryType = getPrimaryType(primarySubtrack, parentTdb);
 char htmlIdentifier[SMALLBUF];
 
 // Get list of leaf subtracks to work with and sort them
-struct slRef *subtrackRef, *subtrackRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
-if (NULL != trackDbSetting(parentTdb, "sortOrder") || NULL != trackDbSetting(parentTdb, "dragAndDrop"))
+struct slRef *subtrackRef, *subtrackRefList =
+                                trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
+if (NULL != trackDbSetting(parentTdb, "sortOrder")
+||  NULL != trackDbSetting(parentTdb, "dragAndDrop"))
     tdbRefSortPrioritiesFromCart(cart, &subtrackRefList); // preserves user's prev sort/drags
 else
     slSort(&subtrackRefList, trackDbRefCmp);  // straight from trackDb.ra
 
 // Now we can start in on the table of subtracks
-printf("\n<TABLE CELLSPACING='2' CELLPADDING='0' border='0' id='subtracks.%s'><THEAD>\n</TR></THEAD><TBODY>\n",parentTdb->track);
+printf("\n<TABLE CELLSPACING='2' CELLPADDING='0' border='0' id='subtracks.%s'>"
+       "<THEAD>\n</TR></THEAD><TBODY>\n",parentTdb->track);
 
 for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
     {
     struct trackDb *subtrack = subtrackRef->val;
     int fourState = subtrackFourStateChecked(subtrack,cart);
     boolean checkedCB = fourStateChecked(fourState);
     boolean enabledCB = fourStateEnabled(fourState);
     safef(htmlIdentifier, sizeof(htmlIdentifier), "%s_sel", subtrack->track);
 
     if (sameString(subtrack->track, primarySubtrack))
         {
         puts("<TR><TD>");
         cgiMakeHiddenBoolean(htmlIdentifier, TRUE);
         puts("[on] ");
         printf ("</TD><TD>%s [selected on main page]</TD></TR>\n",
@@ -4349,95 +4432,79 @@
         {
         puts("<TR><TD>");
         cgiMakeCheckBox(htmlIdentifier, checkedCB && enabledCB);
         printf ("</TD><TD>%s</TD></TR>\n", subtrack->longLabel);
         }
     }
 puts("</TBODY><TFOOT></TFOOT>");
 puts("</TABLE>");
 if (slCount(subtrackRefList) > 5)
     puts("&nbsp;&nbsp;&nbsp;&nbsp;<span class='subCBcount'></span>");
 puts("<P>");
 if (!primarySubtrack)
     puts("<script type='text/javascript'>matInitializeMatrix();</script>");
 }
 
-#ifdef SUBTRACK_CFG
 static void makeAddClearButtonPair(char *class,char *seperator)
 // Print an [Add][Clear] button pair that uses javascript to check subtracks
 {
 char buf[256];
 if (class)
     safef(buf, sizeof buf,"matSetMatrixCheckBoxes(true,'%s'); return false;", class);
 else
     safef(buf, sizeof buf,"matSetMatrixCheckBoxes(true); return false;");
 cgiMakeOnClickButton(buf, ADD_BUTTON_LABEL);
 if (seperator)
     printf("%s",seperator);
 if (class)
     safef(buf, sizeof buf,"matSetMatrixCheckBoxes(false,'%s'); return false;", class);
 else
     safef(buf, sizeof buf,"matSetMatrixCheckBoxes(false); return false;");
 cgiMakeOnClickButton(buf, CLEAR_BUTTON_LABEL);
 }
-#else///ifndef SUBTRACK_CFG
-static void makeAddClearSubmitTweak(char javascript[JBUFSIZE], char *formName,
-				    char *buttonVar, char *label)
-/* safef into javascript a sequence of commands that will force a refresh
- * of this same form, updating the values of whatever variables are necessary
- * to say what we want to do. */
-{
-safef(javascript, JBUFSIZE*sizeof(char),
-      "document.%s.action = '%s'; document.%s.%s.value='%s'; "
-      "document.%s.submit();",
-      formName, cgiScriptName(), formName, buttonVar, label,
-      formName);
-}
-#endif///ndef SUBTRACK_CFG
 
 #define MANY_SUBTRACKS  8
-
 #define WIGGLE_HELP_PAGE  "../goldenPath/help/hgWiggleTrackHelp.html"
 
 boolean cfgBeginBoxAndTitle(struct trackDb *tdb, boolean boxed, char *title)
-/* Handle start of box and title for individual track type settings */
+// Handle start of box and title for individual track type settings
 {
 if(!boxed)
     {
     boxed = trackDbSettingOn(tdb,"boxedCfg");
     if(boxed)
         printf("<BR>");
     }
 if (boxed)
     {
     printf("<TABLE class='blueBox");
     char *view = tdbGetViewName(tdb);
     if(view != NULL)
         printf(" %s",view);
     printf("' style='background-color:%s;'><TR><TD>", COLOR_BG_ALTDEFAULT);
     if (title)
         printf("<CENTER><B>%s Configuration</B></CENTER>\n", title);
     }
 else if (title)
     printf("<p><B>%s &nbsp;</b>", title );
 else
     printf("<p>");
 return boxed;
 }
 
 void cfgEndBox(boolean boxed)
-/* Handle end of box and title for individual track type settings */
+// Handle end of box and title for individual track type settings
 {
 if (boxed)
     puts("</td></tr></table>");
 }
 
 void wigCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
 /* UI for the wiggle track */
 {
 char *typeLine = NULL;  /*  to parse the trackDb type line  */
 char *words[8];     /*  to parse the trackDb type line  */
 int wordCount = 0;  /*  to parse the trackDb type line  */
 char option[256];
 double minY;        /*  from trackDb or cart    */
 double maxY;        /*  from trackDb or cart    */
 double tDbMinY;     /*  data range limits from trackDb type line */
@@ -4496,31 +4563,32 @@
 wiggleGraphDropDown(option, lineBar);
 if(boxed)
     {
     printf("</td><td align=right colspan=2>");
     printf("<A HREF=\"%s\" TARGET=_blank>Graph configuration help</A>",WIGGLE_HELP_PAGE);
     }
 puts("</td></TR>");
 
 printf("<TR valign=center><th align=right>Track height:</th><td align=left colspan=3>");
 snprintf(option, sizeof(option), "%s.%s", name, HEIGHTPER );
 cgiMakeIntVarWithLimits(option, defaultHeight, "Track height",0, minHeightPixels, maxHeightPixels);
 printf("pixels&nbsp;(range: %d to %d)",
     minHeightPixels, maxHeightPixels);
 puts("</TD></TR>");
 
-printf("<TR valign=center><th align=right>Vertical viewing range:</th><td align=left>&nbsp;min:&nbsp;");
+printf("<TR valign=center><th align=right>Vertical viewing range:</th>"
+       "<td align=left>&nbsp;min:&nbsp;");
 snprintf(option, sizeof(option), "%s.%s", name, MIN_Y );
 cgiMakeDoubleVarWithLimits(option, minY, "Range min", 0, NO_VALUE, NO_VALUE);
 printf("</td><td align=leftv colspan=2>max:&nbsp;");
 snprintf(option, sizeof(option), "%s.%s", name, MAX_Y );
 cgiMakeDoubleVarWithLimits(option, maxY, "Range max", 0, NO_VALUE, NO_VALUE);
 printf("&nbsp;(range: %g to %g)",
     tDbMinY, tDbMaxY);
 puts("</TD></TR>");
 
 printf("<TR valign=center><th align=right>Data view scaling:</th><td align=left colspan=3>");
 snprintf(option, sizeof(option), "%s.%s", name, AUTOSCALE );
 wiggleScaleDropDown(option, autoScale);
 snprintf(option, sizeof(option), "%s.%s", name, ALWAYSZERO);
 printf("Always include zero:&nbsp");
 wiggleAlwaysZeroDropDown(option, alwaysZero);
@@ -4528,149 +4596,153 @@
 
 printf("<TR valign=center><th align=right>Transform function:</th><td align=left>");
 snprintf(option, sizeof(option), "%s.%s", name, TRANSFORMFUNC);
 printf("Transform data points by:&nbsp");
 wiggleTransformFuncDropDown(option, transformFunc);
 
 printf("<TR valign=center><th align=right>Windowing function:</th><td align=left>");
 snprintf(option, sizeof(option), "%s.%s", name, WINDOWINGFUNCTION );
 wiggleWindowingDropDown(option, windowingFunction);
 
 printf("<th align=right>Smoothing window:</th><td align=left>");
 snprintf(option, sizeof(option), "%s.%s", name, SMOOTHINGWINDOW );
 wiggleSmoothingDropDown(option, smoothingWindow);
 puts("&nbsp;pixels</TD></TR>");
 
-printf("<TR valign=center><td align=right><b>Draw y indicator lines:</b><td align=left colspan=2>");
+printf("<TR valign=center><td align=right><b>Draw y indicator lines:</b>"
+       "<td align=left colspan=2>");
 printf("at y = 0.0:");
 snprintf(option, sizeof(option), "%s.%s", name, HORIZGRID );
 wiggleGridDropDown(option, horizontalGrid);
 printf("&nbsp;&nbsp;&nbsp;at y =");
 snprintf(option, sizeof(option), "%s.%s", name, YLINEMARK );
 cgiMakeDoubleVarWithLimits(option, yLineMark, "Indicator at Y", 0, tDbMinY, tDbMaxY);
 snprintf(option, sizeof(option), "%s.%s", name, YLINEONOFF );
 wiggleYLineMarkDropDown(option, yLineMarkOnOff);
 printf("</td>");
 if(boxed)
     puts("</TD></TR></TABLE>");
 else
     {
     puts("</TD></TR></TABLE>");
     printf("<A HREF=\"%s\" TARGET=_blank>Graph configuration help</A>",WIGGLE_HELP_PAGE);
     }
 
 cfgEndBox(boxed);
 }
 
 
-
 void filterButtons(char *filterTypeVar, char *filterTypeVal, boolean none)
 /* Put up some filter buttons. */
 {
 printf("<B>Filter:</B> ");
 radioButton(filterTypeVar, filterTypeVal, "red");
 radioButton(filterTypeVar, filterTypeVal, "green");
 radioButton(filterTypeVar, filterTypeVal, "blue");
 radioButton(filterTypeVar, filterTypeVal, "exclude");
 radioButton(filterTypeVar, filterTypeVal, "include");
 if (none)
     radioButton(filterTypeVar, filterTypeVal, "none");
 }
 
 void radioButton(char *var, char *val, char *ourVal)
 /* Print one radio button */
 {
 cgiMakeRadioButton(var, ourVal, sameString(ourVal, val));
 printf("%s ", ourVal);
 }
 
-void oneMrnaFilterUi(struct controlGrid *cg, struct trackDb *tdb, char *text, char *var, char *suffix, struct cart *cart)
+void oneMrnaFilterUi(struct controlGrid *cg, struct trackDb *tdb, char *text, char *var,
+                     char *suffix, struct cart *cart)
 /* Print out user interface for one type of mrna filter. */
 {
 controlGridStartCell(cg);
 printf("%s:<BR>", text);
 boolean parentLevel = isNameAtParentLevel(tdb,var);
 cgiMakeTextVar(var, cartUsualStringClosestToHome(cart, tdb, parentLevel,suffix, ""), 19);
 controlGridEndCell(cg);
 }
 
 void bedFiltCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed)
 /* Put up UI for an "bedFilter" tracks. */
 {
 struct mrnaUiData *mud = newBedUiData(prefix);
 struct mrnaFilter *fil;
 struct controlGrid *cg = NULL;
 boolean parentLevel = isNameAtParentLevel(tdb,prefix);
-char *filterTypeVal = cartUsualStringClosestToHome(cart, tdb, parentLevel, mud->filterTypeSuffix, "red");
+char *filterTypeVal =
+                cartUsualStringClosestToHome(cart, tdb, parentLevel, mud->filterTypeSuffix, "red");
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 /* Define type of filter. */
 printf("<table width=400><tr><td align='left'>\n");
 char buffer[256];
 safef(buffer, sizeof buffer,"%s.%s",prefix,mud->filterTypeSuffix);
 filterButtons(buffer, filterTypeVal, FALSE);
 printf("</br>");
 /* List various fields you can filter on. */
 cg = startControlGrid(4, NULL);
 for (fil = mud->filterList; fil != NULL; fil = fil->next)
     {
     safef(buffer, sizeof buffer,"%s.%s",prefix,fil->suffix);
     oneMrnaFilterUi(cg, tdb, fil->label, buffer, fil->suffix, cart);
     }
 endControlGrid(&cg);
 cfgEndBox(boxed);
 }
 
 void mrnaCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed)
 /* Put up UI for an mRNA (or EST) track. */
 {
 boolean isXeno = (sameString(tdb->track, "xenoMrna") ||  sameString(tdb->track, "xenoEst"));
 struct mrnaUiData *mud = newMrnaUiData(prefix, isXeno);
 struct mrnaFilter *fil;
 struct controlGrid *cg = NULL;
 boolean parentLevel = isNameAtParentLevel(tdb,prefix);
-char *filterTypeVal = cartUsualStringClosestToHome(cart, tdb, parentLevel, mud->filterTypeSuffix,"red");
-char *logicTypeVal  = cartUsualStringClosestToHome(cart, tdb, parentLevel, mud->logicTypeSuffix, "and");
+char *filterTypeVal =
+                cartUsualStringClosestToHome(cart, tdb, parentLevel, mud->filterTypeSuffix,"red");
+char *logicTypeVal  =
+                cartUsualStringClosestToHome(cart, tdb, parentLevel, mud->logicTypeSuffix, "and");
 
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 /* Define type of filter. */
 char buffer[256];
 safef(buffer,sizeof buffer,"%s.%s",prefix,mud->filterTypeSuffix);
 filterButtons(buffer, filterTypeVal, FALSE);
 printf("  <B>Combination Logic:</B> ");
 safef(buffer,sizeof buffer,"%s.%s",prefix,mud->logicTypeSuffix);
 radioButton(buffer, logicTypeVal, "and");
 radioButton(buffer, logicTypeVal, "or");
 printf("<BR>\n");
 
 /* List various fields you can filter on. */
 printf("<table border=0 cellspacing=1 cellpadding=1 width=%d>\n", CONTROL_TABLE_WIDTH);
 cg = startControlGrid(4, NULL);
 for (fil = mud->filterList; fil != NULL; fil = fil->next)
     {
     safef(buffer,sizeof buffer,"%s.%s",prefix,fil->suffix);
     oneMrnaFilterUi(cg, tdb, fil->label, buffer, fil->suffix, cart);
     }
 endControlGrid(&cg);
 baseColorDrawOptDropDown(cart, tdb);
 indelShowOptions(cart, tdb);
 cfgEndBox(boxed);
 }
 
 
 void scoreGrayLevelCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix, int scoreMax)
-/* If scoreMin has been set, let user select the shade of gray for that score, in case
- * the default is too light to see or darker than necessary. */
+// If scoreMin has been set, let user select the shade of gray for that score, in case
+// the default is too light to see or darker than necessary.
 {
 boolean parentLevel = isNameAtParentLevel(tdb,prefix);
 char *scoreMinStr = trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN);
 if (scoreMinStr != NULL)
     {
     int scoreMin = atoi(scoreMinStr);
     // maxShade=9 taken from hgTracks/simpleTracks.c.  Ignore the 10 in shadesOfGray[10+1] --
     // maxShade is used to access the array.
     int maxShade = 9;
     int scoreMinGrayLevel = scoreMin * maxShade/scoreMax;
     if (scoreMinGrayLevel <= 0) scoreMinGrayLevel = 1;
     char *setting = trackDbSettingClosestToHome(tdb, MIN_GRAY_LEVEL);
     int minGrayLevel = cartUsualIntClosestToHome(cart, tdb, parentLevel, MIN_GRAY_LEVEL,
                         setting ? atoi(setting) : scoreMinGrayLevel);
     if (minGrayLevel <= 0) minGrayLevel = 1;
@@ -4696,53 +4768,55 @@
     // Use class to set color of each option:
     for (i = 1;  i <= maxShade;  i++)
         {
         level = 255 - (255*i / maxShade);
         printf("<OPTION%s STYLE='color: #%02x%02x%02x' VALUE=%d>",
             (minGrayLevel == i ? " SELECTED" : ""), level, level, level, i);
         if (i == maxShade)
             printf("&bull; black</OPTION>\n");
         else
             printf("&bull; gray (%d%%)</OPTION>\n", i * (100/maxShade));
         }
     printf("</SELECT>\n");
     }
 }
 
-static boolean getScoreDefaultsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max)
-/* returns TRUE if defaults exist and sets the string pointer (because they may be float or int)
-   if min or max are set, then they should be freed */
+static boolean getScoreDefaultsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,
+                                       char**min,char**max)
+// returns TRUE if defaults exist and sets the string pointer (because they may be float or int)
+// if min or max are set, then they should be freed
 {
 if(min)
     *min = NULL; // default these outs!
 if(max)
     *max = NULL;
 char *setting = trackDbSettingClosestToHome(tdb, scoreName);
 if(setting)
     {
     if(strchr(setting,':') != NULL)
         return colonPairToStrings(setting,min,max);
     else if(min)
         *min = cloneString(setting);
     return TRUE;
     }
 return FALSE;
 }
 
-static boolean getScoreLimitsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max)
-/* returns TRUE if limits exist and sets the string pointer (because they may be float or int)
-   if min or max are set, then they should be freed */
+static boolean getScoreLimitsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,
+                                     char**min,char**max)
+// returns TRUE if limits exist and sets the string pointer (because they may be float or int)
+// if min or max are set, then they should be freed
 {
 if(min)
     *min = NULL; // default these outs!
 if(max)
     *max = NULL;
 char scoreLimitName[128];
 safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _LIMITS);
 char *setting = trackDbSettingClosestToHome(tdb, scoreLimitName);
 if(setting)
     {
     return colonPairToStrings(setting,min,max);
     }
 else
     {
     if(min)
@@ -4771,222 +4845,237 @@
             *min=minLoc;
         else
             freeMem(minLoc);
         if(max && *max == NULL && maxLoc != NULL)
             *max=maxLoc;
         else
             freeMem(maxLoc);
         return TRUE;
         }
     }
 return FALSE;
 }
 
 static void getScoreIntRangeFromCart(struct cart *cart, struct trackDb *tdb, boolean parentLevel,
                                  char *scoreName, int *limitMin, int *limitMax,int *min,int *max)
-/* gets an integer score range from the cart, but the limits from trackDb
-   for any of the pointers provided, will return a value found, if found, else it's contents
-   are undisturbed (use NO_VALUE to recognize unavaliable values) */
+// gets an integer score range from the cart, but the limits from trackDb
+// for any of the pointers provided, will return a value found, if found, else it's contents
+// are undisturbed (use NO_VALUE to recognize unavaliable values)
 {
 char scoreLimitName[128];
 char *deMin=NULL,*deMax=NULL;
 if((limitMin || limitMax) && getScoreLimitsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
     {
     if(deMin != NULL && limitMin)
         *limitMin = atoi(deMin);
     if(deMax != NULL && limitMax)
         *limitMax = atoi(deMax);
     freeMem(deMin);
     freeMem(deMax);
     }
 if((min || max) && getScoreDefaultsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
     {
     if(deMin != NULL && min)
         *min = atoi(deMin);
     if(deMax != NULL && max)
         *max =atoi(deMax);
     freeMem(deMin);
     freeMem(deMax);
     }
 if(max)
     {
     safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MAX);
     deMax = cartOptionalStringClosestToHome(cart, tdb,parentLevel,scoreLimitName);
     if(deMax != NULL)
         *max = atoi(deMax);
     }
 if(min)
-    {
-    safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, (max && deMax? _MIN:"")); // Warning: name changes if max!
+    {                                                           // Warning: name changes if max!
+    safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, (max && deMax? _MIN:""));
     deMin = cartOptionalStringClosestToHome(cart, tdb,parentLevel,scoreLimitName);
     if(deMin != NULL)
         *min = atoi(deMin);
     }
-// Defaulting min and max within limits.  Sorry for the horizontal ifs, but stacking the group makes them easier to follow
-if (min && limitMin && *limitMin != NO_VALUE && (*min == NO_VALUE || *min < *limitMin)) *min = *limitMin;
-if (min && limitMax && *limitMax != NO_VALUE &&                      *min > *limitMax)  *min = *limitMax;
-if (max && limitMax && *limitMax != NO_VALUE && (*max == NO_VALUE || *max > *limitMax)) *max = *limitMax;
-if (max && limitMin && *limitMin != NO_VALUE &&                      *max < *limitMin)  *max = *limitMin;
+// Defaulting min and max within limits.  Sorry for the horizontal ifs,
+// but stacking the group makes them easier to follow
+if (min && limitMin
+&& *limitMin != NO_VALUE && (*min == NO_VALUE || *min < *limitMin)) *min = *limitMin;
+if (min && limitMax
+&& *limitMax != NO_VALUE &&                      *min > *limitMax)  *min = *limitMax;
+if (max && limitMax
+&& *limitMax != NO_VALUE && (*max == NO_VALUE || *max > *limitMax)) *max = *limitMax;
+if (max && limitMin
+&& *limitMin != NO_VALUE &&                      *max < *limitMin)  *max = *limitMin;
 }
 
 static void getScoreFloatRangeFromCart(struct cart *cart, struct trackDb *tdb, boolean parentLevel,
                          char *scoreName, double *limitMin,double *limitMax,double*min,double*max)
-/* gets an double score range from the cart, but the limits from trackDb
-   for any of the pointers provided, will return a value found, if found, else it's contents
-   are undisturbed (use NO_VALUE to recognize unavaliable values) */
+// gets an double score range from the cart, but the limits from trackDb
+// for any of the pointers provided, will return a value found, if found, else it's contents
+// are undisturbed (use NO_VALUE to recognize unavaliable values)
 {
 char scoreLimitName[128];
 char *deMin=NULL,*deMax=NULL;
 if((limitMin || limitMax) && getScoreLimitsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
     {
     if(deMin != NULL && limitMin)
         *limitMin = strtod(deMin,NULL);
     if(deMax != NULL && limitMax)
         *limitMax =strtod(deMax,NULL);
     freeMem(deMin);
     freeMem(deMax);
     }
 if((min || max) && getScoreDefaultsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
     {
     if(deMin != NULL && min)
         *min = strtod(deMin,NULL);
     if(deMax != NULL && max)
         *max =strtod(deMax,NULL);
     freeMem(deMin);
     freeMem(deMax);
     }
 if(max)
     {
     safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MAX);
     deMax = cartOptionalStringClosestToHome(cart, tdb,parentLevel,scoreLimitName);
     if(deMax != NULL)
         *max = strtod(deMax,NULL);
     }
 if(min)
-    {
-    safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MIN); // name is always {filterName}Min
+    {                                                // name is always {filterName}Min
+    safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MIN);
     deMin = cartOptionalStringClosestToHome(cart, tdb,parentLevel,scoreLimitName);
     if(deMin != NULL)
         *min = strtod(deMin,NULL);
     }
-// Defaulting min and max within limits.  Sorry for the horizontal ifs, but stacking the group makes them easier to follow
-if (min && limitMin && (int)(*limitMin) != NO_VALUE && ((int)(*min) == NO_VALUE || *min < *limitMin)) *min = *limitMin;
-if (min && limitMax && (int)(*limitMax) != NO_VALUE &&                             *min > *limitMax)  *min = *limitMax;
-if (max && limitMax && (int)(*limitMax) != NO_VALUE && ((int)(*max) == NO_VALUE || *max > *limitMax)) *max = *limitMax;
-if (max && limitMin && (int)(*limitMin) != NO_VALUE &&                             *max < *limitMin)  *max = *limitMin;
+// Defaulting min and max within limits.  Sorry for the horizontal ifs,
+// but stacking the group makes them easier to follow
+if (min && limitMin
+&& (int)(*limitMin) != NO_VALUE && ((int)(*min) == NO_VALUE || *min < *limitMin)) *min = *limitMin;
+if (min && limitMax
+&& (int)(*limitMax) != NO_VALUE &&                             *min > *limitMax)  *min = *limitMax;
+if (max && limitMax
+&& (int)(*limitMax) != NO_VALUE && ((int)(*max) == NO_VALUE || *max > *limitMax)) *max = *limitMax;
+if (max && limitMin
+&& (int)(*limitMin) != NO_VALUE &&                             *max < *limitMin)  *max = *limitMin;
 }
 
-static boolean showScoreFilter(struct cart *cart, struct trackDb *tdb, boolean *opened, boolean boxed,
-                               boolean parentLevel,char *name, char *title, char *label,
-                               char *scoreName, boolean isFloat)
-/* Shows a score filter control with minimum value and optional range */
+static boolean showScoreFilter(struct cart *cart, struct trackDb *tdb, boolean *opened,
+                               boolean boxed, boolean parentLevel,char *name, char *title,
+                               char *label, char *scoreName, boolean isFloat)
+// Shows a score filter control with minimum value and optional range
 {
 char *setting = trackDbSetting(tdb, scoreName);
 if(setting)
     {
     if(*opened == FALSE)
         {
         boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
         puts("<TABLE>");
         *opened = TRUE;
         }
     printf("<TR><TD align='right'><B>%s:</B><TD align='left'>",label);
     char varName[256];
     char altLabel[256];
     safef(varName, sizeof(varName), "%s%s", scoreName, _BY_RANGE);
     boolean filterByRange = trackDbSettingClosestToHomeOn(tdb, varName);
-    // NOTE: could determine isFloat = (strchr(setting,'.') != NULL);  However, historical trackDb settings of pValueFilter did not always contain '.'
+    // NOTE: could determine isFloat = (strchr(setting,'.') != NULL);
+    //       However, historical trackDb settings of pValueFilter did not always contain '.'
     if (isFloat)
         {
         double minLimit=NO_VALUE,maxLimit=NO_VALUE;
         double minVal=minLimit,maxVal=maxLimit;
         colonPairToDoubles(setting,&minVal,&maxVal);
-        getScoreFloatRangeFromCart(cart,tdb,parentLevel,scoreName,&minLimit,&maxLimit,&minVal,&maxVal);
+        getScoreFloatRangeFromCart(cart,tdb,parentLevel,scoreName,&minLimit,&maxLimit,
+                                                                  &minVal,  &maxVal);
         safef(varName, sizeof(varName), "%s.%s%s", name, scoreName, _MIN);
-        safef(altLabel, sizeof(altLabel), "%s%s", (filterByRange?"Minimum ":""), htmlEncodeText(htmlTextStripTags(label),FALSE));
+        safef(altLabel, sizeof(altLabel), "%s%s", (filterByRange ? "Minimum " : ""),
+              htmlEncodeText(htmlTextStripTags(label),FALSE));
         cgiMakeDoubleVarWithLimits(varName,minVal, altLabel, 0,minLimit, maxLimit);
         if(filterByRange)
             {
             printf("<TD align='left'>to<TD align='left'>");
             safef(varName, sizeof(varName), "%s.%s%s", name, scoreName, _MAX);
             safef(altLabel, sizeof(altLabel), "%s%s", (filterByRange?"Maximum ":""), label);
             cgiMakeDoubleVarWithLimits(varName,maxVal, altLabel, 0,minLimit, maxLimit);
             }
         safef(altLabel, sizeof(altLabel), "%s", (filterByRange?"": "colspan=3"));
         if(minLimit != NO_VALUE && maxLimit != NO_VALUE)
             printf("<TD align='left'%s> (%g to %g)",altLabel,minLimit, maxLimit);
         else if(minLimit != NO_VALUE)
             printf("<TD align='left'%s> (minimum %g)",altLabel,minLimit);
         else if(maxLimit != NO_VALUE)
             printf("<TD align='left'%s> (maximum %g)",altLabel,maxLimit);
         else
             printf("<TD align='left'%s",altLabel);
         }
     else
         {
         int minLimit=NO_VALUE,maxLimit=NO_VALUE;
         int minVal=minLimit,maxVal=maxLimit;
         colonPairToInts(setting,&minVal,&maxVal);
-        getScoreIntRangeFromCart(cart,tdb,parentLevel,scoreName,&minLimit,&maxLimit,&minVal,&maxVal);
+        getScoreIntRangeFromCart(cart,tdb,parentLevel,scoreName,&minLimit,&maxLimit,
+                                                                &minVal,  &maxVal);
         safef(varName, sizeof(varName), "%s.%s%s", name, scoreName, filterByRange ? _MIN:"");
         safef(altLabel, sizeof(altLabel), "%s%s", (filterByRange?"Minimum ":""), label);
         cgiMakeIntVarWithLimits(varName,minVal, altLabel, 0,minLimit, maxLimit);
         if(filterByRange)
             {
             printf("<TD align='left'>to<TD align='left'>");
             safef(varName, sizeof(varName), "%s.%s%s", name, scoreName, _MAX);
             safef(altLabel, sizeof(altLabel), "%s%s", (filterByRange?"Maximum ":""), label);
             cgiMakeIntVarWithLimits(varName,maxVal, altLabel, 0,minLimit, maxLimit);
             }
         safef(altLabel, sizeof(altLabel), "%s", (filterByRange?"": "colspan=3"));
         if(minLimit != NO_VALUE && maxLimit != NO_VALUE)
             printf("<TD align='left'%s> (%d to %d)",altLabel,minLimit, maxLimit);
         else if(minLimit != NO_VALUE)
             printf("<TD align='left'%s> (minimum %d)",altLabel,minLimit);
         else if(maxLimit != NO_VALUE)
             printf("<TD align='left'%s> (maximum %d)",altLabel,maxLimit);
         else
             printf("<TD align='left'%s",altLabel);
         }
     puts("</TR>");
     return TRUE;
     }
 return FALSE;
 }
 
 
-static int numericFiltersShowAll(char *db, struct cart *cart, struct trackDb *tdb, boolean *opened, boolean boxed,
-                               boolean parentLevel,char *name, char *title)
+static int numericFiltersShowAll(char *db, struct cart *cart, struct trackDb *tdb, boolean *opened,
+                                 boolean boxed, boolean parentLevel,char *name, char *title)
 // Shows all *Filter style filters.  Note that these are in random order and have no graceful title
 {
 int count = 0;
 struct slName *filterSettings = trackDbSettingsWildMatch(tdb, "*Filter");
 if (filterSettings)
     {
     puts("<BR>");
     struct slName *filter = NULL;
 #ifdef EXTRA_FIELDS_SUPPORT
     struct extraField *extras = extraFieldsGet(db,tdb);
 #else///ifndef EXTRA_FIELDS_SUPPORT
     struct sqlConnection *conn = hAllocConnTrack(db, tdb);
     struct asObject *as = asForTdb(conn, tdb);
     hFreeConn(&conn);
 #endif///ndef EXTRA_FIELDS_SUPPORT
 
     while ((filter = slPopHead(&filterSettings)) != NULL)
         {
-        if (differentString(filter->name,NO_SCORE_FILTER) && differentString(filter->name,SCORE_FILTER)) // TODO: scoreFilter could be included
+        if (differentString(filter->name,NO_SCORE_FILTER)
+        &&  differentString(filter->name,SCORE_FILTER)) // TODO: scoreFilter could be included
             {
             // Determine floating point or integer
             char *setting = trackDbSetting(tdb, filter->name);
             boolean isFloat = (strchr(setting,'.') != NULL);
 
             char *scoreName = cloneString(filter->name);
             char *field = filter->name;   // No need to clone: will be thrown away at end of cycle
             int ix = strlen(field) - strlen("Filter");
             assert(ix > 0);
             field[ix] = '\0';
 
         #ifdef EXTRA_FIELDS_SUPPORT
             if (extras != NULL)
                 {
                 struct extraField *extra = extraFieldsFind(extras, field);
@@ -5040,147 +5129,152 @@
 if (trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN))
     return TRUE;
 boolean blocked = FALSE;
 struct slName *filterSettings = trackDbSettingsWildMatch(tdb, "*Filter");
 if (filterSettings != NULL)
     {
     boolean one = FALSE;
     struct slName *oneFilter = filterSettings;
     for (;oneFilter != NULL;oneFilter=oneFilter->next)
         {
         if (sameWord(NO_SCORE_FILTER,oneFilter->name))
             {
             blocked = TRUE;
             continue;
             }
-        if (differentString(oneFilter->name,SCORE_FILTER)) // scoreFilter is implicit but could be blocked
-            {
+        if (differentString(oneFilter->name,SCORE_FILTER)) // scoreFilter is implicit
+            {                                              // but could be blocked
             one = TRUE;
             break;
             }
         }
     slNameFreeList(&filterSettings);
     if (one)
         return TRUE;
     }
 if (!blocked)  // scoreFilter is implicit unless NO_SCORE_FILTER
     return TRUE;
 
 return FALSE;
 }
 
 
-void scoreCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title,  int maxScore, boolean boxed)
-/* Put up UI for filtering bed track based on a score */
+void scoreCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title,
+                int maxScore, boolean boxed)
+// Put up UI for filtering bed track based on a score
 {
 char option[256];
 boolean parentLevel = isNameAtParentLevel(tdb,name);
 boolean skipScoreFilter = FALSE;
 boolean bigBed = startsWith("bigBed",tdb->type);
 
 if (!bigBed)  // bigBed filters are limited!
     {
     // Numeric filters are first
     boolean isBoxOpened = FALSE;
     if (numericFiltersShowAll(db, cart, tdb, &isBoxOpened, boxed, parentLevel, name, title) > 0)
         skipScoreFilter = TRUE;
 
     // Add any multi-selects next
     filterBy_t *filterBySet = filterBySetGet(tdb,cart,name);
     if(filterBySet != NULL)
         {
         if(!tdbIsComposite(tdb) && cartOptionalString(cart, "ajax") == NULL)
             jsIncludeFile("hui.js",NULL);
 
-        if (!isBoxOpened)   // Note filterBy boxes are not double "boxed", if there are no other filters
-            printf("<BR>");
+        if (!isBoxOpened)   // Note filterBy boxes are not double "boxed",
+            printf("<BR>"); // if there are no other filters
         filterBySetCfgUi(cart,tdb,filterBySet,TRUE);
         filterBySetFree(&filterBySet);
         skipScoreFilter = TRUE;
         }
 
     // For no good reason scoreFilter is incompatible with filterBy and or numericFilters
-    // FIXME scoreFilter should be implemented inside numericFilters and is currently specificly excluded to avoid unexpected changes
+    // FIXME scoreFilter should be implemented inside numericFilters and is currently specificly
+    //       excluded to avoid unexpected changes
     if (skipScoreFilter)
         {
         if (isBoxOpened)
             cfgEndBox(boxed);
 
         return; // Cannot have both '*filter' and 'scoreFilter'
         }
     }
 
 boolean scoreFilterOk = (trackDbSettingClosestToHome(tdb, NO_SCORE_FILTER) == NULL);
 boolean glvlScoreMin = (trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN) != NULL);
 if (! (scoreFilterOk || glvlScoreMin))
     return;
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 if (scoreFilterOk)
     {
     int minLimit=0,maxLimit=maxScore,minVal=0,maxVal=maxScore;
-    getScoreIntRangeFromCart(cart,tdb,parentLevel,SCORE_FILTER,&minLimit,&maxLimit,&minVal,&maxVal);
+    getScoreIntRangeFromCart(cart,tdb,parentLevel,SCORE_FILTER,&minLimit,&maxLimit,
+                                                               &minVal,  &maxVal);
 
     boolean filterByRange = trackDbSettingClosestToHomeOn(tdb, SCORE_FILTER _BY_RANGE);
     if (!bigBed && filterByRange)
         {
         puts("<B>Filter score range:  min:</B>");
         snprintf(option, sizeof(option), "%s.%s", name,SCORE_FILTER _MIN);
         cgiMakeIntVarWithLimits(option, minVal, "Minimum score",0, minLimit,maxLimit);
         puts("<B>max:</B>");
         snprintf(option, sizeof(option), "%s.%s", name,SCORE_FILTER _MAX);
         cgiMakeIntVarWithLimits(option, maxVal, "Maximum score",0,minLimit,maxLimit);
         printf("(%d to %d)\n",minLimit,maxLimit);
         }
     else
         {
         printf("<b>Show only items with score at or above:</b> ");
         snprintf(option, sizeof(option), "%s.%s", name,SCORE_FILTER);
         cgiMakeIntVarWithLimits(option, minVal, "Minimum score",0, minLimit,maxLimit);
         printf("&nbsp;&nbsp;(range: %d to %d)\n", minLimit, maxLimit);
         if (!boxed)
             printf("<BR>\n");
         }
     if (glvlScoreMin)
         printf("<BR>");
     }
 
 if (glvlScoreMin)
     scoreGrayLevelCfgUi(cart, tdb, name, maxScore);
 
 if (!bigBed)
     {
-    /* filter top-scoring N items in track */
+    // filter top-scoring N items in track
     char *scoreCtString = trackDbSettingClosestToHome(tdb, "filterTopScorers");
     if (scoreCtString != NULL)
         {
-        /* show only top-scoring items. This option only displayed if trackDb
-        * setting exists.  Format:  filterTopScorers <on|off> <count> <table> */
+        // show only top-scoring items. This option only displayed if trackDb
+        // setting exists.  Format:  filterTopScorers <on|off> <count> <table>
         char *words[2];
         char *scoreFilterCt = NULL;
         chopLine(cloneString(scoreCtString), words);
         safef(option, sizeof(option), "%s.filterTopScorersOn", name);
         bool doScoreCtFilter =
-            cartUsualBooleanClosestToHome(cart, tdb, parentLevel, "filterTopScorersOn", sameString(words[0], "on"));
+            cartUsualBooleanClosestToHome(cart, tdb, parentLevel, "filterTopScorersOn",
+                                          sameString(words[0], "on"));
         puts("<P>");
         cgiMakeCheckBox(option, doScoreCtFilter);
         safef(option, sizeof(option), "%s.filterTopScorersCt", name);
-        scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, parentLevel, "filterTopScorersCt", words[1]);
+        scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, parentLevel, "filterTopScorersCt",
+                                                     words[1]);
 
         puts("&nbsp; <B> Show only items in top-scoring </B>");
         cgiMakeIntVarWithLimits(option,atoi(scoreFilterCt),"Top-scoring count",0,1,100000);
-        /* Only check size of table if track does not have subtracks */
+        //* Only check size of table if track does not have subtracks */
         if ( !parentLevel && hTableExists(db, tdb->table))
             printf("&nbsp; (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table));
         else
             printf("&nbsp; (range: 1 to 100,000)\n");
         }
     }
 cfgEndBox(boxed);
 }
 
 // Moved from hgTrackUi for consistency
 static void filterByChromCfgUi(struct cart *cart, struct trackDb *tdb)
 {
 char *filterSetting;
 char filterVar[256];
 char *filterVal = "";
@@ -5200,80 +5294,82 @@
 // initial value of chromosome coloring option is "on", unless
 // overridden by the colorChromDefault setting in the track
 char *colorDefault = trackDbSettingOrDefault(tdb, "colorChromDefault", "on");
 
 printf("<p><b>Color track based on chromosome:</b> ");
 snprintf(colorVar, sizeof(colorVar), "%s.color", tdb->track);
 colorSetting = cartUsualString(cart, colorVar, colorDefault);
 cgiMakeRadioButton(colorVar, "on", sameString(colorSetting, "on"));
 printf(" on ");
 cgiMakeRadioButton(colorVar, "off", sameString(colorSetting, "off"));
 printf(" off ");
 printf("<br><br>");
 filterByChromCfgUi(cart,tdb);
 }
 
-void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
+void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title,
+              boolean boxed)
 /* Put up UI for psl tracks */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 char *typeLine = cloneString(tdb->type);
 char *words[8];
 int wordCount = wordCount = chopLine(typeLine, words);
 if (wordCount == 3 && sameWord(words[1], "xeno"))
     crossSpeciesCfgUi(cart,tdb);
 baseColorDropLists(cart, tdb, name);
 indelShowOptionsWithName(cart, tdb, name);
 cfgEndBox(boxed);
 }
 
 
-void netAlignCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed)
+void netAlignCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title,
+                   boolean boxed)
 /* Put up UI for net tracks */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 boolean parentLevel = isNameAtParentLevel(tdb,prefix);
 
 enum netColorEnum netColor = netFetchColorOption(cart, tdb, parentLevel);
 
 char optString[256];	/*	our option strings here	*/
 safef(optString, ArraySize(optString), "%s.%s", prefix, NET_COLOR );
 printf("<p><b>Color nets by:&nbsp;</b>");
 netColorDropDown(optString, netColorEnumToString(netColor));
 
 #ifdef NOT_YET
 enum netLevelEnum netLevel = netFetchLevelOption(cart, tdb, parentLevel);
 
 safef( optString, ArraySize(optString), "%s.%s", prefix, NET_LEVEL );
 printf("<p><b>Limit display of nets to:&nbsp;</b>");
 netLevelDropDown(optString, netLevelEnumToString(netLevel));
 #endif
 
 cfgEndBox(boxed);
 }
 
-void chainCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed, char *chromosome)
+void chainCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title,
+                boolean boxed, char *chromosome)
 /* Put up UI for chain tracks */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 boolean parentLevel = isNameAtParentLevel(tdb,prefix);
 
-enum chainColorEnum chainColor =
-	chainFetchColorOption(cart, tdb, parentLevel);
+enum chainColorEnum chainColor = chainFetchColorOption(cart, tdb, parentLevel);
 
 /* check if we have normalized scores available */
 boolean normScoreAvailable = chainDbNormScoreAvailable(tdb);
 
 char optString[256];
 if (normScoreAvailable)
     {
     safef(optString, ArraySize(optString), "%s.%s", prefix, OPT_CHROM_COLORS );
     printf("<p><b>Color chains by:&nbsp;</b>");
     chainColorDropDown(optString, chainColorEnumToString(chainColor));
     }
 else
     {
     printf("<p><b>Color track based on chromosome:</b>&nbsp;");
 
@@ -5283,265 +5379,284 @@
     char *binaryColorDefault =
 	    trackDbSettingClosestToHomeOrDefault(tdb, "colorChromDefault", "on");
     /* allow cart to override trackDb setting */
     safef(optString, sizeof(optString), "%s.color", prefix);
     char * colorSetting = cartUsualStringClosestToHome(cart, tdb,
 	parentLevel, "color", binaryColorDefault);
     cgiMakeRadioButton(optString, "on", sameString(colorSetting, "on"));
     printf(" on ");
     cgiMakeRadioButton(optString, "off", sameString(colorSetting, "off"));
     printf(" off ");
     printf("<br>\n");
     }
 
 printf("<p><b>Filter by chromosome (e.g. chr10):</b> ");
 safef(optString, ArraySize(optString), "%s.%s", prefix, OPT_CHROM_FILTER);
-cgiMakeTextVar(optString,
-    cartUsualStringClosestToHome(cart, tdb, parentLevel,
+cgiMakeTextVar(optString, cartUsualStringClosestToHome(cart, tdb, parentLevel,
 	OPT_CHROM_FILTER, ""), 15);
 
 if (normScoreAvailable)
     scoreCfgUi(db, cart,tdb,prefix,NULL,CHAIN_SCORE_MAXIMUM,FALSE);
 
 cfgEndBox(boxed);
 }
 
 struct dyString *dyAddFilterAsInt(struct cart *cart, struct trackDb *tdb,
-       struct dyString *extraWhere,char *filter,char *defaultLimits, char*field, boolean *and)
-/* creates the where clause condition to support numeric int filter range.
-   Filters are expected to follow
-        {fiterName}: trackDb min or min:max - default value(s);
-        {filterName}Min or {filterName}: min (user supplied) cart variable;
-        {filterName}Max: max (user supplied) cart variable;
-        {filterName}Limits: trackDb allowed range "0:1000" Optional
-           uses:{filterName}Min: old trackDb value if {filterName}Limits not found
-                {filterName}Max: old trackDb value if {filterName}Limits not found
-                defaultLimits: function param if no tdb limits settings found)
-   The 'and' param and dyString in/out allows stringing multiple where clauses together */
+                                  struct dyString *extraWhere,char *filter,
+                                  char *defaultLimits, char*field, boolean *and)
+// creates the where clause condition to support numeric int filter range.
+// Filters are expected to follow
+//      {fiterName}: trackDb min or min:max - default value(s);
+//      {filterName}Min or {filterName}: min (user supplied) cart variable;
+//      {filterName}Max: max (user supplied) cart variable;
+//      {filterName}Limits: trackDb allowed range "0:1000" Optional
+//         uses:{filterName}Min: old trackDb value if {filterName}Limits not found
+//              {filterName}Max: old trackDb value if {filterName}Limits not found
+//              defaultLimits: function param if no tdb limits settings found)
+// The 'and' param and dyString in/out allows stringing multiple where clauses together
 {
 char filterLimitName[64];
 if(sameWord(filter,NO_SCORE_FILTER))
     safef(filterLimitName, sizeof(filterLimitName), "%s", NO_SCORE_FILTER);
 else
     safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter,_NO);
 if(trackDbSettingClosestToHome(tdb, filterLimitName) != NULL)
     return extraWhere;
 
 char *setting = NULL;
 if(differentWord(filter,SCORE_FILTER))
     setting = trackDbSettingClosestToHome(tdb, filter);
 else
     setting = trackDbSettingClosestToHomeOrDefault(tdb, filter,"0:1000");
 if(setting || sameWord(filter,NO_SCORE_FILTER))
     {
     boolean invalid = FALSE;
     int minValueTdb = 0,maxValueTdb = NO_VALUE;
     colonPairToInts(setting,&minValueTdb,&maxValueTdb);
     int minLimit=NO_VALUE,maxLimit=NO_VALUE,min=minValueTdb,max=maxValueTdb;
     colonPairToInts(defaultLimits,&minLimit,&maxLimit);
     getScoreIntRangeFromCart(cart,tdb,FALSE,filter,&minLimit,&maxLimit,&min,&max);
     if(minLimit != NO_VALUE || maxLimit != NO_VALUE)
         {
-        // assume tdb default values within range! (don't give user errors that have no consequence)
+        // assume tdb default values within range!
+        // (don't give user errors that have no consequence)
         if((min != minValueTdb && ((minLimit != NO_VALUE && min < minLimit)
                                 || (maxLimit != NO_VALUE && min > maxLimit)))
         || (max != maxValueTdb && ((minLimit != NO_VALUE && max < minLimit)
                                 || (maxLimit != NO_VALUE && max > maxLimit))))
             {
             invalid = TRUE;
             char value[64];
             if(max == NO_VALUE) // min only is allowed, but max only is not
                 safef(value, sizeof(value), "entered minimum (%d)", min);
             else
                 safef(value, sizeof(value), "entered range (min:%d and max:%d)", min, max);
             char limits[64];
             if(minLimit != NO_VALUE && maxLimit != NO_VALUE)
                 safef(limits, sizeof(limits), "violates limits (%d to %d)", minLimit, maxLimit);
             else if(minLimit != NO_VALUE)
                 safef(limits, sizeof(limits), "violates lower limit (%d)", minLimit);
             else //if(maxLimit != NO_VALUE)
                 safef(limits, sizeof(limits), "violates uppper limit (%d)", maxLimit);
             warn("invalid filter by %s: %s %s for track %s", field, value, limits, tdb->track);
             }
         }
     // else no default limits!
     if(invalid)
         {
         safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, (max!=NO_VALUE?_MIN:""));
         cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
         safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MAX);
         cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
         }
-    else if((min != NO_VALUE && (minLimit == NO_VALUE || minLimit != min))  // Assumes min==NO_VALUE or min==minLimit is no filter
-         || (max != NO_VALUE && (maxLimit == NO_VALUE || maxLimit != max))) // Assumes max==NO_VALUE or max==maxLimit is no filter!
+    else if ((min != NO_VALUE && (minLimit == NO_VALUE || minLimit != min))
+         ||  (max != NO_VALUE && (maxLimit == NO_VALUE || maxLimit != max)))
+         // Assumes min==NO_VALUE or min==minLimit is no filter
+         // Assumes max==NO_VALUE or max==maxLimit is no filter!
         {
         if(max == NO_VALUE || (maxLimit != NO_VALUE && maxLimit == max))
             dyStringPrintf(extraWhere, "%s(%s >= %d)", (*and?" and ":""),field,min);  // min only
         else if(min == NO_VALUE || (minLimit != NO_VALUE && minLimit == min))
             dyStringPrintf(extraWhere, "%s(%s <= %d)", (*and?" and ":""),field,max);  // max only
         else
-            dyStringPrintf(extraWhere, "%s(%s BETWEEN %d and %d)", (*and?" and ":""),field,min,max); // both min and max
+            dyStringPrintf(extraWhere, "%s(%s BETWEEN %d and %d)", (*and?" and ":""), // both
+                           field,min,max);
         *and=TRUE;
         }
     }
-    //if(dyStringLen(extraWhere)) warn("SELECT FROM %s WHERE %s",tdb->table,dyStringContents(extraWhere));
+//if (dyStringLen(extraWhere))
+//    warn("SELECT FROM %s WHERE %s",tdb->table,dyStringContents(extraWhere));
 return extraWhere;
 }
 
 struct dyString *dyAddFilterAsDouble(struct cart *cart, struct trackDb *tdb,
-       struct dyString *extraWhere,char *filter,char *defaultLimits, char*field, boolean *and)
-/* creates the where clause condition to support numeric double filters.
-   Filters are expected to follow
-        {fiterName}: trackDb min or min:max - default value(s);
-        {filterName}Min or {filterName}: min (user supplied) cart variable;
-        {filterName}Max: max (user supplied) cart variable;
-        {filterName}Limits: trackDb allowed range "0.0:10.0" Optional
-            uses:  defaultLimits: function param if no tdb limits settings found)
-   The 'and' param and dyString in/out allows stringing multiple where clauses together */
+                                     struct dyString *extraWhere,char *filter,
+                                     char *defaultLimits, char*field, boolean *and)
+// creates the where clause condition to support numeric double filters.
+// Filters are expected to follow
+//      {fiterName}: trackDb min or min:max - default value(s);
+//      {filterName}Min or {filterName}: min (user supplied) cart variable;
+//      {filterName}Max: max (user supplied) cart variable;
+//      {filterName}Limits: trackDb allowed range "0.0:10.0" Optional
+//          uses:  defaultLimits: function param if no tdb limits settings found)
+// The 'and' param and dyString in/out allows stringing multiple where clauses together
 {
 char *setting = trackDbSettingClosestToHome(tdb, filter);
 if(setting)
     {
     boolean invalid = FALSE;
     double minValueTdb = 0,maxValueTdb = NO_VALUE;
     colonPairToDoubles(setting,&minValueTdb,&maxValueTdb);
     double minLimit=NO_VALUE,maxLimit=NO_VALUE,min=minValueTdb,max=maxValueTdb;
     colonPairToDoubles(defaultLimits,&minLimit,&maxLimit);
     getScoreFloatRangeFromCart(cart,tdb,FALSE,filter,&minLimit,&maxLimit,&min,&max);
     if((int)minLimit != NO_VALUE || (int)maxLimit != NO_VALUE)
         {
-        // assume tdb default values within range! (don't give user errors that have no consequence)
+        // assume tdb default values within range!
+        // (don't give user errors that have no consequence)
         if((min != minValueTdb && (((int)minLimit != NO_VALUE && min < minLimit)
                                 || ((int)maxLimit != NO_VALUE && min > maxLimit)))
         || (max != maxValueTdb && (((int)minLimit != NO_VALUE && max < minLimit)
                                 || ((int)maxLimit != NO_VALUE && max > maxLimit))))
             {
             invalid = TRUE;
             char value[64];
             if((int)max == NO_VALUE) // min only is allowed, but max only is not
                 safef(value, sizeof(value), "entered minimum (%g)", min);
             else
                 safef(value, sizeof(value), "entered range (min:%g and max:%g)", min, max);
             char limits[64];
             if((int)minLimit != NO_VALUE && (int)maxLimit != NO_VALUE)
                 safef(limits, sizeof(limits), "violates limits (%g to %g)", minLimit, maxLimit);
             else if((int)minLimit != NO_VALUE)
                 safef(limits, sizeof(limits), "violates lower limit (%g)", minLimit);
             else //if((int)maxLimit != NO_VALUE)
                 safef(limits, sizeof(limits), "violates uppper limit (%g)", maxLimit);
             warn("invalid filter by %s: %s %s for track %s", field, value, limits, tdb->track);
             }
         }
     if(invalid)
         {
         char filterLimitName[64];
         safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MIN);
         cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
         safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MAX);
         cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
         }
-    else if(((int)min != NO_VALUE && ((int)minLimit == NO_VALUE || minLimit != min))  // Assumes min==NO_VALUE or min==minLimit is no filter
-         || ((int)max != NO_VALUE && ((int)maxLimit == NO_VALUE || maxLimit != max))) // Assumes max==NO_VALUE or max==maxLimit is no filter!
+    else if (((int)min != NO_VALUE && ((int)minLimit == NO_VALUE || minLimit != min))
+         ||  ((int)max != NO_VALUE && ((int)maxLimit == NO_VALUE || maxLimit != max)))
+         // Assumes min==NO_VALUE or min==minLimit is no filter
+         // Assumes max==NO_VALUE or max==maxLimit is no filter!
         {
         if((int)max == NO_VALUE || ((int)maxLimit != NO_VALUE && maxLimit == max))
             dyStringPrintf(extraWhere, "%s(%s >= %g)", (*and?" and ":""),field,min);  // min only
         else if((int)min == NO_VALUE || ((int)minLimit != NO_VALUE && minLimit == min))
             dyStringPrintf(extraWhere, "%s(%s <= %g)", (*and?" and ":""),field,max);  // max only
         else
-            dyStringPrintf(extraWhere, "%s(%s BETWEEN %g and %g)", (*and?" and ":""),field,min,max); // both min and max
+            dyStringPrintf(extraWhere, "%s(%s BETWEEN %g and %g)", (*and?" and ":""), // both
+                           field,min,max);
         *and=TRUE;
         }
     }
-    //if(dyStringLen(extraWhere)) warn("SELECT FROM %s WHERE %s",tdb->table,dyStringContents(extraWhere));
+//if (dyStringLen(extraWhere))
+//    warn("SELECT FROM %s WHERE %s",tdb->table,dyStringContents(extraWhere));
 return extraWhere;
 }
 
-struct dyString *dyAddAllScoreFilters(struct cart *cart, struct trackDb *tdb, struct dyString *extraWhere,boolean *and)
-/* creates the where clause condition to gather together all random double filters
-   Filters are expected to follow
-        {fiterName}: trackDb min or min:max - default value(s);
-        {filterName}Min or {filterName}: min (user supplied) cart variable;
-        {filterName}Max: max (user supplied) cart variable;
-        {filterName}Limits: trackDb allowed range "0.0:10.0" Optional
-            uses:  defaultLimits: function param if no tdb limits settings found)
-   The 'and' param and dyString in/out allows stringing multiple where clauses together */
+struct dyString *dyAddAllScoreFilters(struct cart *cart, struct trackDb *tdb,
+                                      struct dyString *extraWhere,boolean *and)
+// creates the where clause condition to gather together all random double filters
+// Filters are expected to follow
+//      {fiterName}: trackDb min or min:max - default value(s);
+//      {filterName}Min or {filterName}: min (user supplied) cart variable;
+//      {filterName}Max: max (user supplied) cart variable;
+//      {filterName}Limits: trackDb allowed range "0.0:10.0" Optional
+//          uses:  defaultLimits: function param if no tdb limits settings found)
+// The 'and' param and dyString in/out allows stringing multiple where clauses together
 {
 struct slName *filterSettings = trackDbSettingsWildMatch(tdb, "*Filter");
 if (filterSettings)
     {
     struct slName *filter = NULL;
     while ((filter = slPopHead(&filterSettings)) != NULL)
         {
-        if (differentString(filter->name,"noScoreFilter") && differentString(filter->name,"scoreFilter")) // TODO: scoreFilter could be included
+        if (differentString(filter->name,"noScoreFilter")
+        &&  differentString(filter->name,"scoreFilter")) // TODO: scoreFilter could be included
             {
             char *field = cloneString(filter->name);
             int ix = strlen(field) - strlen("filter");
             assert(ix > 0);
             field[ix] = '\0';
             char *setting = trackDbSetting(tdb, filter->name);
-            // How to determine float or int ?  If actual tracDb setting has decimal places, then float!
+            // How to determine float or int ?
+            // If actual tracDb setting has decimal places, then float!
             if (strchr(setting,'.') == NULL)
                 extraWhere = dyAddFilterAsInt(cart,tdb,extraWhere,filter->name,"0:1000",field,and);
             else
                 extraWhere = dyAddFilterAsDouble(cart,tdb,extraWhere,filter->name,NULL,field,and);
             }
         slNameFree(&filter);
         }
     }
 return extraWhere;
 }
 
 boolean encodePeakHasCfgUi(struct trackDb *tdb)
 // Confirms that this track has encode Peak cfgUI
 {
 if (sameWord("narrowPeak",tdb->type)
 ||  sameWord("broadPeak", tdb->type)
 ||  sameWord("encodePeak",tdb->type)
 ||  sameWord("gappedPeak",tdb->type))
     {
     return (trackDbSettingClosestToHome(tdb, SCORE_FILTER )
         ||  trackDbSettingClosestToHome(tdb, SIGNAL_FILTER)
         ||  trackDbSettingClosestToHome(tdb, PVALUE_FILTER)
         ||  trackDbSettingClosestToHome(tdb, QVALUE_FILTER)
         ||  trackDbSettingClosestToHome(tdb, SCORE_FILTER ));
     }
     return FALSE;
 }
 
 
-void encodePeakCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
-/* Put up UI for filtering wgEnocde peaks based on score, Pval and Qval */
+void encodePeakCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title,
+                     boolean boxed)
+// Put up UI for filtering wgEnocde peaks based on score, Pval and Qval
 {
 boolean parentLevel = isNameAtParentLevel(tdb,name);
 boolean opened = FALSE;
-showScoreFilter(cart,tdb,&opened,boxed,parentLevel,name,title,"Minimum Signal value",     SIGNAL_FILTER,TRUE);
-showScoreFilter(cart,tdb,&opened,boxed,parentLevel,name,title,"Minimum P-Value (<code>-log<sub>10</sub></code>)",PVALUE_FILTER,TRUE);
-showScoreFilter(cart,tdb,&opened,boxed,parentLevel,name,title,"Minimum Q-Value (<code>-log<sub>10</sub></code>)",QVALUE_FILTER,TRUE);
+showScoreFilter(cart,tdb,&opened,boxed,parentLevel,name,title,
+                "Minimum Signal value",     SIGNAL_FILTER,TRUE);
+showScoreFilter(cart,tdb,&opened,boxed,parentLevel,name,title,
+                "Minimum P-Value (<code>-log<sub>10</sub></code>)",PVALUE_FILTER,TRUE);
+showScoreFilter(cart,tdb,&opened,boxed,parentLevel,name,title,
+                "Minimum Q-Value (<code>-log<sub>10</sub></code>)",QVALUE_FILTER,TRUE);
 
 char *setting = trackDbSettingClosestToHomeOrDefault(tdb, SCORE_FILTER,NULL);//"0:1000");
 if(setting)
     {
     if(!opened)
         {
         boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
         puts("<TABLE>");
         opened = TRUE;
         }
     char varName[256];
     int minLimit=0,maxLimit=1000,minVal=0,maxVal=NO_VALUE;
     colonPairToInts(setting,&minVal,&maxVal);
-    getScoreIntRangeFromCart(cart,tdb,parentLevel,SCORE_FILTER,&minLimit,&maxLimit,&minVal,&maxVal);
+    getScoreIntRangeFromCart(cart,tdb,parentLevel,SCORE_FILTER,&minLimit,&maxLimit,
+                                                               &minVal,  &maxVal);
     if(maxVal != NO_VALUE)
         puts("<TR><TD align='right'><B>Score range: min:</B><TD align='left'>");
     else
         puts("<TR><TD align='right'><B>Minimum score:</B><TD align='left'>");
     safef(varName, sizeof(varName), "%s%s", SCORE_FILTER, _BY_RANGE);
     boolean filterByRange = trackDbSettingClosestToHomeOn(tdb, varName);
     safef(varName, sizeof(varName), "%s.%s%s", name, SCORE_FILTER, (filterByRange?_MIN:""));
     cgiMakeIntVarWithLimits(varName, minVal, "Minimum score", 0, minLimit, maxLimit);
     if(filterByRange)
         {
         if(maxVal == NO_VALUE)
             maxVal = maxLimit;
         puts("<TD align='right'>to<TD align='left'>");
         safef(varName, sizeof(varName), "%s.%s%s", name, SCORE_FILTER,_MAX);
         cgiMakeIntVarWithLimits(varName, maxVal, "Maximum score", 0, minLimit, maxLimit);
@@ -5559,56 +5674,58 @@
     puts("</TABLE>");
     cfgEndBox(boxed);
     }
 }
 
 void genePredCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
 /* Put up gencode-specific controls */
 {
 char varName[64];
 boolean parentLevel = isNameAtParentLevel(tdb,name);
 char *geneLabel = cartUsualStringClosestToHome(cart, tdb,parentLevel, "label", "gene");
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 if (sameString(name, "acembly"))
     {
-    char *acemblyClass = cartUsualStringClosestToHome(cart,tdb,parentLevel,"type", acemblyEnumToString(0));
+    char *acemblyClass = cartUsualStringClosestToHome(cart,tdb,parentLevel,"type",
+                                                      acemblyEnumToString(0));
     printf("<p><b>Gene Class: </b>");
     acemblyDropDown("acembly.type", acemblyClass);
     printf("  ");
     }
 else if(startsWith("wgEncodeGencode", name)
      || sameString("wgEncodeSangerGencode", name)
      || (startsWith("encodeGencode", name) && !sameString("encodeGencodeRaceFrags", name)))
     {
     printf("<B>Label:</B> ");
     safef(varName, sizeof(varName), "%s.label", name);
     cgiMakeRadioButton(varName, "gene", sameString("gene", geneLabel));
     printf("%s ", "gene");
     cgiMakeRadioButton(varName, "accession", sameString("accession", geneLabel));
     printf("%s ", "accession");
     cgiMakeRadioButton(varName, "both", sameString("both", geneLabel));
     printf("%s ", "both");
     cgiMakeRadioButton(varName, "none", sameString("none", geneLabel));
     printf("%s ", "none");
     }
 
 if(trackDbSettingClosestToHomeOn(tdb, "nmdFilter"))
     {
     boolean nmdDefault = FALSE;
     safef(varName, sizeof(varName), "hgt.%s.nmdFilter", name);
-    nmdDefault = cartUsualBoolean(cart,varName, FALSE);  // TODO: var name (hgt prefix) needs changing before ClosesToHome can be used
+    nmdDefault = cartUsualBoolean(cart,varName, FALSE);
+    // TODO: var name (hgt prefix) needs changing before ClosesToHome can be used
     printf("<p><b>Filter out NMD targets.</b>");
     cgiMakeCheckBox(varName, nmdDefault);
     }
 
 if(!sameString(tdb->track, "tigrGeneIndex")
 && !sameString(tdb->track, "ensGeneNonCoding")
 && !sameString(tdb->track, "encodeGencodeRaceFrags"))
     baseColorDropLists(cart, tdb, name);
 
 filterBy_t *filterBySet = filterBySetGet(tdb,cart,name);
 if(filterBySet != NULL)
     {
     printf("<BR>");
     filterBySetCfgUi(cart,tdb,filterBySet,FALSE);
     filterBySetFree(&filterBySet);
@@ -5620,31 +5737,32 @@
 static boolean isSpeciesOn(struct cart *cart, struct trackDb *tdb, char *species, char *option, int optionSize, boolean defaultState)
 /* check the cart to see if species is turned off or on (default is defaultState) */
 {
 boolean parentLevel = isNameAtParentLevel(tdb,option);
 if (*option == '\0')
     safef(option, optionSize, "%s.%s", tdb->track, species);
 else
     {
     char *suffix = option + strlen(option);
     int suffixSize = optionSize - strlen(option);
     safef(suffix,suffixSize,".%s",species);
     }
 return cartUsualBooleanClosestToHome(cart,tdb, parentLevel, species,defaultState);
 }
 
-char **wigMafGetSpecies(struct cart *cart, struct trackDb *tdb, char *prefix, char *db, struct wigMafSpecies **list, int *groupCt)
+char **wigMafGetSpecies(struct cart *cart, struct trackDb *tdb, char *prefix, char *db,
+                        struct wigMafSpecies **list, int *groupCt)
 {
 int speciesCt = 0;
 char *speciesGroup   = trackDbSetting(tdb, SPECIES_GROUP_VAR);
 char *speciesUseFile = trackDbSetting(tdb, SPECIES_USE_FILE);
 char *speciesOrder   = trackDbSetting(tdb, SPECIES_ORDER_VAR);
 char sGroup[24];
 //Ochar *groups[20];
 struct wigMafSpecies *wmSpecies, *wmSpeciesList = NULL;
 int group;
 int i;
 #define MAX_SP_SIZE 2000
 #define MAX_GROUPS 20
 char *species[MAX_SP_SIZE];
 char option[MAX_SP_SIZE];
 
@@ -5757,45 +5875,48 @@
 
 #define BRANEY_SAYS_USETARG_IS_OBSOLETE
 #ifndef BRANEY_SAYS_USETARG_IS_OBSOLETE
 char *speciesTarget = trackDbSetting(tdb, SPECIES_TARGET_VAR);
 char *speciesTree = trackDbSetting(tdb, SPECIES_TREE_VAR);
 struct phyloTree *tree;
 if ((speciesTree != NULL) && ((tree = phyloParseString(speciesTree)) != NULL))
     {
     char buffer[128];
     char *nodeNames[512];
     int numNodes = 0;
     char *path, *orgName;
     int ii;
 
     safef(buffer, sizeof(buffer), "%s.vis",name);
-    cartMakeRadioButton(cart, buffer,"useTarg", "useTarg");// not closestToHome because BRANEY_SAYS_USETARG_IS_OBSOLETE
+    // not closestToHome because BRANEY_SAYS_USETARG_IS_OBSOLETE
+    cartMakeRadioButton(cart, buffer,"useTarg", "useTarg");
     printf("Show shortest path to target species:  ");
     path = phyloNodeNames(tree);
     numNodes = chopLine(path, nodeNames);
     for(ii=0; ii < numNodes; ii++)
         {
         if ((orgName = hOrganism(nodeNames[ii])) != NULL)
             nodeNames[ii] = orgName;
         nodeNames[ii][0] = toupper(nodeNames[ii][0]);
         }
 
+    // not closestToHome because BRANEY_SAYS_USETARG_IS_OBSOLETE
     cgiMakeDropList(SPECIES_HTML_TARGET, nodeNames, numNodes,
-	cartUsualString(cart, SPECIES_HTML_TARGET, speciesTarget));// not closestToHome because BRANEY_SAYS_USETARG_IS_OBSOLETE
+                    cartUsualString(cart, SPECIES_HTML_TARGET, speciesTarget));
     puts("<br>");
-    cartMakeRadioButton(cart,buffer,"useCheck", "useTarg");   // not closestToHome because BRANEY_SAYS_USETARG_IS_OBSOLETE
+    // not closestToHome because BRANEY_SAYS_USETARG_IS_OBSOLETE
+    cartMakeRadioButton(cart,buffer,"useCheck", "useTarg");
     printf("Show all species checked : ");
     }
 #endif///ndef BRANEY_SAYS_USETARG_IS_OBSOLETE
 
 if (groupCt == 1)
     puts("\n<TABLE><TR>");
 group = -1;
 lineBreakJustPrinted = FALSE;
 for (wmSpecies = wmSpeciesList, i = 0, j = 0; wmSpecies != NULL;
 		    wmSpecies = wmSpecies->next, i++)
     {
     char *label;
     prevGroup = group;
     group = wmSpecies->group;
     if (groupCt != 1 && group != prevGroup)
@@ -5987,32 +6108,32 @@
 
 safef(option, sizeof option, "%s.%s", name, "codons");
 if (framesTable)
     {
     char *nodeNames[512];
     char buffer[128];
 
     printf("<BR><B>Codon Translation:</B><BR>");
     printf("Default species to establish reading frame: ");
     nodeNames[0] = db;
     for (wmSpecies = wmSpeciesList, i = 1; wmSpecies != NULL;
 			wmSpecies = wmSpecies->next, i++)
 	{
 	nodeNames[i] = wmSpecies->name;
 	}
-    cgiMakeDropList(SPECIES_CODON_DEFAULT, nodeNames, i,
-	cartUsualString(cart, SPECIES_CODON_DEFAULT, defaultCodonSpecies)); // tdb independent var
+    cgiMakeDropList(SPECIES_CODON_DEFAULT, nodeNames, i,     // tdb independent var
+                    cartUsualString(cart, SPECIES_CODON_DEFAULT, defaultCodonSpecies));
     puts("<br>");
     char *cartVal = cartUsualStringClosestToHome(cart, tdb, parentLevel, "codons","codonDefault");
     safef(buffer, sizeof(buffer), "%s.codons",name);
     cgiMakeRadioButton(buffer,"codonNone",     sameWord(cartVal,"codonNone"));
     printf("No codon translation<BR>");
     cgiMakeRadioButton(buffer,"codonDefault",  sameWord(cartVal,"codonDefault"));
     printf("Use default species reading frames for translation<BR>");
     cgiMakeRadioButton(buffer,"codonFrameNone",sameWord(cartVal,"codonFrameNone"));
     printf("Use reading frames for species if available, otherwise no translation<BR>");
     cgiMakeRadioButton(buffer,"codonFrameDef", sameWord(cartVal,"codonFrameDef"));
     printf("Use reading frames for species if available, otherwise use default species<BR>");
     }
 else
     {
     /* Codon highlighting does not apply to wigMafProt type */
@@ -6087,32 +6208,32 @@
       } \
     }\""
 
 void bamCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
 /* BAM: short-read-oriented alignment file format. */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 char cartVarName[1024];
 
 printf("<TABLE%s><TR><TD>",boxed?" width='100%'":"");
 char *showNames = cartOrTdbString(cart, tdb, BAM_SHOW_NAMES, "0");
 safef(cartVarName, sizeof(cartVarName), "%s.%s", name, BAM_SHOW_NAMES);
 cgiMakeCheckBox(cartVarName, SETTING_IS_ON(showNames));
 printf("</TD><TD>Display read names</TD>");
 if (boxed && fileExists(hHelpFile("hgBamTrackHelp")))
-    printf("<TD style='text-align:right'><A HREF=\"../goldenPath/help/hgBamTrackHelp.html\" TARGET=_BLANK>BAM "
-           "configuration help</A></TD>");
+    printf("<TD style='text-align:right'><A HREF=\"../goldenPath/help/hgBamTrackHelp.html\" "
+           "TARGET=_BLANK>BAM configuration help</A></TD>");
 printf("</TR>\n");
 boolean canPair = (cartOrTdbString(cart, tdb, BAM_PAIR_ENDS_BY_NAME, NULL) != NULL);
 if (canPair)
     {
     char *doPairing = cartOrTdbString(cart, tdb, BAM_PAIR_ENDS_BY_NAME, "0");
     printf("<TR><TD>");
     safef(cartVarName, sizeof(cartVarName), "%s." BAM_PAIR_ENDS_BY_NAME, name);
     cgiMakeCheckBox(cartVarName, SETTING_IS_ON(doPairing));
     printf("</TD><TD>Attempt to join paired end reads by name</TD></TR>\n");
     }
 printf("<TR><TD colspan=2>Minimum alignment quality:\n");
 safef(cartVarName, sizeof(cartVarName), "%s." BAM_MIN_ALI_QUAL, name);
 cgiMakeIntVar(cartVarName,
 	      atoi(cartOrTdbString(cart, tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT)), 4);
 printf("</TD></TR></TABLE>");
@@ -6178,237 +6299,245 @@
     char *viewSetting = trackDbSetting(tdb, "view");
     if (sameOk(viewSetting, view) || sameOk(tagEncode(viewSetting), view))
         return tdb;
     }
 for (tdb = forest; tdb != NULL; tdb = tdb->next)
     {
     struct trackDb *viewTdb = rFindView(tdb->subtracks, view);
     if (viewTdb != NULL)
         return viewTdb;
     }
 return NULL;
 }
 
 static boolean compositeViewCfgExpandedByDefault(struct trackDb *parentTdb,char *view,
 	char **retVisibility)
-/* returns true if the view cfg is expanded by default.  Optionally allocates string of view
- * setting (eg 'dense') */
+// returns true if the view cfg is expanded by default.  Optionally allocates string of view
+// setting (eg 'dense')
 {
 boolean expanded = FALSE;
 if ( retVisibility != NULL )
     *retVisibility = cloneString(hStringFromTv(parentTdb->visibility));
 struct trackDb *viewTdb = rFindView(parentTdb->subtracks, view);
 if (viewTdb == NULL)
     return FALSE;
 if (retVisibility != NULL)
     *retVisibility = cloneString(hStringFromTv(viewTdb->visibility));
 if (trackDbSetting(viewTdb, "viewUi"))
     expanded = TRUE;
 return expanded;
 }
 
 enum trackVisibility visCompositeViewDefault(struct trackDb *parentTdb,char *view)
-/* returns the default track visibility of particular view within a composite track */
+// returns the default track visibility of particular view within a composite track
 {
 char *visibility = NULL;
 compositeViewCfgExpandedByDefault(parentTdb,view,&visibility);
 enum trackVisibility vis = hTvFromString(visibility);
 freeMem(visibility);
 return vis;
 }
 
 static boolean hCompositeDisplayViewDropDowns(char *db, struct cart *cart, struct trackDb *parentTdb)
-/* UI for composite view drop down selections. */
+// UI for composite view drop down selections.
 {
 int ix;
 char varName[SMALLBUF];
 char classes[SMALLBUF];
 char javascript[JBUFSIZE];
-#define CFG_LINK  "<B><A HREF=\"#a_cfg_%s\" onclick=\"return (showConfigControls('%s') == false);\" title=\"%s Configuration\">%s</A><INPUT TYPE=HIDDEN NAME='%s.showCfg' value='%s'></B>"
-#define MAKE_CFG_LINK(name,title,viewTrack,open) printf(CFG_LINK, (name),(name),(title),(title),(viewTrack),((open)?"on":"off"))
+#define CFG_LINK  "<B><A HREF=\"#a_cfg_%s\" onclick=\"return (showConfigControls('%s') == " \
+                  "false);\" title=\"%s Configuration\">%s</A><INPUT TYPE=HIDDEN " \
+                  "NAME='%s.showCfg' value='%s'></B>"
+#define MAKE_CFG_LINK(name,title,viewTrack,open) \
+                    printf(CFG_LINK, (name),(name),(title),(title),(viewTrack),((open)?"on":"off"))
 
-membersForAll_t *membersForAll = membersForAllSubGroupsGet(parentTdb, cart); // membersForAll is generated once per track, then cached
+// membersForAll is generated once per track, then cached
+membersForAll_t *membersForAll = membersForAllSubGroupsGet(parentTdb, cart);
 members_t *membersOfView = membersForAll->members[dimV];
 if(membersOfView == NULL)
     return FALSE;
 
 char configurable[membersOfView->count];
 memset(configurable,cfgNone,sizeof(configurable));
 int firstOpened = -1;
 boolean makeCfgRows = FALSE;
 struct trackDb **matchedViewTracks = needMem(sizeof(struct trackDb *) * membersOfView->count);
 
 for (ix = 0; ix < membersOfView->count; ix++)
     {
     if (membersOfView->subtrackList     != NULL
     &&  membersOfView->subtrackList[ix] != NULL)
         {
         struct trackDb *subtrack = membersOfView->subtrackList[ix]->val;
         matchedViewTracks[ix] = subtrack->parent;
         configurable[ix] = (char)cfgTypeFromTdb(subtrack, TRUE);
         if (configurable[ix] != cfgNone && trackDbSettingBlocksConfiguration(subtrack,FALSE))
             configurable[ix]  = cfgNone;
 
         if(configurable[ix] != cfgNone)
             {
             if(firstOpened == -1)
                 {
                 safef(varName, sizeof(varName), "%s.showCfg", matchedViewTracks[ix]->track);
-                if(cartUsualBoolean(cart,varName,FALSE)) // No need for closestToHome: view level input
+                if (cartUsualBoolean(cart,varName,FALSE)) // No need for closestToHome: view level
                     firstOpened = ix;
                 }
             makeCfgRows = TRUE;
             }
         }
     }
 
 toLowerN(membersOfView->groupTitle, 1);
-printf("<B>Select %s</B> (<A HREF='../goldenPath/help/multiView.html' title='Help on views' TARGET=_BLANK>help</A>):\n", membersOfView->groupTitle);
+printf("<B>Select %s</B> (<A HREF='../goldenPath/help/multiView.html' title='Help on views' "
+       "TARGET=_BLANK>help</A>):\n", membersOfView->groupTitle);
 printf("<TABLE><TR style='text-align:left;'>\n");
 // Make row of vis drop downs
 for (ix = 0; ix < membersOfView->count; ix++)
     {
     char *viewName = membersOfView->tags[ix];
     if (matchedViewTracks[ix] != NULL)
         {
         printf("<TD>");
         if(configurable[ix] != cfgNone)
             {
-            MAKE_CFG_LINK(membersOfView->tags[ix],membersOfView->titles[ix],matchedViewTracks[ix]->track,(firstOpened == ix));
+            MAKE_CFG_LINK(membersOfView->tags[ix],membersOfView->titles[ix],
+                          matchedViewTracks[ix]->track,(firstOpened == ix));
             }
         else
             printf("<B>%s</B>",membersOfView->titles[ix]);
         puts("</TD>");
 
-    #ifdef SUBTRACK_CFG
         safef(varName, sizeof(varName), "%s", matchedViewTracks[ix]->track);
-    #else///ifndef SUBTRACK_CFG
-        safef(varName, sizeof(varName), "%s.%s.vis", parentTdb->track, viewName);  // FIXME: Time to get rid of "track.view.vis" since viewInTheMiddle
-    #endif///ndef SUBTRACK_CFG
-        enum trackVisibility tv =
-            hTvFromString(cartUsualString(cart, varName,hStringFromTv(visCompositeViewDefault(parentTdb,viewName))));
+        enum trackVisibility tv = hTvFromString(cartUsualString(cart,varName,
+                                      hStringFromTv(visCompositeViewDefault(parentTdb,viewName))));
 
-        safef(javascript, sizeof(javascript), "onchange=\"matSelectViewForSubTracks(this,'%s');\" onfocus='this.lastIndex=this.selectedIndex;'", viewName);
+        safef(javascript, sizeof(javascript), "onchange=\"matSelectViewForSubTracks(this,'%s');\" "
+                                              "onfocus='this.lastIndex=this.selectedIndex;'",
+                                              viewName);
 
         printf("<TD>");
         safef(classes, sizeof(classes), "viewDD normalText %s", membersOfView->tags[ix]);
         hTvDropDownClassWithJavascript(varName, tv, parentTdb->canPack,classes,javascript);
         puts(" &nbsp; &nbsp; &nbsp;</TD>");
         }
     }
 puts("</TR>");
 
 // Make row of cfg boxes if needed
 if(makeCfgRows)
     {
     puts("</TABLE><TABLE>");
     for (ix = 0; ix < membersOfView->count; ix++)
         {
         struct trackDb *view = matchedViewTracks[ix];
         if (view != NULL)
             {
             char *viewName = membersOfView->tags[ix];
             printf("<TR id=\"tr_cfg_%s\"", viewName);
-            if((firstOpened == -1 && !compositeViewCfgExpandedByDefault(parentTdb,membersOfView->tags[ix],NULL))
+            if ((   firstOpened == -1
+                 && !compositeViewCfgExpandedByDefault(parentTdb,membersOfView->tags[ix],NULL))
                 || (firstOpened != -1 && firstOpened != ix))
                 printf(" style=\"display:none\"");
             printf("><TD width=10>&nbsp;</TD>");
             int ix2=ix;
             while(0 < ix2--)
                 printf("<TD width=100>&nbsp;</TD>");
             printf("<TD colspan=%d>",membersOfView->count+1);
             if(configurable[ix] != cfgNone)
                 {                                  // Hint: subtrack is model but named for view
                 cfgByCfgType(configurable[ix],db,cart,view->subtracks,view->track,
                         membersOfView->titles[ix],TRUE);
-            #ifndef SUBTRACK_CFG
-                cfgLinkToDependentCfgs(cart,parentTdb,view->track);
-            #endif///ndef SUBTRACK_CFG
                 }
             }
         }
     }
 puts("</TABLE>");
 freeMem(matchedViewTracks);
 return TRUE;
 }
 
 char *compositeLabelWithVocabLink(char *db,struct trackDb *parentTdb, struct trackDb *childTdb,
 	char *vocabType, char *label)
-/* If the parentTdb has a controlledVocabulary setting and the vocabType is found,
-   then label will be wrapped with the link to display it.  Return string is cloned. */
+// If the parentTdb has a controlledVocabulary setting and the vocabType is found,
+// then label will be wrapped with the link to display it.  Return string is cloned.
 {
 char *vocab = trackDbSetting(parentTdb, "controlledVocabulary");
 (void)metadataForTable(db,childTdb,NULL);
 if(vocab == NULL)
     return cloneString(label); // No wrapping!
 
 char *words[15];
 int count,ix;
 boolean found=FALSE;
 if((count = chopByWhite(cloneString(vocab), words,15)) <= 1)
     return cloneString(label);
 
 char *suffix=NULL;
 char *rootLabel = labelRoot(label,&suffix);
 
 for(ix=1;ix<count && !found;ix++)
     {
-    if(sameString(vocabType,words[ix])) // controlledVocabulary setting matches tag so all labels are linked
-        {
+    if (sameString(vocabType,words[ix])) // controlledVocabulary setting matches tag
+        {                               // so all labels are linked
         char *link = controlledVocabLink(words[0],"term",words[ix],rootLabel,rootLabel,suffix);
         return link;
         }
-    else if(countChars(words[ix],'=') == 1 && childTdb != NULL) // The name of a trackDb setting follows and will be the controlled vocab term
+    else if (countChars(words[ix],'=') == 1 && childTdb != NULL)
+            // The name of a trackDb setting follows and will be the controlled vocab term
         {
         strSwapChar(words[ix],'=',0);
         if(sameString(vocabType,words[ix]))  // tags match, but search for term
             {
             char * cvSetting = words[ix] + strlen(words[ix]) + 1;
             const char * cvTerm = metadataFindValue(childTdb,cvSetting);
             if(cvTerm != NULL)
                 {
-                char *link = controlledVocabLink(words[0],(sameWord(cvSetting,"antibody")?"target":"term"),(char *)cvTerm,(char *)cvTerm,rootLabel,suffix);
+                char *link = controlledVocabLink(words[0],(sameWord(cvSetting,"antibody") ?
+                                                                                "target" : "term"),
+                                                 (char *)cvTerm,(char *)cvTerm,rootLabel,suffix);
                 return link;
                 }
             }
         }
     }
 freeMem(words[0]);
 freeMem(rootLabel);
 return cloneString(label);
 }
 
 #ifdef BUTTONS_BY_CSS
 #define BUTTON_MAT "<span class='pmButton' onclick=\"matSetMatrixCheckBoxes(%s%s%s%s)\">%c</span>"
 #else///ifndef BUTTONS_BY_CSS
-#define PM_BUTTON_UC "<IMG height=18 width=18 onclick=\"return (matSetMatrixCheckBoxes(%s%s%s%s%s%s) == false);\" id='btn_%s' src='../images/%s'>"
+#define PM_BUTTON_UC "<IMG height=18 width=18 onclick=\"return " \
+                     "(matSetMatrixCheckBoxes(%s%s%s%s%s%s) == false);\" id='btn_%s' " \
+                     "src='../images/%s'>"
 #endif///def BUTTONS_BY_CSS
 
 #define MATRIX_RIGHT_BUTTONS_AFTER 8
 #define MATRIX_BOTTOM_BUTTONS_AFTER 20
 
 static void buttonsForAll()
 {
 #ifdef BUTTONS_BY_CSS
 printf(BUTTON_MAT,"true", "", "", "", '+');
 printf(BUTTON_MAT,"false","", "", "", '-');
 #else///ifndef BUTTONS_BY_CSS
 printf(PM_BUTTON_UC,"true", "", "", "", "", "",  "plus_all",    "add_sm.gif");
 printf(PM_BUTTON_UC,"false","", "", "", "", "", "minus_all", "remove_sm.gif");
 #endif///def BUTTONS_BY_CSS
 }
+
 static void buttonsForOne(char *name,char *class,boolean vertical)
 {
 #ifdef BUTTONS_BY_CSS
 printf(BUTTON_MAT, "true",  ",'", class, "'", '+');
 if (vertical)
     puts("<BR>");
 printf(BUTTON_MAT, "false", ",'", class, "'", '-');
 #else///ifndef BUTTONS_BY_CSS
 printf(PM_BUTTON_UC, "true",  ",'", class, "'", "", "", name,    "add_sm.gif");
 if (vertical)
     puts("<BR>");
 printf(PM_BUTTON_UC, "false", ",'", class, "'", "", "", name, "remove_sm.gif");
 #endif///def BUTTONS_BY_CSS
 }
 
@@ -6417,488 +6546,537 @@
 // Returns non-zero if the matrix will be squeezed.  Non-zero is actually squeezedLabelHeight
 {
 char *browserVersion;
 if (btIE == cgiClientBrowser(&browserVersion, NULL, NULL) && *browserVersion < '9')
     return 0;
 
 members_t *dimensionX = membersForAll->members[dimX];
 members_t *dimensionY = membersForAll->members[dimY];
 if(dimensionX && dimensionY)
     {
     if(dimensionX->count>MATRIX_SQUEEZE)
         {
         int ixX,cntX=0;
         for (ixX = 0; ixX < dimensionX->count; ixX++)
             {
-            if(dimensionX->subtrackList && dimensionX->subtrackList[ixX] && dimensionX->subtrackList[ixX]->val)
+            if (dimensionX->subtrackList
+            &&  dimensionX->subtrackList[ixX]
+            &&  dimensionX->subtrackList[ixX]->val)
                 cntX++;
             }
         if(cntX>MATRIX_SQUEEZE)
             return TRUE;
         }
     }
 return FALSE;
 }
 
-static void matrixXheadingsRow1(char *db,struct trackDb *parentTdb,boolean squeeze, membersForAll_t* membersForAll,boolean top)
-/* prints the top row of a matrix: 'All' buttons; X titles; buttons 'All' */
+static void matrixXheadingsRow1(char *db,struct trackDb *parentTdb,boolean squeeze,
+                                membersForAll_t* membersForAll,boolean top)
+// prints the top row of a matrix: 'All' buttons; X titles; buttons 'All'
 {
 members_t *dimensionX = membersForAll->members[dimX];
 members_t *dimensionY = membersForAll->members[dimY];
 
 printf("<TR ALIGN=CENTER valign=%s>\n",top?"BOTTOM":"TOP");
 if(dimensionX && dimensionY)
     {
     printf("<TH ALIGN=LEFT valign=%s>",top?"TOP":"BOTTOM");
     //printf("<TH ALIGN=LEFT valign=%s>",(top == squeeze)?"BOTTOM":"TOP");//"TOP":"BOTTOM");
     buttonsForAll();
     puts("&nbsp;All</TH>");
     }
 
 // If there is an X dimension, then titles go across the top
 if(dimensionX)
     {
     int ixX,cntX=0;
     if(dimensionY)
         {
         if(squeeze)
             printf("<TH align=RIGHT><div class='%s'><B><EM>%s</EM></B></div></TH>",
                    (top?"up45":"dn45"), dimensionX->groupTitle);
         else
             printf("<TH align=RIGHT><B><EM>%s</EM></B></TH>", dimensionX->groupTitle);
         }
     else
-        printf("<TH ALIGN=RIGHT valign=%s>&nbsp;&nbsp;<B><EM>%s</EM></B></TH>",(top?"TOP":"BOTTOM"), dimensionX->groupTitle);
+        printf("<TH ALIGN=RIGHT valign=%s>&nbsp;&nbsp;<B><EM>%s</EM></B></TH>",
+               (top ? "TOP" : "BOTTOM"), dimensionX->groupTitle);
 
     for (ixX = 0; ixX < dimensionX->count; ixX++)
         {
-        if(dimensionX->subtrackList && dimensionX->subtrackList[ixX] && dimensionX->subtrackList[ixX]->val)
+        if (dimensionX->subtrackList
+        &&  dimensionX->subtrackList[ixX]
+        &&  dimensionX->subtrackList[ixX]->val)
             {
             if(dimensionY && squeeze)
-                {
-                strSwapStrs(dimensionX->titles[ixX],strlen(dimensionX->titles[ixX]),"<BR>"," "); // Breaks must be removed!
-                printf("<TH nowrap='' class='%s'><div class='%s'>%s</div></TH>\n",dimensionX->tags[ixX],(top?"up45":"dn45"),
-                       compositeLabelWithVocabLink(db,parentTdb,dimensionX->subtrackList[ixX]->val,dimensionX->groupTag,dimensionX->titles[ixX]));
+                {                                                       // Breaks must be removed!
+                strSwapStrs(dimensionX->titles[ixX],strlen(dimensionX->titles[ixX]),"<BR>"," ");
+                printf("<TH nowrap='' class='%s'><div class='%s'>%s</div></TH>\n",
+                       dimensionX->tags[ixX],(top?"up45":"dn45"),
+                       compositeLabelWithVocabLink(db,parentTdb,dimensionX->subtrackList[ixX]->val,
+                                                   dimensionX->groupTag,dimensionX->titles[ixX]));
                 }
             else
                 {
                 char *label =replaceChars(dimensionX->titles[ixX]," (","<BR>(");
-                printf("<TH WIDTH='60' class='matCell %s all'>&nbsp;%s&nbsp;</TH>",dimensionX->tags[ixX],
-                       compositeLabelWithVocabLink(db,parentTdb,dimensionX->subtrackList[ixX]->val,dimensionX->groupTag,label));
+                printf("<TH WIDTH='60' class='matCell %s all'>&nbsp;%s&nbsp;</TH>",
+                       dimensionX->tags[ixX],
+                       compositeLabelWithVocabLink(db,parentTdb,dimensionX->subtrackList[ixX]->val,
+                                                   dimensionX->groupTag,label));
                 freeMem(label);
                 }
             cntX++;
             }
         }
     // If dimension is big enough, then add Y buttons to right as well
     if(cntX>MATRIX_RIGHT_BUTTONS_AFTER)
         {
         if(dimensionY)
             {
             if(squeeze)
                 printf("<TH align=LEFT><div class='%s'><B><EM>%s</EM></B></div></TH>",
                     (top?"up45":"dn45"), dimensionX->groupTitle);
             else
                 printf("<TH align=LEFT><B><EM>%s</EM></B></TH>", dimensionX->groupTitle);
             printf("<TH ALIGN=RIGHT valign=%s>All&nbsp;",top?"TOP":"BOTTOM");
-            //printf("<TH ALIGN=RIGHT valign=%s>All&nbsp;",(top == squeeze)?"BOTTOM":"TOP");//"TOP":"BOTTOM");
             buttonsForAll();
             puts("</TH>");
             }
         else
-            printf("<TH ALIGN=LEFT valign=%s><B><EM>%s</EM></B>&nbsp;&nbsp;</TH>",top?"TOP":"BOTTOM", dimensionX->groupTitle);
+            printf("<TH ALIGN=LEFT valign=%s><B><EM>%s</EM></B>&nbsp;&nbsp;</TH>",
+                   top ? "TOP" : "BOTTOM", dimensionX->groupTitle);
         }
     }
 else if(dimensionY)
     {
     printf("<TH ALIGN=RIGHT WIDTH=100 nowrap>");
     printf("<B><EM>%s</EM></B>", dimensionY->groupTitle);
     printf("</TH><TH ALIGN=CENTER WIDTH=60>");
     buttonsForAll();
     puts("</TH>");
     }
 puts("</TR>\n");
 }
 
-static void matrixXheadingsRow2(struct trackDb *parentTdb, boolean squeeze, membersForAll_t* membersForAll)
-/* prints the 2nd row of a matrix: Y title; X buttons; title Y */
+static void matrixXheadingsRow2(struct trackDb *parentTdb, boolean squeeze,
+                                membersForAll_t* membersForAll)
+// prints the 2nd row of a matrix: Y title; X buttons; title Y
 {
 members_t *dimensionX = membersForAll->members[dimX];
 members_t *dimensionY = membersForAll->members[dimY];
 
 // If there are both X and Y dimensions, then there is a row of buttons in X
 if(dimensionX && dimensionY)
     {
     int ixX,cntX=0;
-    printf("<TR ALIGN=CENTER><TH ALIGN=CENTER colspan=2><B><EM>%s</EM></B></TH>",dimensionY->groupTitle);
+    printf("<TR ALIGN=CENTER><TH ALIGN=CENTER colspan=2><B><EM>%s</EM></B></TH>",
+           dimensionY->groupTitle);
     for (ixX = 0; ixX < dimensionX->count; ixX++)    // Special row of +- +- +-
         {
-        if(dimensionX->subtrackList && dimensionX->subtrackList[ixX] && dimensionX->subtrackList[ixX]->val)
+        if (dimensionX->subtrackList
+        &&  dimensionX->subtrackList[ixX]
+        &&  dimensionX->subtrackList[ixX]->val)
             {
             char objName[SMALLBUF];
             printf("<TD nowrap class='matCell %s all'>\n",dimensionX->tags[ixX]);
             safef(objName, sizeof(objName), "plus_%s_all", dimensionX->tags[ixX]);
             buttonsForOne( objName, dimensionX->tags[ixX], squeeze );
             puts("</TD>");
             cntX++;
             }
         }
     // If dimension is big enough, then add Y buttons to right as well
     if(cntX>MATRIX_RIGHT_BUTTONS_AFTER)
         printf("<TH ALIGN=CENTER colspan=2><B><EM>%s</EM></B></TH>", dimensionY->groupTitle);
     puts("</TR>\n");
     }
 }
 
-static boolean matrixXheadings(char *db,struct trackDb *parentTdb, membersForAll_t* membersForAll,boolean top)
-/* UI for X headings in matrix */
+static boolean matrixXheadings(char *db,struct trackDb *parentTdb, membersForAll_t* membersForAll,
+                               boolean top)
+// UI for X headings in matrix
 {
 boolean squeeze = matrixSqueeze(membersForAll);
 
 if(top)
     matrixXheadingsRow1(db,parentTdb,squeeze,membersForAll,top);
 
     matrixXheadingsRow2(parentTdb,squeeze,membersForAll);
 
 if(!top)
     matrixXheadingsRow1(db,parentTdb,squeeze,membersForAll,top);
 
 return squeeze;
 }
 
-static void matrixYheadings(char *db,struct trackDb *parentTdb, membersForAll_t* membersForAll,int ixY,boolean left)
-/* prints the column of Y labels and buttons */
+static void matrixYheadings(char *db,struct trackDb *parentTdb, membersForAll_t* membersForAll,
+                            int ixY,boolean left)
+// prints the column of Y labels and buttons
 {
 members_t *dimensionX = membersForAll->members[dimX];
 members_t *dimensionY = membersForAll->members[dimY];
 
 struct trackDb *childTdb = NULL;
-if(dimensionY && dimensionY->subtrackList && dimensionY->subtrackList[ixY] && dimensionY->subtrackList[ixY]->val)
+if (dimensionY
+&&  dimensionY->subtrackList
+&&  dimensionY->subtrackList[ixY]
+&&  dimensionY->subtrackList[ixY]->val)
     childTdb = dimensionY->subtrackList[ixY]->val;
 
 if(dimensionX && dimensionY && childTdb != NULL) // Both X and Y, then column of buttons
     {
     char objName[SMALLBUF];
-    printf("<TH class='matCell all %s' ALIGN=%s nowrap colspan=2>",dimensionY->tags[ixY],left?"RIGHT":"LEFT");
+    printf("<TH class='matCell all %s' ALIGN=%s nowrap colspan=2>",
+           dimensionY->tags[ixY],left?"RIGHT":"LEFT");
     if(left)
-        printf("%s&nbsp;",compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,dimensionY->titles[ixY]));
+        printf("%s&nbsp;",compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,
+                                                      dimensionY->titles[ixY]));
     safef(objName, sizeof(objName), "plus_all_%s", dimensionY->tags[ixY]);
     buttonsForOne( objName, dimensionY->tags[ixY], FALSE );
     if(!left)
-        printf("&nbsp;%s",compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,dimensionY->titles[ixY]));
+        printf("&nbsp;%s",compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,
+                                                      dimensionY->titles[ixY]));
     puts("</TH>");
     }
 else if (dimensionX)
     {
     printf("<TH ALIGN=%s>",left?"RIGHT":"LEFT");
     buttonsForAll();
     puts("</TH>");
     }
 else if (left && dimensionY && childTdb != NULL)
     printf("<TH class='matCell all %s' ALIGN=RIGHT nowrap>%s</TH>\n",dimensionY->tags[ixY],
-           compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,dimensionY->titles[ixY]));
+           compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,
+                                       dimensionY->titles[ixY]));
 }
 
-static int displayABCdimensions(char *db,struct cart *cart, struct trackDb *parentTdb, struct slRef *subtrackRefList, membersForAll_t* membersForAll)
-/* This will walk through all declared nonX&Y dimensions (X and Y is the 2D matrix of CBs.
-   NOTE: ABC dims are only supported if there are X & Y both.  Also expected number should be passed in */
+static int displayABCdimensions(char *db,struct cart *cart, struct trackDb *parentTdb,
+                                struct slRef *subtrackRefList, membersForAll_t* membersForAll)
+// This will walk through all declared nonX&Y dimensions (X and Y is the 2D matrix of CBs.
+// NOTE: ABC dims are only supported if there are X & Y both.
+//       Also expected number should be passed in
 {
 int count=0,ix;
 for(ix=dimA;ix<membersForAll->dimMax;ix++)
     {
     if(membersForAll->members[ix]==NULL)
         continue;
     if(membersForAll->members[ix]->count<1)
         continue;
     count++;
 
     if(count==1) // First time set up a table
         puts("<BR><TABLE>");
-    printf("<TR><TH valign=top align='right'>&nbsp;&nbsp;<B><EM>%s</EM></B>:</TH>",membersForAll->members[ix]->groupTitle);
+    printf("<TR><TH valign=top align='right'>&nbsp;&nbsp;<B><EM>%s</EM></B>:</TH>",
+           membersForAll->members[ix]->groupTitle);
     int aIx;
     for(aIx=0;aIx<membersForAll->members[ix]->count;aIx++)
         {
         if(membersForAll->members[ix]->tags[aIx] != NULL)
             {
             assert(membersForAll->members[ix]->subtrackList[aIx]->val != NULL);
             printf("<TH align=left nowrap>");
             char objName[SMALLBUF];
             char javascript[JBUFSIZE];
             boolean alreadySet=FALSE;
             if(membersForAll->members[ix]->selected != NULL)
                 alreadySet = membersForAll->members[ix]->selected[aIx];
-            safef(objName, sizeof(objName), "%s.mat_%s_dim%c_cb",parentTdb->track,membersForAll->members[ix]->tags[aIx],membersForAll->letters[ix]);
-            safef(javascript,sizeof(javascript),"onclick='matCbClick(this);' class=\"matCB abc %s\"",membersForAll->members[ix]->tags[aIx]);
-            // TODO Set classes properly (if needed!!!)  The class abc works but what about a b or c?
+            safef(objName, sizeof(objName), "%s.mat_%s_dim%c_cb",parentTdb->track,
+                  membersForAll->members[ix]->tags[aIx],membersForAll->letters[ix]);
+            safef(javascript,sizeof(javascript),
+                  "onclick='matCbClick(this);' class=\"matCB abc %s\"",
+                  membersForAll->members[ix]->tags[aIx]);
             cgiMakeCheckBoxJS(objName,alreadySet,javascript);
-            printf("%s",compositeLabelWithVocabLink(db,parentTdb,membersForAll->members[ix]->subtrackList[aIx]->val,
-                   membersForAll->members[ix]->groupTag,membersForAll->members[ix]->titles[aIx]));
+            printf("%s",compositeLabelWithVocabLink(db,parentTdb,
+                   membersForAll->members[ix]->subtrackList[aIx]->val,
+                   membersForAll->members[ix]->groupTag,
+                   membersForAll->members[ix]->titles[aIx]));
             puts("</TH>");
             }
         }
     puts("</TR>");
     }
 if(count>0)
     puts("</TABLE>");
 return count;
 }
 
 #ifdef DEBUG
 static void dumpDimension(members_t *dimension, char *name, FILE *f)
 /* Dump out information on dimension. */
 {
 int count = dimension->count;
 fprintf(f, "%s: count=%d tag=%s title=%s setting=%s<BR>\n", name, count, dimension->tag, dimension->title, dimension->setting);
 int i;
 for (i=0; i<count; ++i)
     fprintf(f, "%s=%s ", dimension->names[i], dimension->values[i]);
 fprintf(f, "<BR>\n");
 }
 #endif /* DEBUG */
 
 static char *labelWithVocabLinkForMultiples(char *db,struct trackDb *parentTdb, members_t* members)
-/* If the parentTdb has a controlledVocabulary setting and the vocabType is found,
-   then label will be wrapped with the link to all relevent terms.  Return string is cloned. */
+// If the parentTdb has a controlledVocabulary setting and the vocabType is found,
+// then label will be wrapped with the link to all relevent terms.  Return string is cloned.
 {
 assert(members->subtrackList != NULL);
 char *vocab = cloneString(trackDbSetting(parentTdb, "controlledVocabulary"));
 if(vocab == NULL)
     return cloneString(members->groupTitle); // No link wrapping!
 
 char *words[15];
 int count,ix;
 boolean found=FALSE;
 if((count = chopByWhite(vocab, words,15)) <= 1) // vocab now contains just the file name
     return cloneString(members->groupTitle);
 
 char *mdbVar = NULL;
 
 // Find mdb var to look up based upon the groupTag and cv setting
 for(ix=1;ix<count && !found;ix++)
     {
-    if(sameString(members->groupTag,words[ix])) // controlledVocabulary setting matches tag so all labels are linked
-        {
+    if (sameString(members->groupTag,words[ix])) // controlledVocabulary setting matches tag
+        {                                       // so all labels are linked
         mdbVar = members->groupTag;
         break;
         }
     else if(startsWithWordByDelimiter(members->groupTag,'=',words[ix]))
         {
         mdbVar = words[ix] + strlen(members->groupTag) + 1;
         break;
         }
     }
 if(mdbVar == NULL)
     {
     freeMem(vocab);
     return cloneString(members->groupTitle);
     }
 
 #define VOCAB_MULTILINK_BEG "<A HREF='hgEncodeVocab?ra=%s&%s=\""
 #define VOCAB_MULTILINK_END "\"' title='Click for details of each %s' TARGET=ucscVocab>%s</A>"
-struct dyString *dyLink = dyStringCreate(VOCAB_MULTILINK_BEG,vocab,(sameWord(mdbVar,"antibody")?"target":"term"));
+struct dyString *dyLink = dyStringCreate(VOCAB_MULTILINK_BEG,vocab,
+                                         (sameWord(mdbVar,"antibody")?"target":"term"));
 
 // Now build the comma delimited string of mdb vals (all have same mdb var)
 boolean first = TRUE;
 for(ix=0;ix<members->count;ix++)
     {
     if(members->subtrackList[ix] != NULL && members->subtrackList[ix]->val != NULL)
         {
         struct trackDb *childTdb = members->subtrackList[ix]->val;
         (void)metadataForTable(db,childTdb,NULL); // Makes sure this has been populated
         const char * mdbVal = metadataFindValue(childTdb,mdbVar); // one for each is enough
         if(mdbVal != NULL)
             {
             if(!first)
                 dyStringAppendC(dyLink,',');
             dyStringAppend(dyLink,(char *)mdbVal);
             first = FALSE;
             }
         }
     }
 dyStringPrintf(dyLink,VOCAB_MULTILINK_END,members->groupTitle,members->groupTitle);
 freeMem(vocab);
 return dyStringCannibalize(&dyLink);
 }
 
-static boolean compositeUiByFilter(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName)
-/* UI for composite tracks: filter subgroups by multiselects to select subtracks. */
+static boolean compositeUiByFilter(char *db, struct cart *cart, struct trackDb *parentTdb,
+                                   char *formName)
+// UI for composite tracks: filter subgroups by multiselects to select subtracks.
 {
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart);
 if(membersForAll == NULL || membersForAll->filters == FALSE) // Not Matrix or filters
     return FALSE;
 if(cartOptionalString(cart, "ajax") == NULL)
     {
     webIncludeResourceFile("ui.dropdownchecklist.css");
     jsIncludeFile("ui.dropdownchecklist.js",NULL);
     jsIncludeFile("ddcl.js",NULL);
     }
 
 cgiDown(0.7);
 printf("<B>Select subtracks %sby:</B> (select multiple %sitems - %s)<BR>\n",
        (membersForAll->members[dimX] != NULL || membersForAll->members[dimY] != NULL ? "further ":""),
        (membersForAll->dimMax == dimA?"":"categories and "),FILTERBY_HELP_LINK);
 printf("<TABLE><TR valign='top'>\n");
 
 // Do All [+][-] buttons
 if(membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) // No matrix
     {
     printf("<TD align='left' width='50px'><B>All:</B><BR>");
 #ifdef BUTTONS_BY_CSS
     // TODO: Test when a real world case actually calls this.  Currently no trackDb.ra cases exist
-    #define BUTTON_FILTER_COMP "<span class='pmButton inOutButton' onclick='waitOnFunction(filterCompositeSet,this,%s)'>%c</span>"
+    #define BUTTON_FILTER_COMP "<span class='pmButton inOutButton' " \
+                               "onclick='waitOnFunction(filterCompositeSet,this,%s)'>%c</span>"
     printf(BUTTON_FILTER_COMP,"true", '+');
     printf(BUTTON_FILTER_COMP,"false",'-');
 #else///ifndef BUTTONS_BY_CSS
-    #define PM_BUTTON_FILTER_COMP "<input type='button' class='inOutButton' onclick=\"waitOnFunction(filterCompositeSet,this,%s); return false;\" id='btn_%s' value='%c'>"
+    #define PM_BUTTON_FILTER_COMP "<input type='button' class='inOutButton' " \
+                                  "onclick=\"waitOnFunction(filterCompositeSet,this,%s); " \
+                                  "return false;\" id='btn_%s' value='%c'>"
     printf(PM_BUTTON_FILTER_COMP,"true",  "plus_fc",'+');
     printf(PM_BUTTON_FILTER_COMP,"false","minus_fc",'-');
 #endif///ndef BUTTONS_BY_CSS
     printf("</TD>\n");
     }
 
 // Now make a filterComp box for each ABC dimension
 int dimIx=dimA;
 for(dimIx=dimA;dimIx<membersForAll->dimMax;dimIx++)
     {
-  //printf("<TD align='right'><B>%s:</B></TD><TD align='left'>\n",labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx]));
-    printf("<TD align='left'><B>%s:</B><BR>\n",labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx]));
+    printf("<TD align='left'><B>%s:</B><BR>\n",
+           labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx]));
 
-    #define FILTER_COMPOSITE_FORMAT "<SELECT id='fc%d' name='%s.filterComp.%s' %s onchange='filterCompositeSelectionChanged(this);' style='display: none; font-size:.8em;' class='filterComp'><BR>\n"
-    printf(FILTER_COMPOSITE_FORMAT,dimIx,parentTdb->track,membersForAll->members[dimIx]->groupTag,"multiple");
+    #define FILTER_COMPOSITE_FORMAT "<SELECT id='fc%d' name='%s.filterComp.%s' %s " \
+                                    "onchange='filterCompositeSelectionChanged(this);' " \
+                                    "style='display: none; font-size:.8em;' " \
+                                    "class='filterComp'><BR>\n"
+    printf(FILTER_COMPOSITE_FORMAT,dimIx,parentTdb->track,membersForAll->members[dimIx]->groupTag,
+           "multiple");
 
-    // DO we support anything besides multi? (membersForAll->members[dimIx]->fcType == fctMulti?"multiple ":""));
+    // DO we support anything besides multi?
+    //  (membersForAll->members[dimIx]->fcType == fctMulti?"multiple ":""));
     if(membersForAll->members[dimIx]->fcType != fctOneOnly)
-        printf("<OPTION%s>All</OPTION>\n",(sameWord("All",membersForAll->checkedTags[dimIx])?" SELECTED":"") );
+        printf("<OPTION%s>All</OPTION>\n",
+               (sameWord("All",membersForAll->checkedTags[dimIx])?" SELECTED":"") );
 
     int ix=0;
     for(ix=0;ix<membersForAll->members[dimIx]->count; ix++)
         {
         boolean alreadySet = membersForAll->members[dimIx]->selected[ix];
         printf("<OPTION%s value=%s>%s</OPTION>\n",(alreadySet?" SELECTED":""),
                membersForAll->members[dimIx]->tags[ix],membersForAll->members[dimIx]->titles[ix]);
         }
     printf("</SELECT>");
 
     if(membersForAll->members[dimIx]->fcType == fctOneOnly)
         printf(" (select only one)");
 
     printf("</TD><TD width='20'></TD>\n");
     }
 printf("</TR></TABLE>\n");
 
 puts("<BR>\n");
 
 return TRUE;
 }
 
-static boolean compositeUiByMatrix(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName)
-/* UI for composite tracks: matrix of checkboxes. */
+static boolean compositeUiByMatrix(char *db, struct cart *cart, struct trackDb *parentTdb,
+                                   char *formName)
+// UI for composite tracks: matrix of checkboxes.
 {
 //int ix;
 char objName[SMALLBUF];
 
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart);
 if(membersForAll == NULL || membersForAll->dimensions == NULL) // Not Matrix!
     return FALSE;
 
 int ixX,ixY;
 members_t *dimensionX = membersForAll->members[dimX];
 members_t *dimensionY = membersForAll->members[dimY];
 
 // use array of char determine all the cells (in X,Y,Z dimensions) that are actually populated
 char *value;
 int sizeOfX = dimensionX?dimensionX->count:1;
 int sizeOfY = dimensionY?dimensionY->count:1;
 int cells[sizeOfX][sizeOfY]; // There needs to be atleast one element in dimension
 int chked[sizeOfX][sizeOfY]; // How many subCBs are checked per matCB?
 int enabd[sizeOfX][sizeOfY]; // How many subCBs are enabled per matCB?
 memset(cells, 0, sizeof(cells));
 memset(chked, 0, sizeof(chked));
 memset(enabd, 0, sizeof(chked));
 
-struct slRef *subtrackRef, *subtrackRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
+struct slRef *subtrackRef, *subtrackRefList =
+                                    trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
 struct trackDb *subtrack;
 if (dimensionX || dimensionY) // Must be an X or Y dimension
     {
     // Fill the cells based upon subtrack membership
     for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
         {
         subtrack = subtrackRef->val;
         ixX = (dimensionX ? -1 : 0 );
         ixY = (dimensionY ? -1 : 0 );
         if(dimensionX && subgroupFind(subtrack,dimensionX->groupTag,&value))
             {
             ixX = stringArrayIx(value,dimensionX->tags,dimensionX->count);
             subgroupFree(&value);
             }
         if(dimensionY && subgroupFind(subtrack,dimensionY->groupTag,&value))
             {
             ixY = stringArrayIx(value,dimensionY->tags,dimensionY->count);
             subgroupFree(&value);
             }
         if(ixX > -1 && ixY > -1)
             {
             cells[ixX][ixY]++;
             int fourState = subtrackFourStateChecked(subtrack,cart);
-            if(fourStateEnabled(fourState))  // hidden views are handled by 4-way CBs: only count enabled
+            // hidden views are handled by 4-way CBs: only count enabled
+            if (fourStateEnabled(fourState))
                 {
-                if(subtrackInAllCurrentABCs(subtrack,membersForAll))  // Only bother if the subtrack is found in all ABC dims checked
+                // Only bother if the subtrack is found in all ABC dims checked
+                if (subtrackInAllCurrentABCs(subtrack,membersForAll))
                     {
                     enabd[ixX][ixY]++;
                     if(fourStateChecked(fourState) == 1)
                         chked[ixX][ixY]++;
                     }
                 }
             }
         }
     }
 
 // If there is no matrix and if there is a filterComposite, then were are done.
 if(dimensionX == NULL && dimensionY == NULL)
     {
     if (compositeUiByFilter(db, cart, parentTdb, formName))
         return FALSE;
     }
 
 // Tell the user what to do:
 char javascript[JBUFSIZE];
 //puts("<B>Select subtracks by characterization:</B><BR>");
 printf("<B>Select subtracks by ");
 if(dimensionX && !dimensionY)
     safef(javascript, sizeof(javascript), "%s:</B>",dimensionX->groupTitle);
 else if(!dimensionX && dimensionY)
     safef(javascript, sizeof(javascript), "%s:</B>",dimensionY->groupTitle);
 else if(dimensionX && dimensionY)
-    safef(javascript, sizeof(javascript), "%s and %s:</B>",dimensionX->groupTitle,dimensionY->groupTitle);
+    safef(javascript, sizeof(javascript), "%s and %s:</B>",
+          dimensionX->groupTitle,dimensionY->groupTitle);
 else
     safef(javascript, sizeof(javascript), "multiple variables:</B>");
 puts(strLower(javascript));
 
 if(!subgroupingExists(parentTdb,"view"))
-    puts("(<A HREF=\"../goldenPath/help/multiView.html\" title='Help on subtrack selection' TARGET=_BLANK>help</A>)\n");
+    puts("(<A HREF=\"../goldenPath/help/multiView.html\" title='Help on subtrack selection' "
+         "TARGET=_BLANK>help</A>)\n");
 
 puts("<BR>\n");
 
 if(membersForAll->abcCount > 0 && membersForAll->filters == FALSE)
     {
     displayABCdimensions(db,cart,parentTdb,subtrackRefList,membersForAll);
     }
 
-if(dimensionX == NULL && dimensionY == NULL) // Could have been just filterComposite. Must be an X or Y dimension
+// Could have been just filterComposite. Must be an X or Y dimension
+if (dimensionX == NULL && dimensionY == NULL)
     return FALSE;
 
-printf("<TABLE class='greenBox matrix' cellspacing=0 style='background-color:%s;'>\n",COLOR_BG_ALTDEFAULT);
+printf("<TABLE class='greenBox matrix' cellspacing=0 style='background-color:%s;'>\n",
+       COLOR_BG_ALTDEFAULT);
 
 (void)matrixXheadings(db,parentTdb,membersForAll,TRUE);
 
 // Now the Y by X matrix
 int cntX=0,cntY=0;
 for (ixY = 0; ixY < sizeOfY; ixY++)
     {
     if(dimensionY == NULL || (dimensionY->tags[ixY]))
         {
         cntY++;
         assert(!dimensionY || ixY < dimensionY->count);
         printf("<TR ALIGN=CENTER>");
 
         matrixYheadings(db,parentTdb, membersForAll,ixY,TRUE);
 
@@ -6919,225 +7097,202 @@
                 char *ttlY = NULL;
                 if(dimensionX)
                     {
                     ttlX = cloneString(dimensionX->titles[ixX]);
                     stripString(ttlX,"<i>");
                     stripString(ttlX,"</i>");
                     }
                 if(dimensionY != NULL)
                     {
                     ttlY = cloneString(dimensionY->titles[ixY]);
                     stripString(ttlY,"<i>");
                     stripString(ttlY,"</i>");
                     }
                 if(cells[ixX][ixY] > 0)
                     {
-                    boolean halfChecked = (chked[ixX][ixY] > 0 && chked[ixX][ixY] < enabd[ixX][ixY]);
+                    boolean halfChecked = (  chked[ixX][ixY] > 0
+                                          && chked[ixX][ixY] < enabd[ixX][ixY]);
 
                     struct dyString *dyJS = dyStringCreate("onclick='matCbClick(this);'");
                     if(dimensionX && dimensionY)
                         {
-                        safef(objName, sizeof(objName), "mat_%s_%s_cb", dimensionX->tags[ixX],dimensionY->tags[ixY]);
+                        safef(objName, sizeof(objName), "mat_%s_%s_cb",
+                              dimensionX->tags[ixX],dimensionY->tags[ixY]);
                         }
                     else
                         {
-                        safef(objName, sizeof(objName), "mat_%s_cb", (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY]));
+                        safef(objName, sizeof(objName), "mat_%s_cb",
+                              (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY]));
                         }
                     if(ttlX && ttlY)
-                        printf("<TD class='matCell %s %s'>\n",dimensionX->tags[ixX],dimensionY->tags[ixY]);
+                        printf("<TD class='matCell %s %s'>\n",
+                               dimensionX->tags[ixX],dimensionY->tags[ixY]);
                     else
-                        printf("<TD class='matCell %s'>\n", (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY]));
+                        printf("<TD class='matCell %s'>\n",
+                               (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY]));
                     dyStringPrintf(dyJS, " class=\"matCB");
                     if(halfChecked)
                         dyStringPrintf(dyJS, " disabled");  // appears disabled but still clickable!
                     if(dimensionX)
                         dyStringPrintf(dyJS, " %s",dimensionX->tags[ixX]);
                     if(dimensionY)
                         dyStringPrintf(dyJS, " %s",dimensionY->tags[ixY]);
                     dyStringAppendC(dyJS,'"');
                     if(chked[ixX][ixY] > 0)
                         dyStringAppend(dyJS," CHECKED");
                     if(halfChecked)
-                        dyStringAppend(dyJS," title='Not all associated subtracks have been selected'");
+                        dyStringAppend(dyJS," title='Not all associated subtracks have been"
+                                            " selected'");
 
-                    MAT_CB(objName,dyStringCannibalize(&dyJS)); // X&Y are set by javascript page load
+                    MAT_CB(objName,dyStringCannibalize(&dyJS)); // X&Y are set by javascript
                     puts("</TD>");
                     }
                 else
                     {
                     if(ttlX && ttlY)
-                        printf("<TD class='matCell %s %s'></TD>\n",dimensionX->tags[ixX],dimensionY->tags[ixY]);
+                        printf("<TD class='matCell %s %s'></TD>\n",
+                               dimensionX->tags[ixX],dimensionY->tags[ixY]);
                     else
-                        printf("<TD class='matCell %s'></TD>\n", (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY]));
+                        printf("<TD class='matCell %s'></TD>\n",
+                               (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY]));
                     }
                 }
             }
         if(dimensionX && cntX>MATRIX_RIGHT_BUTTONS_AFTER)
             matrixYheadings(db,parentTdb, membersForAll,ixY,FALSE);
         puts("</TR>\n");
         }
     }
 if(dimensionY && cntY>MATRIX_BOTTOM_BUTTONS_AFTER)
     matrixXheadings(db,parentTdb,membersForAll,FALSE);
 
 puts("</TD></TR></TABLE>");
 
 // If any filter additional filter composites, they can be added at the end.
 compositeUiByFilter(db, cart, parentTdb, formName);
 
 return TRUE;
 }
 
-static boolean compositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName)
-/* UI for composite tracks: all/none buttons only (as opposed to matrix or lots of buttons */
+static boolean compositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb,
+                                     char *formName)
+// UI for composite tracks: all/none buttons only (as opposed to matrix or lots of buttons
 {
 if (trackDbCountDescendantLeaves(parentTdb) <= 1)
     return FALSE;
 
 if(dimensionsExist(parentTdb))
     return FALSE;
 
 #ifdef BUTTONS_BY_CSS
 #define BUTTON_ALL   "<span class='pmButton' onclick='matSubCBsCheck(%s)'>%c</span>"
 #define BUTTON_PLUS_ALL_GLOBAL()  printf(BUTTON_ALL,"true", '+')
 #define BUTTON_MINUS_ALL_GLOBAL() printf(BUTTON_ALL,"false",'-')
 #else///ifndef BUTTONS_BY_CSS
-#define PM_BUTTON_GLOBAL "<IMG height=18 width=18 onclick=\"matSubCBsCheck(%s);\" id='btn_%s' src='../images/%s'>"
+#define PM_BUTTON_GLOBAL "<IMG height=18 width=18 onclick=\"matSubCBsCheck(%s);\" " \
+                         "id='btn_%s' src='../images/%s'>"
 #define    BUTTON_PLUS_ALL_GLOBAL()  printf(PM_BUTTON_GLOBAL,"true",  "plus_all",   "add_sm.gif")
 #define    BUTTON_MINUS_ALL_GLOBAL() printf(PM_BUTTON_GLOBAL,"false","minus_all","remove_sm.gif")
 #endif///ndef BUTTONS_BY_CSS
 BUTTON_PLUS_ALL_GLOBAL();
 BUTTON_MINUS_ALL_GLOBAL();
 puts("&nbsp;<B>Select all subtracks</B><BR>");
 return TRUE;
 }
 
 static boolean compositeUiNoMatrix(char *db, struct cart *cart, struct trackDb *parentTdb,
-          char *primarySubtrack, char *formName)
-/* UI for composite tracks: subtrack selection.  This is the default UI
-without matrix controls. */
+                                   char *formName)
+// UI for composite tracks: subtrack selection.  This is the default UI
+// without matrix controls.
 {
 int i, j, k;
 char *words[SMALLBUF];
 char option[SMALLBUF];
 int wordCnt;
-#ifndef SUBTRACK_CFG
-char javascript[JBUFSIZE];
-#endif///ndef SUBTRACK_CFG
-char *primaryType = getPrimaryType(primarySubtrack, parentTdb);
 char *name, *value;
 char buttonVar[32];
 char setting[] = "subGroupN";
 char *button;
 struct trackDb *subtrack;
 bool hasSubgroups = (trackDbSetting(parentTdb, "subGroup1") != NULL);
 
 if(dimensionsExist(parentTdb))
     return FALSE;
 
 puts ("<TABLE>");
 if (hasSubgroups)
     {
     puts("<TR><B>Select subtracks:</B></TR>");
-    puts("<TR><TD><B><EM>&nbsp; &nbsp; All</EM></B>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </TD><TD>");
+    puts("<TR><TD><B><EM>&nbsp; &nbsp; All</EM></B>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"
+         "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </TD><TD>");
     }
 else
     {
     puts("<TR><TD><B>All subtracks:</B></TD><TD>");
     }
 safef(buttonVar, sizeof buttonVar, "%s", "button_all");
 if (formName)
     {
-#ifdef SUBTRACK_CFG
     makeAddClearButtonPair(NULL,"</TD><TD>"); // NULL means all
-#else///ifndef SUBTRACK_CFG
-    cgiMakeHiddenVar(buttonVar, "");
-    makeAddClearSubmitTweak(javascript, formName, buttonVar,
-                ADD_BUTTON_LABEL);
-    cgiMakeOnClickButton(javascript, ADD_BUTTON_LABEL);
-    puts("</TD><TD>");
-    makeAddClearSubmitTweak(javascript, formName, buttonVar,
-                CLEAR_BUTTON_LABEL);
-    cgiMakeOnClickButton(javascript, CLEAR_BUTTON_LABEL);
-#endif///ndef SUBTRACK_CFG
     }
 else
     {
     cgiMakeButton(buttonVar, ADD_BUTTON_LABEL);
     puts("</TD><TD>");
     cgiMakeButton(buttonVar, CLEAR_BUTTON_LABEL);
     }
 button = cgiOptionalString(buttonVar);
 if (isNotEmpty(button))
     {
     struct slRef *tdbRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
     struct slRef *tdbRef;
     for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
         {
 	subtrack = tdbRef->val;
         boolean newVal = FALSE;
         safef(option, sizeof(option), "%s_sel", subtrack->track);
         newVal = sameString(button, ADD_BUTTON_LABEL);
-        if (primarySubtrack)
-            {
-            if (sameString(subtrack->track, primarySubtrack))
-                newVal = TRUE;
-            if (hSameTrackDbType(primaryType, subtrack->type))
-                cartSetBoolean(cart, option, newVal);
-            }
-        else
             cartSetBoolean(cart, option, newVal);
         }
     }
 puts("</TD></TR>");
 puts ("</TABLE>");
-/* generate set & clear buttons for subgroups */
+// generate set & clear buttons for subgroups
 for (i = 0; i < MAX_SUBGROUP; i++)
     {
     char *subGroup;
     safef(setting, sizeof setting, "subGroup%d", i+1);
     if (trackDbSetting(parentTdb, setting) == NULL)
         break;
     wordCnt = chopLine(cloneString(trackDbSetting(parentTdb, setting)), words);
     if (wordCnt < 2)
         continue;
     subGroup = cloneString(words[0]);
     if(sameWord(subGroup,"view"))
         continue;  // Multi-view should have taken care of "view" subgroup already
     puts ("<TABLE>");
     printf("<TR><TD><B><EM>&nbsp; &nbsp; %s</EM></B></TD></TR>", words[1]);
     for (j = 2; j < wordCnt; j++)
         {
         if (!parseAssignment(words[j], &name, &value))
             continue;
         printf("<TR><TD>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %s</TD><TD>",
            value);
         safef(buttonVar, sizeof buttonVar, "%s_%s", subGroup, name);
         if (formName)
             {
-        #ifdef SUBTRACK_CFG
             makeAddClearButtonPair(name,"</TD><TD>");
-        #else///ifndef SUBTRACK_CFG
-            cgiMakeHiddenVar(buttonVar, "");
-            makeAddClearSubmitTweak(javascript, formName, buttonVar,
-                        ADD_BUTTON_LABEL);
-            cgiMakeOnClickButton(javascript, ADD_BUTTON_LABEL);
-            puts("</TD><TD>");
-            makeAddClearSubmitTweak(javascript, formName, buttonVar,
-                        CLEAR_BUTTON_LABEL);
-            cgiMakeOnClickButton(javascript, CLEAR_BUTTON_LABEL);
-        #endif///ndef SUBTRACK_CFG
             }
         else
             {
             cgiMakeButton(buttonVar, ADD_BUTTON_LABEL);
             puts("</TD><TD>");
             cgiMakeButton(buttonVar, CLEAR_BUTTON_LABEL);
             }
         puts("</TD></TR>");
         button = cgiOptionalString(buttonVar);
         if (isEmpty(button))
             continue;
 	struct slRef *tdbRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
 	struct slRef *tdbRef;
 	for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
             {
@@ -7145,288 +7300,272 @@
             char *p;
             int n;
             if ((p = trackDbSetting(subtrack, "subGroups")) == NULL)
                 continue;
             n = chopLine(cloneString(p), words);
             for (k = 0; k < n; k++)
                 {
                 char *subName, *subValue;
                 if (!parseAssignment(words[k], &subName, &subValue))
                     continue;
                 if (sameString(subName, subGroup) && sameString(subValue, name))
                     {
                     boolean newVal = FALSE;
                     safef(option, sizeof(option),"%s_sel", subtrack->track);
                     newVal = sameString(button, ADD_BUTTON_LABEL);
-                    if (primarySubtrack)
-                        {
-                        if (sameString(subtrack->track, primarySubtrack))
-                            newVal = TRUE;
-                        if (hSameTrackDbType(primaryType, subtrack->type))
-                            cartSetBoolean(cart, option, newVal);
-                        }
-                    else
                         cartSetBoolean(cart, option, newVal);
                     }
                 }
             }
         }
     puts ("</TABLE>");
     }
     return TRUE;
 }
 
 void hCompositeUi(char *db, struct cart *cart, struct trackDb *tdb,
 		  char *primarySubtrack, char *fakeSubmit, char *formName)
-/* UI for composite tracks: subtrack selection.  If primarySubtrack is
- * non-NULL, don't allow it to be cleared and only offer subtracks
- * that have the same type.  If fakeSubmit is non-NULL, add a hidden
- * var with that name so it looks like it was pressed. */
+// UI for composite tracks: subtrack selection.  If primarySubtrack is
+// non-NULL, don't allow it to be cleared and only offer subtracks
+// that have the same type.  If fakeSubmit is non-NULL, add a hidden
+// var with that name so it looks like it was pressed.
 {
 bool hasSubgroups = (trackDbSetting(tdb, "subGroup1") != NULL);
 boolean isMatrix = dimensionsExist(tdb);
 boolean viewsOnly = FALSE;
 
 if (primarySubtrack == NULL && !cartVarExists(cart, "ajax"))
     {
     if(trackDbSetting(tdb, "dragAndDrop") != NULL)
         jsIncludeFile("jquery.tablednd.js", NULL);
     jsIncludeFile("ajax.js",NULL);
     jsIncludeFile("hui.js",NULL);
-#ifdef SUBTRACK_CFG
     jsIncludeFile("subCfg.js",NULL);
-#endif///ndef SUBTRACK_CFG
     }
 
 cgiDown(0.7);
 if (trackDbCountDescendantLeaves(tdb) < MANY_SUBTRACKS && !hasSubgroups)
     {
     if(primarySubtrack)
         compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack);
     else
         compositeUiSubtracks(db, cart, tdb);
     return;
     }
 if (fakeSubmit)
     cgiMakeHiddenVar(fakeSubmit, "submit");
 
 if(primarySubtrack == NULL)
     {
     if(subgroupingExists(tdb,"view"))
         {
         hCompositeDisplayViewDropDowns(db, cart,tdb);
         if(subgroupCount(tdb) <= 1)
             viewsOnly = TRUE;
         }
     if(!viewsOnly)
         {
         cgiDown(0.7);
         if(trackDbSettingOn(tdb, "allButtonPair"))
 	    {
             compositeUiAllButtons(db, cart, tdb, formName);
 	    }
-        else if (!hasSubgroups || !isMatrix || primarySubtrack)
+        else if (!hasSubgroups || !isMatrix)
 	    {
-            compositeUiNoMatrix(db, cart,tdb,primarySubtrack,formName);
+            compositeUiNoMatrix(db, cart, tdb, formName);
 	    }
         else
 	    {
             compositeUiByMatrix(db, cart, tdb, formName);
 	    }
         }
     }
 
 cartSaveSession(cart);
 cgiContinueHiddenVar("g");
 
 if(primarySubtrack)
     compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack);
 else
     compositeUiSubtracks(db, cart, tdb);
 
 if (primarySubtrack == NULL)  // primarySubtrack is set for tableBrowser but not hgTrackUi
     {
     if (trackDbCountDescendantLeaves(tdb) > 5)
         {
         cgiDown(0.7);
         cgiMakeButton("Submit", "Submit");
         }
     }
 }
 
 boolean superTrackDropDownWithExtra(struct cart *cart, struct trackDb *tdb,
                                 int visibleChild,char *extra)
-/* Displays hide/show dropdown for supertrack.
- * Set visibleChild to indicate whether 'show' should be grayed
- * out to indicate that no supertrack members are visible:
- *    0 to gray out (no visible children)
- *    1 don't gray out (there are visible children)
- *   -1 don't know (this function should determine)
- * If -1,i the subtracks field must be populated with the child trackDbs.
- * Returns false if not a supertrack */
+// Displays hide/show dropdown for supertrack.
+// Set visibleChild to indicate whether 'show' should be grayed
+// out to indicate that no supertrack members are visible:
+//    0 to gray out (no visible children)
+//    1 don't gray out (there are visible children)
+//   -1 don't know (this function should determine)
+// If -1,i the subtracks field must be populated with the child trackDbs.
+// Returns false if not a supertrack
 {
 if (!tdbIsSuperTrack(tdb))
     return FALSE;
 
-/* determine if supertrack is show/hide */
+// determine if supertrack is show/hide
 boolean show = FALSE;
 char *setting =
         cartUsualString(cart, tdb->track, tdb->isShow ? "show" : "hide");
 if (sameString("show", setting))
     show = TRUE;
 
-/* Determine if any tracks in supertrack are visible; if not,
- * the 'show' is grayed out */
+// Determine if any tracks in supertrack are visible; if not, the 'show' is grayed out
 if (show && (visibleChild == -1))
     {
     visibleChild = 0;
     struct slRef *childRef;
     for ( childRef = tdb->children; childRef != NULL; childRef = childRef->next)
         {
 	struct trackDb *cTdb = childRef->val;
         cTdb->visibility =
                 hTvFromString(cartUsualString(cart, cTdb->track,
                                       hStringFromTv(cTdb->visibility)));
         if (cTdb->visibility != tvHide)
             visibleChild = 1;
         }
     }
 hideShowDropDownWithClassAndExtra(tdb->track, show, (show && visibleChild) ?
                             "normalText visDD" : "hiddenText visDD",extra);
 return TRUE;
 }
 
 int tvConvertToNumericOrder(enum trackVisibility v)
 {
 return ((v) == tvFull   ? 4 : \
         (v) == tvPack   ? 3 : \
         (v) == tvSquish ? 2 : \
         (v) == tvDense  ? 1 : 0);
 }
+
 int tvCompare(enum trackVisibility a, enum trackVisibility b)
 /* enum trackVis isn't in numeric order by visibility, so compare
  * symbolically: */
 {
 return (tvConvertToNumericOrder(b) - tvConvertToNumericOrder(a));
 }
 
 enum trackVisibility tvMin(enum trackVisibility a, enum trackVisibility b)
 /* Return the less visible of a and b. */
 {
 if (tvCompare(a, b) >= 0)
     return a;
 else
     return b;
 }
 
-enum trackVisibility tdbLocalVisibility(struct cart *cart, struct trackDb *tdb,boolean *subtrackOverride)
-// returns visibility NOT limited by ancestry.  Fills optional boolean if subtrack specific vis is found
-// If not NULL cart will be examined without ClosestToHome.  Folders/supertracks resolve to hide/full
+enum trackVisibility tdbLocalVisibility(struct cart *cart, struct trackDb *tdb,
+                                        boolean *subtrackOverride)
+// returns visibility NOT limited by ancestry.
+// Fills optional boolean if subtrack specific vis is found
+// If not NULL cart will be examined without ClosestToHome.
+// Folders/supertracks resolve to hide/full
 {
 if (subtrackOverride != NULL)
 *subtrackOverride = FALSE; // default
 
 // tdb->visibility should reflect local trackDb setting
 enum trackVisibility vis = tdb->visibility;
 if (tdbIsSuperTrack(tdb))
     vis = (tdb->isShow ? tvFull : tvHide);
 
 if (cart != NULL) // cart is optional
     {
-    char *cartVis = NULL;
-    #ifndef SUBTRACK_CFG
-    if (tdbIsCompositeView(tdb))
-        {
-        char *view = trackDbLocalSetting(tdb,"view"); // views have funky cart setting
-        assert(view != NULL);
-        char setting[512];
-        safef(setting,sizeof(setting),"%s.%s.vis",tdb->parent->track,view);
-        cartVis = cartOptionalString(cart, setting);
-        }
-    else
-    #endif///ndef SUBTRACK_CFG
-        cartVis = cartOptionalString(cart, tdb->track);
+    char *cartVis = cartOptionalString(cart, tdb->track);
     if (cartVis != NULL)
         {
         vis = hTvFromString(cartVis);
         if (subtrackOverride != NULL && tdbIsContainerChild(tdb))
             *subtrackOverride = TRUE;
         }
     }
 return vis;
 }
 
-enum trackVisibility tdbVisLimitedByAncestors(struct cart *cart, struct trackDb *tdb, boolean checkBoxToo, boolean foldersToo)
-// returns visibility limited by ancestry.  This includes subtrack vis override and parents limit maximum.
+enum trackVisibility tdbVisLimitedByAncestors(struct cart *cart, struct trackDb *tdb,
+                                              boolean checkBoxToo, boolean foldersToo)
+// returns visibility limited by ancestry.
+// This includes subtrack vis override and parents limit maximum.
 // cart may be null, in which case, only trackDb settings (default state) are examined
 // checkBoxToo means ensure subtrack checkbox state is visible
 // foldersToo means limit by folders (aka superTracks) as well.
 {
 boolean subtrackOverride = FALSE;
 enum trackVisibility vis = tdbLocalVisibility(cart,tdb,&subtrackOverride);
 
 if (tdbIsContainerChild(tdb))
     {
     // subtracks without explicit (cart) vis but are selected, should get inherited vis
     if (!subtrackOverride)
         vis = tvFull;
     // subtracks with checkbox that says no, are stopped cold
     if (checkBoxToo && !fourStateVisible(subtrackFourStateChecked(tdb,cart)))
         vis = tvHide; // Checkbox says no
     }
 if (subtrackOverride)
     return vis;
-
-if (vis == tvHide || tdb->parent == NULL || (!foldersToo && tdbIsFolder(tdb->parent)))  // aka superTrack
+                                                            // aka superTrack
+if (vis == tvHide || tdb->parent == NULL || (!foldersToo && tdbIsFolder(tdb->parent)))
     return vis; // end of line
 
 return tvMin(vis,tdbVisLimitedByAncestors(cart,tdb->parent,checkBoxToo,foldersToo));
 }
 
 char *compositeViewControlNameFromTdb(struct trackDb *tdb)
-/* Returns a string with the composite view control name if one exists */
+// Returns a string with the composite view control name if one exists
 {
 char *stView   = NULL;
 char *name     = NULL;
 char *rootName = NULL;
-// This routine should give these results: compositeName.viewName or else subtrackName.viewName or else compositeName or else subtrackName
+// This routine should give these results: compositeName.viewName or else subtrackName.viewName
+// or else compositeName or else subtrackName
 if(tdbIsCompositeChild(tdb) == TRUE && trackDbLocalSetting(tdb, "parent") != NULL)
     {
     if(trackDbSettingClosestToHomeOn(tdb, "configurable"))
         rootName = tdb->track;  // subtrackName
     else
-        rootName = firstWordInLine(cloneString(trackDbLocalSetting(tdb, "parent"))); // compositeName
+        rootName = firstWordInLine(cloneString(trackDbLocalSetting(tdb, "parent")));
     }
 if(rootName != NULL)
     {
     if(subgroupFind(tdb,"view",&stView))
         {
         int len = strlen(rootName) + strlen(stView) + 3;
         name = needMem(len);
         safef(name,len,"%s.%s",rootName,stView);
         subgroupFree(&stView);
         }
     else
         name = cloneString(rootName);
     }
 else
     name = cloneString(tdb->track);
 return name;
 }
 
 void compositeViewControlNameFree(char **name)
-/* frees a string allocated by compositeViewControlNameFromTdb */
+// frees a string allocated by compositeViewControlNameFromTdb
 {
 if(name && *name)
     freez(name);
 }
 
 boolean isNameAtParentLevel(struct trackDb *tdb,char *name)
 // cfgUi controls are passed a prefix name that may be at the composite, view or subtrack level
 // returns TRUE if name at view or composite level
 {
 struct trackDb *parent;
 for (parent = tdb->parent; parent != NULL; parent = parent->parent)
     if (startsWithWordByDelimiter(parent->track, '.', name))
         return TRUE;
 return FALSE;
 }
@@ -7468,76 +7607,83 @@
 
 boolean printPennantIconNote(struct trackDb *tdb)
 // Returns TRUE and prints out the "pennantIcon" and note when found.
 //This is used by hgTrackUi and hgc before printing out trackDb "html"
 {
 char * setting = trackDbSetting(tdb, "pennantIcon");
 if (setting != NULL)
     {
     setting = cloneString(setting);
     char *icon = htmlEncodeText(nextWord(&setting),FALSE);
     char *url = nextWord(&setting);
     char *hint = htmlEncodeText(stripEnclosingDoubleQuotes(setting),FALSE);
 
     if (strlen(url) > 0)
         {
-        printf("<P><a title='%s' href='%s' TARGET=ucscHelp><img height='16' width='16' src='../images/%s'></a>",hint,url,icon);
+        printf("<P><a title='%s' href='%s' TARGET=ucscHelp><img height='16' width='16' "
+               "src='../images/%s'></a>",hint,url,icon);
 
         // Special case for liftOver from hg17 or hg18, but this should probably be generalized.
         if (sameString(icon,"18.jpg") && startsWithWord("lifted",hint))
-            printf("&nbsp;Note: these data have been converted via liftOver from the Mar. 2006 (NCBI36/hg18) version of the track.");
+            printf("&nbsp;Note: these data have been converted via liftOver from the Mar. 2006 "
+                   "(NCBI36/hg18) version of the track.");
         else if (sameString(icon,"17.jpg") && startsWithWord("lifted",hint))
-            printf("&nbsp;Note: these data have been converted via liftOver from the May 2004 (NCBI35/hg17) version of the track.");
+            printf("&nbsp;Note: these data have been converted via liftOver from the May 2004 "
+                   "(NCBI35/hg17) version of the track.");
         else if (strlen(hint) > 0)
             printf("&nbsp;Note: %s.",hint);
         printf("</P>\n");
         }
     else
         printf("<img height='16' width='16' src='%s'>\n",icon);
     return TRUE;
     }
 return FALSE;
 }
 
 boolean hPrintPennantIcon(struct trackDb *tdb)
-// Returns TRUE and prints out the "pennantIcon" when found.  Example: ENCODE tracks in hgTracks config list.
+// Returns TRUE and prints out the "pennantIcon" when found.
+// Example: ENCODE tracks in hgTracks config list.
 {
 char *setting = trackDbSetting(tdb, "pennantIcon");
 if(setting != NULL)
     {
     setting = cloneString(setting);
     char *icon = htmlEncodeText(nextWord(&setting),FALSE);
     if (setting)
         {
         char *url = nextWord(&setting);
         if (setting)
             {
             char *hint = htmlEncodeText(stripEnclosingDoubleQuotes(setting),FALSE);
-            hPrintf("<a title='%s' href='%s' TARGET=ucscHelp><img height='16' width='16' src='../images/%s'></a>\n",hint,url,icon);
+            hPrintf("<a title='%s' href='%s' TARGET=ucscHelp><img height='16' width='16' "
+                    "src='../images/%s'></a>\n",hint,url,icon);
             freeMem(hint);
             }
         else
-            hPrintf("<a href='%s' TARGET=ucscHelp><img height='16' width='16' src='../images/%s'></a>\n",url,icon);
+            hPrintf("<a href='%s' TARGET=ucscHelp><img height='16' width='16' "
+                    "src='../images/%s'></a>\n",url,icon);
         }
     else
         hPrintf("<img height='16' width='16' src='%s'>\n",icon);
     freeMem(icon);
     return TRUE;
     }
 else if(trackDbSetting(tdb, "wgEncode") != NULL)
     {
-    hPrintf("<a title='encode project' href='../ENCODE'><img height='16' width='16' src='../images/encodeThumbnail.jpg'></a>\n");
+    hPrintf("<a title='encode project' href='../ENCODE'><img height='16' width='16' "
+            "src='../images/encodeThumbnail.jpg'></a>\n");
     return TRUE;
     }
 return FALSE;
 }
 
 void printUpdateTime(char *database, struct trackDb *tdb,
     struct customTrack *ct)
 /* display table update time */
 {
 /* have not decided what to do for a composite container */
 if (tdbIsComposite(tdb))
     return;
 struct sqlConnection *conn = NULL;
 char *tableName = NULL;
 if (isCustomTrack(tdb->track))