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