d3875e2d3ebe45f89214d98a2c766a3771e7b057
braney
  Sun Apr 7 15:05:54 2019 -0700
add manual view limits to lolly

diff --git src/hg/hgTracks/lolly.c src/hg/hgTracks/lolly.c
index 5e1e58c..af7aa93 100644
--- src/hg/hgTracks/lolly.c
+++ src/hg/hgTracks/lolly.c
@@ -73,34 +73,37 @@
 {
 int fontHeight = tl.fontHeight+1;
 int centerLabel = (height/2)-(fontHeight/2);
 if ( tg->visibility == tvDense)
     {
     hvGfxText(hvg, xOff, yOff+fontHeight, color, font, tg->shortLabel);
     return;
     }
 
 hvGfxText(hvg, xOff, yOff+centerLabel, color, font, tg->shortLabel);
 char upper[1024];
 safef(upper, sizeof(upper), "%g -",   tg->lollyCart->upperLimit);
 hvGfxTextRight(hvg, xOff, yOff + 2 * 5 , width - 1, fontHeight, color,
     font, upper);
 char lower[1024];
+if (tg->lollyCart->lowerLimit < tg->lollyCart->upperLimit)
+    {
     safef(lower, sizeof(lower), "%g _", tg->lollyCart->lowerLimit);
     hvGfxTextRight(hvg, xOff, yOff+height-fontHeight - 2 * 5, width - 1, fontHeight,
         color, font, lower);
     }
+}
 
 
 static int lollyHeight(struct track *tg, enum trackVisibility vis)
 /* calculate height of all the lollys being displayed */
 {
 if ( tg->visibility == tvDense)
     return  tl.fontHeight;
 
 return tg->lollyCart->height;
 }
 
 double calcVarianceFromSums(double sum, double sumSquares, bits64 n)
 /* Calculate variance. */
 {   
 double var = sumSquares - sum*sum/n;
@@ -119,46 +122,51 @@
 {
 const struct lolly *a = *((struct lolly **)va);
 const struct lolly *b = *((struct lolly **)vb);
 return a->height - b->height;
 }
 
 void lollyLoadItems(struct track *tg)
 {
 struct lm *lm = lmInit(0);
 struct bbiFile *bbi =  fetchBbiForTrack(tg);
 struct bigBedInterval *bb, *bbList =  bigBedIntervalQuery(bbi, chromName, winStart, winEnd, 0, lm);
 char *bedRow[bbi->fieldCount];
 char startBuf[16], endBuf[16];
 struct lolly *popList = NULL, *pop;
 unsigned lollyField = 5;
+struct lollyCartOptions *lollyCart = tg->lollyCart;
 char *setting = trackDbSetting(tg->tdb, "lollyField");
 if (setting != NULL)
     lollyField = atoi(setting);
+double minVal = DBL_MAX, maxVal = -DBL_MAX;
+
 
 double sumData = 0.0, sumSquares = 0.0;
-double minVal = DBL_MAX, maxVal = -DBL_MAX;
 unsigned count = 0;
 
 int trackHeight = tg->lollyCart->height;
                     
 for (bb = bbList; bb != NULL; bb = bb->next)
     {
-    AllocVar(pop);
-    slAddHead(&popList, pop);
     bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow));
     double val = atof(bedRow[lollyField - 1]);
+    if (!((lollyCart->autoScale == wiggleScaleAuto) ||  ((val >= lollyCart->minY) && (val <= lollyCart->maxY) )))
+        continue;
+
+    AllocVar(pop);
+    slAddHead(&popList, pop);
     pop->val = val;
     pop->start = atoi(bedRow[1]);
     pop->end = atoi(bedRow[2]);
     pop->name = cloneString(bedRow[3]);
     count++;
     sumData += val;
     sumSquares += val * val;
     if (val > maxVal)
         maxVal = val;
     if (val < minVal)
         minVal = val;
     }
 
 tg->lollyCart->upperLimit = maxVal;
 tg->lollyCart->lowerLimit = minVal;
@@ -210,34 +218,43 @@
     */
 slSort(&popList, cmpHeight);
 tg->items = popList;
 }
 
 static struct lollyCartOptions *lollyCartOptionsNew(struct cart *cart, struct trackDb *tdb, 
                                 int wordCount, char *words[])
 {
 struct lollyCartOptions *lollyCart;
 AllocVar(lollyCart);
 
 int maxHeightPixels;
 int minHeightPixels;
 int defaultHeight;  /*  pixels per item */
 int settingsDefault;
+
 cartTdbFetchMinMaxPixels(cart, tdb, MIN_HEIGHT_PER, atoi(DEFAULT_HEIGHT_PER), atoi(DEFAULT_HEIGHT_PER),
                                 &minHeightPixels, &maxHeightPixels, &settingsDefault, &defaultHeight);
 lollyCart->height = defaultHeight;
 
+lollyCart->autoScale = wigFetchAutoScaleWithCart(cart,tdb, tdb->track, NULL);
+
+double tDbMinY;     /*  data range limits from trackDb type line */
+double tDbMaxY;     /*  data range limits from trackDb type line */
+char *trackWords[8];     /*  to parse the trackDb type line  */
+int trackWordCount = 0;  /*  to parse the trackDb type line  */
+wigFetchMinMaxYWithCart(cart, tdb, tdb->track, &lollyCart->minY, &lollyCart->maxY, &tDbMinY, &tDbMaxY, trackWordCount, trackWords);
+
 return lollyCart;
 }
 
 void lollyMethods(struct track *track, struct trackDb *tdb, 
                                 int wordCount, char *words[])
 /* bigLolly track type methods */
 {
 struct lollyCartOptions *lollyCart = lollyCartOptionsNew(cart, tdb, wordCount, words);
 char *ourWords[2];
 ourWords[0] = "bigBed";
 ourWords[1] = "4";
 bigBedMethods(track, tdb,2,ourWords);
 if (tdb->visibility == tvDense)
     return;
 track->loadItems = lollyLoadItems;