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