8935bd46a374201b88bc38ed35994f2a306827d7
braney
  Thu Apr 24 17:38:41 2014 -0700
make stacked wiggles grok the smoothing parameter,  Fix autoscale to usethe windowingFunction to drive the autoScale.

diff --git src/hg/hgTracks/multiWig.c src/hg/hgTracks/multiWig.c
index 2dade16..0e20422 100644
--- src/hg/hgTracks/multiWig.c
+++ src/hg/hgTracks/multiWig.c
@@ -174,51 +174,32 @@
 struct slRef *ref;
 int numTrack = 0;
 for (ref = refList; ref != NULL; numTrack++,ref = ref->next)
     {
     struct preDrawContainer *pre = ref->val;
     if (pre == NULL)  // pre may be null if the bigWig file didn't load
 	continue;
 
     struct preDrawElement *p = pre->preDraw + pre->preDrawZero;
     int width = pre->width;
     int i;
     int offset = numTrack * pre->width;
     int prevOffset = (numTrack - 1) * pre->width;
     for (i=0; i<width; ++i, offset++,prevOffset++)
 	{
-	double val;
+	double val = p->smooth;
 
-	switch(windowingFunction)
-	{
-	    case wiggleWindowingMean:
-		val = p->sumData / p->count;
-		break;
-
-	    case wiggleWindowingWhiskers:
-	    case wiggleWindowingMax:
-		val = p->max;
-		break;
-	    case wiggleWindowingMin:
-		val = p->min;
-		break;
-	    default:
-		{
-		errAbort("bad windowing function (value: %d)\n", windowingFunction);
-		break;
-		}
-	}
 	if (p->count)
 	    {
 	    if (yOffsets)
 		yOffsets[offset] = val;
 	    else
 		{
 		if (min > val) min = val;
 		if (max < val) max = val;
 		}
 	    }
 	else if (yOffsets)
 	    {
 	    yOffsets[offset] = 0;
 	    }
 	if (yOffsets && (numTrack > 0))
@@ -299,67 +280,69 @@
 	}
     }
 
 if (errMsgFound)
     {
     Color yellow = hvGfxFindRgb(hvg, &undefinedYellowColor);
     hvGfxBox(hvg, xOff, yOff, width, tg->height, yellow);
     }
 
 struct wigCartOptions *wigCart = tg->extraUiData;
 struct wigGraphOutput *wgo = setUpWgo(xOff, yOff, width, tg->height, numTracks, wigCart, hvg);
 
 /* Cope with autoScale and stacked bars - we do it here rather than in the child tracks, so that
  * all children can be on same scale. */
 double minVal, maxVal;
-if (wigCart->autoScale || (wigCart->aggregateFunction == wiggleAggregateStacked))
-    {
+
 /* Force load of all predraw arrays so can do calcs. Build up list, and then
  * figure out max/min.  No worries about multiple loading, the loaders protect
  * themselves. */
 struct slRef *refList = NULL;
 for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
     {
     if (isSubtrackVisible(subtrack))
 	{
 	struct preDrawContainer *pre = subtrack->loadPreDraw(subtrack, seqStart, seqEnd, width);
+	preDrawWindowFunction(pre->preDraw, pre->preDrawSize, wigCart->windowingFunction,
+		wigCart->transformFunc);
+	preDrawSmoothing(pre->preDraw, pre->preDrawSize, wigCart->smoothingWindow);
+	pre->smoothingDone = TRUE;
 	refAdd(&refList, pre);
 	}
     }
 slReverse(&refList);
 minMaxVals(refList, &minVal, &maxVal, wigCart->windowingFunction,  wigCart->alwaysZero, wgo->yOffsets);
 slFreeList(&refList);
 
-    if (wigCart->autoScale)
+if (!wigCart->autoScale)
     {
-	/* Cope with log transform if need be */
-	if (wigCart->transformFunc == wiggleTransformFuncLog)
-	     {
-	     minVal = wiggleLogish(minVal);
-	     maxVal = wiggleLogish(maxVal);
+    minVal = wigCart->minY;
+    maxVal = wigCart->maxY;
     }
 
 /* Loop through again setting up the wigCarts of the children to have minY/maxY for
  * our limits and autoScale off. */
 for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
     {
     struct wigCartOptions *wigCart = subtrack->extraUiData;
     wigCart->minY = minVal;
     wigCart->maxY = maxVal;
     wigCart->autoScale = wiggleScaleManual;
-	    }
-	}
+    struct preDrawContainer *pre = subtrack->preDrawContainer;
+    pre->graphUpperLimit = maxVal;
+    pre->graphLowerLimit = minVal;
+    
     }
 
 int numTrack = 0;
 for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
     {
     if (isSubtrackVisible(subtrack))
 	{
         if (!subtrack->networkErrMsg || !errMsgShown)
 	    {
 	    if (subtrack->networkErrMsg)
 	       errMsgShown = TRUE;
 	    wgo->numTrack = numTrack++;
 	    subtrack->wigGraphOutput = wgo;
 	    int height = subtrack->totalHeight(subtrack, vis);
 	    hvGfxSetClip(hvg, xOff, y, width, height);