src/hg/hgTracks/goldTrack.c 1.5
1.5 2010/05/11 01:43:27 kent
Refactoring to split the trackDb.tableName field into separate track and table fields. Similarly track.mapName field goes to the same track and table fields.
Index: src/hg/hgTracks/goldTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/goldTrack.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -b -B -U 1000000 -r1.4 -r1.5
--- src/hg/hgTracks/goldTrack.c 3 Sep 2008 19:19:02 -0000 1.4
+++ src/hg/hgTracks/goldTrack.c 11 May 2010 01:43:27 -0000 1.5
@@ -1,165 +1,165 @@
/* goldTrack - also known as assembly track. */
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "jksql.h"
#include "hdb.h"
#include "hgTracks.h"
#include "agpFrag.h"
#include "agpGap.h"
static int cmpAgpFrag(const void *va, const void *vb)
/* Compare two agpFrags by chromStart. */
{
const struct agpFrag *a = *((struct agpFrag **)va);
const struct agpFrag *b = *((struct agpFrag **)vb);
return a->chromStart - b->chromStart;
}
static void goldLoad(struct track *tg)
/* Load up golden path from database table to track items. */
{
struct sqlConnection *conn = hAllocConn(database);
struct sqlResult *sr = NULL;
char **row;
struct agpFrag *fragList = NULL, *frag;
struct agpGap *gapList = NULL, *gap;
int rowOffset;
/* Get the frags and load into tg->items. */
sr = hRangeQuery(conn, "gold", chromName, winStart, winEnd, NULL, &rowOffset);
while ((row = sqlNextRow(sr)) != NULL)
{
frag = agpFragLoad(row+rowOffset);
slAddHead(&fragList, frag);
}
slSort(&fragList, cmpAgpFrag);
sqlFreeResult(&sr);
tg->items = fragList;
/* Get the gaps into tg->customPt. */
sr = hRangeQuery(conn, "gap", chromName, winStart, winEnd, NULL, &rowOffset);
while ((row = sqlNextRow(sr)) != NULL)
{
gap = agpGapLoad(row+rowOffset);
slAddHead(&gapList, gap);
}
slReverse(&gapList);
sqlFreeResult(&sr);
tg->customPt = gapList;
hFreeConn(&conn);
}
static void goldFree(struct track *tg)
/* Free up goldTrackGroup items. */
{
agpFragFreeList((struct agpFrag**)&tg->items);
agpGapFreeList((struct agpGap**)&tg->customPt);
}
static char *goldName(struct track *tg, void *item)
/* Return name of gold track item. */
{
struct agpFrag *frag = item;
return frag->frag;
}
static void goldDrawDense(struct track *tg, int seqStart, int seqEnd,
struct hvGfx *hvg, int xOff, int yOff, int width,
MgFont *font, Color color, enum trackVisibility vis)
/* Draw golden path items. */
{
int baseWidth = seqEnd - seqStart;
struct agpFrag *frag;
struct agpGap *gap;
int y = yOff;
int heightPer = tg->heightPer;
int lineHeight = tg->lineHeight;
int x1,x2,w;
int midLineOff = heightPer/2;
boolean isFull = (vis == tvFull);
Color brown = color;
Color gold = tg->ixAltColor;
Color pink = 0;
Color pink1 = hvGfxFindColorIx(hvg, 240, 140, 140);
Color pink2 = hvGfxFindColorIx(hvg, 240, 100, 100);
int ix = 0;
double scale = scaleForPixels(width);
/* Draw gaps if any. */
if (!isFull)
{
int midY = y + midLineOff;
for (gap = tg->customPt; gap != NULL; gap = gap->next)
{
if (!sameWord(gap->bridge, "no"))
{
drawScaledBox(hvg, gap->chromStart, gap->chromEnd, scale, xOff, midY, 1, brown);
}
}
}
for (frag = tg->items; frag != NULL; frag = frag->next)
{
x1 = round((double)((int)frag->chromStart-winStart)*scale) + xOff;
x2 = round((double)((int)frag->chromEnd-winStart)*scale) + xOff;
w = x2-x1;
color = ((ix&1) ? gold : brown);
pink = ((ix&1) ? pink1 : pink2);
if (w < 1)
w = 1;
if (sameString(frag->type, "A")) color = pink;
hvGfxBox(hvg, x1, y, w, heightPer, color);
if (isFull)
y += lineHeight;
else if (baseWidth < 10000000)
{
char status[256];
sprintf(status, "%s:%d-%d %s %s:%d-%d",
frag->frag, frag->fragStart, frag->fragEnd,
frag->strand,
frag->chrom, frag->chromStart, frag->chromEnd);
- mapBoxHc(hvg, frag->chromStart, frag->chromEnd, x1,y,w,heightPer, tg->mapName,
+ mapBoxHc(hvg, frag->chromStart, frag->chromEnd, x1,y,w,heightPer, tg->track,
frag->frag, status);
}
++ix;
}
}
static void goldDraw(struct track *tg, int seqStart, int seqEnd,
struct hvGfx *hvg, int xOff, int yOff, int width,
MgFont *font, Color color, enum trackVisibility vis)
/* Draw golden path items. */
{
if (vis == tvDense)
goldDrawDense(tg, seqStart, seqEnd, hvg, xOff, yOff, width,
font, color, vis);
else
genericDrawItems(tg, seqStart, seqEnd, hvg, xOff, yOff, width,
font, color, vis);
}
static Color goldColor(struct track *tg, void *item, struct hvGfx *hvg)
/* Return color to draw known gene in. */
{
struct agpFrag *frag = item;
Color pink = hvGfxFindColorIx(hvg, 240, 140, 140);
Color color = (sameString(frag->type, "A") ? pink : tg->ixColor);
return color;
}
void goldMethods(struct track *tg)
/* Make track for golden path (assembly track). */
{
tg->loadItems = goldLoad;
tg->freeItems = goldFree;
tg->drawItems = goldDraw;
tg->drawItemAt = bedDrawSimpleAt;
tg->itemName = goldName;
tg->mapItemName = goldName;
tg->itemColor = goldColor;
}