7bc24686024ec14d351ab208b5179ab251d7c463
tdreszer
Fri Oct 14 16:34:15 2011 -0700
Major work on bedFilt, psl and wigMaf to make them properly composite ready.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index d62ee79..5641573 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -1112,31 +1112,31 @@
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
+alreadySet = cartUsualBooleanClosestToHome(cart, tdb, FALSE, settingName, alreadySet); // NOTE: viewLevel=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));
}
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. */
@@ -1769,63 +1769,59 @@
void chimpDropDown(char *var, char *curVal)
/* Make drop down of options. */
{
cgiMakeDropList(var, chimpOptions, ArraySize(chimpOptions),
curVal);
}
/****** Some stuff for mRNA and EST related controls *******/
static void addMrnaFilter(struct mrnaUiData *mud, char *track, char *label, char *key, char *table)
/* Add an mrna filter */
{
struct mrnaFilter *fil;
-char buf[128];
AllocVar(fil);
fil->label = label;
-safef(buf, sizeof(buf), "%s_%s", track, key);
-fil->key = cloneString(buf);
+fil->suffix = cloneString(key);
fil->table = table;
slAddTail(&mud->filterList, fil);
}
-struct mrnaUiData *newBedUiData(char *track)
+static struct mrnaUiData *newEmptyMrnaUiData(char *track)
/* Make a new in extra-ui data structure for a bed. */
{
struct mrnaUiData *mud;
-char buf[128]; /* Expand me here */
AllocVar(mud);
-safef(buf, sizeof(buf), "%sFt", track);
-mud->filterTypeVar = cloneString(buf);
-safef(buf, sizeof(buf), "%sLt", track);
-mud->logicTypeVar = cloneString(buf);
+mud->filterTypeSuffix = cloneString("Ft");
+mud->logicTypeSuffix = cloneString("Lt");
+return mud;
+}
+
+struct mrnaUiData *newBedUiData(char *track)
+/* Make a new in extra-ui data structure for a bed. */
+{
+struct mrnaUiData *mud = newEmptyMrnaUiData(track);
addMrnaFilter(mud, track, "name", "name",track);
return mud;
}
struct mrnaUiData *newMrnaUiData(char *track, boolean isXeno)
/* Make a new in extra-ui data structure for mRNA. */
{
-struct mrnaUiData *mud;
-char buf[128];
-AllocVar(mud);
-safef(buf, sizeof(buf), "%sFt", track);
-mud->filterTypeVar = cloneString(buf);
-safef(buf, sizeof(buf), "%sLt", track);
-mud->logicTypeVar = cloneString(buf);
+struct mrnaUiData *mud = newEmptyMrnaUiData(track);
if (isXeno)
addMrnaFilter(mud, track, "organism", "org", "organism");
addMrnaFilter(mud, track, "accession", "acc", "acc");
addMrnaFilter(mud, track, "author", "aut", "author");
addMrnaFilter(mud, track, "library", "lib", "library");
addMrnaFilter(mud, track, "tissue", "tis", "tissue");
addMrnaFilter(mud, track, "cell", "cel", "cell");
addMrnaFilter(mud, track, "keyword", "key", "keyword");
addMrnaFilter(mud, track, "gene", "gen", "geneName");
addMrnaFilter(mud, track, "product", "pro", "productName");
addMrnaFilter(mud, track, "description", "des", "description");
return mud;
}
int trackNameAndLabelCmp(const void *va, const void *vb)
@@ -3326,32 +3322,32 @@
errAbort("filterBy values either all have labels (as value|label) or none do.");
*chipper++ = 0; // The label is found inside the filters->svValues as the next string
strSwapChar(chipper,'_',' '); // Title does not have underscores
}
else if (filterBy->valueAndLabel)
errAbort("filterBy values either all have labels in form of value|label or none do.");
}
}
slAddTail(&filterBySet,filterBy); // Keep them in order (only a few)
if(cart != NULL)
{
char suffix[256];
safef(suffix, sizeof(suffix), "filterBy.%s", filterBy->column);
- boolean compositeLevel = isNameAtCompositeLevel(tdb,name);
- if(cartLookUpVariableClosestToHome(cart,tdb,compositeLevel,suffix,&(filterBy->htmlName)))
+ boolean viewLevel = isNameAtCompositeLevel(tdb,name);
+ if(cartLookUpVariableClosestToHome(cart,tdb,viewLevel,suffix,&(filterBy->htmlName)))
filterBy->slChoices = cartOptionalSlNameList(cart,filterBy->htmlName);
}
if(filterBy->htmlName == NULL)
{
int len = strlen(name) + strlen(filterBy->column) + 15;
filterBy->htmlName = needMem(len);
safef(filterBy->htmlName, len, "%s.filterBy.%s", name,filterBy->column);
}
}
freeMem(setting);
return filterBySet;
}
void filterBySetFree(filterBy_t **filterBySet)
@@ -3718,61 +3714,60 @@
{
#ifdef SUBTRACK_CFG
// When only one subtrack, then show it's cfg settings instead of composite/view level settings
// This simplifies the UI where hgTrackUi won't have 2 levels of cfg,
// while hgTracks still supports rightClick cfg of the subtrack.
if (configurableByAjax(tdb,cType) > 0) // Only if subtrack's configurable by ajax do we consider this option
{
if (tdbIsComposite(tdb) // called for the composite
&& !tdbIsCompositeView(tdb->subtracks) // and there is no view level
&& slCount(tdb->subtracks) == 1) // and there is only one subtrack
{
//warn("What do you mean by having a composite (%s) with only one subtrack (%s) ???",tdb->track,tdb->subtracks->track);
tdb = tdb->subtracks; // show subtrack cfg instead
prefix = tdb->track;
}
- else if (tdb->parent != NULL
+ else if (tdb->parent != NULL // called with subtrack (tdb is never a view)
&& tdbIsCompositeView(tdb->parent) // subtrack has view
- && differentString(prefix,tdb->track) // and this has been called for the view
- && slCount(tdb->parent->subtracks) == 1) // and there is only one subtrack
+ && differentString(prefix,tdb->track) // and this has been called FOR the view
+ && slCount(tdb->parent->subtracks) == 1) // and view has only one subtrack
prefix = tdb->track; // removes reference to view level
}
#endif///def SUBTRACK_CFG
switch(cType)
{
case cfgBedScore:
{
char *scoreMax = trackDbSettingClosestToHome(tdb, SCORE_FILTER _MAX);
int maxScore = (scoreMax ? sqlUnsigned(scoreMax):1000);
scoreCfgUi(db, cart,tdb,prefix,title,maxScore,boxed);
}
break;
case cfgPeak:
encodePeakCfgUi(cart,tdb,prefix,title,boxed);
break;
case cfgWig: wigCfgUi(cart,tdb,prefix,title,boxed);
break;
- case cfgWigMaf: // NOTE: wigMaf is using non-standard view level naming methods so isn't configurable by ajax
- wigMafCfgUi(cart,tdb,prefix,title,boxed, db);
+ case cfgWigMaf: wigMafCfgUi(cart,tdb,prefix,title,boxed, db);
break;
case cfgGenePred: genePredCfgUi(cart,tdb,prefix,title,boxed);
break;
case cfgChain: chainCfgUi(db,cart,tdb,prefix,title,boxed, NULL);
break;
case cfgNetAlign: netAlignCfgUi(db,cart,tdb,prefix,title,boxed);
break;
- case cfgBedFilt: bedUi(tdb,cart,title, boxed);
+ case cfgBedFilt: bedFiltCfgUi(cart,tdb,prefix,title, boxed);
break;
#ifdef USE_BAM
case cfgBam: bamCfgUi(cart, tdb, prefix, title, boxed);
break;
#endif
case cfgVcf: vcfCfgUi(cart, tdb, prefix, title, boxed);
break;
case cfgPsl: pslCfgUi(db,cart,tdb,prefix,title,boxed);
break;
default: warn("Track type is not known to multi-view composites. type is: %d ", cType);
break;
}
}
char *encodeRestrictionDate(char *db,struct trackDb *trackDb,boolean excludePast)
@@ -4505,77 +4500,119 @@
radioButton(filterTypeVar, filterTypeVal, "green");
radioButton(filterTypeVar, filterTypeVal, "blue");
radioButton(filterTypeVar, filterTypeVal, "exclude");
radioButton(filterTypeVar, filterTypeVal, "include");
if (none)
radioButton(filterTypeVar, filterTypeVal, "none");
}
void radioButton(char *var, char *val, char *ourVal)
/* Print one radio button */
{
cgiMakeRadioButton(var, ourVal, sameString(ourVal, val));
printf("%s ", ourVal);
}
-void oneMrnaFilterUi(struct controlGrid *cg, char *text, char *var, struct cart *cart)
+void oneMrnaFilterUi(struct controlGrid *cg, struct trackDb *tdb, char *text, char *var, char *suffix, struct cart *cart)
/* Print out user interface for one type of mrna filter. */
{
controlGridStartCell(cg);
printf("%s: ", text);
-cgiMakeTextVar(var, cartUsualString(cart, var, ""), 19);
+boolean viewLevel = isNameAtCompositeLevel(tdb,var);
+cgiMakeTextVar(var, cartUsualStringClosestToHome(cart, tdb, viewLevel,suffix, ""), 19);
controlGridEndCell(cg);
}
-void bedUi(struct trackDb *tdb, struct cart *cart, char *title, boolean boxed)
-/* Put up UI for an mRNA (or EST) track. */
+void bedFiltCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed)
+/* Put up UI for an "bedFilter" tracks. */
{
-struct mrnaUiData *mud = newBedUiData(tdb->track);
+struct mrnaUiData *mud = newBedUiData(prefix);
struct mrnaFilter *fil;
struct controlGrid *cg = NULL;
-char *filterTypeVar = mud->filterTypeVar;
-char *filterTypeVal = cartUsualString(cart, filterTypeVar, "red");
+boolean viewLevel = isNameAtCompositeLevel(tdb,prefix);
+char *filterTypeVal = cartUsualStringClosestToHome(cart, tdb, viewLevel, mud->filterTypeSuffix, "red");
boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
/* Define type of filter. */
printf("
\n");
-filterButtons(filterTypeVar, filterTypeVal, FALSE);
+char buffer[256];
+safef(buffer, sizeof buffer,"%s.%s",prefix,mud->filterTypeSuffix);
+filterButtons(buffer, filterTypeVal, FALSE);
printf("");
/* List various fields you can filter on. */
cg = startControlGrid(4, NULL);
for (fil = mud->filterList; fil != NULL; fil = fil->next)
- oneMrnaFilterUi(cg, fil->label, fil->key, cart);
+ {
+ safef(buffer, sizeof buffer,"%s.%s",prefix,fil->suffix);
+ oneMrnaFilterUi(cg, tdb, fil->label, buffer, fil->suffix, cart);
+ }
endControlGrid(&cg);
cfgEndBox(boxed);
}
+void mrnaCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed)
+/* Put up UI for an mRNA (or EST) track. */
+{
+boolean isXeno = (sameString(tdb->track, "xenoMrna") || sameString(tdb->track, "xenoEst"));
+struct mrnaUiData *mud = newMrnaUiData(prefix, isXeno);
+struct mrnaFilter *fil;
+struct controlGrid *cg = NULL;
+boolean viewLevel = isNameAtCompositeLevel(tdb,prefix);
+char *filterTypeVal = cartUsualStringClosestToHome(cart, tdb, viewLevel, mud->filterTypeSuffix,"red");
+char *logicTypeVal = cartUsualStringClosestToHome(cart, tdb, viewLevel, mud->logicTypeSuffix, "and");
+
+boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
+/* Define type of filter. */
+char buffer[256];
+safef(buffer,sizeof buffer,"%s.%s",prefix,mud->filterTypeSuffix);
+filterButtons(buffer, filterTypeVal, FALSE);
+printf(" Combination Logic: ");
+safef(buffer,sizeof buffer,"%s.%s",prefix,mud->logicTypeSuffix);
+radioButton(buffer, logicTypeVal, "and");
+radioButton(buffer, logicTypeVal, "or");
+printf(" \n");
+
+/* List various fields you can filter on. */
+printf("
\n", CONTROL_TABLE_WIDTH);
+cg = startControlGrid(4, NULL);
+for (fil = mud->filterList; fil != NULL; fil = fil->next)
+ {
+ safef(buffer,sizeof buffer,"%s.%s",prefix,fil->suffix);
+ oneMrnaFilterUi(cg, tdb, fil->label, buffer, fil->suffix, cart);
+ }
+endControlGrid(&cg);
+baseColorDrawOptDropDown(cart, tdb);
+indelShowOptions(cart, tdb);
+cfgEndBox(boxed);
+}
+
void scoreGrayLevelCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix, int scoreMax)
/* If scoreMin has been set, let user select the shade of gray for that score, in case
* the default is too light to see or darker than necessary. */
{
-boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix);
+boolean viewLevel = isNameAtCompositeLevel(tdb,prefix);
char *scoreMinStr = trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN);
if (scoreMinStr != NULL)
{
int scoreMin = atoi(scoreMinStr);
// maxShade=9 taken from hgTracks/simpleTracks.c. Ignore the 10 in shadesOfGray[10+1] --
// maxShade is used to access the array.
int maxShade = 9;
int scoreMinGrayLevel = scoreMin * maxShade/scoreMax;
if (scoreMinGrayLevel <= 0) scoreMinGrayLevel = 1;
char *setting = trackDbSettingClosestToHome(tdb, MIN_GRAY_LEVEL);
- int minGrayLevel = cartUsualIntClosestToHome(cart, tdb, compositeLevel, MIN_GRAY_LEVEL,
+ int minGrayLevel = cartUsualIntClosestToHome(cart, tdb, viewLevel, MIN_GRAY_LEVEL,
setting ? atoi(setting) : scoreMinGrayLevel);
if (minGrayLevel <= 0) minGrayLevel = 1;
if (minGrayLevel > maxShade) minGrayLevel = maxShade;
puts("\nShade of lowest-scoring items: ");
// Add javascript to select so that its color is consistent with option colors:
int level = 255 - (255*minGrayLevel / maxShade);
printf("