007cb48e6924935c046a7a0d0354eeac84e5f6cb angie Wed Oct 5 11:30:12 2011 -0700 Feature #3710 (vcfTabix UI options): added filtering by value of FILTER column. diff --git src/hg/lib/vcfUi.c src/hg/lib/vcfUi.c index 2473e2a..fb16ef3 100644 --- src/hg/lib/vcfUi.c +++ src/hg/lib/vcfUi.c @@ -1,23 +1,24 @@ /* vcfUi - Variant Call Format user interface controls that are shared * between more than one CGI. */ #include "common.h" #include "cheapcgi.h" #include "errCatch.h" #include "hCommon.h" #include "hui.h" +#include "jsHelper.h" #include "vcf.h" #include "vcfUi.h" #if (defined USE_TABIX && defined KNETFILE_HOOKS) #include "knetUdc.h" #include "udc.h" #endif//def USE_TABIX && KNETFILE_HOOKS INLINE char *nameOrDefault(char *thisName, char *defaultVal) /* If thisName is not a placeholder value, return it; otherwise return default. */ { if (isNotEmpty(thisName) && !sameString(thisName, ".")) return thisName; return defaultVal; } @@ -185,63 +186,91 @@ char *name, boolean compositeLevel) /* Let the user specify a height for the track. */ { if (vcff != NULL && vcff->genotypeCount > 1) { printf("Haplotype sorting display height: \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"); } } static void vcfCfgHapCluster(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff, - char *name) + char *name, boolean compositeLevel) /* Show controls for haplotype-sorting display, which only makes sense to do when * the VCF file describes multiple genotypes. */ { -boolean compositeLevel = isNameAtCompositeLevel(tdb, name); 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? -// color haplotypes by red/blue or allele bases? +} + +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("Exclude items with these FILTER settings:
\n"); +char cartVar[512]; +safef(cartVar, sizeof(cartVar), "%s.exclude_filterColumn", 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); + } +struct slName *selectedValues = NULL; +if (cartListVarExists(cart, cartVar)) + 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("", 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); + vcfCfgHapCluster(cart, tdb, vcff, name, compositeLevel); + vcfCfgFilterColumn(cart, tdb, vcff, name, compositeLevel); } else { printf("Sorry, couldn't access VCF file.
\n"); } -// filter: -// by qual column -// by filter column -// color bases like pgSnp or some better palette? - puts(""); if (boxed && fileExists(hHelpFile("hgVcfTrackHelp"))) printf("VCF configuration help"); printf(""); if (!boxed && fileExists(hHelpFile("hgVcfTrackHelp"))) printf("

VCF " "configuration help

"); cfgEndBox(boxed); }