7f98bf75bd712a44b8ed9ededdd10e0f387cd35a
angie
  Thu Aug 13 10:31:58 2015 -0700
Moved averaging of wiggle values back from annoFormatTab to annoGrateWig,
so that it can be done properly across multiple regions with data.
A user was trying to get average GC over 1MB regions, but averages of
smaller subregions were returned instead.
refs #15834

diff --git src/lib/annoStreamBigWig.c src/lib/annoStreamBigWig.c
index c3681e8..933c0ba 100644
--- src/lib/annoStreamBigWig.c
+++ src/lib/annoStreamBigWig.c
@@ -102,31 +102,31 @@
 {
 float *vals;
 int baseCount = endIv->end - startIv->start;
 AllocArray(vals, baseCount);
 int vecOff = 0;
 struct bbiInterval *iv;
 for (iv = startIv;  iv != endIv->next;  iv = iv->next)
     {
     int i;
     for (i = 0;  i < (iv->end - iv->start);  i++)
 	vals[vecOff++] = iv->val;
     if (vecOff > baseCount)
 	errAbort("annoStreamBigWig %s: overflowed baseCount (%s:%d-%d)",
 		 name, chrom, startIv->start, endIv->end);
     }
-return annoRowWigNew(chrom, startIv->start, endIv->end, rightJoinFail, vals, callerLm);
+return annoRowWigVecNew(chrom, startIv->start, endIv->end, rightJoinFail, vals, callerLm);
 }
 
 static struct annoRow *asbwNextRow(struct annoStreamer *sSelf, char *minChrom, uint minEnd,
 				   struct lm *callerLm)
 /* Return a single annoRow, or NULL if there are no more items. */
 {
 struct annoStreamBigWig *self = (struct annoStreamBigWig *)sSelf;
 if (self->eof)
     return NULL;
 else if (self->nextInterval == NULL)
     {
     asbwDoQuery(self, minChrom, minEnd);
     if (self->eof)
         return NULL;
     }
@@ -179,23 +179,25 @@
 struct asObject *annoStreamBigWigAsObject()
 /* Return an asObj that describes annoRow contents for wiggle (just float value). */
 {
 return asParseText(annoRowBigWigAsText);
 }
 
 struct annoStreamer *annoStreamBigWigNew(char *fileOrUrl, struct annoAssembly *aa)
 /* Create an annoStreamer (subclass) object from a file or URL. */
 {
 struct bbiFile *bbi = bigWigFileOpen(fileOrUrl);
 struct asObject *asObj = annoStreamBigWigAsObject();
 struct annoStreamBigWig *self = NULL;
 AllocVar(self);
 struct annoStreamer *streamer = &(self->streamer);
 annoStreamerInit(streamer, aa, asObj, fileOrUrl);
-streamer->rowType = arWig;
+//#*** Would be more memory-efficient to do arWigSingle for bedGraphs.
+//#*** annoGrateWig would need to be updated to handle incoming arWigSingle.
+streamer->rowType = arWigVec;
 streamer->setRegion = asbwSetRegion;
 streamer->nextRow = asbwNextRow;
 streamer->close = asbwClose;
 self->chromList = bbiChromList(bbi);
 self->bbi = bbi;
 return (struct annoStreamer *)self;
 }