src/hg/hgTracks/contigTrack.c 1.7
1.7 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/contigTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/contigTrack.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 1000000 -r1.6 -r1.7
--- src/hg/hgTracks/contigTrack.c 3 Sep 2008 19:19:01 -0000 1.6
+++ src/hg/hgTracks/contigTrack.c 11 May 2010 01:43:27 -0000 1.7
@@ -1,135 +1,135 @@
/* Stuff for the contig track. */
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "jksql.h"
#include "hdb.h"
#include "hgTracks.h"
#include "ctgPos.h"
static void contigLoad(struct track *tg)
/* Load up contigs from database table to track items. */
{
char query[256];
struct sqlConnection *conn = hAllocConn(database);
struct sqlResult *sr = NULL;
char **row;
struct ctgPos *ctgList = NULL, *ctg;
/* Get the contigs and load into tg->items. */
sprintf(query, "select * from %s where chrom = '%s' and chromStart<%u and chromEnd>%u",
- tg->mapName, chromName, winEnd, winStart);
+ tg->table, chromName, winEnd, winStart);
sr = sqlGetResult(conn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
ctg = ctgPosLoad(row);
slAddHead(&ctgList, ctg);
}
slReverse(&ctgList);
sqlFreeResult(&sr);
hFreeConn(&conn);
tg->items = ctgList;
}
static char *abbreviateContig(char *string, MgFont *font, int width)
/* Return a string abbreviated enough to fit into space. */
{
int textWidth;
/* If have enough space, return original unabbreviated string. */
textWidth = mgFontStringWidth(font, string);
if (textWidth <= width)
return string;
/* Try skipping over 'ctg' */
string += 3;
textWidth = mgFontStringWidth(font, string);
if (textWidth <= width)
return string;
return NULL;
}
static void contigDraw(struct track *tg, int seqStart, int seqEnd,
struct hvGfx *hvg, int xOff, int yOff, int width,
MgFont *font, Color color, enum trackVisibility vis)
/* Draw contig items. */
{
struct ctgPos *ctg;
int y = yOff;
int heightPer = tg->heightPer;
int lineHeight = tg->lineHeight;
int x1,x2,w;
boolean isFull = (vis == tvFull);
int ix = 0;
char *s;
double scale = scaleForPixels(width);
for (ctg = tg->items; ctg != NULL; ctg = ctg->next)
{
x1 = round((double)((int)ctg->chromStart-winStart)*scale) + xOff;
x2 = round((double)((int)ctg->chromEnd-winStart)*scale) + xOff;
/* Clip here so that text will tend to be more visible... */
if (x1 < xOff)
x1 = xOff;
if (x2 > xOff + width)
x2 = xOff + width;
w = x2-x1;
if (w < 1)
w = 1;
hvGfxBox(hvg, x1, y, w, heightPer, color);
s = abbreviateContig(ctg->contig, tl.font, w);
if (s != NULL)
hvGfxTextCentered(hvg, x1, y, w, heightPer, MG_WHITE, tl.font, s);
if (isFull)
y += lineHeight;
else
{
- mapBoxHc(hvg, ctg->chromStart, ctg->chromEnd, x1,y,w,heightPer, tg->mapName,
+ mapBoxHc(hvg, ctg->chromStart, ctg->chromEnd, x1,y,w,heightPer, tg->track,
tg->mapItemName(tg, ctg),
tg->itemName(tg, ctg));
}
++ix;
}
}
static void contigFree(struct track *tg)
/* Free up contigTrackGroup items. */
{
ctgPosFreeList((struct ctgPos**)&tg->items);
}
static char *contigName(struct track *tg, void *item)
/* Return name of contig track item. */
{
struct ctgPos *ctg = item;
return ctg->contig;
}
static int contigItemStart(struct track *tg, void *item)
/* Return start of contig track item. */
{
struct ctgPos *ctg = item;
return ctg->chromStart;
}
static int contigItemEnd(struct track *tg, void *item)
/* Return end of contig track item. */
{
struct ctgPos *ctg = item;
return ctg->chromEnd;
}
void contigMethods(struct track *tg)
/* Make track for contig */
{
tg->loadItems = contigLoad;
tg->freeItems = contigFree;
tg->drawItems = contigDraw;
tg->itemName = contigName;
tg->mapItemName = contigName;
tg->totalHeight = tgFixedTotalHeightNoOverflow;
tg->itemHeight = tgFixedItemHeight;
tg->itemStart = contigItemStart;
tg->itemEnd = contigItemEnd;
}