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