533112afe2a2005e80cdb1f82904ea65032d4302 braney Sat Oct 2 11:37:34 2021 -0700 split hg/lib into two separate libaries, one only used by the cgis diff --git src/hg/lib/annoStreamWig.c src/hg/lib/annoStreamWig.c deleted file mode 100644 index 0651c2b..0000000 --- src/hg/lib/annoStreamWig.c +++ /dev/null @@ -1,156 +0,0 @@ -/* annoStreamWig -- subclass of annoStreamer for wiggle database tables */ - -/* Copyright (C) 2014 The Regents of the University of California - * See README in this or parent directory for licensing information. */ - -#include "annoStreamWig.h" -#include "annoStreamDb.h" -#include "jksql.h" -#include "wiggle.h" - -char *annoRowWigAsText = -"table annoRowWig\n" -"\"autoSql description of a single annoRowWig value, for filtering\"\n" -" (\n" -" string chrom; \"Reference sequence chromosome or scaffold\"\n" -" uint chromStart; \"Start position in chromosome\"\n" -" uint chromEnd; \"End position in chromosome\"\n" -" float value; \"data value for this range\"\n" -" )\n" - ; - -struct annoStreamWig - { - struct annoStreamer streamer; // Parent class members & methods / external interface - // Private members - struct annoStreamer *wigStr; // Internal streamer for .wig as in wiggle db tables - struct udcFile *wibFH; // wib file udcFile handle - char *wibFile; // name of wib file on which wibFH was opened - }; - -static void aswSetRegion(struct annoStreamer *vSelf, char *chrom, uint regionStart, uint regionEnd) -/* Set region -- and free current sqlResult if there is one. */ -{ -annoStreamerSetRegion(vSelf, chrom, regionStart, regionEnd); -struct annoStreamWig *self = (struct annoStreamWig *)vSelf; -self->wigStr->setRegion(self->wigStr, chrom, regionStart, regionEnd); -} - -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. */ -{ -char *realWibFile = hReplaceGbdb(wibFile); -if (self->wibFile == NULL || !sameString(self->wibFile, realWibFile)) - { - udcFileClose(&self->wibFH); - freeMem(self->wibFile); - self->wibFile = cloneString(realWibFile); - self->wibFH = udcFileMayOpen(self->wibFile, NULL); - if (self->wibFH == NULL) - errAbort("annoStreamWig: udc can't open wibFile '%s'", self->wibFile); - } -freeMem(realWibFile); -} - -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 %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! */ -{ -udcSeek(self->wibFH, wiggle->offset); -UBYTE wigBuf[wiggle->count]; -size_t expectedBytes = sizeof(wigBuf); -size_t bytesRead = udcRead(self->wibFH, wigBuf, expectedBytes); -if (bytesRead != expectedBytes) - errnoAbort("annoStreamWig: failed to udcRead %llu bytes from %s (got %llu)\n", - (unsigned long long)expectedBytes, wiggle->file, (unsigned long long)bytesRead); -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; - for (j = 0; j < wiggle->span; j++) - vector[bpOffset + j] = value; - } -if (retValidCount != NULL) - *retValidCount = validCount; -} - -static struct annoRow *aswNextRow(struct annoStreamer *vSelf, char *minChrom, uint minEnd, - struct lm *callerLm) -/* Return an annoRow encoding the next chunk of wiggle data, or NULL if there are no more items. */ -{ -struct annoStreamWig *self = (struct annoStreamWig *)vSelf; -struct annoRow *rowOut = NULL; -boolean done = FALSE; -while (!done) - { - struct annoRow *wigRow = self->wigStr->nextRow(self->wigStr, minChrom, minEnd, callerLm); - if (wigRow == NULL) - return NULL; - struct wiggle wiggle; - wiggleStaticLoad((char **)wigRow->data, &wiggle); - checkWibFile(self, wiggle.file); - // translate wigRow + bytes to float vector - boolean rightFail = FALSE; - int validCount = 0; - int bpLen = wiggle.chromEnd - wiggle.chromStart; - float vector[bpLen]; - getFloatArray(self, &wiggle, &rightFail, &validCount, vector); - if (rightFail || validCount > 0) - { - rowOut = annoRowWigVecNew(wigRow->chrom, wigRow->start, wigRow->end, rightFail, vector, - callerLm); - done = TRUE; - } - } -return rowOut; -} - -static void aswClose(struct annoStreamer **pVSelf) -/* Free wiggleDataStream and self. */ -{ -if (pVSelf == NULL) - return; -struct annoStreamWig *self = *(struct annoStreamWig **)pVSelf; -udcFileClose(&(self->wibFH)); -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, maxOutput, NULL); -struct annoStreamer *streamer = &(self->streamer); -annoStreamerInit(streamer, aa, asParseText(annoRowWigAsText), self->wigStr->name); -streamer->rowType = arWigVec; -streamer->setRegion = aswSetRegion; -streamer->nextRow = aswNextRow; -streamer->close = aswClose; -return (struct annoStreamer *)self; -}