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;
+    }
+}
+
+