src/hg/lib/hui.c 1.266

1.266 2010/03/25 17:32:12 angie
Moving bam configuration code from hgTrackUi to hui to support bam in multi-view composites.
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.265
retrieving revision 1.266
diff -b -B -U 4 -r1.265 -r1.266
--- src/hg/lib/hui.c	19 Mar 2010 21:23:51 -0000	1.265
+++ src/hg/lib/hui.c	25 Mar 2010 17:32:12 -0000	1.266
@@ -3180,8 +3180,10 @@
     case cfgNetAlign:	netAlignCfgUi(db,cart,tdb,prefix,title,boxed);
                         break;
     case cfgBedFilt:    bedUi(tdb,cart,title, boxed);
                  	break;
+    case cfgBam:        bamCfgUi(cart, tdb, prefix, title, boxed);
+			break;
     default:            warn("Track type is not known to multi-view composites. type is: %d ", cType);
                         break;
     }
 }
@@ -4912,8 +4914,105 @@
     }
 cfgEndBox(boxed);
 }
 
+#ifdef USE_BAM
+static char *grayLabels[] =
+    { "alignment quality",
+      "base qualities",
+      "unpaired ends",
+    };
+static char *grayValues[] =
+    { BAM_GRAY_MODE_ALI_QUAL,
+      BAM_GRAY_MODE_BASE_QUAL,
+      BAM_GRAY_MODE_UNPAIRED,
+    };
+
+// When a child input of a radio set is changed, click its radio button:
+#define UPDATE_RADIO_FORMAT "%s=\"\
+    var inputs = document.getElementsByName('%s'); \
+    if (inputs) { \
+      for (var i=0; i < inputs.length; i++) { \
+        if (inputs[i].type == 'radio') { \
+          inputs[i].checked = (inputs[i].value == '%s'); \
+        } \
+      } \
+    }\""
+
+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];
+puts("<BR>");
+printf("<B>Display read names:</B>\n");
+char *tdbShowNames = trackDbSetting(tdb, BAM_SHOW_NAMES);
+safef(cartVarName, sizeof(cartVarName), "%s.%s", name, BAM_SHOW_NAMES);
+cartMakeCheckBox(cart, cartVarName, !sameOk(tdbShowNames, "off"));
+boolean canPair = (trackDbSetting(tdb, BAM_PAIR_ENDS_BY_NAME) != NULL);
+puts("<BR>");
+if (canPair)
+    {
+    printf("<B>Attempt to join paired end reads by name:</B>\n");
+    safef(cartVarName, sizeof(cartVarName), "%s." BAM_PAIR_ENDS_BY_NAME, name);
+    cartMakeCheckBox(cart, cartVarName, TRUE);
+    puts("<BR>");
+    }
+printf("<B>Minimum alignment quality:</B>\n");
+safef(cartVarName, sizeof(cartVarName), "%s." BAM_MIN_ALI_QUAL, name);
+cartMakeIntVar(cart, cartVarName,
+	       atoi(trackDbSettingOrDefault(tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT)), 4);
+puts("<BR>");
+if (isCustomTrack(name))
+    {
+    // Auto-magic baseColor defaults for BAM, same as in hgTracks.c newCustomTrack
+    hashAdd(tdb->settingsHash, BASE_COLOR_USE_SEQUENCE, cloneString("lfExtra"));
+    hashAdd(tdb->settingsHash, BASE_COLOR_DEFAULT, cloneString("diffBases"));
+    hashAdd(tdb->settingsHash, SHOW_DIFF_BASES_ALL_SCALES, cloneString("."));
+    hashAdd(tdb->settingsHash, "showDiffBasesMaxZoom", cloneString("100"));
+    }
+baseColorDrawOptDropDown(cart, tdb);
+printf("<BR>\n");
+printf("<B>Additional coloring modes:</B><BR>\n");
+safef(cartVarName, sizeof(cartVarName), "%s." BAM_COLOR_MODE, name);
+char *selected = cartUsualString(cart, cartVarName,
+				 trackDbSettingOrDefault(tdb, BAM_COLOR_MODE, BAM_COLOR_MODE_DEFAULT));
+cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_STRAND, sameString(selected, BAM_COLOR_MODE_STRAND));
+printf("Color by strand (blue for +, red for -)<BR>\n");
+cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_GRAY, sameString(selected, BAM_COLOR_MODE_GRAY));
+printf("Use gray for\n");
+char cartVarName2[1024];
+safef(cartVarName2, sizeof(cartVarName2), "%s." BAM_GRAY_MODE, name);
+int grayMenuSize = canPair ? ArraySize(grayLabels) : ArraySize(grayLabels)-1;
+char *sel2 = cartUsualString(cart, cartVarName2,
+			     trackDbSettingOrDefault(tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT));
+char onChange[2048];
+safef(onChange, sizeof(onChange), UPDATE_RADIO_FORMAT,
+      "onChange", cartVarName, BAM_COLOR_MODE_GRAY);
+cgiMakeDropListFull(cartVarName2, grayLabels, grayValues, grayMenuSize, sel2, onChange);
+printf("<BR>\n");
+cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_TAG, sameString(selected, BAM_COLOR_MODE_TAG));
+printf("Use R,G,B colors specified in user-defined tag ");
+safef(cartVarName2, sizeof(cartVarName2), "%s." BAM_COLOR_TAG, name);
+sel2 = cartUsualString(cart, cartVarName2,
+		       trackDbSettingOrDefault(tdb, BAM_COLOR_TAG, BAM_COLOR_TAG_DEFAULT));
+safef(onChange, sizeof(onChange), UPDATE_RADIO_FORMAT,
+      "onkeypress", cartVarName, BAM_COLOR_MODE_TAG);
+cgiMakeTextVarWithExtraHtml(cartVarName2, sel2, 30, onChange);
+printf("<BR>\n");
+cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_OFF, sameString(selected, BAM_COLOR_MODE_OFF));
+printf("No additional coloring<BR>\n");
+
+//TODO: include / exclude flags
+
+if (fileExists(hHelpFile("hgBamTrackHelp")))
+    printf("<P><A HREF=\"../goldenPath/help/hgBamTrackHelp.html\" TARGET=_BLANK>BAM "
+	   "configuration help</A></P>");
+
+cfgEndBox(boxed);
+}
+#endif//def USE_BAM
+
 struct trackDb *rFindViewInList(struct trackDb *tdbList, char *view)
 /* Return the trackDb on the list (or on any children of the list) that has matching view tag. */
 {
 struct trackDb *tdb;