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