8e5ea49d44db7a5d17dd310d1cc1a73d3140ed8a
chmalee
  Wed Nov 3 11:28:21 2021 -0700
Get barChartCategoryUrl working on hgc pages, refs #28442

diff --git src/hg/hgc/barChartClick.c src/hg/hgc/barChartClick.c
index dbf0cc3..1b76823 100644
--- src/hg/hgc/barChartClick.c
+++ src/hg/hgc/barChartClick.c
@@ -26,47 +26,30 @@
 #include "facetedBar.h"
 #include "pipeline.h"
 
 #define EXTRA_FIELDS_SIZE 256
 
 struct barChartItemData
 /* Measured value for a sample and the sample category at a locus.
  * Used for barChart track details (boxplot) */
     {
     struct barChartItemData *next;  /* Next in singly linked list. */
     char *sample;	/* Sample identifier */
     char *category;     /* Sample category (from barChartSample table  or barChartSampleUrl file) */
     double value;	/* Measured value (e.g. expression level) */
     };
 
-static struct hash *getTrackCategories(struct trackDb *tdb)
-/* Get list of categories from trackDb.  This may be a subset of those in matrix. 
- * (though maybe better to prune matrix for performance) */
-{
-char *categs = trackDbSetting(tdb, BAR_CHART_CATEGORY_LABELS);
-char *words[BAR_CHART_MAX_CATEGORIES];
-int wordCt;
-wordCt = chopLine(cloneString(categs), words);
-int i;
-struct hash *categoryHash = hashNew(0);
-for (i=0; i<wordCt; i++)
-    {
-    hashStore(categoryHash, words[i]);
-    }
-return categoryHash;
-}
-
 static struct barChartBed *getBarChartFromFile(struct trackDb *tdb, char *file, 
                                                 char *item, char *chrom, int start, int end, 
                                                 struct asObject **retAs, char **extraFieldsRet,
                                                 int *extraFieldsCountRet)
 /* Retrieve barChart BED item from big file */
 {
 boolean hasOffsets = TRUE;
 struct bbiFile *bbi = bigBedFileOpen(file);
 struct asObject *as = bigBedAsOrDefault(bbi);
 if (retAs != NULL)
     *retAs = as;
 hasOffsets = (
     asColumnFind(as, BARCHART_OFFSET_COLUMN) != NULL && 
     asColumnFind(as, BARCHART_LEN_COLUMN) != NULL);
 struct lm *lm = lmInit(0);
@@ -203,30 +186,44 @@
 int i;
 for (i=1; i<wordCt && samples[i] != NULL; i++)
     {
     char *sample = samples[i];
     char *categ = (char *)hashFindVal(sampleHash, sample);
     if (categ == NULL)
         warn("barChart track %s: unknown category for sample %s", tdb->track, sample);
     else if (hashLookup(categoryHash, categ))
         {
         AllocVar(data);
         data->sample = cloneString(sample);
         data->category = cloneString(categ);
         data->value = sqlDouble(vals[i]);
         slAddHead(&sampleVals, data);
         }
+    else
+        {
+        // we may have subbed out '_' for ' ' in barChartUiGetCategories earlier so try
+        // searching for them in the hash here instead of straight from the data file
+        subChar(categ, '_', ' ');
+        if (hashLookup(categoryHash, categ))
+            {
+            AllocVar(data);
+            data->sample = cloneString(sample);
+            data->category = cloneString(categ);
+            data->value = sqlDouble(vals[i]);
+            slAddHead(&sampleVals, data);
+            }
+        }
     }
 return sampleVals;
 }
 
 static struct sqlConnection *getConnectionAndTable(struct trackDb *tdb, char *suffix,
                                                          char **retTable)
 /* Look for <table><suffix> in database or hgFixed and set up connection */
 {
 char table[256];
 if (trackHubDatabase(database))
     return NULL;
 
 assert(retTable);
 safef(table, sizeof(table), "%s%s", tdb->table, suffix);
 *retTable = cloneString(table);
@@ -285,31 +282,32 @@
         }
     }
 return sampleVals;
 }
 
 static struct barChartItemData *getSampleVals(struct trackDb *tdb, struct barChartBed *chartItem,
                                                 char **retMatrixUrl, char **retSampleUrl)
 /* Get data values for this item (locus) from all samples */
 {
 struct barChartItemData *vals = NULL;
 char *dataFile = trackDbSetting(tdb, "barChartMatrixUrl");
 // for backwards compatibility during qa review
 if (dataFile == NULL)
     dataFile = trackDbSetting(tdb, "barChartDataUrl");
 // for backwards compatibility during qa review
-struct hash *categoryHash = getTrackCategories(tdb);
+struct barChartCategory *categories = barChartUiGetCategories(database, tdb);
+struct hash *categoryHash = barChartCategoriesToHash(categories);
 if (dataFile != NULL)
     {
     char *sampleFile = trackDbSetting(tdb, "barChartSampleUrl");
     if (sampleFile == NULL)
         return NULL;
     if (retMatrixUrl != NULL)
         *retMatrixUrl = dataFile;
     if (retSampleUrl != NULL)
         *retSampleUrl = sampleFile;
     vals = getSampleValsFromFile(tdb, categoryHash, chartItem, dataFile, sampleFile);
     }
 else
     vals = getSampleValsFromTable(tdb, categoryHash, chartItem);
 return vals;
 }