580bf7de78a35e5d3fbbdc8171ffcf80a795f877
galt
  Thu Oct 22 19:46:56 2020 -0700
Fix speed of javascript in Matrix for hgTrackUi. fixes #26398

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 53ed2fc..2e6915c 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -8269,30 +8269,58 @@
                membersForAll->members[dimIx]->tags[ix],membersForAll->members[dimIx]->titles[ix]);
         }
     printf("</SELECT>");
 
     if (membersForAll->members[dimIx]->fcType == fctOneOnly)
         printf(" (select only one)");
 
     printf("</TD><TD width='20'></TD>\n");
     }
 printf("</TR></TABLE>\n");
 
 puts("<BR>\n");
 
 return TRUE;
 }
+void fastMatixToSubtrackMap()
+// prints out the "common" globals json hash
+// This hash is the one utils.js and therefore all CGIs know about
+{
+struct dyString *dy = dyStringNew(1024);
+dyStringPrintf(dy,
+"var mtxSubMap = {};\n"
+"$( document ).ready(function()\n"
+"{\n"
+"subCBs = $('input.subCB');\n"
+"$( subCBs ).each( function (i) { \n"
+"  // class='subCB BS-Seq Mantle_Cell_Lymphoma venous_blood A007MCL CNAG CPG_methylation_cov signal' \n"
+"  var classList = $( this ).attr('class').split(' ');\n"
+"  var classes = '.' + classList[1] + '.' + classList[2]; // dimX and dimY \n"
+"  if (mtxSubMap[classes] === undefined) {\n"
+"    mtxSubMap[classes] = [this];\n"
+"  } else {\n"
+"    mtxSubMap[classes].push(this);\n"
+"  }"
+"});\n"
+"});\n"
+);
+
+
+jsInline(dy->string);
+dyStringFree(&dy);
+}
+
 
 static boolean compositeUiByMatrix(char *db, struct cart *cart, struct trackDb *parentTdb,
                                    char *formName)
 // UI for composite tracks: matrix of checkboxes.
 {
 //int ix;
 char objName[SMALLBUF];
 
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart);
 if (membersForAll == NULL || membersForAll->dimensions == NULL) // Not Matrix!
     return FALSE;
 
 int ixX,ixY;
 members_t *dimensionX = membersForAll->members[dimX];
 members_t *dimensionY = membersForAll->members[dimY];
@@ -8493,30 +8521,32 @@
         puts("</TR>\n");
         }
     }
 if (dimensionY && cntY>MATRIX_BOTTOM_BUTTONS_AFTER)
     matrixXheadings(db,parentTdb,membersForAll,FALSE);
 
 puts("</TD></TR></TABLE>");
 
 // if there is a treeImage, put it beside the matrix
 if (treeImage != NULL)
     printf("</TD><TD><IMG SRC=\"%s\"></TD></TABLE>", treeImage);
 
 // If any filter additional filter composites, they can be added at the end.
 compositeUiByFilter(db, cart, parentTdb, formName);
 
+fastMatixToSubtrackMap();  
+
 return TRUE;
 }
 
 static boolean compositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb,
                                      char *formName)
 // UI for composite tracks: all/none buttons only (as opposed to matrix or lots of buttons
 {
 if (trackDbCountDescendantLeaves(parentTdb) <= 1)
     return FALSE;
 
 if (dimensionsExist(parentTdb))
     return FALSE;
 
 #define PM_BUTTON_GLOBAL "<IMG height=18 width=18 id='%s' src='../images/%s'>"
 #define PM_BUTTON_GLOBAL_JS "matSubCBsCheck(%s);"