72d5004d94ad220eecb2868ee1d58d6257ab051d
kent
  Mon Jan 20 12:05:23 2014 -0800
Improving handling of empty data sets by bedToBigBed and bigBedInfo.
diff --git src/utils/bedToBigBed/bedToBigBed.c src/utils/bedToBigBed/bedToBigBed.c
index 65a909b..b7e2f66 100644
--- src/utils/bedToBigBed/bedToBigBed.c
+++ src/utils/bedToBigBed/bedToBigBed.c
@@ -601,62 +601,70 @@
     int extraIndexSize = 16 + 4*1;   // Fixed record size 16, plus 1 times field size of 4 
     repeatCharOut(f, 0, extraIndexSize*extraIndexCount);
     extraIndexListEndOffset = ftell(f);
     }
 
 /* Write out chromosome/size database. */
 bits64 chromTreeOffset = ftell(f);
 bbiWriteChromInfo(usageList, blockSize, f);
 
 /* Set up to keep track of possible initial reduction levels. */
 int resScales[bbiMaxZoomLevels], resSizes[bbiMaxZoomLevels];
 int resTryCount = bbiCalcResScalesAndSizes(aveSize, resScales, resSizes);
 
 /* Write out primary full resolution data in sections, collect stats to use for reductions. */
 bits64 dataOffset = ftell(f);
+bits32 blockCount = 0;
+bits32 maxBlockSize = 0;
+struct bbiBoundsArray *boundsArray = NULL;
 writeOne(f, bedCount);
-bits32 blockCount = bbiCountSectionsNeeded(usageList, itemsPerSlot);
-struct bbiBoundsArray *boundsArray;
+if (bedCount > 0)
+    {
+    blockCount = bbiCountSectionsNeeded(usageList, itemsPerSlot);
     AllocArray(boundsArray, blockCount);
     lineFileRewind(lf);
-bits32 maxBlockSize = 0;
     if (eim)
 	bbExIndexMakerAllocChunkArrays(eim, bedCount);
     writeBlocks(usageList, lf, as, itemsPerSlot, boundsArray, blockCount, doCompress,
 	    f, resTryCount, resScales, resSizes, eim, bedCount, fieldCount, &maxBlockSize);
+    }
 verboseTime(1, "pass2 - checking and writing primary data (%lld records, %d fields)", 
 	(long long)bedCount, fieldCount);
 
 /* Write out primary data index. */
 bits64 indexOffset = ftell(f);
 cirTreeFileBulkIndexToOpenFile(boundsArray, sizeof(boundsArray[0]), blockCount,
     blockSize, 1, NULL, bbiBoundsArrayFetchKey, bbiBoundsArrayFetchOffset, 
     indexOffset, f);
 freez(&boundsArray);
 verboseTime(2, "index write");
 
 /* Declare arrays and vars that track the zoom levels we actually output. */
 bits32 zoomAmounts[bbiMaxZoomLevels];
 bits64 zoomDataOffsets[bbiMaxZoomLevels];
 bits64 zoomIndexOffsets[bbiMaxZoomLevels];
 
 /* Call monster zoom maker library function that bedGraphToBigWig also uses. */
-int zoomLevels = bbiWriteZoomLevels(lf, f, blockSize, itemsPerSlot,
+int zoomLevels = 0;
+if (bedCount > 0)
+    {
+    bbiWriteZoomLevels(lf, f, blockSize, itemsPerSlot,
 	bedWriteReducedOnceReturnReducedTwice, fieldCount,
 	doCompress, indexOffset - dataOffset, 
 	usageList, resTryCount, resScales, resSizes, 
 	zoomAmounts, zoomDataOffsets, zoomIndexOffsets, &totalSum);
+    }
 
 /* Write out extra indexes if need be. */
 if (eim)
     {
     int i;
     for (i=0; i < eim->indexCount; ++i)
         {
 	eim->fileOffsets[i] = ftell(f);
 	maxBedNameSize = eim->maxFieldSize[i];
 	qsort(eim->chunkArrayArray[i], bedCount, 
 	    sizeof(struct bbNamedFileChunk), bbNamedFileChunkCmpByName);
 	assert(sizeof(struct bbNamedFileChunk) == sizeof(eim->chunkArrayArray[i][0]));
 	bptFileBulkIndexToOpenFile(eim->chunkArrayArray[i], sizeof(eim->chunkArrayArray[i][0]), 
 	    bedCount, blockSize, bbNamedFileChunkKey, maxBedNameSize, bbNamedFileChunkVal, 
 	    sizeof(bits64) + sizeof(bits64), f);