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; ismooth; - 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);