ee9a6c5c63eba2d963a5d7581185b1004fffe964 angie Mon Apr 15 14:06:10 2013 -0700 Added indentifying name to annoStreamer for output header info and better error messages. refs #6152 diff --git src/hg/lib/annoStreamWig.c src/hg/lib/annoStreamWig.c index 6d5fb51..e9242fb 100644 --- src/hg/lib/annoStreamWig.c +++ src/hg/lib/annoStreamWig.c @@ -31,51 +31,51 @@ } static void checkWibFile(struct annoStreamWig *self, char *wibFile) /* If self doesn't have a .wib file name and handle open, or if the new wibFile is * not the same as the old one, update self to use new wibFile. */ { if (self->wibFile == NULL || !sameString(self->wibFile, wibFile)) { carefulClose(&(self->wibF)); freeMem(self->wibFile); self->wibFile = cloneString(wibFile); self->wibF = mustOpen(self->wibFile, "r"); } } -static void paranoidCheckSize(struct wiggle *wiggle) +static void paranoidCheckSize(struct annoStreamWig *self, struct wiggle *wiggle) /* paranoid, consider taking this out when code is stable: */ { int bpLen = wiggle->chromEnd - wiggle->chromStart; if (bpLen != (wiggle->span * wiggle->count)) - errAbort("annoStreamWig: length in bases (%u - %u = %d) != span*count (%u * %u = %u)", - wiggle->chromEnd, wiggle->chromStart, bpLen, + errAbort("annoStreamWig %s: length in bases (%u - %u = %d) != span*count (%u * %u = %u)", + self->streamer.name, wiggle->chromEnd, wiggle->chromStart, bpLen, wiggle->span, wiggle->count, (wiggle->span * wiggle->count)); } static void getFloatArray(struct annoStreamWig *self, struct wiggle *wiggle, boolean *retRightFail, int *retValidCount, float *vector) /* expand wiggle bytes & spans to per-bp floats; filter values here! */ { fseek(self->wibF, wiggle->offset, SEEK_SET); UBYTE wigBuf[wiggle->count]; size_t bytesRead = fread(wigBuf, 1, wiggle->count, self->wibF); if (bytesRead != wiggle->count) errnoAbort("annoStreamWig: failed to read %u bytes from %s (got %llu)\n", wiggle->count, wiggle->file, (unsigned long long)bytesRead); -paranoidCheckSize(wiggle); +paranoidCheckSize(self, wiggle); int i, j, validCount = 0; for (i = 0; i < wiggle->count; i++) { float value; if (wigBuf[i] == WIG_NO_DATA) value = NAN; else { value = BIN_TO_VALUE(wigBuf[i], wiggle->lowerLimit, wiggle->dataRange); if (annoFilterWigValueFails(self->streamer.filters, value, retRightFail)) value = NAN; else validCount++; } int bpOffset = i * wiggle->span; @@ -121,24 +121,24 @@ { if (pVSelf == NULL) return; struct annoStreamWig *self = *(struct annoStreamWig **)pVSelf; carefulClose(&(self->wibF)); freeMem(self->wibFile); annoStreamerFree(pVSelf); } struct annoStreamer *annoStreamWigDbNew(char *db, char *table, struct annoAssembly *aa, int maxOutput) /* Create an annoStreamer (subclass) object from a wiggle database table. */ { struct annoStreamWig *self = NULL; AllocVar(self); +self->wigStr = annoStreamDbNew(db, table, aa, asParseText(wiggleAsText)); struct annoStreamer *streamer = &(self->streamer); -annoStreamerInit(streamer, aa, asParseText(annoRowWigAsText)); +annoStreamerInit(streamer, aa, asParseText(annoRowWigAsText), self->wigStr->name); streamer->rowType = arWig; streamer->setRegion = aswSetRegion; streamer->nextRow = aswNextRow; streamer->close = aswClose; -self->wigStr = annoStreamDbNew(db, table, aa, asParseText(wiggleAsText)); return (struct annoStreamer *)self; }