src/hg/lib/hui.c 1.198
1.198 2009/05/21 19:00:00 tdreszer
Fixed scoreFilter defaults code and matrix rendering when dimension row/column has no accociated subtrack
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.197
retrieving revision 1.198
diff -b -B -U 4 -r1.197 -r1.198
--- src/hg/lib/hui.c 20 May 2009 16:01:34 -0000 1.197
+++ src/hg/lib/hui.c 21 May 2009 19:00:00 -0000 1.198
@@ -3351,14 +3351,36 @@
printf("</SELECT></P>\n");
}
}
-static boolean getScoreLimits(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max)
+static boolean getScoreDefaultsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max)
+/* returns TRUE if defaults exist and sets the string pointer (because they may be float or int)
+ if min or max are set, then they should be freed */
+{
+if(min)
+ *min = NULL; // default these outs!
+if(max)
+ *max = NULL;
+char *setting = trackDbSettingClosestToHome(tdb, scoreName);
+if(setting)
+ {
+ if(strchr(setting,':') != NULL)
+ return colonPairToStrings(setting,min,max);
+ else if(min)
+ *min = cloneString(setting);
+ return TRUE;
+ }
+return FALSE;
+}
+
+static boolean getScoreLimitsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max)
/* returns TRUE if limits exist and sets the string pointer (because they may be float or int)
if min or max are set, then they should be freed */
{
-*min = NULL; // default these outs!
-*max = NULL;
+if(min)
+ *min = NULL; // default these outs!
+if(max)
+ *max = NULL;
char scoreLimitName[128];
safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _LIMITS);
char *setting = trackDbSettingClosestToHome(tdb, scoreLimitName);
if(setting)
@@ -3366,29 +3388,35 @@
return colonPairToStrings(setting,min,max);
}
else
{
+ if(min)
+ {
safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MIN);
setting = trackDbSettingClosestToHome(tdb, scoreLimitName);
if(setting)
*min = cloneString(setting);
+ }
+ if(max)
+ {
safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MAX);
setting = trackDbSettingClosestToHome(tdb, scoreLimitName);
if(setting)
*max = cloneString(setting);
+ }
return TRUE;
}
-if(defaults != NULL && (*min == NULL || *max == NULL))
+if(defaults != NULL && ((min && *min == NULL) || (max && *max == NULL)))
{
char *minLoc=NULL;
char *maxLoc=NULL;
if(colonPairToStrings(defaults,&minLoc,&maxLoc))
{
- if(*min == NULL && minLoc != NULL)
+ if(min && *min == NULL && minLoc != NULL)
*min=minLoc;
else
freeMem(minLoc);
- if(*max == NULL && maxLoc != NULL)
+ if(max && *max == NULL && maxLoc != NULL)
*max=maxLoc;
else
freeMem(maxLoc);
return TRUE;
@@ -3404,25 +3432,26 @@
are undisturbed (use NO_VALUE to recognize unavaliable values) */
{
char scoreLimitName[128];
char *deMin=NULL,*deMax=NULL;
-if(limitMin || limitMax)
+if((limitMin || limitMax) && getScoreLimitsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
{
- getScoreLimits(tdb,scoreName,NULL,&deMin,&deMax);
- if(deMin != NULL)
- {
- if(limitMin)
+ if(deMin != NULL && limitMin)
*limitMin = atoi(deMin);
+ if(deMax != NULL && limitMax)
+ *limitMax = atoi(deMax);
freeMem(deMin);
+ freeMem(deMax);
}
- if(deMax != NULL)
+if((min || max) && getScoreDefaultsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
{
- if(limitMax)
- *limitMax = atoi(deMax);
+ if(deMin != NULL && min)
+ *min = atoi(deMin);
+ if(deMax != NULL && max)
+ *max =atoi(deMax);
+ freeMem(deMin);
freeMem(deMax);
}
- }
-
if(max)
{
safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MAX);
deMax = cartOptionalStringClosestToHome(cart, tdb,FALSE,scoreLimitName);
@@ -3435,8 +3464,12 @@
deMin = cartOptionalStringClosestToHome(cart, tdb,FALSE,scoreLimitName);
if(deMin != NULL)
*min = atoi(deMin);
}
+if(min && limitMin && *min < *limitMin) *min = *limitMin; // defaults within range
+if(min && limitMax && *min > *limitMax) *min = *limitMax;
+if(max && limitMax && *max > *limitMax) *max = *limitMax;
+if(max && limitMin && *max < *limitMin) *max = *limitMin;
}
static void getScoreFloatRangeFromCart(struct cart *cart, struct trackDb *tdb, char *scoreName,
double *limitMin,double *limitMax,double*min,double*max)
@@ -3445,25 +3478,26 @@
are undisturbed (use NO_VALUE to recognize unavaliable values) */
{
char scoreLimitName[128];
char *deMin=NULL,*deMax=NULL;
-if(limitMin || limitMax)
+if((limitMin || limitMax) && getScoreLimitsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
{
- getScoreLimits(tdb,scoreName,NULL,&deMin,&deMax);
- if(deMin != NULL)
- {
- if(limitMin)
+ if(deMin != NULL && limitMin)
*limitMin = strtod(deMin,NULL);
+ if(deMax != NULL && limitMax)
+ *limitMax =strtod(deMax,NULL);
freeMem(deMin);
+ freeMem(deMax);
}
- if(deMax != NULL)
+if((min || max) && getScoreDefaultsFromTdb(tdb,scoreName,NULL,&deMin,&deMax))
{
- if(limitMax)
- *limitMax =strtod(deMax,NULL);
+ if(deMin != NULL && min)
+ *min = strtod(deMin,NULL);
+ if(deMax != NULL && max)
+ *max =strtod(deMax,NULL);
+ freeMem(deMin);
freeMem(deMax);
}
- }
-
if(max)
{
safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, _MAX);
deMax = cartOptionalStringClosestToHome(cart, tdb,FALSE,scoreLimitName);
@@ -3476,8 +3510,12 @@
deMin = cartOptionalStringClosestToHome(cart, tdb,FALSE,scoreLimitName);
if(deMin != NULL)
*min = strtod(deMin,NULL);
}
+if(min && limitMin && *min < *limitMin) *min = *limitMin; // defaults within range
+if(min && limitMax && *min > *limitMax) *min = *limitMax;
+if(max && limitMax && *max > *limitMax) *max = *limitMax;
+if(max && limitMin && *max < *limitMin) *max = *limitMin;
}
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 */
@@ -4607,13 +4645,16 @@
if(dimensionY)
printf("<TH align='right' WIDTH=\"100\"><EM><B>%s</EM></B>:</TH>", dimensionX->title);
for (ixX = 0; ixX < dimensionX->count; ixX++)
{
+ if(tdbsX[ixX] != NULL)
+ {
char *label = replaceChars(dimensionX->values[ixX]," (","<BR>(");//
printf("<TH WIDTH=\"100\">%s</TH>",labelWithVocabLink(parentTdb,tdbsX[ixX],dimensionX->tag,label));
freeMem(label);
}
}
+ }
else if(dimensionY)
{
printf("<TH ALIGN=CENTER WIDTH=\"100\">");
BUTTON_PLUS_ALL();
@@ -4627,20 +4668,25 @@
{
printf("<TR ALIGN=CENTER BGCOLOR=\"%s\"><TH ALIGN=RIGHT><EM><B>%s</EM></B></TH><TD> </TD>",COLOR_BG_ALTDEFAULT, dimensionY->title);
for (ixX = 0; ixX < dimensionX->count; ixX++) // Special row of +- +- +-
{
+ if(tdbsX[ixX] != NULL)
+ {
puts("<TD>");
safef(objName, sizeof(objName), "plus_%s_all", dimensionX->names[ixX]);
BUTTON_PLUS_ONE( objName,dimensionX->names[ixX]);
BUTTON_MINUS_ONE(objName,dimensionX->names[ixX]);
puts("</TD>");
}
+ }
puts("</TR>\n");
}
// Now the Y by X matrix
for (ixY = 0; ixY < sizeOfY; ixY++)
{
+ if(tdbsY[ixY] != NULL)
+ {
assert(!dimensionY || ixY < dimensionY->count);
printf("<TR ALIGN=CENTER BGCOLOR=\"#FFF9D2\">");
if(dimensionY == NULL) // 'All' buttons go here if no Y dimension
{
@@ -4663,8 +4709,10 @@
puts("</TD>");
}
for (ixX = 0; ixX < sizeOfX; ixX++)
{
+ if(tdbsX[ixX] != NULL)
+ {
assert(!dimensionX || ixX < dimensionX->count);
if(dimensionX && ixX == dimensionX->count)
break;
if(cells[ixX][ixY] > 0)
@@ -4696,23 +4744,25 @@
}
else
puts("<TD> </TD>");
}
+ }
puts("</TR>\n");
}
+ }
if(dimensionZ)
{
printf("<TR align='center' valign='bottom' BGCOLOR='%s''>",COLOR_BG_ALTDEFAULT);
printf("<TH class='greenRoof' STYLE='font-size: 2' colspan=50> </TH>");
printf("<TR BGCOLOR='%s'><TH valign=top align=left colspan=2 rowspan=20><B><EM>%s</EM></B>:",
COLOR_BG_ALTDEFAULT,dimensionZ->title);
+ int cntZ=0;
for(ixZ=0;ixZ<sizeOfZ;ixZ++)
- if(cellsZ[ixZ]>0)
{
- if(ixZ > 0 && (ixZ % sizeOfX) == 0)
+ if(tdbsZ[ixZ] != NULL && cellsZ[ixZ]>0)
{
+ if(cntZ > 0 && (cntZ % sizeOfX) == 0)
printf("</TR><TR BGCOLOR='%s'>",COLOR_BG_ALTDEFAULT);
- }
printf("<TH align=left nowrap>");
safef(objName, sizeof(objName), "mat_%s_dimZ_cb",dimensionZ->names[ixZ]);
safef(javascript, sizeof(javascript), "onclick='matSetSubtrackCheckBoxes(this.checked,\"%s\");'",dimensionZ->names[ixZ]);
alreadySet = cartUsualBoolean(cart, objName, FALSE);
@@ -4721,8 +4771,15 @@
dyStringPrintf(dyJS, " class=\"matrixCB dimZ %s\"",dimensionZ->names[ixZ]);
cgiMakeCheckBoxJS(objName,alreadySet,dyStringCannibalize(&dyJS));
printf("%s",labelWithVocabLink(parentTdb,tdbsZ[ixZ],dimensionZ->tag,dimensionZ->values[ixZ]));
puts("</TH>");
+ cntZ++;
+ }
+ }
+ while((cntZ % sizeOfX) > 0) // fill in the rest of the row
+ {
+ printf("<TH> </TH>");
+ cntZ++;
}
}
puts("</TD></TR></TABLE>");
subgroupMembersFree(&dimensionX);