ff4af73ba2a52b18ce5423aae3104fae1d1a3473
hiram
  Fri Nov 20 17:25:43 2020 -0800
converted to single file for json data instead of one file for each track refs #21980

diff --git src/hg/hgTracks/wigTrack.c src/hg/hgTracks/wigTrack.c
index 5375908..488f7b1 100644
--- src/hg/hgTracks/wigTrack.c
+++ src/hg/hgTracks/wigTrack.c
@@ -13,32 +13,30 @@
 #include "hdb.h"
 #include "hgTracks.h"
 #include "wiggle.h"
 #include "hmmstats.h"
 #include "scoredRef.h"
 #ifndef GBROWSE
 #include "customTrack.h"
 #endif /* GBROWSE */
 #include "wigCommon.h"
 #include "imageV2.h"
 #include "memgfx.h"
 #include "udc.h"
 #include "trashDir.h"
 #include "jsonWrite.h"
 
-extern boolean enableMouseOver;
-
 struct wigItem
 /* A wig track item. */
     {
     struct wigItem *next;
     int start, end;	/* Start/end in chrom (aka browser) coordinates. */
     char *db;		/* Database */
     int ix;		/* Position in list. */
     int height;		/* Pixel height of item. */
     unsigned span;      /* each value spans this many bases */
     unsigned count;     /* number of values to use */
     unsigned offset;    /* offset in File to fetch data */
     char *file; /* path name to data file, one byte per value */
     double lowerLimit;  /* lowest data value in this block */
     double dataRange;   /* lowerLimit + dataRange = upperLimit */
     unsigned validCount;        /* number of valid data values in this block */
@@ -929,30 +927,31 @@
         else /* perhaps entered region without values after some data already */
             {
             if (mouseOverX2 > 0)	/* yes, been in data, end it here */
                 {
 		mouseOverData->x2 = mouseOverX2;
                 mouseOverX2 = -1;	/* start over with new data when found*/
                 }
             }
         /* potentially end the last mouseOver box */
         if (mouseOverX2 > 0 && mouseOverX2 > mouseOverData->x2)
                 mouseOverData->x2 = mouseOverX2;
 
         }       //      if (enableMouseOver)
     else
 	skipMouseOvers = TRUE;
+
     /* ===== done with mouseOver calculations===== */
 
     assert(x1/pixelBins->binSize < pixelBins->binCount);
     unsigned long *bitCount = &pixelBins->bins[x1/pixelBins->binSize];
 
     Color drawColor = colorArray[x1];
     if (drawColor != oldDrawColor)
         {
 	mediumColor = somewhatLighterColor32(drawColor);
 	lightColor = somewhatLighterColor32(mediumColor);
 	oldDrawColor = drawColor;
         }
 
     /*	count is non-zero meaning valid data exists here	*/
     if (p->count)
@@ -1427,63 +1426,47 @@
 struct wigMouseOver *mouseOverData = graphPreDrawContainer(preContainer,
     preDrawZero, width, tg, hvg, xOff, yOff,
     graphUpperLimit, graphLowerLimit, graphRange, vis, wigCart);
 
 drawZeroLine(vis, wigCart->horizontalGrid,
     graphUpperLimit, graphLowerLimit,
     hvg, xOff, yOff, width, tg->lineHeight);
 
 drawArbitraryYLine(vis, (enum wiggleGridOptEnum)wigCart->yLineOnOff,
     graphUpperLimit, graphLowerLimit,
     hvg, xOff, yOff, width, tg->lineHeight, wigCart->yLineMark, graphRange,
     wigCart->yLineOnOff);
 
 if (enableMouseOver && mouseOverData)
     {
-    static boolean beenHereDoneThat = FALSE;
-    struct tempName jsonData;
-    trashDirFile(&jsonData, "hgt", tg->track, ".json");
-    FILE *trashJson = mustOpen(jsonData.forCgi, "w");
-    struct jsonWrite *jw = jsonWriteNew();
-    jsonWriteObjectStart(jw, NULL);
-    jsonWriteListStart(jw, tg->track);
+    jsonWriteListStart(mouseOverJson, tg->track);
     slReverse(&mouseOverData);
     struct wigMouseOver *dataItem = mouseOverData;
     for (; dataItem; dataItem = dataItem->next)
         {
-        jsonWriteObjectStart(jw, NULL);
-        jsonWriteNumber(jw, "x1", (long long)dataItem->x1);
-        jsonWriteNumber(jw, "x2", (long long)dataItem->x2);
-        jsonWriteDouble(jw, "v", dataItem->value);
-        jsonWriteNumber(jw, "c", dataItem->valueCount);
-        jsonWriteObjectEnd(jw);
-        }
-    jsonWriteListEnd(jw);
-    jsonWriteObjectEnd(jw);
-    fputs(jw->dy->string,trashJson);
-    carefulClose(&trashJson);
-    slFreeList(&mouseOverData);
-    if (! beenHereDoneThat )
-        {
-        hPrintf("<div id='mouseOverVerticalLine' class='mouseOverVerticalLine'></div>\n");
-        hPrintf("<div id='mouseOverText' class='mouseOverText'></div>\n");
-// hPrintf("<div id='mouseDbg'><span id='debugMsg'><p>. . . mouseDbg</p></span></div>\n");
-        beenHereDoneThat = TRUE;
+        jsonWriteObjectStart(mouseOverJson, NULL);
+        jsonWriteNumber(mouseOverJson, "x1", (long long)dataItem->x1);
+        jsonWriteNumber(mouseOverJson, "x2", (long long)dataItem->x2);
+        jsonWriteDouble(mouseOverJson, "v", dataItem->value);
+        jsonWriteNumber(mouseOverJson, "c", dataItem->valueCount);
+        jsonWriteObjectEnd(mouseOverJson);
         }
-    // hidden element to pass along jsonData file name and also the trigger
+    jsonWriteListEnd(mouseOverJson);
+    slFreeList(&mouseOverData);
+    // hidden element to pass along jsonUrl file name and also the trigger
     // that this track has data to display.
-    hPrintf("<div id='mouseOver_%s' name='%s' class='hiddenText mouseOverData' jsonData='%s'></div>\n", tg->track, tg->track, jsonData.forCgi);
+    hPrintf("<div id='mouseOver_%s' name='%s' class='hiddenText mouseOverData' jsonUrl='%s'></div>\n", tg->track, tg->track, mouseOverJsonFile->forCgi);
     }
 // Might need something like this later for other purposes
 // else if (enableMouseOver)       // system enabled, but no data for this track
 //     {
     /* signal to indicate zoom in required to see data */
 //     hPrintf("<div id='mouseOver_%s' name='%s' class='hiddenText mouseOverData'></div>\n", tg->track, tg->track);
 //     }
 
 wigMapSelf(tg, hvg, seqStart, seqEnd, xOff, yOff, width);
 }
 
 struct preDrawContainer *wigLoadPreDraw(struct track *tg, int seqStart, int seqEnd, int width)
 /* Do bits that load the predraw buffer tg->preDrawContainer. */
 {
 /* Just need to do this once... */