70d181fe8c0667fce247e4436d81322c50112d22
kent
Thu Jun 17 14:30:17 2010 -0700
Making hgTrackRender - a program that renders one track quickly - currently from the command line in postscript only.
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index cbf0f90..effed3b 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -1,5625 +1,25 @@
/* hgTracks - Human Genome browser main cgi script. */
+
#include "common.h"
-#include "hCommon.h"
#include "linefile.h"
#include "portable.h"
#include "memalloc.h"
#include "localmem.h"
+#include "hCommon.h"
#include "obscure.h"
#include "dystring.h"
#include "hash.h"
-#include "jksql.h"
-#include "gfxPoly.h"
-#include "memgfx.h"
-#include "hvGfx.h"
-#include "psGfx.h"
#include "cheapcgi.h"
-#include "hPrint.h"
#include "htmshell.h"
#include "cart.h"
#include "hdb.h"
#include "hui.h"
#include "hgFind.h"
#include "hgTracks.h"
-#include "trashDir.h"
-#include "grp.h"
#include "versionInfo.h"
-#include "web.h"
-#include "cds.h"
-#include "cutterTrack.h"
-#include "wikiTrack.h"
-#include "ctgPos.h"
-#include "bed.h"
-#include "bigBed.h"
-#include "bigWig.h"
-#include "bedCart.h"
-#include "customTrack.h"
-#include "cytoBand.h"
-#include "ensFace.h"
-#include "liftOver.h"
-#include "pcrResult.h"
-#include "wikiLink.h"
-#include "jsHelper.h"
-#include "mafTrack.h"
-#include "hgConfig.h"
-#include "encode.h"
-#include "agpFrag.h"
-#include "imageV2.h"
-#include "suggest.h"
static char const rcsid[] = "$Id: hgTracks.c,v 1.1651 2010/06/11 17:53:06 larrym Exp $";
-/* These variables persist from one incarnation of this program to the
- * next - living mostly in the cart. */
-boolean baseShowPos; /* TRUE if should display full position at top of base track */
-boolean baseShowAsm; /* TRUE if should display assembly info at top of base track */
-boolean baseShowScaleBar; /* TRUE if should display scale bar at very top of base track */
-boolean baseShowRuler; /* TRUE if should display the basic ruler in the base track (default) */
-char *baseTitle = NULL; /* Title it should display top of base track (optional)*/
-static char *userSeqString = NULL; /* User sequence .fa/.psl file. */
-
-/* These variables are set by getPositionFromCustomTracks() at the very
- * beginning of tracksDisplay(), and then used by loadCustomTracks(). */
-char *ctFileName = NULL; /* Custom track file. */
-struct customTrack *ctList = NULL; /* Custom tracks. */
-boolean hasCustomTracks = FALSE; /* whether any custom tracks are for this db*/
-struct slName *browserLines = NULL; /* Custom track "browser" lines. */
-
-boolean withNextItemArrows = FALSE; /* Display next feature (gene) navigation buttons near center labels? */
-#ifndef IMAGEv2_DRAG_REORDER
-boolean withPriorityOverride = FALSE; /* Display priority for each track to allow reordering */
-#endif//ndef IMAGEv2_DRAG_REORDER
-
-int gfxBorder = hgDefaultGfxBorder; /* Width of graphics border. */
-int guidelineSpacing = 12; /* Pixels between guidelines. */
-
-boolean withIdeogram = TRUE; /* Display chromosome ideogram? */
-
-int rulerMode = tvHide; /* on, off, full */
-
-char *rulerMenu[] =
-/* dropdown for ruler visibility */
- {
- "hide",
- "dense",
- "full"
- };
-
-static long enteredMainTime = 0; /* time at beginning of main() */
-char *protDbName; /* Name of proteome database for this genome. */
-#define MAX_CONTROL_COLUMNS 6
-#define LOW 1
-#define MEDIUM 2
-#define BRIGHT 3
-#define MAXCHAINS 50000000
-boolean hgDebug = FALSE; /* Activate debugging code. Set to true by hgDebug=on in command line*/
-int imagePixelHeight = 0;
-boolean dragZooming = TRUE;
-struct hash *oldVars = NULL;
-
-boolean hideControls = FALSE; /* Hide all controls? */
-boolean trackImgOnly = FALSE; /* caller wants just the track image and track table html */
-boolean ideogramToo = FALSE; /* caller wants the ideoGram (when requesting just one track) */
-
-/* Structure returned from findGenomePos.
- * We use this to to expand any tracks to full
- * that were found to contain the searched-upon
- * position string */
-struct hgPositions *hgp = NULL;
-
-
-/* Other global variables. */
-struct group *groupList = NULL; /* List of all tracks. */
-char *browserName; /* Test or public browser */
-char *organization; /* UCSC */
-
-
-struct track *trackFindByName(struct track *tracks, char *trackName)
-/* find a track in tracks by name, recursively searching subtracks */
-{
-struct track *track;
-for (track = tracks; track != NULL; track = track->next)
- {
- if (sameString(track->track, trackName))
- return track;
- else if (track->subtracks != NULL)
- {
- struct track *st = trackFindByName(track->subtracks, trackName);
- if (st != NULL)
- return st;
- }
- }
-return NULL;
-}
-
-int tgCmpPriority(const void *va, const void *vb)
-/* Compare to sort based on priority; use shortLabel as secondary sort key. */
-{
-const struct track *a = *((struct track **)va);
-const struct track *b = *((struct track **)vb);
-float dif = a->group->priority - b->group->priority;
-
-if (dif == 0)
- dif = a->priority - b->priority;
-if (dif < 0)
- return -1;
-else if (dif == 0.0)
- /* secondary sort on label */
- return strcasecmp(a->shortLabel, b->shortLabel);
-else
- return 1;
-}
-
-int trackRefCmpPriority(const void *va, const void *vb)
-/* Compare based on priority. */
-{
-const struct trackRef *a = *((struct trackRef **)va);
-const struct trackRef *b = *((struct trackRef **)vb);
-return tgCmpPriority(&a->track, &b->track);
-}
-
-int gCmpPriority(const void *va, const void *vb)
-/* Compare groups based on priority. */
-{
-const struct group *a = *((struct group **)va);
-const struct group *b = *((struct group **)vb);
-float dif = a->priority - b->priority;
-
-if (dif == 0)
- return 0;
-if (dif < 0)
- return -1;
-else if (dif == 0.0)
- return 0;
-else
- return 1;
-}
-
-void changeTrackVis(struct group *groupList, char *groupTarget, int changeVis)
-/* Change track visibilities. If groupTarget is
- * NULL then set visibility for tracks in all groups. Otherwise,
- * just set it for the given group. If vis is -2, then visibility is
- * unchanged. If -1 then set visibility to default, otherwise it should
- * be tvHide, tvDense, etc.
- * If we are going back to default visibility, then reset the track
- * ordering also. */
-{
-struct group *group;
-if (changeVis == -2)
- return;
-for (group = groupList; group != NULL; group = group->next)
- {
- struct trackRef *tr;
- if (groupTarget == NULL || sameString(group->name,groupTarget))
- {
- static char pname[512];
- /* if default vis then reset group priority */
- if (changeVis == -1)
- group->priority = group->defaultPriority;
- for (tr = group->trackList; tr != NULL; tr = tr->next)
- {
- struct track *track = tr->track;
- struct trackDb *tdb = track->tdb;
- if (changeVis == -1)
- {
- if(tdbIsComposite(tdb))
- {
- safef(pname, sizeof(pname),"%s.*",track->track); //to remove all settings associated with this composite!
- cartRemoveLike(cart,pname);
- struct track *subTrack;
- for(subTrack = track->subtracks;subTrack != NULL; subTrack = subTrack->next)
- {
- subTrack->visibility = tdb->visibility;
- cartRemove(cart, subTrack->track);
- }
- }
-
- /* restore defaults */
- if (tdbIsSuperTrackChild(tdb) || tdbIsCompositeChild(tdb))
- {
- assert(tdb->parent != NULL && tdb->parent->track);
- cartRemove(cart, tdb->parent->track);
- #ifndef IMAGEv2_DRAG_REORDER
- if (withPriorityOverride)
- {
- safef(pname, sizeof(pname), "%s.priority",tdb->parent->track);
- cartRemove(cart, pname);
- }
- #endif//ndef IMAGEv2_DRAG_REORDER
- }
-
- track->visibility = tdb->visibility;
- cartRemove(cart, track->track);
-
- /* set the track priority back to the default value */
- #ifndef IMAGEv2_DRAG_REORDER
- if (withPriorityOverride)
- {
- safef(pname, sizeof(pname), "%s.priority",track->track);
- cartRemove(cart, pname);
- track->priority = track->defaultPriority;
- }
- #endif//ndef IMAGEv2_DRAG_REORDER
- }
- else
- {
- /* change to specified visibility */
- if (tdbIsSuperTrackChild(tdb))
- {
- assert(tdb->parent != NULL);
- /* Leave supertrack members alone -- only change parent */
- struct trackDb *parentTdb = tdb->parent;
- if ((changeVis == tvHide && !parentTdb->isShow) ||
- (changeVis != tvHide && parentTdb->isShow))
- {
- /* remove if setting to default vis */
- cartRemove(cart, parentTdb->track);
- }
- else
- cartSetString(cart, parentTdb->track,
- changeVis == tvHide ? "hide" : "show");
- }
- else
- {
- /* regular track */
- if (changeVis == tdb->visibility)
- /* remove if setting to default vis */
- cartRemove(cart, track->track);
- else
- cartSetString(cart, track->track,
- hStringFromTv(changeVis));
- track->visibility = changeVis;
- }
- }
- }
- }
- }
-slSort(&groupList, gCmpPriority);
-}
-
-int trackOffsetX()
-/* Return x offset where track display proper begins. */
-{
-int x = gfxBorder;
-if (withLeftLabels)
- x += tl.leftLabelWidth + gfxBorder;
-return x;
-}
-
-
-static void mapBoxTrackUi(struct hvGfx *hvg, int x, int y, int width,
- int height, char *name, char *shortLabel, char *id)
-/* Print out image map rectangle that invokes hgTrackUi. */
-{
-x = hvGfxAdjXW(hvg, x, width);
-char *url = trackUrl(name, chromName);
-
-if(theImgBox && curImgTrack)
- {
- char title[256];
- safef(title,sizeof(title),"%s controls", shortLabel);
- struct imgSlice *curSlice = imgTrackSliceGetByType(curImgTrack,stButton);
- if(curSlice)
- sliceAddLink(curSlice,url,title);
- }
-else
- {
- hPrintf("\n");
- }
-freeMem(url);
-}
-
-static void mapBoxToggleComplement(struct hvGfx *hvg, int x, int y, int width, int height,
- struct track *toggleGroup, char *chrom,
- int start, int end, char *message)
-/*print out a box along the DNA bases that toggles a cart variable
- * "complement" to complement the DNA bases at the top by the ruler*/
-{
-struct dyString *ui = uiStateUrlPart(toggleGroup);
-x = hvGfxAdjXW(hvg, x, width);
-if(theImgBox && curImgTrack)
- {
- char link[512];
- safef(link,sizeof(link),"%s?complement_%s=%d&%s",
- hgTracksName(), database, !cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE),ui->string);
- imgTrackAddMapItem(curImgTrack,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height, NULL);
- }
-else
- {
- hPrintf("string);
- freeDyString(&ui);
- if (message != NULL)
- mapStatusMessage("%s", message);
- hPrintf(">\n");
- }
-}
-
-char *trackUrl(char *mapName, char *chromName)
-/* Return hgTrackUi url; chromName is optional. */
-{
-char *encodedMapName = cgiEncode(mapName);
-char buf[2048];
-if(chromName == NULL)
- safef(buf, sizeof(buf), "%s?%s=%u&g=%s", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), encodedMapName);
-else
- safef(buf, sizeof(buf), "%s?%s=%u&c=%s&g=%s", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chromName, encodedMapName);
-freeMem(encodedMapName);
-return(cloneString(buf));
-}
-
-void smallBreak()
-/* Draw small horizontal break */
-{
-hPrintf("
\n");
-}
-
-int trackPlusLabelHeight(struct track *track, int fontHeight)
-/* Return the sum of heights of items in this track (or subtrack as it may be)
- * and the center label(s) above the items (if any). */
-{
-int y = track->totalHeight(track, limitVisibility(track));
-if (isWithCenterLabels(track))
- y += fontHeight;
-if (tdbIsComposite(track->tdb))
- {
- struct track *subtrack;
- for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
- {
- if (isSubtrackVisible(subtrack) && isWithCenterLabels(subtrack))
- y += fontHeight;
- }
- }
-return y;
-}
-
-void drawColoredButtonBox(struct hvGfx *hvg, int x, int y, int w, int h,
- int enabled, Color shades[])
-/* draw button box, providing shades of the desired button color */
-{
-int light = shades[1], mid = shades[2], dark = shades[4];
-if (enabled)
- {
- hvGfxBox(hvg, x, y, w, 1, light);
- hvGfxBox(hvg, x, y+1, 1, h-1, light);
- hvGfxBox(hvg, x+1, y+1, w-2, h-2, mid);
- hvGfxBox(hvg, x+1, y+h-1, w-1, 1, dark);
- hvGfxBox(hvg, x+w-1, y+1, 1, h-1, dark);
- }
-else /* try to make the button look as if
- * it is already depressed */
- {
- hvGfxBox(hvg, x, y, w, 1, dark);
- hvGfxBox(hvg, x, y+1, 1, h-1, dark);
- hvGfxBox(hvg, x+1, y+1, w-2, h-2, light);
- hvGfxBox(hvg, x+1, y+h-1, w-1, 1, light);
- hvGfxBox(hvg, x+w-1, y+1, 1, h-1, light);
- }
-}
-
-void drawGrayButtonBox(struct hvGfx *hvg, int x, int y, int w, int h, int enabled)
-/* Draw a gray min-raised looking button. */
-{
- drawColoredButtonBox(hvg, x, y, w, h, enabled, shadesOfGray);
-}
-
-void drawBlueButtonBox(struct hvGfx *hvg, int x, int y, int w, int h, int enabled)
-/* Draw a blue min-raised looking button. */
-{
- drawColoredButtonBox(hvg, x, y, w, h, enabled, shadesOfSea);
-}
-
-void drawButtonBox(struct hvGfx *hvg, int x, int y, int w, int h, int enabled)
-/* Draw a standard (gray) min-raised looking button. */
-{
- drawGrayButtonBox(hvg, x, y, w, h, enabled);
-}
-
-void beforeFirstPeriod( char *str )
-{
-char *t = rindex( str, '.' );
-
-if( t == NULL )
- return;
-else
- str[strlen(str) - strlen(t)] = '\0';
-}
-
-static void drawBases(struct hvGfx *hvg, int x, int y, int width, int height,
- Color color, MgFont *font, boolean complementSeq,
- struct dnaSeq *thisSeq)
-/* Draw evenly spaced bases. */
-{
-struct dnaSeq *seq;
-
-if (thisSeq == NULL)
- seq = hDnaFromSeq(database, chromName, winStart, winEnd, dnaUpper);
-else
- seq = thisSeq;
-
-if (complementSeq)
- complement(seq->dna, seq->size);
-spreadBasesString(hvg, x, y, width, height, color, font,
- seq->dna, seq->size, FALSE);
-
-if (thisSeq == NULL)
- freeDnaSeq(&seq);
-}
-
-void drawComplementArrow( struct hvGfx *hvg, int x, int y,
- int width, int height, MgFont *font)
-/* Draw arrow and create clickbox for complementing ruler bases */
-{
-boolean baseCmpl = cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE);
-// reverse arrow when base complement doesn't match display
-char *text = (baseCmpl == revCmplDisp) ? "--->" : "<---";
-hvGfxTextRight(hvg, x, y, width, height, MG_BLACK, font, text);
-mapBoxToggleComplement(hvg, x, y, width, height, NULL, chromName, winStart, winEnd,
- "complement bases");
-}
-
-struct track *chromIdeoTrack(struct track *trackList)
-/* Find chromosome ideogram track */
-{
-struct track *track;
-for(track = trackList; track != NULL; track = track->next)
- {
- if(sameString(track->track, "cytoBandIdeo"))
- {
- if (hTableExists(database, track->table))
- return track;
- else
- return NULL;
- }
- }
-return NULL;
-}
-
-void removeTrackFromGroup(struct track *track)
-/* Remove track from group it is part of. */
-{
-struct trackRef *tr = NULL;
-for(tr = track->group->trackList; tr != NULL; tr = tr->next)
- {
- if(tr->track == track)
- {
- slRemoveEl(&track->group->trackList, tr);
- break;
- }
- }
-}
-
-
-void fillInStartEndBands(struct track *ideoTrack, char *startBand, char *endBand, int buffSize)
-/* Loop through the bands and fill in the one that the current window starts
- on and ends on. */
-{
-struct cytoBand *cb = NULL, *cbList = ideoTrack->items;
-for(cb = cbList; cb != NULL; cb = cb->next)
- {
- /* If the start or end is encompassed by this band fill
- it in. */
- if(winStart >= cb->chromStart &&
- winStart <= cb->chromEnd)
- {
- safef(startBand, buffSize, "%s", cb->name);
- }
- /* End is > rather than >= due to odditiy in the
- cytoband track where the starts and ends of two
- bands overlaps by one. */
- if(winEnd > cb->chromStart &&
- winEnd <= cb->chromEnd)
- {
- safef(endBand, buffSize, "%s", cb->name);
- }
- }
-}
-
-void makeChromIdeoImage(struct track **pTrackList, char *psOutput,
- struct tempName *ideoTn)
-/* Make an ideogram image of the chromsome and our position in it. If the
- * ideoTn parameter is not NULL, it is filled in if the ideogram is created. */
-{
-struct track *ideoTrack = NULL;
-MgFont *font = tl.font;
-char *mapName = "ideoMap";
-struct hvGfx *hvg;
-boolean doIdeo = TRUE;
-boolean ideogramAvail = FALSE;
-int ideoWidth = round(.8 *tl.picWidth);
-int ideoHeight = 0;
-int textWidth = 0;
-struct tempName gifTn;
-if (ideoTn == NULL)
- ideoTn = &gifTn; // not returning value
-
-ideoTrack = chromIdeoTrack(*pTrackList);
-
-/* If no ideogram don't draw. */
-if(ideoTrack == NULL)
- doIdeo = FALSE;
-else if(trackImgOnly && !ideogramToo)
- {
- doIdeo = FALSE;
- }
-else
- {
- ideogramAvail = TRUE;
- /* Remove the track from the group and track list. */
- removeTrackFromGroup(ideoTrack);
- slRemoveEl(pTrackList, ideoTrack);
-
- /* Fix for hide all button hiding the ideogram as well. */
- if(withIdeogram && ideoTrack->items == NULL)
- {
- ideoTrack->visibility = tvDense;
- ideoTrack->loadItems(ideoTrack);
- }
- limitVisibility(ideoTrack);
-
- /* If hidden don't draw. */
- if(ideoTrack->limitedVis == tvHide || !withIdeogram)
- doIdeo = FALSE;
- }
-if(doIdeo)
- {
- char startBand[16];
- char endBand[16];
- char title[32];
- startBand[0] = endBand[0] = '\0';
- fillInStartEndBands(ideoTrack, startBand, endBand, sizeof(startBand));
- /* Start up client side map. */
- if (!psOutput)
- hPrintf("\n");
- }
-hPrintf("
\n");
-hPrintf("
|