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