src/hg/hgTracks/bedTrack.c 1.7

1.7 2009/05/20 20:50:51 mikep
display sequence or sequence different to the genome using a bed or bigBed which has the sequence in the name (eg tagAlign) in a similar manner to PSL files (by loading the BED as a linkedFeature like a PSL)
Index: src/hg/hgTracks/bedTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/bedTrack.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 4 -r1.6 -r1.7
--- src/hg/hgTracks/bedTrack.c	16 Mar 2009 05:07:54 -0000	1.6
+++ src/hg/hgTracks/bedTrack.c	20 May 2009 20:50:51 -0000	1.7
@@ -7,8 +7,9 @@
 #include "bedCart.h"
 #include "bbiFile.h"
 #include "bigBed.h"
 #include "hgTracks.h"
+#include "cds.h"
 
 static char *bbiNameFromTable(struct sqlConnection *conn, char *table)
 /* Return file name from little table. */
 {
@@ -107,9 +108,11 @@
 	sr = sqlGetResult(conn, query);
 	rowOffset = hOffsetPastBin(database, hDefaultChrom(database), topTable);
 	}
     else if(scoreFilterClause != NULL && tg->bedSize >= 5)
+	{
 	sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, scoreFilterClause, &rowOffset);
+	}
     else
 	{
 	sr = hRangeQuery(conn, tg->mapName, chromName, winStart, winEnd, NULL, &rowOffset);
 	}
@@ -624,8 +627,66 @@
 tg->labelNextPrevItem = linkedFeaturesLabelNextPrevItem;
 tg->freeItems = freeSimpleBed;
 }
 
+struct linkedFeatures *simpleBedToLinkedFeatures(struct bed *b, int bedFields, boolean everyBase)
+/* Create a linked feature from a single bed item
+ * Any bed fields past the 6th field (strand) will be ignored
+ * Make one simpleFeature for every base of the bed if everyBase is TRUE,
+ * otherwise it will contain a single 'exon' corresponding to the bed (start,end)
+ * Dont free the bed as a pointer to each item is stored in lf->original 
+ */
+{
+struct linkedFeatures *lf = NULL;
+if (b)
+    {
+    AllocVar(lf);
+    lf->start = lf->tallStart = b->chromStart;
+    lf->end = lf->tallEnd = b->chromEnd;
+    struct simpleFeature *sf;
+    int s;
+    int stepSize = everyBase ? 1 : lf->end - lf->start;
+    lf->components = NULL;
+    for (s = lf->start ; s < lf->end ; s += stepSize)
+	{
+	AllocVar(sf);
+	sf->start = s;
+	sf->end = sf->start + stepSize;
+	sf->qStart = s - lf->start;
+	sf->qEnd = sf->qStart + stepSize;
+	slAddHead(&lf->components, sf);
+	}
+    slReverse(&lf->components);
+    if (bedFields > 3)
+	safecpy(lf->name, sizeof(lf->name), b->name);
+    if (bedFields > 4)
+	lf->score = b->score;
+    if (bedFields > 5)
+	lf->orientation = (b->strand[0] == '+' ? 1 : (b->strand[0] == '-' ? -1 : 0)); 
+    lf->original = b;
+    }
+return lf;
+}
+
+struct linkedFeatures *simpleBedListToLinkedFeatures(struct bed *b, int bedFields, boolean everyBase)
+/* Create a list of linked features from a list of beds */
+{
+struct linkedFeatures *lfList = NULL;
+while (b)
+    {
+    slAddHead(&lfList, simpleBedToLinkedFeatures(b, bedFields, everyBase));
+    b = b->next;
+    }
+slReverse(&lfList);
+return lfList;
+}
+
+void loadSimpleBedAsLinkedFeaturesPerBase(struct track *tg)
+/* bed list not freed as pointer to it is stored in 'original' field */
+{
+loadSimpleBed(tg);
+tg->items = simpleBedListToLinkedFeatures(tg->items, tg->bedSize, TRUE);
+}
 
 void complexBedMethods(struct track *track, struct trackDb *tdb, boolean isBigBed,
                                 int wordCount, char *words[])
 /* Fill in methods for more complex bed tracks. */
@@ -642,11 +703,21 @@
 track->isBigBed = isBigBed;
 
 if (fieldCount < 8)
     {
+    if (baseColorGetDrawOpt(track) != baseColorDrawOff)
+	{
+	// data must be loaded as bed and converted to linkedFeatures 
+	// to draw each base character must make one simpleFeature per base
+	linkedFeaturesMethods(track);
+	track->loadItems = loadSimpleBedAsLinkedFeaturesPerBase;
+	}
+    else
+	{
     bedMethods(track);
     track->loadItems = loadSimpleBed;
     }
+    }
 else if (useItemRgb && fieldCount == 9)
     {
     linkedFeaturesMethods(track);
     track->loadItems = loadBed9;