23ecc080ba35d0563c208e8ff96f9852475e34f6 chmalee Mon Jun 18 14:23:06 2018 -0700 Adding url, urls, urlLabel and extraFields support to bigBarChart tracks diff --git src/hg/hgc/barChartClick.c src/hg/hgc/barChartClick.c index b06c711..241a7ba 100644 --- src/hg/hgc/barChartClick.c +++ src/hg/hgc/barChartClick.c @@ -37,54 +37,68 @@ 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; inext) { + char *rest = cloneString(bb->rest); char startBuf[16], endBuf[16]; char *row[32]; bigBedIntervalToRow(bb, chrom, startBuf, endBuf, row, ArraySize(row)); struct barChartBed *barChart = barChartBedLoadOptionalOffsets(row, hasOffsets); if (barChart == NULL) continue; if (sameString(barChart->name, item)) + { + char *restFields[256]; + int restCount = chopTabs(rest, restFields); + int restBedFields = (6 + (hasOffsets ? 2 : 0)); + if (restCount > restBedFields) + { + int i; + for (i = 0; i < restCount - restBedFields; i++) + extraFieldsRet[i] = restFields[restBedFields + i]; + *extraFieldsCountRet = (restCount - restBedFields); + } return barChart; } + } return NULL; } static struct barChartBed *getBarChartFromTable(struct trackDb *tdb, char *table, char *item, char *chrom, int start, int end) /* Retrieve barChart BED item from track table */ { struct sqlConnection *conn = NULL; struct customTrack *ct = lookupCt(tdb->track); if (ct == NULL) conn = hAllocConnTrack(database, tdb); else { conn = hAllocConn(CUSTOM_TRASH); table = ct->dbTableName; @@ -104,37 +118,37 @@ "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, - struct asObject **retAs) + struct asObject **retAs, char **extraFieldsReg, int *extraFieldsCountRet) /* 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, retAs); + barChart = getBarChartFromFile(tdb, file, item, chrom, start, end, retAs, extraFieldsReg, extraFieldsCountRet); 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]; @@ -350,64 +364,83 @@ 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 && inext, 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 asObject *as = NULL; -struct barChartBed *chartItem = getBarChart(tdb, item, seqName, start, end, &as); +char *extraFields[256]; +int extraFieldCount; +int numColumns; +struct barChartBed *chartItem = getBarChart(tdb, item, seqName, start, end, &as, extraFields, &extraFieldCount); if (chartItem == NULL) errAbort("Can't find item %s in barChart table/file %s\n", item, tdb->table); genericHeader(tdb, item); // get name and name2 from trackDb, .as file, or use defaults struct asColumn *nameCol = NULL, *name2Col = NULL; +//struct asColumn *name2Col; char *nameLabel = NULL, *name2Label = NULL; if (as != NULL) { + numColumns = slCount(as->columnList); nameCol = asFindColByIx(as, BARCHART_NAME_COLUMN_IX); name2Col = asFindColByIx(as, BARCHART_NAME2_COLUMN_IX); } -nameLabel = trackDbSettingClosestToHomeOrDefault(tdb, "bedNameLabel", nameCol ? nameCol->comment : "Item"), +nameLabel = trackDbSettingClosestToHomeOrDefault(tdb, "bedNameLabel", nameCol ? nameCol->comment : "Item"); +if (trackDbSettingClosestToHomeOrDefault(tdb, "url", NULL) != NULL) + printCustomUrl(tdb, item, TRUE); +else printf("%s: %s
\n", nameLabel, chartItem->name); name2Label = name2Col ? name2Col->comment : "Alternative name"; -if (differentString(chartItem->name2, "")) +if (differentString(chartItem->name2, "")) { + if (trackDbSettingClosestToHomeOrDefault(tdb, "url2", NULL) != NULL) + printOtherCustomUrl(tdb, chartItem->name2, "url2", TRUE); + else printf("%s: %s
\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("Total all %s values: %0.2f %s
\n", metric, barChartTotalValue(chartItem), units); printf("Maximum %s value: %0.2f %s in %s
\n", metric, highLevel, units, barChartUiGetCategoryLabelById(categId, database, tdb)); printf("Score: %d
\n", chartItem->score); printf("Genomic position: " "%s %s:%d-%d
\n", database, hgTracksPathAndSettings(), database, chartItem->chrom, chartItem->chromStart+1, chartItem->chromEnd, chartItem->chrom, chartItem->chromStart+1, chartItem->chromEnd); printf("Strand: %s\n", chartItem->strand); + +// print any remaining extra fields +if (numColumns > 11) + { + extraFieldsPrint(tdb, NULL, extraFields, extraFieldCount); + } + char *matrixUrl = NULL, *sampleUrl = NULL; struct barChartItemData *vals = getSampleVals(tdb, chartItem, &matrixUrl, &sampleUrl); if (vals != NULL) { // Print boxplot puts("

"); char *df = makeDataFrame(tdb->table, vals); char *colorFile = makeColorFile(tdb); printBoxplot(df, item, chartItem->name2, units, colorFile); printf("
View all data points for %s%s%s%s\n", df, chartItem->name, chartItem->name2 ? " (" : "", chartItem->name2 ? chartItem->name2 : "", chartItem->name2 ? ")" : ""); }