1090940912927feb932d11ad5fdefe1a80fffc6b
braney
  Sun Jun 1 15:23:20 2014 -0700
add Watson Cricket mode
diff --git src/hg/hgTracks/wigTrack.c src/hg/hgTracks/wigTrack.c
index abc4816..3e9f43d 100644
--- src/hg/hgTracks/wigTrack.c
+++ src/hg/hgTracks/wigTrack.c
@@ -569,31 +569,32 @@
 }
 
 static double doTransform(double x, enum wiggleTransformFuncEnum transformFunc)
 /* Do log-type transformation if asked. */
 {
 if (transformFunc == wiggleTransformFuncLog)
     {
     x = wiggleLogish(x);
     }
 return x;
 }
 
 
 void preDrawWindowFunction(struct preDrawElement *preDraw, int preDrawSize,
 	enum wiggleWindowingEnum windowingFunction,
-	enum wiggleTransformFuncEnum transformFunc)
+	enum wiggleTransformFuncEnum transformFunc,
+	boolean doNegative)
 /*	apply windowing function to the values in preDraw array	*/
 {
 int i;
 
 /*	Determine the raw plotting value	*/
 for (i = 0; i < preDrawSize; ++i)
     {
     double dataValue;
     if (preDraw[i].count)
 	{
 	switch (windowingFunction)
 	    {
 	    case wiggleWindowingMin:
 		if (fabs(preDraw[i].min)
 				< fabs(preDraw[i].max))
@@ -603,31 +604,39 @@
 		break;
 	    case wiggleWindowingMean:
 	    case wiggleWindowingWhiskers:
 		dataValue =
 		    preDraw[i].sumData / preDraw[i].count;
 		break;
 	    default:
 	    case wiggleWindowingMax:
 		if (fabs(preDraw[i].min)
 			> fabs(preDraw[i].max))
 		    dataValue = preDraw[i].min;
                 else
 		    dataValue = preDraw[i].max;
 		break;
 	    }
+
 	dataValue = doTransform(dataValue, transformFunc);
+	if (doNegative)
+	    {
+	    dataValue = -dataValue;
+	    int swap = preDraw[i].min;
+	    preDraw[i].min = -preDraw[i].max;
+	    preDraw[i].max = -swap;
+	    }
 	preDraw[i].plotValue = dataValue;
 	preDraw[i].smooth = dataValue;
 	}
     }
 }
 
 void preDrawSmoothing(struct preDrawElement *preDraw, int preDrawSize,
     enum wiggleSmoothingEnum smoothingWindow)
 /*      apply smoothing function to preDraw array       */
 {
 /*      Are we perhaps doing smoothing ?  smoothingWindow is 1 off due
  *      to enum funny business in inc/hui.h and lib/hui.c       */
 if (smoothingWindow > 0)
     {
     int winSize = smoothingWindow + 1; /* enum funny business */
@@ -1221,31 +1230,31 @@
 struct wigCartOptions *wigCart = (struct wigCartOptions *) tg->extraUiData;
 
 yLineOnOff = wigCart->yLineOnOff;
 yLineMark = wigCart->yLineMark;
 
 /*	width - width of drawing window in pixels
  *	pixelsPerBase - pixels per base
  *	basesPerPixel - calculated as 1.0/pixelsPerBase
  */
 
 struct preDrawElement *preDraw = preContainer->preDraw;
 
 if (preContainer->smoothingDone == FALSE)
     {
     preDrawWindowFunction(preDraw, preDrawSize, wigCart->windowingFunction,
-	    wigCart->transformFunc);
+	    wigCart->transformFunc, wigCart->doNegative);
     preDrawSmoothing(preDraw, preDrawSize, wigCart->smoothingWindow);
     graphRange = preDrawAutoScale(preDraw, preDrawZero, width,
 	wigCart->autoScale, wigCart->windowingFunction,
 	&preContainer->graphUpperLimit, &preContainer->graphLowerLimit,
 	&epsilon, tg->lineHeight,
 	wigCart->maxY, wigCart->minY, wigCart->alwaysZero);
 	}
 
 graphUpperLimit = preContainer->graphUpperLimit;
 graphLowerLimit = preContainer->graphLowerLimit;
 
 /* if we're autoscaling and the range is 0 this implies that all values 
  * in the given range are the same.  We create a bottom of the scale  
  * by subtracting one from the only value.
  * This results in drawing a box that fills the range. */
@@ -1630,30 +1639,31 @@
  *	limits specified in trackDb or returning defaults
  */
 wigCart->lineBar = wigFetchGraphTypeWithCart(cart,tdb,tdb->track, (char **) NULL);
 wigCart->horizontalGrid = wigFetchHorizontalGridWithCart(cart,tdb,tdb->track, (char **) NULL);
 
 wigCart->autoScale = wigFetchAutoScaleWithCart(cart,tdb,tdb->track, (char **) NULL);
 wigCart->windowingFunction = wigFetchWindowingFunctionWithCart(cart,tdb,tdb->track, (char **) NULL);
 wigCart->smoothingWindow = wigFetchSmoothingWindowWithCart(cart,tdb,tdb->track, (char **) NULL);
 
 wigFetchMinMaxPixelsWithCart(cart,tdb,tdb->track, &minHeight, &maxHeight, &defaultHeight);
 wigFetchYLineMarkValueWithCart(cart,tdb,tdb->track, &yLineMark);
 wigCart->yLineMark = yLineMark;
 wigCart->yLineOnOff = wigFetchYLineMarkWithCart(cart,tdb,tdb->track, (char **) NULL);
 wigCart->alwaysZero = (enum wiggleAlwaysZeroEnum)wigFetchAlwaysZeroWithCart(cart,tdb,tdb->track, (char **) NULL);
 wigCart->transformFunc = (enum wiggleTransformFuncEnum)wigFetchTransformFuncWithCart(cart,tdb,tdb->track, (char **) NULL);
+wigCart->doNegative = wigFetchDoNegativeWithCart(cart,tdb,tdb->track, (char **) NULL);
 
 wigCart->maxHeight = maxHeight;
 wigCart->defaultHeight = defaultHeight;
 wigCart->minHeight = minHeight;
 
 wigFetchMinMaxYWithCart(cart,tdb,tdb->track, &wigCart->minY, &wigCart->maxY, NULL, NULL, wordCount, words);
 
 wigCart->colorTrack = trackDbSetting(tdb, "wigColorBy");
 
 char *containerType = trackDbSetting(tdb, "container");
 if (containerType != NULL && sameString(containerType, "multiWig"))
      wigCart->isMultiWig = TRUE;
 
 wigCart->aggregateFunction = wigFetchAggregateFunctionWithCart(cart,tdb,tdb->track, (char **) NULL);