90f2a73fa25ff0ce351a5cdc571f4ccce621bd2a braney Thu Feb 24 12:39:18 2011 -0800 output a more efficient bedgraph diff --git src/utils/bigWigToBedGraph/bigWigToBedGraph.c src/utils/bigWigToBedGraph/bigWigToBedGraph.c index 72813bb..cd6fa82 100644 --- src/utils/bigWigToBedGraph/bigWigToBedGraph.c +++ src/utils/bigWigToBedGraph/bigWigToBedGraph.c @@ -33,43 +33,68 @@ {"chrom", OPTION_STRING}, {"start", OPTION_INT}, {"end", OPTION_INT}, {"udcDir", OPTION_STRING}, {NULL, 0}, }; void bigWigToBedGraph(char *inFile, char *outFile) /* bigWigToBedGraph - Convert from bigWig to bedGraph format.. */ { struct bbiFile *bwf = bigWigFileOpen(inFile); FILE *f = mustOpen(outFile, "w"); struct bbiChromInfo *chrom, *chromList = bbiChromList(bwf); for (chrom = chromList; chrom != NULL; chrom = chrom->next) { + boolean firstTime = TRUE; + int saveStart, prevEnd; + double saveVal; + if (clChrom != NULL && !sameString(clChrom, chrom->name)) continue; char *chromName = chrom->name; struct lm *lm = lmInit(0); int start = 0, end = chrom->size; if (clStart > 0) start = clStart; if (clEnd > 0) end = clEnd; struct bbiInterval *interval, *intervalList = bigWigIntervalQuery(bwf, chromName, start, end, lm); for (interval = intervalList; interval != NULL; interval = interval->next) - fprintf(f, "%s\t%u\t%u\t%g\n", chromName, interval->start, interval->end, interval->val); + { + if (firstTime) + { + saveStart = interval->start; + saveVal = interval->val; + firstTime = FALSE; + } + else + { + if (!((prevEnd == interval->start) && (saveVal == interval->val))) + { + fprintf(f, "%s\t%u\t%u\t%g\n", chromName, saveStart, prevEnd, saveVal); + saveStart = interval->start; + saveVal = interval->val; + } + + } + prevEnd = interval->end; + } + if (!firstTime) + fprintf(f, "%s\t%u\t%u\t%g\n", chromName, saveStart, prevEnd, saveVal); + lmCleanup(&lm); } bbiChromInfoFreeList(&chromList); carefulClose(&f); bbiFileClose(&bwf); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); clChrom = optionVal("chrom", clChrom); clStart = optionInt("start", clStart); clEnd = optionInt("end", clEnd); udcSetDefaultDir(optionVal("udcDir", udcDefaultDir()));