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