src/hg/hgTracks/bedTrack.c 1.2
1.2 2009/02/10 22:16:52 kent
Creating bigBed type custom tracks.
Index: src/hg/hgTracks/bedTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/bedTrack.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 4 -r1.1 -r1.2
--- src/hg/hgTracks/bedTrack.c 3 Feb 2009 08:19:04 -0000 1.1
+++ src/hg/hgTracks/bedTrack.c 10 Feb 2009 22:16:52 -0000 1.2
@@ -8,24 +8,27 @@
#include "bbiFile.h"
#include "bigBed.h"
#include "hgTracks.h"
-struct bbiFile *bigBedFromTable(struct sqlConnection *conn, char *table)
-/* Return open file from table containing nothing much but file name. */
+static char *bbiNameFromTable(struct sqlConnection *conn, char *table)
+/* Return file name from little table. */
{
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 bigBedFileOpen(fileName);
+return fileName;
}
-struct bigBedInterval *bigBedSelectRange(struct sqlConnection *conn, char *table,
+struct bigBedInterval *bigBedSelectRange(struct sqlConnection *conn, struct track *track,
char *chrom, int start, int end, struct lm *lm)
/* Return list of intervals in range. */
{
-struct bbiFile *bbi = bigBedFromTable(conn, table);
+char *fileName = track->bbiFileName;
+if (fileName == NULL)
+ track->bbiFileName = fileName = bbiNameFromTable(conn, track->mapName);
+struct bbiFile *bbi = bigBedFileOpen(fileName);
struct bigBedInterval *result = bigBedIntervalQuery(bbi, chrom, start, end, lm);
bbiFileClose(&bbi);
return result;
}
@@ -78,9 +81,9 @@
/* Get list of items */
if (tg->isBigBed)
{
struct lm *lm = lmInit(0);
- struct bigBedInterval *bb, *bbList = bigBedSelectRange(conn, tg->mapName,
+ struct bigBedInterval *bb, *bbList = bigBedSelectRange(conn, tg,
chromName, winStart, winEnd, lm);
char *bedRow[32];
char startBuf[16], endBuf[16];
@@ -167,16 +170,17 @@
bedFree(pBed);
return lf;
}
-void bigBedAddLinkedFeaturesFrom(struct sqlConnection *conn, struct trackDb *tdb,
+void bigBedAddLinkedFeaturesFrom(struct sqlConnection *conn, 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 tdb->tableName, convert
* them to linkedFeatures, and add to head of list. */
{
struct lm *lm = lmInit(0);
-struct bigBedInterval *bb, *bbList = bigBedSelectRange(conn, tdb->tableName, chrom, start, end, lm);
+struct trackDb *tdb = track->tdb;
+struct bigBedInterval *bb, *bbList = bigBedSelectRange(conn, track, chrom, start, end, lm);
char *bedRow[32];
char startBuf[16], endBuf[16];
for (bb = bbList; bb != NULL; bb = bb->next)
@@ -204,9 +208,9 @@
useItemRgb = bedItemRgb(tdb);
if (tg->isBigBed)
{
- bigBedAddLinkedFeaturesFrom(conn, tdb, chromName, winStart, winEnd,
+ bigBedAddLinkedFeaturesFrom(conn, tg, chromName, winStart, winEnd,
scoreMin, scoreMax, useItemRgb, 9, &lfList);
}
else
{
@@ -254,9 +258,9 @@
useItemRgb = bedItemRgb(tdb);
if (tg->isBigBed)
{
- bigBedAddLinkedFeaturesFrom(conn, tdb, chromName, winStart, winEnd,
+ bigBedAddLinkedFeaturesFrom(conn, tg, chromName, winStart, winEnd,
scoreMin, scoreMax, useItemRgb, 8, &lfList);
}
else
{
@@ -455,12 +459,10 @@
useItemRgb = bedItemRgb(tdb);
if (tg->isBigBed)
{
- bigBedAddLinkedFeaturesFrom(conn, tdb, chromName, winStart, winEnd,
+ bigBedAddLinkedFeaturesFrom(conn, tg, chromName, winStart, winEnd,
scoreMin, scoreMax, useItemRgb, 12, &lfList);
-#ifdef SOON
-#endif /* SOON */
}
else
{
/* Use tg->tdb->tableName because subtracks inherit composite track's tdb