866749c9bbb85a5f82999f298af6a68ef01e4151
braney
  Wed May 22 10:11:13 2024 -0700
new track type to draw coordinates in track

diff --git src/hg/hgTracks/baseTrack.c src/hg/hgTracks/baseTrack.c
new file mode 100644
index 0000000..053e469
--- /dev/null
+++ src/hg/hgTracks/baseTrack.c
@@ -0,0 +1,142 @@
+
+#include "common.h"
+#include "hgTracks.h"
+
+struct baseRange
+{
+struct baseRange *next;
+char *chrom;
+unsigned start, end;
+unsigned qStart, qEnd;
+};
+
+void loadBaseView(struct track *tg)
+{
+struct lm *lm = lmInit(0);
+struct bbiFile *bbi =  fetchBbiForTrack(tg);
+//struct asObject *as = bigBedAsOrDefault(bbi);
+struct bigBedInterval *bb, *bbList =  bigBedIntervalQuery(bbi, chromName, winStart, winEnd, 0, lm);
+char *bedRow[bbi->fieldCount];
+char startBuf[16], endBuf[16];
+struct baseRange *rangeList = NULL;
+
+for (bb = bbList; bb != NULL; bb = bb->next)
+    {
+    bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow));
+
+    struct baseRange *range;
+    AllocVar(range);
+    range->chrom = chromName;
+    range->start = atoi(bedRow[1]);
+    range->end = atoi(bedRow[2]);
+    range->qStart = atoi(bedRow[3]);
+    range->qEnd = atoi(bedRow[4]);
+
+    slAddHead(&rangeList, range);
+    }
+slReverse(&rangeList);
+tg->items = rangeList;
+}
+
+void drawBaseView(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg,
+                 int xOff, int yOff, int width, MgFont *font, Color color,
+                 enum trackVisibility vis)
+{
+unsigned rulerHeight = mgFontLineHeight(font);
+struct baseRange *rangeList = tg->items, *range;
+unsigned prevBase = seqStart;
+printf("seqStart %d seqEnd %d width %d\n", seqStart, seqEnd, width);
+double scale = (double) insideWidth / (seqEnd - seqStart) ;
+
+//unsigned prevEnd = range->end;
+//struct range *next;
+struct baseRange *newRangeList = NULL;
+
+unsigned start = rangeList->start;
+unsigned lastEnd = rangeList->end;
+unsigned qStart = rangeList->qStart;
+unsigned lastQEnd = rangeList->qEnd;
+for(range = rangeList->next; range; range= range->next)
+    {
+    //next = range->next;
+
+    if (range->start > lastEnd)
+        {
+        unsigned tmp = range->start - lastEnd;
+        if (tmp * scale > 20.0) // flush
+            {
+            struct baseRange *newRange;
+            AllocVar(newRange);
+            newRange->start = start;
+            newRange->end = lastEnd;
+            newRange->qStart = qStart;
+            newRange->qEnd = lastQEnd;
+            slAddHead(&newRangeList, newRange);
+
+            start = range->start;
+            qStart = range->qStart;
+            }
+        //else
+            {
+            lastEnd = range->end;
+            lastQEnd = range->qEnd;
+            }
+        }
+    }
+            struct baseRange *newRange;
+            AllocVar(newRange);
+            newRange->start = start;
+            newRange->end = lastEnd;
+            newRange->qStart = qStart;
+            newRange->qEnd = lastQEnd;
+            slAddHead(&newRangeList, newRange);
+slReverse(&newRangeList);
+for(range = newRangeList; range; range= range->next)
+    {
+    if (range->start > winEnd)
+        break;
+
+    //unsigned rangeStart = (range->start < winStart) ? winStart : range->start;
+    unsigned rangeStart = (range->start < winStart) ? winStart : range->start;
+    if (range->start < winStart)
+        {
+        unsigned offset = winStart - range->start;
+        range->qStart += offset;
+        }
+    unsigned rangeEnd = (range->end > winEnd) ? winEnd : range->end;
+    unsigned rangeWidth = rangeEnd - rangeStart;
+    unsigned rangeScreenWidth = scale * rangeWidth;
+    printf("start %d end %d width %d screenWidth %d scale %g\n", rangeStart, rangeEnd, rangeWidth, rangeScreenWidth, scale);
+
+    if (prevBase < rangeStart)
+        {
+        printf("box start %d rangeStart %d\n", prevBase, rangeStart);
+        //int x = (prevBase - winStart) * scale + insideX;
+        //int width = (rangeStart - prevBase) * scale;
+        //hvGfxBox(hvg, x, yOff, width, rulerHeight, 0xff333333);
+        }
+
+    unsigned rangeQStart = range->qStart;
+    //startBase = rangeStart;
+    if (rangeScreenWidth > 50)
+    hvGfxDrawRulerBumpText(hvg, insideX + (rangeStart - winStart) * scale, yOff, rulerHeight, rangeScreenWidth, MG_BLACK,
+                               font, rangeQStart, rangeWidth, 0, 1);
+    prevBase = rangeEnd;
+    }
+}
+
+static int baseViewHeight(struct track *tg, enum trackVisibility vis)
+{
+MgFont *font = tl.font;
+return mgFontLineHeight(font);
+// hvGfxDrawRulerBumpText
+}
+
+void bigBaseViewMethods(struct track *track, struct trackDb *tdb,
+                                int wordCount, char *words[])
+/* Fill in methods for (simple) bed tracks. */
+{
+track->loadItems = loadBaseView;
+track->drawItems = drawBaseView;
+track->totalHeight = baseViewHeight; 
+}