0490db6e85ca2bdf98e3bf71df2b04d7582a08de
kate
  Mon May 1 14:21:50 2017 -0700
Add links to matrix and sample files on details page. refs #18738

diff --git src/hg/hgc/barChartClick.c src/hg/hgc/barChartClick.c
index cba6d0dd..158f9c9 100644
--- src/hg/hgc/barChartClick.c
+++ src/hg/hgc/barChartClick.c
@@ -108,51 +108,49 @@
 }
 
 static struct barChartBed *getBarChart(struct trackDb *tdb, char *item, char *chrom, int start, int end)
 /* 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);
 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)
+                        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
-char *url = trackDbSetting(tdb, "barChartSampleUrl");
-struct lineFile *lf = udcWrapShortLineFile(url, NULL, 0);
+struct lineFile *lf = udcWrapShortLineFile(sampleFile, NULL, 0);
 struct hash *sampleHash = hashNew(0);
 char *words[2];
 int sampleCt = 0;
 while (lineFileChopNext(lf, words, sizeof words))
     {
     hashAdd(sampleHash, words[0], words[1]);
     sampleCt++;
     }
 lineFileClose(&lf);
 
 // Open matrix file
-url = trackDbSetting(tdb, "barChartDataUrl");
-struct udcFile *f = udcFileOpen(url, NULL);
+struct udcFile *f = udcFileOpen(dataFile, NULL);
 
 // Get header line with sample ids
 char *header = udcReadLine(f);
 int wordCt = sampleCt+1;        // initial field is label or empty 
 char **samples;
 AllocArray(samples, wordCt);
 chopByWhite(header, samples, wordCt);
 
 // Get data values
 // Format: id, category, extras
 bits64 offset = (bits64)bed->_dataOffset;
 bits64 size = (bits64)bed->_dataLen;
 udcSeek(f, offset);
 bits64 seek = udcTell(f);
 if (udcTell(f) != offset)
@@ -240,38 +238,48 @@
     struct barChartSample *sample = hashFindVal(sampleHash, val->sample);
     if (sample == NULL)
         warn("barChart track %s: unknown category for sample %s", tdb->track, val->sample);
     else if (hashLookup(categoryHash, sample->category))
         {
         AllocVar(data);
         data->sample = cloneString(val->sample);
         data->category = cloneString(sample->category);
         data->value = val->value;
         slAddHead(&sampleVals, data);
         }
     }
 return sampleVals;
 }
 
-static struct barChartItemData *getSampleVals(struct trackDb *tdb, struct barChartBed *chartItem)
+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 *file = trackDbSetting(tdb, "barChartDataUrl");
+char *dataFile = trackDbSetting(tdb, "barChartDataUrl");
 struct hash *categoryHash = getTrackCategories(tdb);
-if (file != NULL)
-    vals = getSampleValsFromFile(tdb, categoryHash, chartItem);
+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;
 }
 
 static char *makeDataFrame(char *track, struct barChartItemData *vals)
 /* Create R data frame from sample data.  This is a tab-sep file, one row per sample.
    Return filename. */
 {
 
 // Create data frame with columns for sample, category, value */
 struct tempName dfTn;
 trashDirFile(&dfTn, "hgc", "barChart", ".df.txt");
 FILE *f = fopen(dfTn.forCgi, "w");
 if (f == NULL)
@@ -339,28 +347,32 @@
         chartItem->name);
 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); 
-struct barChartItemData *vals = getSampleVals(tdb, chartItem);
+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);
+    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);
 }