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)