9ffce6e1c30025e5dda5b736502ce8862bb9fe19 braney Mon Mar 12 10:44:00 2018 -0700 make wiggle sorting give the same answer regardless of the type of graph diff --git src/hg/hgTracks/wigTrack.c src/hg/hgTracks/wigTrack.c index eab8c45..2733cdf 100644 --- src/hg/hgTracks/wigTrack.c +++ src/hg/hgTracks/wigTrack.c @@ -878,50 +878,58 @@ if (drawColor != oldDrawColor) { mediumColor = somewhatLighterColor32(drawColor); lightColor = somewhatLighterColor32(mediumColor); oldDrawColor = drawColor; } /* count is non-zero meaning valid data exists here */ if (p->count) { /* data value has been picked by previous scanning. * Could be smoothed, maybe not. */ double dataValue = p->smooth; + /* save a number that represents how many pixels that would be set if we were drawing bars. + * This may used for sorting later on */ + int iy0 = graphUpperLimit * scaleFactor; + int iy1 = (graphUpperLimit - dataValue)*scaleFactor; + int boxHeight = max(1,abs(iy1 - iy0)); + *bitCount += boxHeight; + + /* The graphing coordinate conversion situation is: * graph coordinate y = 0 is graphUpperLimit data space * and total graph height is h which is graphRange in data space * The Y axis is positive down, negative up. * * Taking a simple coordinate conversion from data space * to the graphing space, the data value is at: * h * ((graphUpperLimit - dataValue)/graphRange) * and a data value zero line is at: * h * (graphUpperLimit/graphRange) * These may end up to be negative meaning they are above * the upper graphing limit, or be very large, meaning they * are below the lower graphing limit. This is OK, the * clipping will be taken care of by the vgBox() function. */ if (vis == tvFull || vis == tvPack) { #define scaleHeightToPixels(val) (min(BIGNUM,(scaleFactor * (graphUpperLimit - (val)) + yOff))) -#define doLine(image, x, y, height, color) {vLine(image, x, y, height, color); *bitCount += height;} +#define doLine(image, x, y, height, color) {vLine(image, x, y, height, color); } if (lineBar == wiggleGraphBar) { if (whiskers) { int zeroPos = max(0,scaleHeightToPixels(0)); int scaledVal = scaleHeightToPixels(dataValue); double std = calcStdFromSums(p->sumData, p->sumSquares, p->count); double mean = p->sumData/p->count; if (dataValue < 0) { int scaledMin = scaleHeightToPixels(doTransform(p->min, transformFunc)); int lightHeight = max(1,scaledMin-zeroPos); int mediumHeight = lightHeight; if (!isnan(std))