e62655df7abb8c2ab44f5b11798f6f6c731afded angie Wed Oct 5 15:42:05 2011 -0700 Feature #3710 (vcfTabix UI options): added optional filter on min QUAL score. diff --git src/hg/lib/vcfUi.c src/hg/lib/vcfUi.c index fb16ef3..171e5ae 100644 --- src/hg/lib/vcfUi.c +++ src/hg/lib/vcfUi.c @@ -148,33 +148,33 @@ { if (isNotEmpty(errCatch->message->string)) warn("unable to open %s: %s", fileOrUrl, errCatch->message->string); } errCatchFree(&errCatch); return vcff; } static void vcfCfgHapClusterEnable(struct cart *cart, struct trackDb *tdb, char *name, boolean compositeLevel) /* Let the user enable/disable haplotype sorting display. */ { printf("<B>Enable Haplotype sorting display: </B>"); boolean hapClustEnabled = cartUsualBooleanClosestToHome(cart, tdb, compositeLevel, VCF_HAP_ENABLED_VAR, TRUE); -char varName[1024]; -safef(varName, sizeof(varName), "%s." VCF_HAP_ENABLED_VAR, name); -cgiMakeCheckBox(varName, hapClustEnabled); +char cartVar[1024]; +safef(cartVar, sizeof(cartVar), "%s." VCF_HAP_ENABLED_VAR, name); +cgiMakeCheckBox(cartVar, hapClustEnabled); printf("<BR>\n"); } static void vcfCfgHapClusterColor(struct cart *cart, struct trackDb *tdb, char *name, boolean compositeLevel) /* Let the user choose how to color the sorted haplotypes. */ { printf("<B>Color sorted haplotypes by:</B>\n"); char *colorBy = cartUsualStringClosestToHome(cart, tdb, compositeLevel, VCF_HAP_COLORBY_VAR, VCF_HAP_COLORBY_REFALT); boolean colorByRefAlt = sameString(colorBy, VCF_HAP_COLORBY_REFALT); char varName[1024]; safef(varName, sizeof(varName), "%s." VCF_HAP_COLORBY_VAR, name); cgiMakeRadioButton(varName, VCF_HAP_COLORBY_REFALT, colorByRefAlt); printf("reference/alternate alleles (reference = blue, alternate = red)\n"); @@ -198,41 +198,58 @@ } 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? } +static void vcfCfgMinQual(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff, + char *name, boolean compositeLevel) +/* If checkbox is checked, apply minimum value filter to QUAL column. */ +{ +char cartVar[1024]; +safef(cartVar, sizeof(cartVar), "%s." VCF_APPLY_MIN_QUAL_VAR, name); +boolean applyFilter = cartUsualBooleanClosestToHome(cart, tdb, compositeLevel, + VCF_APPLY_MIN_QUAL_VAR, VCF_DEFAULT_APPLY_MIN_QUAL); +cgiMakeCheckBox(cartVar, applyFilter); +printf("<B>Exclude items with QUAL score less than </B>\n"); +double minQual = cartUsualDoubleClosestToHome(cart, tdb, compositeLevel, VCF_MIN_QUAL_VAR, + VCF_DEFAULT_MIN_QUAL); +safef(cartVar, sizeof(cartVar), "%s." VCF_MIN_QUAL_VAR, name); +cgiMakeDoubleVar(cartVar, minQual, 10); +printf("<BR>\n"); +} + static void vcfCfgFilterColumn(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff, char *name, boolean compositeLevel) /* Show controls for filtering by value of VCF's FILTER column, which uses values defined * in the header. */ { int filterCount = slCount(vcff->filterDefs); if (filterCount < 1) return; -printf("<B>Exclude items with these FILTER settings:</B><BR>\n"); -char cartVar[512]; -safef(cartVar, sizeof(cartVar), "%s.exclude_filterColumn", name); +printf("<B>Exclude items with these FILTER values:</B><BR>\n"); +char cartVar[1024]; +safef(cartVar, sizeof(cartVar), "%s."VCF_EXCLUDE_FILTER_VAR, name); jsMakeCheckboxGroupSetClearButton(cartVar, TRUE); puts(" "); jsMakeCheckboxGroupSetClearButton(cartVar, FALSE); char *values[filterCount]; char *labels[filterCount]; int i; struct vcfInfoDef *filt; 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); @@ -242,30 +259,31 @@ selectedValues = cartOptionalSlNameList(cart, cartVar); cgiMakeCheckboxGroupWithVals(cartVar, labels, values, filterCount, selectedValues, 1); } 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); } 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")))