src/lib/bwgCreate.c 1.19

1.19 2009/11/07 19:27:02 kent
Adding totalSummary to big files. Should be helpful in quickly calculating ranges to be displayed by default.
Index: src/lib/bwgCreate.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/bwgCreate.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -b -B -U 4 -r1.18 -r1.19
--- src/lib/bwgCreate.c	5 Nov 2009 19:32:45 -0000	1.18
+++ src/lib/bwgCreate.c	7 Nov 2009 19:27:02 -0000	1.19
@@ -803,13 +803,15 @@
 FILE *f = mustOpen(fileName, "wb");
 bits32 sig = bigWigSig;
 bits16 version = bbiCurrentVersion;
 bits16 summaryCount = 0;
+bits16 reserved16 = 0;
 bits32 reserved32 = 0;
 bits64 reserved64 = 0;
 bits64 dataOffset = 0, dataOffsetPos;
 bits64 indexOffset = 0, indexOffsetPos;
 bits64 chromTreeOffset = 0, chromTreeOffsetPos;
+bits64 totalSummaryOffset = 0, totalSummaryOffsetPos;
 struct bbiSummary *reduceSummaries[10];
 bits32 reductionAmounts[10];
 bits64 reductionDataOffsetPos[10];
 bits64 reductionDataOffsets[10];
@@ -877,9 +879,14 @@
 dataOffsetPos = ftell(f);
 writeOne(f, dataOffset);
 indexOffsetPos = ftell(f);
 writeOne(f, indexOffset);
-for (i=0; i<8; ++i)
+writeOne(f, reserved16);  /* fieldCount */
+writeOne(f, reserved16);  /* definedFieldCount */
+writeOne(f, reserved64);  /* autoSqlOffset. */
+totalSummaryOffsetPos = ftell(f);
+writeOne(f, totalSummaryOffset);
+for (i=0; i<3; ++i)
     writeOne(f, reserved32);
 
 /* Write summary headers */
 for (i=0; i<summaryCount; ++i)
@@ -890,8 +897,14 @@
     writeOne(f, reserved64);	// Fill in with data offset later
     writeOne(f, reserved64);	// Fill in with index offset later
     }
 
+/* Write dummy summary */
+struct bbiSummaryElement totalSum;
+ZeroVar(&totalSum);
+totalSummaryOffset = ftell(f);
+bbiSummaryElementWrite(f, &totalSum);
+
 /* Write chromosome bPlusTree */
 chromTreeOffset = ftell(f);
 int chromBlockSize = min(blockSize, chromCount);
 bptFileBulkIndexToOpenFile(chromInfoArray, sizeof(chromInfoArray[0]), chromCount, chromBlockSize,
@@ -926,15 +939,41 @@
     reductionIndexOffsets[i] = bbiWriteSummaryAndIndex(reduceSummaries[i], blockSize, itemsPerSlot, f);
     verbose(3, "wrote %d of data, %d of index on level %d\n", (int)(reductionIndexOffsets[i] - reductionDataOffsets[i]), (int)(ftell(f) - reductionIndexOffsets[i]), i);
     }
 
+/* Calculate summary */
+struct bbiSummary *sum = firstSummaryList;
+if (sum != NULL)
+    {
+    totalSum.validCount = sum->validCount;
+    totalSum.minVal = sum->minVal;
+    totalSum.maxVal = sum->maxVal;
+    totalSum.sumData = sum->sumData;
+    totalSum.sumSquares = sum->sumSquares;
+    for (sum = sum->next; sum != NULL; sum = sum->next)
+	{
+	totalSum.validCount += sum->validCount;
+	if (sum->minVal < totalSum.minVal) totalSum.minVal = sum->minVal;
+	if (sum->maxVal > totalSum.maxVal) totalSum.maxVal = sum->maxVal;
+	totalSum.sumData += sum->sumData;
+	totalSum.sumSquares += sum->sumSquares;
+	}
+    /* Write real summary */
+    fseek(f, totalSummaryOffset, SEEK_SET);
+    bbiSummaryElementWrite(f, &totalSum);
+    }
+else
+    totalSummaryOffset = 0;	/* Edge case, no summary. */
+
 /* Go back and fill in offsets properly in header. */
 fseek(f, dataOffsetPos, SEEK_SET);
 writeOne(f, dataOffset);
 fseek(f, indexOffsetPos, SEEK_SET);
 writeOne(f, indexOffset);
 fseek(f, chromTreeOffsetPos, SEEK_SET);
 writeOne(f, chromTreeOffset);
+fseek(f, totalSummaryOffsetPos, SEEK_SET);
+writeOne(f, totalSummaryOffset);
 
 /* Also fill in offsets in zoom headers. */
 for (i=0; i<summaryCount; ++i)
     {