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; }