src/lib/bbiRead.c 1.8
1.8 2009/02/10 22:05:55 kent
Adding fieldCount and definedFieldCount to bbiFile header for bigBeds.
Index: src/lib/bbiRead.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/bbiRead.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -b -B -U 4 -r1.7 -r1.8
--- src/lib/bbiRead.c 9 Feb 2009 02:43:23 -0000 1.7
+++ src/lib/bbiRead.c 10 Feb 2009 22:05:55 -0000 1.8
@@ -68,11 +68,13 @@
bbi->zoomLevels = udcReadBits16(udc, isSwapped);
bbi->chromTreeOffset = udcReadBits64(udc, isSwapped);
bbi->unzoomedDataOffset = udcReadBits64(udc, isSwapped);
bbi->unzoomedIndexOffset = udcReadBits64(udc, isSwapped);
+bbi->fieldCount = udcReadBits16(udc, isSwapped);
+bbi->definedFieldCount = udcReadBits16(udc, isSwapped);
/* Skip over reserved area. */
-udcSeek(udc, udcTell(udc) + 32);
+udcSeek(udc, udcTell(udc) + 28);
/* Read zoom headers. */
int i;
struct bbiZoomLevel *level, *levelList = NULL;
@@ -226,8 +228,9 @@
return NULL;
}
}
+#ifdef UNUSED
static void bbiSummaryOnDiskRead(struct bbiFile *bbi, struct bbiSummaryOnDisk *sum)
/* Read in summary from file. */
{
struct udcFile *udc = bbi->udc;
@@ -240,8 +243,9 @@
udcMustReadOne(udc, sum->maxVal);
udcMustReadOne(udc, sum->sumData);
udcMustReadOne(udc, sum->sumSquares);
}
+#endif /* UNUSED */
static struct bbiSummary *bbiSummaryFromOnDisk(struct bbiSummaryOnDisk *in)
/* Create a bbiSummary unlinked to anything from input in onDisk format. */
{
@@ -265,37 +269,42 @@
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);
-if (blockList != NULL)
- {
- struct fileOffsetSize *block;
- for (block = blockList; block != NULL; block = block->next)
+struct fileOffsetSize *fragList = cirTreeFindOverlappingBlocks(ctf, chromId, start, end);
+struct fileOffsetSize *block, *blockList = fileOffsetSizeMerge(fragList);
+for (block = blockList; block != NULL; block = block->next)
{
+ /* Read info we need into memory. */
udcSeek(udc, block->offset);
- struct bbiSummaryOnDisk diskSum;
- int itemSize = sizeof(diskSum);
+ char *blockBuf = needLargeMem(block->size);
+ udcRead(udc, blockBuf, block->size);
+ char *blockPt = blockBuf;
+
+ struct bbiSummaryOnDisk *dSum;
+ int itemSize = sizeof(*dSum);
assert(block->size % itemSize == 0);
int itemCount = block->size / itemSize;
int i;
for (i=0; i<itemCount; ++i)
{
- bbiSummaryOnDiskRead(bbi, &diskSum);
- if (diskSum.chromId == chromId)
+ dSum = (void *)blockPt;
+ blockPt += sizeof(*dSum);
+ if (dSum->chromId == chromId)
{
- int s = max(diskSum.start, start);
- int e = min(diskSum.end, end);
+ int s = max(dSum->start, start);
+ int e = min(dSum->end, end);
if (s < e)
{
- sum = bbiSummaryFromOnDisk(&diskSum);
+ sum = bbiSummaryFromOnDisk(dSum);
slAddHead(&sumList, sum);
}
}
}
- }
+ freeMem(blockBuf);
}
slFreeList(&blockList);
+slFreeList(&fragList);
cirTreeFileDetach(&ctf);
slReverse(&sumList);
return sumList;
}