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("&nbsp;&nbsp;(range: %d to %d)", minLimit, maxLimit);
 +        printf("&nbsp;&nbsp;(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("&nbsp; <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("&nbsp; (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table));
-     else
-         printf("&nbsp; (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("&nbsp; <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("&nbsp; (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table));
+         else
+             printf("&nbsp; (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:&nbsp;</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:&nbsp;</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:&nbsp;</b>");
      chainColorDropDown(optString, chainColorEnumToString(chainColor));
      }
  else
      {
      printf("<p><b>Color track based on chromosome:</b>&nbsp;");