4bae217fb5eb5ac36cc1ac7a13e25a838149ddd1 kent Fri Jun 17 11:12:23 2011 -0700 Adding bigBed support diff --git src/hg/checkCoverageGaps/checkCoverageGaps.c src/hg/checkCoverageGaps/checkCoverageGaps.c index dbb69d0..5e1e37e 100644 --- src/hg/checkCoverageGaps/checkCoverageGaps.c +++ src/hg/checkCoverageGaps/checkCoverageGaps.c @@ -25,63 +25,80 @@ "usage:\n" " checkCoverageGaps database track1 ... trackN\n" "Note: for bigWig and bigBeds, the biggest gap is rounded to the nearest 10,000 or so\n" "options:\n" " -allParts If set then include _hap and _random and other wierd chroms\n" " -female If set then don't check chrY\n" ); } static struct optionSpec options[] = { {"allParts", OPTION_BOOLEAN}, {"female", OPTION_BOOLEAN}, {NULL, 0}, }; -void bigWigBiggestGap(struct trackDb *tdb, struct sqlConnection *conn, - char *chrom, int chromSize, struct rbTree *rt) + +void bigCoverageIntoTree(struct trackDb *tdb, struct sqlConnection *conn, + char *chrom, int chromSize, struct rbTree *rt, boolean isBigBed) /* Find biggest gap in given chromosome in bigWig */ { char *fileName = bbiNameFromSettingOrTable(tdb, conn, tdb->table); -struct bbiFile *bbi = bigWigFileOpen(fileName); +struct bbiFile *bbi; +if (isBigBed) + bbi = bigBedFileOpen(fileName); +else + bbi = bigWigFileOpen(fileName); int sampleSize = 10000; int sampleCount = chromSize/sampleSize; if (sampleCount > 1) { int evenEnd = sampleCount * sampleSize; double *summaryVals; AllocArray(summaryVals, sampleCount); - if (bigWigSummaryArray(bbi, chrom, 0, evenEnd, bbiSumCoverage, sampleCount, summaryVals)) + boolean ok; + if (isBigBed) + ok = bigBedSummaryArray(bbi, chrom, 0, evenEnd, bbiSumCoverage, sampleCount, summaryVals); + else + ok = bigWigSummaryArray(bbi, chrom, 0, evenEnd, bbiSumCoverage, sampleCount, summaryVals); + if (ok) { int s=0, e, i; for (i=0; i<sampleCount; ++i) { e = s + sampleSize; if (summaryVals[i] > 0.0) rangeTreeAdd(rt, s, e); s = e; } } } bigWigFileClose(&bbi); } +void bigWigBiggestGap(struct trackDb *tdb, struct sqlConnection *conn, + char *chrom, int chromSize, struct rbTree *rt) +/* Find biggest gap in given chromosome in bigWig */ +{ +bigCoverageIntoTree(tdb, conn, chrom, chromSize, rt, FALSE); +} + void bigBedBiggestGap(struct trackDb *tdb, struct sqlConnection *conn, char *chrom, int chromSize, struct rbTree *rt) /* Find biggest gap in given chromosome in bigBed */ { -uglyAbort("bigBed not implemented"); +bigCoverageIntoTree(tdb, conn, chrom, chromSize, rt, TRUE); } void tableBiggestGap(struct hTableInfo *hti, struct trackDb *tdb, struct sqlConnection *conn, char *chrom, int chromSize, struct rbTree *rt) /* Find biggest gap in given chromosome in bigBed */ { char fields[512]; safef(fields, sizeof(fields), "%s,%s", hti->startField, hti->endField); struct sqlResult *sr = hExtendedChromQuery(conn, hti->rootName, chrom, NULL, FALSE, fields, NULL); char **row; while ((row = sqlNextRow(sr)) != NULL) { rangeTreeAdd(rt, sqlUnsigned(row[0]), sqlUnsigned(row[1])); } @@ -121,33 +138,32 @@ biggestSize = size; biggestStart = lastEnd; biggestEnd = chromSize; } } } *retStart = biggestStart; *retEnd = biggestEnd; *retSize = biggestSize; } } void addGaps(struct sqlConnection *conn, char *chrom, struct rbTree *rt) /* Add gaps to range tree. */ { -char query[256]; -safef(query, sizeof(query), "select chromStart, chromEnd from gap where chrom='%s'", chrom); -struct sqlResult *sr = sqlGetResult(conn, query); +struct sqlResult *sr = hExtendedChromQuery(conn, "gap", chrom, NULL, FALSE, + "chromStart,chromEnd", NULL); char **row; while ((row = sqlNextRow(sr)) != NULL) { rangeTreeAdd(rt, sqlUnsigned(row[0]), sqlUnsigned(row[1])); } sqlFreeResult(&sr); } void printBiggestGap(char *database, struct sqlConnection *conn, struct slName *chromList, struct hash *chromHash, char *track) /* Look up track in database, figure out which type it is, call * appropriate biggest gap finder, and then print result. */ { struct trackDb *tdb = hTrackInfo(conn, track); struct hTableInfo *hti = hFindTableInfo(database, chromList->name, tdb->table);