src/hg/hgTracks/wigTrack.c 1.106

1.106 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/wigTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/wigTrack.c,v
retrieving revision 1.105
retrieving revision 1.106
diff -b -B -U 4 -r1.105 -r1.106
--- src/hg/hgTracks/wigTrack.c	15 Apr 2010 23:19:35 -0000	1.105
+++ src/hg/hgTracks/wigTrack.c	27 Apr 2010 23:31:41 -0000	1.106
@@ -686,10 +686,8 @@
     {
     int i;
 
     /* reset limits for auto scale */
-    *overallUpperLimit = wigEncodeStartingUpperLimit;
-    *overallLowerLimit = wigEncodeStartingLowerLimit;
     for (i = preDrawZero; i < preDrawZero+width; ++i)
 	{
 	/*	count is non-zero meaning valid data exists here	*/
 	if (preDraw[i].count)
@@ -1081,9 +1079,10 @@
 }
 
 void wigDrawPredraw(struct track *tg, int seqStart, int seqEnd,
 	struct hvGfx *hvg, int xOff, int yOff, int width,
-	MgFont *font, Color color, enum trackVisibility vis, struct preDrawElement *preDraw,
+	MgFont *font, Color color, enum trackVisibility vis, 
+	struct preDrawContainer *preDrawList,
 	int preDrawZero, int preDrawSize, double *retGraphUpperLimit, double *retGraphLowerLimit)
 /* Draw once we've figured out predraw... */
 {
 enum wiggleYLineMarkEnum yLineOnOff;
@@ -1091,12 +1090,12 @@
 
 /*	determined from data	*/
 double overallUpperLimit = wigEncodeStartingUpperLimit;
 double overallLowerLimit = wigEncodeStartingLowerLimit;
-double overallRange;		/*	determined from data	*/
-double graphUpperLimit;		/*	scaling choice will set these	*/
-double graphLowerLimit;		/*	scaling choice will set these	*/
-double graphRange;		/*	scaling choice will set these	*/
+double overallRange=0;		/*	determined from data	*/
+double graphUpperLimit=0;	/*	scaling choice will set these	*/
+double graphLowerLimit=0;	/*	scaling choice will set these	*/
+double graphRange=0;		/*	scaling choice will set these	*/
 double epsilon;			/*	range of data in one pixel	*/
 Color *colorArray = NULL;       /*	Array of pixels to be drawn.	*/
 struct wigCartOptions *wigCart = (struct wigCartOptions *) tg->extraUiData;
 
@@ -1106,27 +1105,68 @@
 /*	width - width of drawing window in pixels
  *	pixelsPerBase - pixels per base
  *	basesPerPixel - calculated as 1.0/pixelsPerBase
  */
-preDrawWindowFunction(preDraw, preDrawSize, wigCart->windowingFunction,
+
+struct preDrawContainer *preContainer;
+
+/* loop through all the preDraw containers */
+for(preContainer = preDrawList; preContainer; preContainer = preContainer->next)
+    {
+    struct preDrawElement *preDraw = preContainer->preDraw;
+    double thisOverallUpperLimit;
+    double thisOverallLowerLimit;
+    double thisGraphUpperLimit;
+    double thisGraphLowerLimit;
+
+    preDrawWindowFunction(preDraw, preDrawSize, wigCart->windowingFunction,
 	wigCart->transformFunc);
-preDrawSmoothing(preDraw, preDrawSize, wigCart->smoothingWindow);
-overallRange = preDrawLimits(preDraw, preDrawZero, width,
-    &overallUpperLimit, &overallLowerLimit);
-graphRange = preDrawAutoScale(preDraw, preDrawZero, width,
+    preDrawSmoothing(preDraw, preDrawSize, wigCart->smoothingWindow);
+    overallRange = preDrawLimits(preDraw, preDrawZero, width,
+	&thisOverallUpperLimit, &thisOverallLowerLimit);
+    graphRange = preDrawAutoScale(preDraw, preDrawZero, width,
     wigCart->autoScale,
-    &overallUpperLimit, &overallLowerLimit,
-    &graphUpperLimit, &graphLowerLimit,
+	&thisOverallUpperLimit, &thisOverallLowerLimit,
+	&thisGraphUpperLimit, &thisGraphLowerLimit,
     &overallRange, &epsilon, tg->lineHeight,
     wigCart->maxY, wigCart->minY, wigCart->alwaysZero);
 
+    if (preContainer == preDrawList) // first time through
+	{
+	overallUpperLimit = thisOverallUpperLimit;
+	overallLowerLimit = thisOverallLowerLimit;
+	graphUpperLimit = thisGraphUpperLimit;
+	graphLowerLimit = thisGraphLowerLimit;
+	}
+    else
+	{
+	if (overallUpperLimit < thisOverallUpperLimit)
+	    overallUpperLimit = thisOverallUpperLimit;
+	if (overallLowerLimit > thisOverallLowerLimit)
+	    overallLowerLimit = thisOverallLowerLimit;
+	if (graphUpperLimit < thisGraphUpperLimit)
+	    graphUpperLimit = thisGraphUpperLimit;
+	if (graphLowerLimit > thisGraphLowerLimit)
+	    graphLowerLimit = thisGraphLowerLimit;
+	}
+    }
 
+
+overallRange = overallUpperLimit - overallLowerLimit;
+graphRange = graphUpperLimit - graphLowerLimit;
+epsilon = graphRange / tg->lineHeight;
+struct preDrawElement *preDraw = preDrawList->preDraw;
 colorArray = makeColorArray(preDraw, width, preDrawZero,
     wigCart, tg, hvg);
 
-graphPreDraw(preDraw, preDrawZero, width,
+/* now draw all the containers */
+for(preContainer = preDrawList; preContainer; preContainer = preContainer->next)
+    {
+    struct preDrawElement *preDraw = preContainer->preDraw;
+    graphPreDraw(preDraw, preDrawZero, width,
     tg, hvg, xOff, yOff, graphUpperLimit, graphLowerLimit, graphRange,
     epsilon, colorArray, vis, wigCart);
+    }
 
 drawZeroLine(vis, wigCart->horizontalGrid,
     graphUpperLimit, graphLowerLimit,
     hvg, xOff, yOff, width, tg->lineHeight);
@@ -1312,12 +1352,16 @@
 /*	now we are ready to draw.  Each element in the preDraw[] array
  *	cooresponds to a single pixel on the screen
  */
 
+struct preDrawContainer *preDrawContainer;
+AllocVar(preDrawContainer);
+preDrawContainer->preDraw = preDraw;
 wigDrawPredraw(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis,
-	preDraw, preDrawZero, preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
+	preDrawContainer, preDrawZero, preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
 
 
+freeMem(preDrawContainer);
 freeMem(preDraw);
 }	/*	wigDrawItems()	*/
 
 void wigLeftLabels(struct track *tg, int seqStart, int seqEnd,