1291f2242d9627684efaa88259c1c09f5e7c1b10 braney Thu Apr 4 07:19:11 2019 -0700 some lollipop code leaked out on my last commit, so here's more leakage! diff --git src/hg/hgTracks/lollipop.c src/hg/hgTracks/lollipop.c deleted file mode 100644 index ba2895d..0000000 --- src/hg/hgTracks/lollipop.c +++ /dev/null @@ -1,160 +0,0 @@ -/* lollipopTrack -- draw lollipop */ - -/* Copyright (C) 2019 The Regents of the University of California - * See README in this or parent directory for licensing information. */ - -#include "common.h" -#include "obscure.h" -#include "hgTracks.h" -#include "bedCart.h" -#include "bigWarn.h" -#include "lollipop.h" -#include "limits.h" - -static int trackHeight; - -struct lollipop -{ -struct lollipop *next; -double val; -unsigned start; -unsigned radius; -unsigned height; -Color color; -}; - -static void lollipopDrawItems(struct track *tg, int seqStart, int seqEnd, - struct hvGfx *hvg, int xOff, int yOff, int width, - MgFont *font, Color color, enum trackVisibility vis) -/* Draw a list of lollipop structures. */ -{ -double scale = scaleForWindow(width, seqStart, seqEnd); -struct lollipop *popList = tg->items, *pop; - -if (popList == NULL) - return; - -for (pop = popList; pop; pop = pop->next) - { - int sx = ((pop->start - seqStart) + .5) * scale; // x coord of center (lower region) - hvGfxLine(hvg, sx, yOff + trackHeight, sx , yOff+(trackHeight - pop->height), pop->color); - hvGfxCircle(hvg, sx, yOff + trackHeight - pop->radius - pop->height, pop->radius, pop->color, TRUE); - } -} - -void lollipopLeftLabels(struct track *tg, int seqStart, int seqEnd, - struct hvGfx *hvg, int xOff, int yOff, int width, int height, - boolean withCenterLabels, MgFont *font, Color color, - enum trackVisibility vis) -{ -} - - -static int lollipopHeight(struct track *tg, enum trackVisibility vis) -/* calculate height of all the lollipops being displayed */ -{ -if ( tg->visibility == tvDense) - return tl.fontHeight; -trackHeight = 5 * tl.fontHeight; -return 5 * tl.fontHeight; -} - -static void lollipopMapItem(struct track *tg, struct hvGfx *hvg, void *item, char *itemName, char *mapItemName, int start, int end, - int x, int y, int width, int height) -{ -} - - -double calcVarianceFromSums(double sum, double sumSquares, bits64 n) -/* Calculate variance. */ -{ -double var = sumSquares - sum*sum/n; -if (n > 1) - var /= n-1; -return var; -} - -double calcStdFromSums(double sum, double sumSquares, bits64 n) -/* Calculate standard deviation. */ -{ -return sqrt(calcVarianceFromSums(sum, sumSquares, n)); -} - -int cmpHeight(const void *va, const void *vb) -{ -const struct lollipop *a = *((struct lollipop **)va); -const struct lollipop *b = *((struct lollipop **)vb); -return a->height - b->height; -} - -void lollipopLoadItems(struct track *tg) -{ -struct lm *lm = lmInit(0); -struct bbiFile *bbi = fetchBbiForTrack(tg); -struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chromName, winStart, winEnd, 0, lm); -char *bedRow[5]; -char startBuf[16], endBuf[16]; -struct lollipop *popList = NULL, *pop; -unsigned lollipopField = atoi(trackDbSetting(tg->tdb, "lollipopField")); -double sumData = 0.0, sumSquares = 0.0; -//double minVal = DBL_MAX, maxVal = -DBL_MAX; -unsigned count = 0; - -for (bb = bbList; bb != NULL; bb = bb->next) - { - AllocVar(pop); - slAddHead(&popList, pop); - bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); - double val = atof(bedRow[lollipopField]); - pop->val = val; - pop->start = atoi(bedRow[1]); - count++; - sumData += val; - sumSquares += val * val; - } - -double average = sumData/count; -double stdDev = calcStdFromSums(sumData, sumSquares, count); - -for(pop = popList; pop; pop = pop->next) - { - if (pop->val > average + stdDev / 5) - { - pop->color = MG_RED; - pop->radius = 8; - pop->height = 3 * tl.fontHeight; - } - else if (pop->val < average - stdDev / 5) - { - pop->color = MG_GREEN; - pop->radius = 3; - pop->height = 1 * tl.fontHeight; - } - else - { - pop->color = MG_GRAY; - pop->radius = 5; - pop->height = 2 * tl.fontHeight; - } - - } -slSort(&popList, cmpHeight); -tg->items = popList; -} - -void lollipopMethods(struct track *track, struct trackDb *tdb, - int wordCount, char *words[]) -/* Interact track type methods */ -{ -char *ourWords[2]; -ourWords[0] = "bigBed"; -ourWords[1] = "4"; -bigBedMethods(track, tdb,2,ourWords); -if (tdb->visibility == tvDense) - return; -track->loadItems = lollipopLoadItems; -track->drawItems = lollipopDrawItems; -track->totalHeight = lollipopHeight; -track->drawLeftLabels = lollipopLeftLabels; -track->mapItem = lollipopMapItem; -}