3810604d5c77948f1eb2d1dc7605aa4fdda5f3e2 kate Mon May 1 16:56:54 2017 -0700 Use .as comments to label item name and name2. Also add name2 to boxplot. refs #18736 diff --git src/hg/hgc/barChartClick.c src/hg/hgc/barChartClick.c index 54fd588..0b525e9 100644 --- src/hg/hgc/barChartClick.c +++ src/hg/hgc/barChartClick.c @@ -35,39 +35,42 @@ { 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) + char *item, char *chrom, int start, int end, + struct asObject **retAs) /* Retrieve barChart BED item from big file */ { struct sqlConnection *conn = hAllocConnTrack(database, tdb); struct asObject *as = NULL; boolean hasOffsets = TRUE; if (conn != NULL) { as = asForTdb(conn, tdb); + if (retAs != NULL) + *retAs = as; hasOffsets = ( asColumnFind(as, BARCHART_OFFSET_COLUMN) != NULL && asColumnFind(as, BARCHART_LEN_COLUMN) != NULL); hFreeConn(&conn); } struct bbiFile *bbi = bigBedFileOpen(file); struct lm *lm = lmInit(0); struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); for (bb = bbList; bb != NULL; bb = bb->next) { char startBuf[16], endBuf[16]; char *row[32]; bigBedIntervalToRow(bb, chrom, startBuf, endBuf, row, ArraySize(row)); struct barChartBed *barChart = barChartBedLoadOptionalOffsets(row, hasOffsets); if (sameString(barChart->name, item)) @@ -95,37 +98,38 @@ "SELECT * FROM %s WHERE name='%s'" "AND chrom='%s' AND chromStart=%d AND chromEnd=%d", table, item, chrom, start, end); sr = sqlGetResult(conn, query); row = sqlNextRow(sr); if (row != NULL) { barChart = barChartBedLoadOptionalOffsets(row, hasOffsets); } sqlFreeResult(&sr); } hFreeConn(&conn); return barChart; } -static struct barChartBed *getBarChart(struct trackDb *tdb, char *item, char *chrom, int start, int end) +static struct barChartBed *getBarChart(struct trackDb *tdb, char *item, char *chrom, int start, int end, + struct asObject **retAs) /* Retrieve barChart BED item from track */ { struct barChartBed *barChart = NULL; char *file = trackDbSetting(tdb, "bigDataUrl"); if (file != NULL) - barChart = getBarChartFromFile(tdb, file, item, chrom, start, end); + barChart = getBarChartFromFile(tdb, file, item, chrom, start, end, retAs); else barChart = getBarChartFromTable(tdb, tdb->table, item, chrom, start, end); return barChart; } static struct barChartItemData *getSampleValsFromFile(struct trackDb *tdb, struct hash *categoryHash, struct barChartBed *bed, char *dataFile, char *sampleFile) /* Get all data values in a file for this item (locus) */ { // Get sample categories from sample file // Format: id, category, extras struct lineFile *lf = udcWrapShortLineFile(sampleFile, NULL, 0); struct hash *sampleHash = hashNew(0); char *words[2]; @@ -304,78 +308,98 @@ FILE *f = fopen(colorTn.forCgi, "w"); if (f == NULL) errAbort("can't create temp file %s", colorTn.forCgi); struct barChartCategory *categs = barChartUiGetCategories(database, tdb); struct barChartCategory *categ; fprintf(f, "%s\t%s\n", "category", "color"); for (categ = categs; categ != NULL; categ = categ->next) { //fprintf(f, "%s\t#%06X\n", categ->label, categ->color); fprintf(f, "%s\t%d\n", categ->label, categ->color); } fclose(f); return cloneString(colorTn.forCgi); } -static void printBoxplot(char *df, char *item, char *units, char *colorFile) +static void printBoxplot(char *df, char *item, char *name2, char *units, char *colorFile) /* Plot data frame to image file and include in HTML */ { struct tempName pngTn; trashDirFile(&pngTn, "hgc", "barChart", ".png"); /* Exec R in quiet mode, without reading/saving environment or workspace */ char cmd[256]; -safef(cmd, sizeof(cmd), "Rscript --vanilla --slave hgcData/barChartBoxplot.R %s %s %s %s %s", - item, units, colorFile, df, pngTn.forHtml); +safef(cmd, sizeof(cmd), "Rscript --vanilla --slave hgcData/barChartBoxplot.R %s %s %s %s %s %s", + item, units, colorFile, df, pngTn.forHtml, isEmpty(name2) ? "n/a" : name2); int ret = system(cmd); if (ret == 0) printf("<img src = \"%s\" border=1><br>\n", pngTn.forHtml); else warn("Error creating boxplot from sample data"); } +struct asColumn *asFindColByIx(struct asObject *as, int ix) +/* Find AS column by index */ +{ +struct asColumn *asCol; +int i; +for (i=0, asCol = as->columnList; asCol != NULL && i<ix; asCol = asCol->next, i++); +return asCol; +} + void doBarChartDetails(struct trackDb *tdb, char *item) /* Details of barChart item */ { int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); -struct barChartBed *chartItem = getBarChart(tdb, item, seqName, start, end); +struct asObject *as = NULL; +struct barChartBed *chartItem = getBarChart(tdb, item, seqName, start, end, &as); if (chartItem == NULL) errAbort("Can't find item %s in barChart table/file %s\n", item, tdb->table); genericHeader(tdb, item); -// TODO: Get name and name2 fields from .as for bigBed -printf("<b>%s: </b>%s<br>\n", trackDbSettingClosestToHomeOrDefault(tdb, "bedNameLabel", "Item"), - chartItem->name); + +// get name and name2 from trackDb, .as file, or use defaults +struct asColumn *nameCol = NULL, *name2Col = NULL; +char *nameLabel = NULL, *name2Label = NULL; +if (as != NULL) + { + nameCol = asFindColByIx(as, BARCHART_NAME_COLUMN_IX); + name2Col = asFindColByIx(as, BARCHART_NAME2_COLUMN_IX); + } +nameLabel = trackDbSettingClosestToHomeOrDefault(tdb, "bedNameLabel", nameCol ? nameCol->comment : "Item"), +printf("<b>%s: </b>%s<br>\n", nameLabel, chartItem->name); +name2Label = name2Col ? name2Col->comment : "Alternative name"; if (differentString(chartItem->name2, "")) - printf("<b>Alternative name: </b> %s<br>\n", chartItem->name2); + printf("<b>%s: </b> %s<br>\n", name2Label, chartItem->name2); + int categId; float highLevel = barChartMaxValue(chartItem, &categId); char *units = trackDbSettingClosestToHomeOrDefault(tdb, BAR_CHART_UNIT, "units"); char *metric = trackDbSettingClosestToHomeOrDefault(tdb, BAR_CHART_METRIC, ""); printf("<b>Total all %s values: </b> %0.2f %s<br>\n", metric, barChartTotalValue(chartItem), units); printf("<b>Maximum %s value: </b> %0.2f %s in %s<br>\n", metric, highLevel, units, barChartUiGetCategoryLabelById(categId, database, tdb)); printf("<b>Score: </b> %d<br>\n", chartItem->score); printf("<b>Genomic position: " "</b>%s <a href='%s&db=%s&position=%s%%3A%d-%d'>%s:%d-%d</a><br>\n", database, hgTracksPathAndSettings(), database, chartItem->chrom, chartItem->chromStart+1, chartItem->chromEnd, chartItem->chrom, chartItem->chromStart+1, chartItem->chromEnd); printf("<b>Strand: </b> %s\n", chartItem->strand); char *matrixUrl = NULL, *sampleUrl = NULL; struct barChartItemData *vals = getSampleVals(tdb, chartItem, &matrixUrl, &sampleUrl); if (vals != NULL) { // Print boxplot puts("<p>"); char *df = makeDataFrame(tdb->table, vals); char *colorFile = makeColorFile(tdb); - printBoxplot(df, item, units, colorFile); + printBoxplot(df, item, chartItem->name2, units, colorFile); if (matrixUrl != NULL) printf("<br>View <a href='%s'>data matrix</a> and <a href='%s'>sample file</a>\n", matrixUrl, sampleUrl); } puts("<br>"); printTrackHtml(tdb); }