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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TH>");
+            cntZ++;
                 }
         }
     puts("</TD></TR></TABLE>");
     subgroupMembersFree(&dimensionX);