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; }