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