9a49290fedc8b4f9c7a631dedcfe8ac3aa2b4cee
chinhli
  Thu Oct 20 14:10:43 2011 -0700
merge conflict resolved
diff --git src/hg/lib/vcfUi.c src/hg/lib/vcfUi.c
index 171e5ae..04d9c35 100644
--- src/hg/lib/vcfUi.c
+++ src/hg/lib/vcfUi.c
@@ -182,30 +182,31 @@
 printf("first base of allele (A = red, C = blue, G = green, T = magenta)<BR>\n");
 }
 
 static void vcfCfgHapClusterHeight(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff,
 				   char *name, boolean compositeLevel)
 /* Let the user specify a height for the track. */
 {
 if (vcff != NULL && vcff->genotypeCount > 1)
     {
     printf("<B>Haplotype sorting display height:</B> \n");
     int cartHeight = cartUsualIntClosestToHome(cart, tdb, compositeLevel,
 					       VCF_HAP_HEIGHT_VAR, VCF_DEFAULT_HAP_HEIGHT);
     char varName[1024];
     safef(varName, sizeof(varName), "%s." VCF_HAP_HEIGHT_VAR, name);
     cgiMakeIntVarInRange(varName, cartHeight, "Height (in pixels) of track", 5, "10", "2500");
+    puts("<BR>");
     }
 }
 
 static void vcfCfgHapCluster(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff,
 			     char *name, boolean compositeLevel)
 /* Show controls for haplotype-sorting display, which only makes sense to do when
  * the VCF file describes multiple genotypes. */
 {
 vcfCfgHapClusterEnable(cart, tdb, name, compositeLevel);
 vcfCfgHaplotypeCenter(cart, tdb, vcff, NULL, NULL, 0, "mainForm");
 vcfCfgHapClusterColor(cart, tdb, name, compositeLevel);
 vcfCfgHapClusterHeight(cart, tdb, vcff, name, compositeLevel);
 //      thicken lines?
 //      outline center variant?
 }
@@ -248,43 +249,58 @@
 for (i=0, filt=vcff->filterDefs;  filt != NULL;  i++, filt = filt->next)
     {
     values[i] = filt->key;
     struct dyString *dy = dyStringNew(0);
     dyStringAppend(dy, filt->key);
     if (isNotEmpty(filt->description))
 	dyStringPrintf(dy, " (%s)", filt->description);
     labels[i] = dyStringCannibalize(&dy);
     }
 struct slName *selectedValues = NULL;
 if (cartListVarExists(cart, cartVar))
     selectedValues = cartOptionalSlNameList(cart, cartVar);
 cgiMakeCheckboxGroupWithVals(cartVar, labels, values, filterCount, selectedValues, 1);
 }
 
+static void vcfCfgMinAlleleFreq(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff,
+				char *name, boolean compositeLevel)
+/* Show input for minimum allele frequency, if we can extract it from the VCF INFO column. */
+{
+printf("<B>Minimum minor allele frequency (if INFO column includes AF or AC+AN):</B>\n");
+double cartMinFreq = cartUsualDoubleClosestToHome(cart, tdb, compositeLevel,
+					   VCF_MIN_ALLELE_FREQ_VAR, VCF_DEFAULT_MIN_ALLELE_FREQ);
+char varName[1024];
+safef(varName, sizeof(varName), "%s." VCF_MIN_ALLELE_FREQ_VAR, name);
+cgiMakeDoubleVarInRange(varName, cartMinFreq, "minor allele frequency between 0.0 and 0.5", 5,
+			"0.0", "0.5");
+puts("<BR>");
+}
+
 void vcfCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
 /* VCF: Variant Call Format.  redmine #3710 */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 printf("<TABLE%s><TR><TD>", boxed ? " width='100%'" : "");
 struct vcfFile *vcff = vcfHopefullyOpenHeader(cart, tdb);
 if (vcff != NULL)
     {
     boolean compositeLevel = isNameAtCompositeLevel(tdb, name);
     if (vcff->genotypeCount > 1)
 	vcfCfgHapCluster(cart, tdb, vcff, name, compositeLevel);
     vcfCfgMinQual(cart, tdb, vcff, name, compositeLevel);
     vcfCfgFilterColumn(cart, tdb, vcff, name, compositeLevel);
+    vcfCfgMinAlleleFreq(cart, tdb, vcff, name, compositeLevel);
     }
 else
     {
     printf("Sorry, couldn't access VCF file.<BR>\n");
     }
 
 puts("</TD>");
 if (boxed && fileExists(hHelpFile("hgVcfTrackHelp")))
     printf("<TD style='text-align:right'><A HREF=\"../goldenPath/help/hgVcfTrackHelp.html\" "
            "TARGET=_BLANK>VCF configuration help</A></TD>");
 
 printf("</TR></TABLE>");
 
 if (!boxed && fileExists(hHelpFile("hgVcfTrackHelp")))
     printf("<P><A HREF=\"../goldenPath/help/hgVcfTrackHelp.html\" TARGET=_BLANK>VCF "