72d5004d94ad220eecb2868ee1d58d6257ab051d
kent
  Mon Jan 20 12:05:23 2014 -0800
Improving handling of empty data sets by bedToBigBed and bigBedInfo.
diff --git src/lib/bbiWrite.c src/lib/bbiWrite.c
index ac36dbc..2361d47 100644
--- src/lib/bbiWrite.c
+++ src/lib/bbiWrite.c
@@ -37,47 +37,50 @@
  * than double indirect. */
 {
 const struct bbiChromInfo *a = (const struct bbiChromInfo *)va;
 const struct bbiChromInfo *b = (const struct bbiChromInfo *)vb;
 return strcmp(a->name, b->name);
 }
 
 
 void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f)
 /* Write out information on chromosomes to file. */
 {
 int chromCount = slCount(usageList);
 struct bbiChromUsage *usage;
 
 /* Allocate and fill in array from list. */
-struct bbiChromInfo *chromInfoArray;
+struct bbiChromInfo *chromInfoArray = NULL;
+int maxChromNameSize = 0;
+if (chromCount > 0)
+    {
     AllocArray(chromInfoArray, chromCount);
     int i;
-int maxChromNameSize = 0;
     for (i=0, usage = usageList; i<chromCount; ++i, usage = usage->next)
 	{
 	char *chromName = usage->name;
 	int len = strlen(chromName);
 	if (len > maxChromNameSize)
 	    maxChromNameSize = len;
 	chromInfoArray[i].name = chromName;
 	chromInfoArray[i].id = usage->id;
 	chromInfoArray[i].size = usage->size;
 	}
 
     /* Sort so the b-Tree actually works. */
     qsort(chromInfoArray, chromCount, sizeof(chromInfoArray[0]), bbiChromInfoCmp);
+    }
 
 /* Write chromosome bPlusTree */
 int chromBlockSize = min(blockSize, chromCount);
 bptFileBulkIndexToOpenFile(chromInfoArray, sizeof(chromInfoArray[0]), chromCount, chromBlockSize,
     bbiChromInfoKey, maxChromNameSize, bbiChromInfoVal, 
     sizeof(chromInfoArray[0].id) + sizeof(chromInfoArray[0].size), 
     f);
 
 freeMem(chromInfoArray);
 }
 
 void bbiWriteFloat(FILE *f, float val)
 /* Write out floating point val to file.  Mostly to convert from double... */
 {
 writeOne(f, val);
@@ -219,32 +222,35 @@
     usage->itemCount += 1;
     if (lastStart >= 0)
         {
 	int diff = start - lastStart;
 	if (diff < minDiff)
 	    {
 	    if (diff < 0)
 		errAbort("%s is not sorted at line %d.  Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.",
 		    lf->fileName, lf->lineIx);
 	    minDiff = diff;
 	    }
 	}
     lastStart = start;
     }
 slReverse(&usageList);
+double aveSize = 0;
+if (bedCount > 0)
+    aveSize = (double)totalBases/bedCount;
 *retMinDiff = minDiff;
-*retAveSize = (double)totalBases/bedCount;
+*retAveSize = aveSize;
 *retBedCount = bedCount;
 freeHash(&uniqHash);
 return usageList;
 }
 
 int bbiCalcResScalesAndSizes(int aveSize, 
     int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels])
 /* Fill in resScales with amount to zoom at each level, and zero out resSizes based
  * on average span. Returns the number of zoom levels we actually will use. */
 {
 int resTryCount = bbiMaxZoomLevels, resTry;
 int resIncrement = bbiResIncrement;
 int minZoom = 10;
 int res = aveSize;
 if (res < minZoom)