d5a9a15796cc24fd3dc96e9eee982f8a2122de7d
tdreszer
Fri Oct 29 14:46:16 2010 -0700
Fixed problem with bam views. This fix extended to psl and genePred views which would also have had problems. This code also cleans up bam cfg spacing and adds links to selected cv.ra terms found in the '...' metadata table
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index fc833a9..c33cfce 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -35,31 +35,31 @@
//#define PM_BUTTON "\n"
//#define DEF_BUTTON "
\n"
//#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) printf(DEF_BUTTON,(anc),(anc),(nameOrId), (beg),(contains),(nameOrId),(beg),(contains),(anc),"defaults_sm.png","default")
//#define PLUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (anc),(anc),(nameOrId),"true", (beg),(contains),(anc),"add_sm.gif", "+")
//#define MINUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (anc),(anc),(nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-")
#define PM_BUTTON "
\n"
#define DEF_BUTTON "
\n"
#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) printf(DEF_BUTTON,(nameOrId), (beg),(contains),(nameOrId),(beg),(contains),(anc),"defaults_sm.png","default")
#define PLUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (nameOrId),"true", (beg),(contains),(anc),"add_sm.gif", "+")
#define MINUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-")
#define ENCODE_DCC_DOWNLOADS "encodeDCC"
//#define SUBTRACK_CFG_POPUP
-//#define BAM_CFG_UI_CHANGES
+#define BAM_CFG_UI_CHANGES
struct trackDb *wgEncodeDownloadDirKeeper(char *db, struct trackDb *tdb, struct hash *trackHash)
/* Look up through self and parents, looking for someone responsible for handling
* where the downloads are. */
{
if (!sameString(tdb->table, tdb->track))
{
tdb = hashFindVal(trackHash, tdb->table);
if (tdb == NULL)
errAbort("Can't find track for table %s in wgEncodeDownloadDirKeeper", tdb->table);
}
return trackDbTopLevelSelfOrParent(tdb);
}
static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb,char *name,boolean nameIsFile,
@@ -119,65 +119,113 @@
if (hTableOrSplitExists(db, tdb->table))
{
char *tbOff = trackDbSetting(tdb, "tableBrowser");
if (isNotEmpty(tbOff) && sameString(nextWord(&tbOff), "off"))
return FALSE;
char *hint = " title='Open table schema in new window'";
if( label == NULL)
label = " View table schema";
struct trackDb *topLevel = trackDbTopLevelSelfOrParent(tdb);
printf(SCHEMA_LINKED, db, topLevel->grp, topLevel->track, tdb->table, hint, label);
return TRUE;
}
return FALSE;
}
+char *controlledVocabLink(char *file,char *term,char *value,char *title, char *label,char *suffix)
+// returns allocated string of HTML link to controlled vocabulary term
+{
+#define VOCAB_LINK "%s"
+char *encFile = cgiEncode(file);
+char *encTerm = cgiEncode(term);
+char *encValue = cgiEncode(value);
+struct dyString *dyLink = dyStringCreate(VOCAB_LINK,encFile,encTerm,encValue,title,label);
+if (suffix != NULL)
+ dyStringAppend(dyLink,suffix); // Don't encode since this may contain HTML
+
+freeMem(encFile);
+freeMem(encTerm);
+freeMem(encValue);
+return dyStringCannibalize(&dyLink);
+}
+
char *metadataAsHtmlTable(char *db,struct trackDb *tdb,boolean showLongLabel,boolean showShortLabel, struct hash *trackHash)
/* If metadata from metaDb exists, return string of html with table definition */
{
const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL);
if (safeObj == NULL || safeObj->vars == NULL)
return NULL;
//struct dyString *dyTable = dyStringCreate("
%s | |
shortLabel: | %s |
%s: | ",mdbVar->var); dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, mdbVar->val, TRUE, trackHash)); dyStringAppend(dyTable," |
%s: | %s |
%s: | %s |
Color track by codons or bases:");
cgiMakeDropListFull(var, baseColorDrawAllOptionLabels,
baseColorDrawAllOptionValues,
ArraySize(baseColorDrawAllOptionLabels),
curValue, NULL);
#ifndef BAM_CFG_UI_CHANGES
printf("
");
#endif///ndef BAM_CFG_UI_CHANGES
printf("Help on mRNA coloring
",
CDS_MRNA_HELP_PAGE);
}
@@ -997,162 +1045,176 @@
cgiMakeDropListFull(var, baseColorDrawItemOptionLabels,
baseColorDrawItemOptionValues,
ArraySize(baseColorDrawItemOptionLabels),
curValue, NULL);
#ifndef BAM_CFG_UI_CHANGES
printf("
");
#endif///ndef BAM_CFG_UI_CHANGES
printf("Help on base coloring
",
CDS_BASE_HELP_PAGE);
}
}
void baseColorDrawOptDropDown(struct cart *cart, struct trackDb *tdb)
/* Make appropriately labeled drop down of options if any are applicable.*/
{
-baseColorDropLists(cart, tdb);
+baseColorDropLists(cart, tdb, tdb->track);
}
enum baseColorDrawOpt baseColorDrawOptEnabled(struct cart *cart,
struct trackDb *tdb)
/* Query cart & trackDb to determine what drawing mode (if any) is enabled. */
{
char *stringVal = NULL;
assert(cart);
assert(tdb);
/* trackDb can override default of OFF; cart can override trackDb. */
stringVal = trackDbSettingClosestToHomeOrDefault(tdb, BASE_COLOR_DEFAULT,
BASE_COLOR_DRAW_OFF);
stringVal = cartUsualStringClosestToHome(cart, tdb, FALSE, BASE_COLOR_VAR_SUFFIX,stringVal);
return baseColorDrawOptStringToEnum(stringVal);
}
/*** Control of fancy indel display code: ***/
+static boolean tdbOrCartBoolean(struct cart *cart, struct trackDb *tdb,
+ char *settingName, char *defaultOnOff)
+/* Query cart & trackDb to determine if a boolean variable is set. */
+{
+boolean alreadySet;
+alreadySet = !sameString("off",trackDbSettingOrDefault(tdb, settingName, defaultOnOff));
+alreadySet = cartUsualBooleanClosestToHome(cart, tdb, FALSE, settingName, alreadySet); // NOTE: compositeLevel=FALSE because tdb param already is at appropriate level
+return alreadySet;
+}
+
static boolean indelAppropriate(struct trackDb *tdb)
/* Return true if it makes sense to offer indel display options for tdb. */
{
return (tdb && (startsWith("psl", tdb->type) || sameString("bam", tdb->type)) &&
(cfgOptionDefault("browser.indelOptions", NULL) != NULL));
}
-void indelShowOptions(struct cart *cart, struct trackDb *tdb)
+static void indelEnabledByName(struct cart *cart, struct trackDb *tdb, char *name,
+ float basesPerPixel, boolean *retDoubleInsert, boolean *retQueryInsert,
+ boolean *retPolyA)
+/* Query cart & trackDb to determine what indel display (if any) is enabled. Set
+ * basesPerPixel to 0.0 to disable check for zoom level. */
+{
+struct trackDb *tdbLevel = tdb;
+if (differentString(tdb->track, name) && tdb->parent != NULL)
+ tdbLevel = tdb->parent;
+
+boolean apropos = indelAppropriate(tdb);
+if (apropos && (basesPerPixel > 0.0))
+ {
+ // check indel max zoom
+ float showIndelMaxZoom = trackDbFloatSettingOrDefault(tdbLevel, "showIndelMaxZoom", -1.0);
+ if ((showIndelMaxZoom >= 0)
+ && ((basesPerPixel > showIndelMaxZoom) || (showIndelMaxZoom == 0.0)))
+ apropos = FALSE;
+ }
+
+if (retDoubleInsert)
+ *retDoubleInsert = apropos &&
+ tdbOrCartBoolean(cart, tdbLevel, INDEL_DOUBLE_INSERT, "off");
+if (retQueryInsert)
+ *retQueryInsert = apropos &&
+ tdbOrCartBoolean(cart, tdbLevel, INDEL_QUERY_INSERT, "off");
+if (retPolyA)
+ *retPolyA = apropos &&
+ tdbOrCartBoolean(cart, tdbLevel, INDEL_POLY_A, "off");
+}
+
+void indelEnabled(struct cart *cart, struct trackDb *tdb, float basesPerPixel,
+ boolean *retDoubleInsert, boolean *retQueryInsert,
+ boolean *retPolyA)
+/* Query cart & trackDb to determine what indel display (if any) is enabled. Set
+ * basesPerPixel to 0.0 to disable check for zoom level. */
+{
+indelEnabledByName(cart,tdb,tdb->track,basesPerPixel,retDoubleInsert,retQueryInsert,retPolyA);
+}
+
+static void indelShowOptionsWithName(struct cart *cart, struct trackDb *tdb,char *name)
/* Make HTML inputs for indel display options if any are applicable. */
{
if (indelAppropriate(tdb))
{
boolean showDoubleInsert, showQueryInsert, showPolyA;
char var[512];
- indelEnabled(cart, tdb, 0.0, &showDoubleInsert, &showQueryInsert, &showPolyA);
+ indelEnabledByName(cart, tdb, name, 0.0, &showDoubleInsert, &showQueryInsert, &showPolyA);
#ifdef BAM_CFG_UI_CHANGES
printf("
Alignment Gap/Insertion Display Options"); printf(" Help on display options\n | |
", INDEL_HELP_PAGE); - safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, name); cgiMakeCheckBox(var, showDoubleInsert); printf(" | Draw double horizontal lines when both genome and query have " "an insertion |
"); - safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, name); cgiMakeCheckBox(var, showQueryInsert); printf(" | Draw a vertical purple line for an insertion at the beginning or "
"end of the query, orange for insertion in the middle of the query |
"); - safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, name); /* We can highlight valid polyA's only if we have query sequence -- * so indelPolyA code piggiebacks on baseColor code: */ if (baseColorGotSequence(tdb)) { cgiMakeCheckBox(var, showPolyA); printf(" | Draw a vertical green line where query has a polyA tail " "insertion |
Alignment Gap/Insertion Display Options
\n");
- safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, tdb->track);
+ safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, name);
cgiMakeCheckBox(var, showDoubleInsert);
printf("Draw double horizontal lines when both genome and query have "
"an insertion "
"
\n");
- safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, tdb->track);
+ safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, name);
cgiMakeCheckBox(var, showQueryInsert);
printf("Draw a vertical purple line for an insertion at the beginning or "
"end of the query, orange for insertion in the middle of the query"
"
\n");
- safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, tdb->track);
+ safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, name);
/* We can highlight valid polyA's only if we have query sequence --
* so indelPolyA code piggiebacks on baseColor code: */
if (baseColorGotSequence(tdb))
{
cgiMakeCheckBox(var, showPolyA);
printf("Draw a vertical green line where query has a polyA tail "
"insertion"
"
\n");
}
printf("Help on alignment gap/insertion display options"
"
\n",
INDEL_HELP_PAGE);
#endif///ndef BAM_CFG_UI_CHANGES
}
}
-static boolean tdbOrCartBoolean(struct cart *cart, struct trackDb *tdb,
- char *settingName, char *defaultOnOff)
-/* Query cart & trackDb to determine if a boolean variable is set. */
-{
-boolean alreadySet;
-char optionStr[512];
-alreadySet = !sameString("off",
- trackDbSettingOrDefault(tdb, settingName, defaultOnOff));
-safef(optionStr, sizeof(optionStr), "%s_%s",
- settingName, tdb->track);
-alreadySet = cartUsualBoolean(cart, optionStr, alreadySet);
-return alreadySet;
-}
-
-void indelEnabled(struct cart *cart, struct trackDb *tdb, float basesPerPixel,
- boolean *retDoubleInsert, boolean *retQueryInsert,
- boolean *retPolyA)
-/* Query cart & trackDb to determine what indel display (if any) is enabled. Set
- * basesPerPixel to 0.0 to disable check for zoom level. */
-{
-boolean apropos = indelAppropriate(tdb);
-if (apropos && (basesPerPixel > 0.0))
+void indelShowOptions(struct cart *cart, struct trackDb *tdb)
+/* Make HTML inputs for indel display options if any are applicable. */
{
- // check indel max zoom
- float showIndelMaxZoom = trackDbFloatSettingOrDefault(tdb, "showIndelMaxZoom", -1.0);
- if ((showIndelMaxZoom >= 0)
- && ((basesPerPixel > showIndelMaxZoom) || (showIndelMaxZoom == 0.0)))
- apropos = FALSE;
- }
-
-if (retDoubleInsert)
- *retDoubleInsert = apropos &&
- tdbOrCartBoolean(cart, tdb, INDEL_DOUBLE_INSERT, "off");
-if (retQueryInsert)
- *retQueryInsert = apropos &&
- tdbOrCartBoolean(cart, tdb, INDEL_QUERY_INSERT, "off");
-if (retPolyA)
- *retPolyA = apropos &&
- tdbOrCartBoolean(cart, tdb, INDEL_POLY_A, "off");
+indelShowOptionsWithName(cart, tdb, tdb->track);
}
-
/****** base position (ruler) controls *******/
static char *zoomOptions[] = {
ZOOM_1PT5X,
ZOOM_3X,
ZOOM_10X,
ZOOM_BASE
};
void zoomRadioButtons(char *var, char *curVal)
/* Make a list of radio buttons for all zoom options */
{
int i;
int size = ArraySize(zoomOptions);
for (i = 0; i < size; i++)
@@ -4537,36 +4599,36 @@
cgiMakeCheckBox(option, doScoreCtFilter);
safef(option, sizeof(option), "%s.filterTopScorersCt", name);
scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, compositeLevel, "filterTopScorersCt", words[1]);
puts(" Show only items in top-scoring ");
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))
printf(" (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table));
else
printf(" (range: 1 to 100,000)\n");
}
cfgEndBox(boxed);
}
-void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed)
+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);
-baseColorDropLists(cart, tdb);
-indelShowOptions(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);
enum netColorEnum netColor = netFetchColorOption(cart, tdb, compositeLevel);
char optString[256]; /* our option strings here */
safef(optString, ArraySize(optString), "%s.%s", prefix, NET_COLOR );
@@ -4942,31 +5004,31 @@
printf("%s ", "none");
}
if(trackDbSettingClosestToHomeOn(tdb, "nmdFilter"))
{
boolean nmdDefault = FALSE;
safef(varName, sizeof(varName), "hgt.%s.nmdFilter", name);
nmdDefault = cartUsualBoolean(cart,varName, FALSE); // TODO: var name (hgt prefix) needs changing before ClosesToHome can be used
printf("
Filter out NMD targets.");
cgiMakeCheckBox(varName, nmdDefault);
}
if(!sameString(tdb->track, "tigrGeneIndex")
&& !sameString(tdb->track, "ensGeneNonCoding")
&& !sameString(tdb->track, "encodeGencodeRaceFrags"))
- baseColorDrawOptDropDown(cart, tdb);
+ baseColorDropLists(cart, tdb, name);
filterBy_t *filterBySet = filterBySetGet(tdb,cart,name);
if(filterBySet != NULL)
{
filterBySetCfgUi(tdb,filterBySet);
filterBySetFree(&filterBySet);
}
cfgEndBox(boxed);
}
static boolean isSpeciesOn(struct cart *cart, struct trackDb *tdb, char *species, char *option, int optionSize, boolean defaultState)
/* check the cart to see if species is turned off or on (default is defaultState) */
{
boolean ret = defaultState;
safef(option, optionSize, "%s.%s", tdb->track, species);
@@ -5497,35 +5559,35 @@
printf("Minimum alignment quality:\n");
safef(cartVarName, sizeof(cartVarName), "%s." BAM_MIN_ALI_QUAL, name);
cartMakeIntVar(cart, cartVarName,
atoi(trackDbSettingOrDefault(tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT)), 4);
puts("
");
#endif///ndef BAM_CFG_UI_CHANGES
if (isCustomTrack(name))
{
// Auto-magic baseColor defaults for BAM, same as in hgTracks.c newCustomTrack
hashAdd(tdb->settingsHash, BASE_COLOR_USE_SEQUENCE, cloneString("lfExtra"));
hashAdd(tdb->settingsHash, BASE_COLOR_DEFAULT, cloneString("diffBases"));
hashAdd(tdb->settingsHash, SHOW_DIFF_BASES_ALL_SCALES, cloneString("."));
hashAdd(tdb->settingsHash, "showDiffBasesMaxZoom", cloneString("100"));
}
-baseColorDrawOptDropDown(cart, tdb);
+baseColorDropLists(cart, tdb, name);
#ifdef BAM_CFG_UI_CHANGES
puts("
");
#endif///def BAM_CFG_UI_CHANGES
-indelShowOptions(cart, tdb);
+indelShowOptionsWithName(cart, tdb, name);
printf("
\n");
printf("Additional coloring modes:
\n");
safef(cartVarName, sizeof(cartVarName), "%s." BAM_COLOR_MODE, name);
char *selected = cartUsualString(cart, cartVarName,
trackDbSettingOrDefault(tdb, BAM_COLOR_MODE, BAM_COLOR_MODE_DEFAULT));
cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_STRAND, sameString(selected, BAM_COLOR_MODE_STRAND));
printf("Color by strand (blue for +, red for -)
\n");
cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_GRAY, sameString(selected, BAM_COLOR_MODE_GRAY));
printf("Use gray for\n");
char cartVarName2[1024];
safef(cartVarName2, sizeof(cartVarName2), "%s." BAM_GRAY_MODE, name);
int grayMenuSize = canPair ? ArraySize(grayLabels) : ArraySize(grayLabels)-1;
char *sel2 = cartUsualString(cart, cartVarName2,
trackDbSettingOrDefault(tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT));
char onChange[2048];
@@ -5746,58 +5808,45 @@
(void)metadataForTable(db,childTdb,NULL);
if(vocab == NULL)
return cloneString(label); // No wrapping!
char *words[15];
int count,ix;
boolean found=FALSE;
if((count = chopByWhite(cloneString(vocab), words,15)) <= 1)
return cloneString(label);
char *suffix=NULL;
char *rootLabel = labelRoot(label,&suffix);
for(ix=1;ix"
#define MATRIX_RIGHT_BUTTONS_AFTER 8
#define MATRIX_BOTTOM_BUTTONS_AFTER 20
static void buttonsForAll()