/* 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->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->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; }