f2739ff05c7530188b59076f2221b67a5aae3f08 galt Thu Aug 23 19:39:14 2012 -0700 bbiRead.c::bbiSummariesInRegion fixed to handle bbi->isSwapped diff --git src/lib/bbiRead.c src/lib/bbiRead.c index 85079df..4aa69ba 100644 --- src/lib/bbiRead.c +++ src/lib/bbiRead.c @@ -298,47 +298,59 @@ /* Read in summary from file. */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; sum->chromId = udcReadBits32(udc, isSwapped); sum->start = udcReadBits32(udc, isSwapped); sum->end = udcReadBits32(udc, isSwapped); sum->validCount = udcReadBits32(udc, isSwapped); udcMustReadOne(udc, sum->minVal); udcMustReadOne(udc, sum->maxVal); udcMustReadOne(udc, sum->sumData); udcMustReadOne(udc, sum->sumSquares); } #endif /* UNUSED */ +static void bbiSummaryHandleSwapped(struct bbiFile *bbi, struct bbiSummaryOnDisk *in) +/* Swap integer fields in summary as needed. */ +{ +if (bbi->isSwapped) + { + in->chromId = byteSwap32(in->chromId); + in->start = byteSwap32(in->start); + in->end = byteSwap32(in->end); + in->validCount = byteSwap32(in->validCount); + } +} + static struct bbiSummary *bbiSummaryFromOnDisk(struct bbiSummaryOnDisk *in) /* Create a bbiSummary unlinked to anything from input in onDisk format. */ { struct bbiSummary *out; AllocVar(out); out->chromId = in->chromId; out->start = in->start; out->end = in->end; out->validCount = in->validCount; out->minVal = in->minVal; out->maxVal = in->maxVal; out->sumData = in->sumData; out->sumSquares = in->sumSquares; return out; } -static struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, +struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end) /* Return list of all summaries in region at given zoom level of bbiFile. */ { struct bbiSummary *sumList = NULL, *sum; struct udcFile *udc = bbi->udc; udcSeek(udc, zoom->indexOffset); struct cirTreeFile *ctf = cirTreeFileAttach(bbi->fileName, bbi->udc); struct fileOffsetSize *blockList = cirTreeFindOverlappingBlocks(ctf, chromId, start, end); struct fileOffsetSize *block, *beforeGap, *afterGap; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bbi->uncompressBufSize > 0) uncompressBuf = needLargeMem(bbi->uncompressBufSize); @@ -374,30 +386,31 @@ } /* Figure out bounds and number of items in block. */ int blockSize = blockEnd - blockPt; struct bbiSummaryOnDisk *dSum; int itemSize = sizeof(*dSum); assert(blockSize % itemSize == 0); int itemCount = blockSize / itemSize; /* Read in items and convert to memory list format. */ int i; for (i=0; i<itemCount; ++i) { dSum = (void *)blockPt; blockPt += sizeof(*dSum); + bbiSummaryHandleSwapped(bbi, dSum); if (dSum->chromId == chromId) { int s = max(dSum->start, start); int e = min(dSum->end, end); if (s < e) { sum = bbiSummaryFromOnDisk(dSum); slAddHead(&sumList, sum); } } } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf);