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,