3fbac7335e8422a13de52910b6099fa5ad29ccb0 Merge parents 582ef61 748aa2c tdreszer Mon Oct 31 15:42:22 2011 -0700 Merge mixup mashup diff --cc src/hg/lib/hui.c index 32c4656,0a07852..f9e10a4 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@@ -4911,265 -4779,199 +4911,270 @@@ freeMem(field); field = strchr(foundLabel,']'); if (field == NULL) field = cloneString(foundLabel); else field = cloneString(field + 1); strSwapChar(field,'_',' '); } } char label[128]; safef(label,sizeof(label),"Minimum %s",field); freeMem(field); // Determine floating point or integer char *setting = trackDbSetting(tdb, filter->name); boolean isFloat = (strchr(setting,'.') != NULL); - showScoreFilter(cart,tdb,opened,boxed,compositeLevel,name,title,label,filter->name,isFloat); + showScoreFilter(cart,tdb,opened,boxed,viewLevel,name,title,label,filter->name,isFloat); count++; } slNameFree(&filter); } } if (count > 0) puts("</TABLE>"); return count; } -#endif///def ALL_SCORE_FILTERS_LOGIC + + +boolean bedScoreHasCfgUi(struct trackDb *tdb) +// Confirms that this track has a bedScore Cfg UI +{ +// Assumes that cfgType == cfgBedScore +if (trackDbSettingClosestToHome(tdb, FILTER_BY)) + return TRUE; +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 + { + 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 */ { char option[256]; -boolean compositeLevel = isNameAtCompositeLevel(tdb,name); +boolean viewLevel = isNameAtCompositeLevel(tdb,name); boolean skipScoreFilter = FALSE; - filterBy_t *filterBySet = filterBySetGet(tdb,cart,name); + boolean bigBed = startsWith("bigBed",tdb->type); - // Numeric filters are first - boolean isBoxOpened = FALSE; - if (numericFiltersShowAll(cart, tdb, &isBoxOpened, boxed, viewLevel, name, title) > 0) - skipScoreFilter = TRUE; - - // Add any multi-selects next - if(filterBySet != NULL) + if (!bigBed) // bigBed filters are limited! { - 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>"); - filterBySetCfgUi(cart,tdb,filterBySet,TRUE); - filterBySetFree(&filterBySet); - skipScoreFilter = TRUE; - } - filterBy_t *filterBySet = filterBySetGet(tdb,cart,name); - - #ifdef ALL_SCORE_FILTERS_LOGIC + // Numeric filters are first + boolean isBoxOpened = FALSE; - if (numericFiltersShowAll(cart, tdb, &isBoxOpened, boxed, compositeLevel, name, title) > 0) ++ if (numericFiltersShowAll(cart, tdb, &isBoxOpened, boxed, viewLevel, name, title) > 0) + skipScoreFilter = TRUE; - #endif///def ALL_SCORE_FILTERS_LOGIC - // 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 - if (skipScoreFilter) - { - if (isBoxOpened) - cfgEndBox(boxed); + // Add any multi-selects next + 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>"); - filterBySetCfgUi(tdb,filterBySet,TRUE); ++ filterBySetCfgUi(cart,tdb,filterBySet,TRUE); + filterBySetFree(&filterBySet); + skipScoreFilter = TRUE; + } - return; // Cannot have both '*filter' and 'scoreFilter' + // 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 + if (skipScoreFilter) + { - #ifdef ALL_SCORE_FILTERS_LOGIC + if (isBoxOpened) + cfgEndBox(boxed); - #endif///def ALL_SCORE_FILTERS_LOGIC - - 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,SCORE_FILTER,&minLimit,&maxLimit,&minVal,&maxVal); + getScoreIntRangeFromCart(cart,tdb,viewLevel,SCORE_FILTER,&minLimit,&maxLimit,&minVal,&maxVal); boolean filterByRange = trackDbSettingClosestToHomeOn(tdb, SCORE_FILTER _BY_RANGE); - if (filterByRange) + 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(" (range: %d to %d)", minLimit, maxLimit); + printf(" (range: %d to %d)\n", minLimit, maxLimit); + if (!boxed) + printf("<BR>\n"); } + if (glvlScoreMin) + printf("<BR>"); } if (glvlScoreMin) scoreGrayLevelCfgUi(cart, tdb, name, maxScore); - /* 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> */ - char *words[2]; - char *scoreFilterCt = NULL; - chopLine(cloneString(scoreCtString), words); - safef(option, sizeof(option), "%s.filterTopScorersOn", name); - bool doScoreCtFilter = - cartUsualBooleanClosestToHome(cart, tdb, viewLevel, "filterTopScorersOn", sameString(words[0], "on")); - puts("<P>"); - cgiMakeCheckBox(option, doScoreCtFilter); - safef(option, sizeof(option), "%s.filterTopScorersCt", name); - scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, viewLevel, "filterTopScorersCt", words[1]); - - puts(" <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 */ - if ( !viewLevel && hTableExists(db, tdb->table)) - printf(" (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table)); - else - printf(" (range: 1 to 100,000)\n"); + if (!bigBed) + { + /* 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> */ + char *words[2]; + char *scoreFilterCt = NULL; + chopLine(cloneString(scoreCtString), words); + safef(option, sizeof(option), "%s.filterTopScorersOn", name); + bool doScoreCtFilter = - cartUsualBooleanClosestToHome(cart, tdb, compositeLevel, "filterTopScorersOn", sameString(words[0], "on")); ++ cartUsualBooleanClosestToHome(cart, tdb, viewLevel, "filterTopScorersOn", sameString(words[0], "on")); + puts("<P>"); + cgiMakeCheckBox(option, doScoreCtFilter); + safef(option, sizeof(option), "%s.filterTopScorersCt", name); - scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, compositeLevel, "filterTopScorersCt", words[1]); ++ scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, viewLevel, "filterTopScorersCt", words[1]); + + puts(" <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 */ - if ( !compositeLevel && hTableExists(db, tdb->table)) ++ if ( !viewLevel && hTableExists(db, tdb->table)) + printf(" (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table)); + else + printf(" (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 = ""; + +printf("<p><b>Filter by chromosome (e.g. chr10):</b> "); +snprintf(filterVar, sizeof(filterVar), "%s.chromFilter", tdb->track); +filterSetting = cartUsualString(cart, filterVar, filterVal); +cgiMakeTextVar(filterVar, cartUsualString(cart, filterVar, ""), 15); +} + +// Moved from hgTrackUi for consistency +void crossSpeciesCfgUi(struct cart *cart, struct trackDb *tdb) +// Put up UI for selecting rainbow chromosome color or intensity score. +{ +char colorVar[256]; +char *colorSetting; +// 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) /* 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) /* Put up UI for net tracks */ { boxed = cfgBeginBoxAndTitle(tdb, boxed, title); -boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix); +boolean viewLevel = isNameAtCompositeLevel(tdb,prefix); -enum netColorEnum netColor = netFetchColorOption(cart, tdb, compositeLevel); +enum netColorEnum netColor = netFetchColorOption(cart, tdb, viewLevel); char optString[256]; /* our option strings here */ safef(optString, ArraySize(optString), "%s.%s", prefix, NET_COLOR ); printf("<p><b>Color nets by: </b>"); netColorDropDown(optString, netColorEnumToString(netColor)); #ifdef NOT_YET -enum netLevelEnum netLevel = netFetchLevelOption(cart, tdb, compositeLevel); +enum netLevelEnum netLevel = netFetchLevelOption(cart, tdb, viewLevel); safef( optString, ArraySize(optString), "%s.%s", prefix, NET_LEVEL ); printf("<p><b>Limit display of nets to: </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) /* Put up UI for chain tracks */ { boxed = cfgBeginBoxAndTitle(tdb, boxed, title); -boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix); +boolean viewLevel = isNameAtCompositeLevel(tdb,prefix); enum chainColorEnum chainColor = - chainFetchColorOption(cart, tdb, compositeLevel); + chainFetchColorOption(cart, tdb, viewLevel); /* 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: </b>"); chainColorDropDown(optString, chainColorEnumToString(chainColor)); } else { printf("<p><b>Color track based on chromosome:</b> ");