src/lib/bbiRead.c 1.13

1.13 2009/11/05 19:46:57 kent
Adding bbiTotalSummary.
Index: src/lib/bbiRead.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/bbiRead.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -b -B -U 4 -r1.12 -r1.13
--- src/lib/bbiRead.c	14 Aug 2009 20:56:48 -0000	1.12
+++ src/lib/bbiRead.c	5 Nov 2009 19:46:57 -0000	1.13
@@ -572,4 +572,74 @@
     }
 freeMem(elements);
 return ret;
 }
+
+struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi)
+/* Return summary of entire file! */
+{
+struct udcFile *udc = bbi->udc;
+boolean isSwapped = bbi->isSwapped;
+struct bbiSummaryElement res;
+ZeroVar(&res);
+
+if (bbi->totalSummaryOffset != 0)
+    {
+    udcSeek(udc, bbi->totalSummaryOffset);
+    res.validCount = udcReadBits64(udc, isSwapped);
+    res.minVal = udcReadDouble(udc, isSwapped);
+    res.maxVal = udcReadDouble(udc, isSwapped);
+    res.sumData = udcReadDouble(udc, isSwapped);
+    res.sumSquares = udcReadDouble(udc, isSwapped);
+    }
+else
+    {
+    /* Find most extreme zoom. */
+    struct bbiZoomLevel *bestZoom = NULL, *zoom;
+    bits32 bestReduction = 0;
+    for (zoom = bbi->levelList; zoom != NULL; zoom = zoom->next)
+	{
+	if (zoom->reductionLevel > bestReduction)
+	    {
+	    bestReduction = zoom->reductionLevel;
+	    bestZoom = zoom;
+	    }
+	}
+
+    if (bestZoom != NULL)
+	{
+	udcSeek(udc, bestZoom->dataOffset);
+	bits32 zoomSectionCount = udcReadBits32(udc, isSwapped);
+	bits32 i;
+	for (i=0; i<zoomSectionCount; ++i)
+	    {
+	    /* Read, but ignore, position. */
+	    bits32 chromId, chromStart, chromEnd;
+	    chromId = udcReadBits32(udc, isSwapped);
+	    chromStart = udcReadBits32(udc, isSwapped);
+	    chromEnd = udcReadBits32(udc, isSwapped);
+
+	    /* First time through set values, rest of time add to them. */
+	    if (i == 0)
+		{
+		res.validCount = udcReadBits32(udc, isSwapped);
+		res.minVal = udcReadFloat(udc, isSwapped);
+		res.maxVal = udcReadFloat(udc, isSwapped);
+		res.sumData = udcReadFloat(udc, isSwapped);
+		res.sumSquares = udcReadFloat(udc, isSwapped);
+		}
+	    else
+		{
+		res.validCount += udcReadBits32(udc, isSwapped);
+		float minVal = udcReadFloat(udc, isSwapped);
+		if (minVal < res.minVal) res.minVal = minVal;
+		float maxVal = udcReadFloat(udc, isSwapped);
+		if (maxVal > res.maxVal) res.maxVal = maxVal;
+		res.sumData += udcReadFloat(udc, isSwapped);
+		res.sumSquares += udcReadFloat(udc, isSwapped);
+		}
+	    }
+	}
+    }
+return res;
+}
+