00d6b45fd33ab330efcf6d6b88b0d6e9a7880281 kent Thu Oct 28 14:54:35 2010 -0700 Redoing dataHub using new trackHub library routines. Still pretty embryonic, but once again is displaying a couple of tracks for me, this time ones that are genuinely remote. Code is activated by having a 'tracksHub' variable in the cart, which currently is only possible by hacking with cartDump. diff --git src/hg/hgTracks/bigBedTrack.c src/hg/hgTracks/bigBedTrack.c index 7b1337f..3cdb8c2 100644 --- src/hg/hgTracks/bigBedTrack.c +++ src/hg/hgTracks/bigBedTrack.c @@ -1,142 +1,146 @@ /* bigBed - stuff to handle loading and display of bigBed type tracks in browser. * Mostly just links to bed code, but handles a few things itself, like the dense * drawing code. */ #include "common.h" #include "hash.h" #include "linefile.h" #include "jksql.h" #include "hdb.h" #include "bedCart.h" #include "hgTracks.h" #include "hmmstats.h" #include "localmem.h" #include "wigCommon.h" #include "bbiFile.h" #include "obscure.h" #include "bigWig.h" #include "bigBed.h" -char *bbiNameFromTable(struct sqlConnection *conn, char *table) +char *bbiNameFromSettingOrTable(struct trackDb *tdb, struct sqlConnection *conn, char *table) /* Return file name from little table. */ { +char *fileName = cloneString(trackDbSetting(tdb, "bigDataUrl")); +if (fileName == NULL) + { char query[256]; safef(query, sizeof(query), "select fileName from %s", table); char *fileName = sqlQuickString(conn, query); if (fileName == NULL) errAbort("Missing fileName in %s table", table); + } return fileName; } static struct bbiFile *fetchBbiForTrack(struct track *track) /* Fetch bbiFile from track, opening it if it is not already open. */ { struct bbiFile *bbi = track->bbiFile; if (bbi == NULL) { struct sqlConnection *conn = hAllocConnTrack(database, track->tdb); - char *fileName = bbiNameFromTable(conn, track->table); + char *fileName = bbiNameFromSettingOrTable(track->tdb, conn, track->table); hFreeConn(&conn); bbi = track->bbiFile = bigBedFileOpen(fileName); } return bbi; } struct bigBedInterval *bigBedSelectRange(struct track *track, char *chrom, int start, int end, struct lm *lm) /* Return list of intervals in range. */ { struct bbiFile *bbi = fetchBbiForTrack(track); int maxItems = maximumTrackItems(track) + 1; struct bigBedInterval *result = bigBedIntervalQuery(bbi, chrom, start, end, maxItems, lm); if (slCount(result) >= maxItems) { track->limitedVis = tvDense; track->limitedVisSet = TRUE; result = NULL; } return result; } void bigBedAddLinkedFeaturesFrom(struct track *track, char *chrom, int start, int end, int scoreMin, int scoreMax, boolean useItemRgb, int fieldCount, struct linkedFeatures **pLfList) /* Read in items in chrom:start-end from bigBed file named in track->bbiFileName, convert * them to linkedFeatures, and add to head of list. */ { struct lm *lm = lmInit(0); struct trackDb *tdb = track->tdb; struct bigBedInterval *bb, *bbList = bigBedSelectRange(track, chrom, start, end, lm); char *bedRow[32]; char startBuf[16], endBuf[16]; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); struct bed *bed = bedLoadN(bedRow, fieldCount); struct linkedFeatures *lf = bedMungToLinkedFeatures(&bed, tdb, fieldCount, scoreMin, scoreMax, useItemRgb); slAddHead(pLfList, lf); } lmCleanup(&lm); } boolean canDrawBigBedDense(struct track *tg) /* Return TRUE if conditions are such that can do the fast bigBed dense data fetch and * draw. */ { return tg->isBigBed; } void bigBedDrawDense(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color) /* Use big-bed summary data to quickly draw bigBed. */ { struct bbiSummaryElement summary[width]; struct bbiFile *bbi = fetchBbiForTrack(tg); if (bigBedSummaryArrayExtended(bbi, chromName, seqStart, seqEnd, width, summary)) { char *denseCoverage = trackDbSettingClosestToHome(tg->tdb, "denseCoverage"); if (denseCoverage != NULL) { double startVal = 0, endVal = atof(denseCoverage); if (endVal <= 0) { struct bbiSummaryElement sumAll = bbiTotalSummary(bbi); double mean = sumAll.sumData/sumAll.validCount; double std = calcStdFromSums(sumAll.sumData, sumAll.sumSquares, sumAll.validCount); rangeFromMinMaxMeanStd(0, sumAll.maxVal, mean, std, &startVal, &endVal); } int x; for (x=0; x<width; ++x) { if (summary[x].validCount > 0) { Color color = shadesOfGray[grayInRange(summary[x].maxVal, startVal, endVal)]; hvGfxBox(hvg, x+xOff, yOff, 1, tg->heightPer, color); } } } else { int x; for (x=0; x<width; ++x) { if (summary[x].validCount > 0) { hvGfxBox(hvg, x+xOff, yOff, 1, tg->heightPer, color); } } } } } void bigBedMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]) /* Set up bigBed methods. */ { complexBedMethods(track, tdb, TRUE, wordCount, words); }