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);