src/hg/hgTracks/wigTrack.c 1.113
1.113 2010/05/25 17:50:51 kent
Making log transform work with whiskers.
Index: src/hg/hgTracks/wigTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/wigTrack.c,v
retrieving revision 1.112
retrieving revision 1.113
diff -b -B -U 4 -r1.112 -r1.113
--- src/hg/hgTracks/wigTrack.c 23 May 2010 20:12:32 -0000 1.112
+++ src/hg/hgTracks/wigTrack.c 25 May 2010 17:50:51 -0000 1.113
@@ -566,8 +566,22 @@
}
return preDraw;
}
+static double doTransform(double x, enum wiggleTransformFuncEnum transformFunc)
+/* Do log-type transformation if asked. */
+{
+if (transformFunc == wiggleTransformFuncLog)
+ {
+ if (x >= 0)
+ x = log(1+x);
+ else
+ x = -log(1-x);
+ }
+return x;
+}
+
+
void preDrawWindowFunction(struct preDrawElement *preDraw, int preDrawSize,
enum wiggleWindowingEnum windowingFunction,
enum wiggleTransformFuncEnum transformFunc)
/* apply windowing function to the values in preDraw array */
@@ -581,36 +595,30 @@
if (preDraw[i].count)
{
switch (windowingFunction)
{
- case (wiggleWindowingMin):
+ case wiggleWindowingMin:
if (fabs(preDraw[i].min)
< fabs(preDraw[i].max))
dataValue = preDraw[i].min;
else
dataValue = preDraw[i].max;
break;
- case (wiggleWindowingMean):
- case (wiggleWindowingWhiskers):
+ case wiggleWindowingMean:
+ case wiggleWindowingWhiskers:
dataValue =
preDraw[i].sumData / preDraw[i].count;
break;
default:
- case (wiggleWindowingMax):
+ case wiggleWindowingMax:
if (fabs(preDraw[i].min)
> fabs(preDraw[i].max))
dataValue = preDraw[i].min;
else
dataValue = preDraw[i].max;
break;
}
- if (transformFunc == wiggleTransformFuncLog)
- {
- if (dataValue >= 0)
- dataValue = log(1+dataValue);
- else
- dataValue = -log(1-dataValue);
- }
+ dataValue = doTransform(dataValue, transformFunc);
preDraw[i].plotValue = dataValue;
preDraw[i].smooth = dataValue;
}
}
@@ -790,14 +798,13 @@
Color oldDrawColor = colorArray[0] + 1; /* Just to be different from 1st drawColor. */
Color mediumColor = MG_BLACK; // Will be overriden
Color lightColor = MG_BLACK; // Will be overriden
Color clipColor = MG_MAGENTA;
+enum wiggleTransformFuncEnum transformFunc = wigCart->transformFunc;
enum wiggleGraphOptEnum lineBar = wigCart->lineBar;
boolean whiskers = (wigCart->windowingFunction == wiggleWindowingWhiskers
&& width < winEnd-winStart);
-/* Return gray shade corresponding to a number from 50 - 100 */
-
/* right now this is a simple pixel by pixel loop. Future
* enhancements could draw boxes where pixels
* are all the same height in a run.
*/
@@ -849,20 +856,22 @@
{
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(p->min);
+ int scaledMin = scaleHeightToPixels(doTransform(p->min, transformFunc));
int lightHeight = max(1,scaledMin-zeroPos);
int mediumHeight = lightHeight;
if (!isnan(std))
{ // Test needed due to bug in version 1.5 bigWiles
- int scaledMinus = scaleHeightToPixels(dataValue-std);
+ double minus = doTransform(mean - std, transformFunc);
+ int scaledMinus = scaleHeightToPixels(minus);
mediumHeight = max(1,scaledMinus-zeroPos);
}
- int darkHeight = max(1,scaledVal - zeroPos);
+ int darkHeight = max(1,scaledVal-zeroPos);
if (zeroPos == (yOff+h)) // bottom pixel special case
zeroPos -= 1;
if (((zeroPos-yOff)+darkHeight) == 0)
darkHeight += 1; // top pixel special case
@@ -897,15 +906,16 @@
/* Calculate medium part from smoothed mean + std */
int mediumTop = darkTop, mediumHeight = darkHeight;
if (!isnan(std))
{ // Test needed due to bug in version 1.5 bigWiles
- int scaledPlus = scaleHeightToPixels(dataValue+std);
+ double plus = doTransform(mean + std, transformFunc);
+ int scaledPlus = scaleHeightToPixels(plus);
int boxHeight = max(1,zeroPos-scaledPlus);
mediumTop = scaledPlus, mediumHeight = boxHeight;
}
/* Calculate light part from max. */
- int scaledMax = scaleHeightToPixels(p->max);
+ int scaledMax = scaleHeightToPixels(doTransform(p->max, transformFunc));
if (scaledMax == (h+yOff))
scaledMax = (h+yOff) - 1;
boxHeight = max(1,zeroPos-scaledMax);
int lightTop = scaledMax, lightHeight = boxHeight;
@@ -940,21 +950,21 @@
else
{ /* draw a 3 pixel height box */
if (whiskers)
{
- int scaledMin = scaleHeightToPixels(p->min);
- int scaledMax = scaleHeightToPixels(p->max);
+ int scaledMin = scaleHeightToPixels(doTransform(p->min, transformFunc));
+ int scaledMax = scaleHeightToPixels(doTransform(p->max, transformFunc));
+ double mean = p->sumData/p->count;
int boxHeight = max(1,scaledMin - scaledMax);
hvGfxBox(hvg, x, scaledMax, 1, boxHeight, lightColor);
int scaledMean = scaleHeightToPixels(dataValue);
double std = calcStdFromSums(p->sumData, p->sumSquares, p->count);
if (!isnan(std)) // Test needed because of bug in version 1.5 bigWiles
{
- int scaledMeanPlus = scaleHeightToPixels(dataValue+std);
- int scaledMeanMinus = scaleHeightToPixels(dataValue-std);
- int boxHeight = max(1,scaledMeanMinus - scaledMeanPlus);
- hvGfxBox(hvg, x, scaledMeanPlus, 1,
- boxHeight, mediumColor);
+ int scaledPlus = scaleHeightToPixels(doTransform(mean+std, transformFunc));
+ int scaledMinus = scaleHeightToPixels(doTransform(mean-std, transformFunc));
+ int boxHeight = max(1,scaledMinus - scaledPlus);
+ hvGfxBox(hvg, x, scaledPlus, 1, boxHeight, mediumColor);
}
hvGfxBox(hvg, x, scaledMean, 1, 1, drawColor);
}
else