src/hg/hgTables/bigWig.c 1.2
1.2 2009/03/12 19:44:21 kent
Making correlations, and bed output work with bigWig. Possibly subtrack merge works too, but need to make a test case for it. Custom track bigWig output is still broken.
Index: src/hg/hgTables/bigWig.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTables/bigWig.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 4 -r1.1 -r1.2
--- src/hg/hgTables/bigWig.c 12 Mar 2009 16:45:14 -0000 1.1
+++ src/hg/hgTables/bigWig.c 12 Mar 2009 19:44:21 -0000 1.2
@@ -153,19 +153,22 @@
struct region *region, int maxOut,
enum wigOutputType wigOutType)
/* Write out bigWig for region, doing intersecting and filtering as need be. */
{
+boolean isMerged = anySubtrackMerge(table, database);
int resultCount = 0;
char *wigFileName = bigWigFileName(table, conn);
if (wigFileName)
{
struct bbiFile *bwf = bigWigFileOpen(wigFileName);
if (bwf)
{
- if (!anyFilter() && !anyIntersection())
+ /* Easy case, just dump out data. */
+ if (!anyFilter() && !anyIntersection() && !isMerged && wigOutType == wigOutData)
resultCount = bigWigIntervalDump(bwf, region->chrom, region->start, region->end,
maxOut, stdout);
- else
+ /* Pretty easy case, still do it ourselves. */
+ else if (!isMerged && wigOutType == wigOutData)
{
double ll, ul;
enum wigCompare cmp;
getWigFilter(database, curTable, &cmp, &ll, &ul);
@@ -177,8 +180,15 @@
fprintf(stdout, "%s\t%d\t%d\t%g\n", region->chrom, iv->start, iv->end, iv->val);
}
lmCleanup(&lm);
}
+ /* Harder cases - resort to making a data vector and letting that machinery handle it. */
+ else
+ {
+ struct dataVector *dv = bigWigDataVector(table, conn, region);
+ resultCount = wigPrintDataVectorOut(dv, wigOutType, maxOut, NULL);
+ dataVectorFree(&dv);
+ }
}
bbiFileClose(&bwf);
}
freeMem(wigFileName);
@@ -263,4 +273,58 @@
bbiFileClose(&bwf);
htmlClose();
}
+void bigWigFillDataVector(char *table, struct region *region,
+ struct sqlConnection *conn, struct dataVector *vector)
+/* Fill in data vector with bigWig info on region. Handles filters and intersections. */
+{
+uglyf("bigWigFillDataVector table=%s region=%s:%d-%d<BR>\n", table, region->chrom, region->start, region->end);
+
+/* Figure out filter values if any. */
+double ll, ul;
+enum wigCompare cmp;
+getWigFilter(database, curTable, &cmp, &ll, &ul);
+
+/* Get intervals that pass filter and intersection. */
+struct lm *lm = lmInit(0);
+char *fileName = bigWigFileName(table, conn);
+struct bbiFile *bwf = bigWigFileOpen(fileName);
+struct bbiInterval *iv, *ivList;
+ivList = intersectedFilteredBbiIntervalsOnRegion(conn, bwf, region, cmp, ll, ul, lm);
+int vIndex = 0;
+for (iv = ivList; iv != NULL; iv = iv->next)
+ {
+ int start = max(iv->start, region->start);
+ int end = min(iv->end, region->end);
+ double val = iv->val;
+ int i;
+ for (i=start; i<end && vIndex < vector->maxCount; ++i)
+ {
+ vector->value[vIndex] = val;
+ vector->position[vIndex] = i;
+ ++vIndex;
+ }
+ }
+vector->count = vIndex;
+bbiFileClose(&bwf);
+freeMem(fileName);
+lmCleanup(&lm);
+}
+
+struct dataVector *bigWigDataVector(char *table,
+ struct sqlConnection *conn, struct region *region)
+/* Read in bigWig as dataVector and return it. Filtering, subtrack merge
+ * and intersection are handled. */
+{
+uglyf("bigWigDataVector table=%s region=%s:%d-%d<BR>\n", table, region->chrom, region->start, region->end);
+if (anySubtrackMerge(database, table))
+ return mergedWigDataVector(table, conn, region);
+else
+ {
+ struct dataVector *dv = dataVectorNew(region->chrom, region->end - region->start);
+ bigWigFillDataVector(table, region, conn, dv);
+ return dv;
+ }
+}
+
+