src/hg/hgTracks/bigWigTrack.c 1.10

1.10 2010/04/27 23:31:41 braney
first pass at multiWiggle. This shouldn't change existing behavior. Add extTable to your bigWig trackDb to get two tables into one bigWig wiggle track.
Index: src/hg/hgTracks/bigWigTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/bigWigTrack.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -b -B -U 4 -r1.9 -r1.10
--- src/hg/hgTracks/bigWigTrack.c	25 Mar 2010 17:46:01 -0000	1.9
+++ src/hg/hgTracks/bigWigTrack.c	27 Apr 2010 23:31:41 -0000	1.10
@@ -18,15 +18,25 @@
 	MgFont *font, Color color, enum trackVisibility vis)
 {
 /* Allocate predraw area. */
 int preDrawZero, preDrawSize;
-struct preDrawElement *preDraw = initPreDraw(width, &preDrawSize, &preDrawZero);
+struct preDrawContainer *preDrawList = NULL;
 
 /* Get summary info from bigWig */
 int summarySize = width;
 struct bbiSummaryElement *summary;
 AllocArray(summary, summarySize);
-if (bigWigSummaryArrayExtended(tg->bbiFile, chromName, winStart, winEnd, summarySize, summary))
+
+struct bbiFile *bbiFile ;
+for(bbiFile = tg->bbiFile; bbiFile ; bbiFile = bbiFile->next)
+    {
+    struct preDrawContainer *preDrawContainer;
+    struct preDrawElement *preDraw = initPreDraw(width, &preDrawSize, &preDrawZero);
+    AllocVar(preDrawContainer);
+    preDrawContainer->preDraw = preDraw;
+    slAddHead(&preDrawList, preDrawContainer);
+
+    if (bigWigSummaryArrayExtended(bbiFile, chromName, winStart, winEnd, summarySize, summary))
     {
     /* Convert format to predraw */
     int i;
     for (i=0; i<summarySize; ++i)
@@ -38,29 +48,55 @@
 	pe->max = be->maxVal;
 	pe->sumData = be->sumData;
 	pe->sumSquares = be->sumSquares;
 	}
-
-    /* Call actual graphing routine. */
-    wigDrawPredraw(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis,
-		   preDraw, preDrawZero, preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
+	}
     }
 
-freeMem(preDraw);
+/* Call actual graphing routine. */
+wigDrawPredraw(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis,
+	       preDrawList, preDrawZero, preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
+
+struct preDrawContainer *nextContain;
+for(; preDrawList ; preDrawList = nextContain)
+    {
+    nextContain = preDrawList->next;
+    freeMem(preDrawList->preDraw);
+    freeMem(preDrawList);
+    }
 freeMem(summary);
 }
 
 static void bigWigLoadItems(struct track *tg)
 /* Fill up tg->items with bedGraphItems derived from a bigWig file */
 {
-if (tg->bbiFile == NULL)
+char *extTableString = trackDbSetting(tg->tdb, "extTable");
+
+if (extTableString != NULL)
+    {
+    // if there's an extra table, read this one in too
+    struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
+    char *fileName = bbiNameFromTable(conn, tg->mapName);
+    struct bbiFile *bbiFile = bigWigFileOpen(fileName);
+    slAddHead(&tg->bbiFile, bbiFile);
+
+    fileName = bbiNameFromTable(conn, extTableString);
+    bbiFile = bigWigFileOpen(fileName);
+    slAddHead(&tg->bbiFile, bbiFile);
+
+    hFreeConn(&conn);
+    }
+else
+    {
+    if (tg->bbiFile == NULL)
     {
     /* Figure out bigWig file name. */
     struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
     char *fileName = bbiNameFromTable(conn, tg->mapName);
     tg->bbiFile = bigWigFileOpen(fileName);
     hFreeConn(&conn);
     }
+    }
 }
 
 void bigWigMethods(struct track *track, struct trackDb *tdb, 
 	int wordCount, char *words[])