f5bc011a1d5dd3daa3211c93eead19e8c7f50ce3 braney Thu Mar 16 16:53:32 2023 -0700 polishing up squishyPack for release diff --git src/hg/hgTracks/hgTracks.h src/hg/hgTracks/hgTracks.h index b517639..58ed277 100644 --- src/hg/hgTracks/hgTracks.h +++ src/hg/hgTracks/hgTracks.h @@ -1,1781 +1,1782 @@ /* hgTracks.h - stuff private to hgTracks, but shared with * individual tracks. */ /* Copyright (C) 2014 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #ifndef HGTRACKS_H #define HGTRACKS_H #ifndef HVGFX_H #include "hvGfx.h" #endif #ifndef HUI_H #include "hui.h" #endif #include "jsHelper.h" #include "imageV2.h" #ifndef CART_H #include "cart.h" #endif #ifndef PSL_H #include "psl.h" #endif #ifndef BED_H #include "bed.h" #endif #ifndef TRACKLAYOUT_H #include "trackLayout.h" #endif /* TRACKLAYOUT_H */ #ifndef HPRINT_H #include "hPrint.h" #endif /* HPRINT_H */ #ifndef GBROWSE #ifndef ITEMATTR_H #include "itemAttr.h" #endif /* ITEMATTR_H */ #endif /* GBROWSE */ #include "soTerm.h" /* A few hgGenome cart constant defaults copied from */ #define hggPrefix "hgGenome_" #define hggGraphPrefix hggPrefix "graph" /* trackDb setting for expRatio tracks */ #define EXP_COLOR_DENSE "expColorDense" #ifdef LOWELAB #define MAXPIXELS 60000 #else #define MAXPIXELS 14000 #endif #define BIGBEDMAXIMUMITEMS 1000000 #define MULTI_REGION_VIRTUAL_CHROM_NAME "multi" // original name was 'virt' #define MULTI_REGION_CFG_BUTTON_TOP "multiRegionButtonTop" /* for botDelay call, 10 second for warning, 20 second for immediate exit */ #define delayFraction 0.25 extern long enteredMainTime; #include "lolly.h" struct track /* Structure that displays of tracks. The central data structure * of the graphical genome browser. */ { struct track *next; /* Next on list. */ char *track; /* Track symbolic name. Name on image map etc. Same as tdb->track. */ char *table; /* Table symbolic name. Name of database table. Same as tdb->table.*/ enum trackVisibility visibility; /* How much of this want to see. */ enum trackVisibility limitedVis; /* How much of this actually see. */ boolean limitedVisSet; /* Is limited visibility set? */ char *longLabel; /* Long label to put in center. */ char *shortLabel; /* Short label to put on side. */ bool mapsSelf; /* True if system doesn't need to do map box. */ bool drawName; /* True if BED wants name drawn in box. */ Color *colorShades; /* Color scale (if any) to use. */ struct rgbColor color; /* Main color. */ Color ixColor; /* Index of main color. */ Color *altColorShades; /* optional alternate color scale */ struct rgbColor altColor; /* Secondary color. */ Color ixAltColor; void (*loadItems)(struct track *tg); /* loadItems loads up items for the chromosome range indicated. */ void *items; /* Some type of slList of items. */ char *(*itemName)(struct track *tg, void *item); /* Return name of one of an item to display on left side. */ char *(*mapItemName)(struct track *tg, void *item); /* Return name to associate on map. */ int (*totalHeight)(struct track *tg, enum trackVisibility vis); /* Return total height. Called before and after drawItems. * Must set the following variables. */ int height; /* Total height - must be set by above call. */ int lineHeight; /* Height per item line including border. */ int heightPer; /* Height per item line minus border. */ int (*itemHeight)(struct track *tg, void *item); /* Return height of one item. */ int (*itemRightPixels)(struct track *tg, void *item); /* Return number of pixels needed to right of item for additional labeling. (Optional) */ void (*preDrawMultiRegion)(struct track *tg); /* Handle multi-region issues after predraw and before draw such as autoScale for wigs. */ void (*preDrawItems)(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Do PreDraw item list, one per track. */ void (*drawItems)(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw item list, one per track. */ void (*drawItemAt)(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int yOff, double scale, MgFont *font, Color color, enum trackVisibility vis); /* Draw a single item. This is optional, but if it's here * then you can plug in genericDrawItems into the drawItems, * which takes care of all sorts of things including packing. */ int (*itemStart)(struct track *tg, void *item); /* Return start of item in base pairs. */ int (*itemEnd)(struct track *tg, void *item); /* Return end of item in base pairs. */ void (*freeItems)(struct track *tg); /* Free item list. */ struct hash *attrTable; /* Persistent table to speed up lookup of attributes in secondary tables (optional). */ Color (*itemColor)(struct track *tg, void *item, struct hvGfx *hvg); /* Get color of item (optional). */ Color (*itemNameColor)(struct track *tg, void *item, struct hvGfx *hvg); /* Get color for the item's name (optional). */ Color (*itemLabelColor)(struct track *tg, void *item, struct hvGfx *hvg); /* Get color for the item's label (optional). */ void (*mapItem)(struct track *tg, struct hvGfx *hvg, void *item, char *itemName, char *mapItemName, int start, int end, int x, int y, int width, int height); /* Write out image mapping for a given item */ boolean hasUi; /* True if has an extended UI page. */ void *wigCartData; /* pointer to wigCart */ void *extraUiData; /* Pointer for track specific filter etc. data. */ void (*trackFilter)(struct track *tg); /* Stuff to handle user interface parts. */ void *customPt; /* Misc pointer variable unique to track. */ int customInt; /* Misc int variable unique to track. */ int subType; /* Variable to say what subtype this is for similar tracks * to share code. */ /* Stuff for the various wig incarnations - sample, wig, bigWig */ float minRange, maxRange; /*min and max range for sample tracks 0.0 to 1000.0*/ float scaleRange; /* What to scale samples by to get logical 0-1 */ double graphUpperLimit, graphLowerLimit; /* Limits of actual data in window for wigs. */ struct preDrawContainer *preDrawContainer; /* Numbers to graph in wig, one per pixel */ struct preDrawContainer *(*loadPreDraw)(struct track *tg, int seqStart, int seqEnd, int width); struct wigGraphOutput *wigGraphOutput; /* Where to draw wig - different for transparency */ /* Do bits that load the predraw buffer. Called to set preDrawContainer */ struct bbiFile *bbiFile; /* Associated bbiFile for bigWig or bigBed. */ int bedSize; /* Number of fields if a bed file. */ boolean isBigBed; /* If a bed, is it a bigBed? */ boolean isRemoteSql; /* Is using a remote mySQL connection. */ char *remoteSqlHost; /* Host machine name for remote DB. */ char *remoteSqlUser; /* User name for remote DB. */ char *remoteSqlPassword; /* Password for remote DB. */ char *remoteSqlDatabase; /* Database in remote DB. */ char *remoteSqlTable; /* Table name in remote DB. */ char *otherDb; /* Other database for an axt track. */ unsigned short private; /* True(1) if private, false(0) otherwise. */ float priority; /* Tracks are drawn in priority order. */ float defaultPriority; /* Tracks are drawn in priority order. */ char *groupName; /* Name of group if any. */ struct group *group; /* Group this track is associated with. */ char *defaultGroupName; /* default Group this track is associated with. */ boolean canPack; /* Can we pack the display for this track? */ struct spaceSaver *ss; /* Layout when packed. */ struct trackDb *tdb; /*todo:change visibility, etc. to use this */ float expScale; /* What to scale expression tracks by. */ char *expTable; /* Expression table in hgFixed. */ int sourceCount; /* Number of sources for factorSource tracks. */ struct expRecord **sources; /* Array of sources */ int sourceRightPixels; /* Number of pixels to right we'll need. */ boolean exonArrows; /* Draw arrows on exons? */ boolean exonArrowsAlways; /* Draw arrows on exons even with introns showing? */ boolean nextExonButtonable; /* Use the next-exon buttons? */ boolean nextItemButtonable; /* Use the next-gene buttons? */ struct itemAttrTbl *itemAttrTbl; /* relational attributes for specific items (color) */ /* fill in left label drawing area */ Color labelColor; /* Fixed color for the track label (optional) */ void (*drawLeftLabels)(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); struct track *subtracks; /* list of subsidiary tracks that are loaded and drawn by this track. This is used for "composite" tracks, such as "mafWiggle */ struct track *parent; /* Parent track if any */ struct track *prevTrack; // if not NULL, points to track immediately above in the image. // Needed by ConditionalCenterLabel logic boolean (*nextPrevExon)(struct track *tg, struct hvGfx *hvg, void *item, int x, int y, int w, int h, boolean next); /* Function will draw the button on a track item and assign a map */ /* box to it as well, so that a click will move the browser window */ /* to the next (or previous if next==FALSE) item. This is meant to */ /* jump to parts of an item already partially in the window but is */ /* hanging off the edge... e.g. the next exon in a gene. */ void (*nextPrevItem)(struct track *tg, boolean next); /* If this function is given, it can dictate where the browser loads */ /* up based on whether a next-item button on the longLabel line of */ /* the track was pressed (as opposed to the next-item buttons on the */ /* track items themselves... see nextPrevExon() ). This is meant for */ /* going to the next/previous item currently unseen in the browser, */ /* e.g. the next gene. */ char *(*itemDataName)(struct track *tg, char *itemName); /* If not NULL, function to translated an itemName into a data name. * This is can be used for looking up sequence, CDS, etc. It is used * to support item names that have uniqueness identifiers added to deal * with multiple alignments. The resulting value should *not* be freed, * and it should be assumed that it might only remain valid for a short * period of time.*/ int loadTime; /* Time it takes to load (for performance tuning) */ int drawTime; /* Time it takes to draw (for performance tuning) */ enum enumBool remoteDataSource; /* The data for this track is from a remote source */ /* Slow retrieval means image can be rendered via an AJAX callback. */ boolean customTrack; /* Need to explicitly declare this is a custom track */ boolean syncChildVisToSelf; /* If TRUE sync visibility to of children to self. */ char *networkErrMsg; /* Network layer error message */ boolean parallelLoading; /* If loading in parallel, usually network resources. */ struct bbiSummaryElement *summary; /* for bigBed */ struct bbiSummaryElement *sumAll; /* for bigBed */ boolean drawLabelInBox; /* draw labels into the features instead of next to them */ boolean drawLabelInBoxNotDense; /* don't draw labels in dense mode, (needed only when drawLabelInBox set */ struct track *nextWindow; /* Same track in next window's track list. */ struct track *prevWindow; /* Same track in prev window's track list. */ // Fixed-width non-proportional tracks void (*nonPropDrawItemAt)(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int yOff, double scale, MgFont *font, Color color, enum trackVisibility vis); /* Draw a single Non-proportional fixed-width item. Such as gtexGene. * This is method is optional, but if it's here * then you can plug in genericDrawItems into the drawItems, * which takes care of all sorts of things including packing. */ int (*nonPropPixelWidth)(struct track *tg, void *item); /* Return the width in pixels of the non-proportional part of track, e.g. gtexGene graphic */ struct slInt *labelColumns; /* The columns in a bigBed that can be used for labels. */ boolean subTrackVisSet; /* have we calculated visibility on this subtrack */ boolean subTrackVis; /* if we calculated it, what is it */ struct lollyCartOptions *lollyCart; double squishyPackPoint; /* the value at which we switch to squish mode. */ + char * originalTrack; /* the name of the original track if this a pseduo-duplicate track used for squishyPack */ }; struct window // window in multiwindow image { struct window *next; // Next on list. // These two were experimental and will be removed soon: char *organism; /* Name of organism */ char *database; /* Name of database */ char *chromName; int winStart; // in bases int winEnd; int insideX; // in pixels int insideWidth; long virtStart; // in bases on virt chrom long virtEnd; boolean regionOdd; // window comes from odd region? or even? for window separator coloring struct track *trackList; // track list for window }; typedef void (*TrackHandler)(struct track *tg); int trackPriCmp(const void *va, const void *vb); /* Compare for sort based on priority */ boolean trackIsCompositeWithSubtracks(struct track *track); /* Temporary function until all composite tracks point to their own children */ struct trackRef /* A reference to a track. */ { struct trackRef *next; /* Next in list. */ struct track *track; /* Underlying track. */ }; struct group /* A group of related tracks. */ { struct group *next; /* Next group in list. */ char *name; /* Symbolic name. */ char *label; /* User visible name. */ float priority; /* Display order, 0 is on top. */ float defaultPriority; /* original priority before reordering */ struct trackRef *trackList; /* List of tracks. */ boolean defaultIsClosed; /* close the track group by default. */ char *errMessage; /* any error messages that came up during trackDb parsing. */ }; struct simpleFeature /* Minimal feature - just stores position in browser coordinates. */ { struct simpleFeature *next; int start, end; /* Start/end in browser coordinates. */ int qStart, qEnd; /* query start/end */ int grayIx; /* Level of gray usually. */ int codonIndex; /* 1-based codon index (ignored if 0) */ }; /* Some details of how to draw linked features. */ enum {lfSubXeno = 1}; enum {lfSubSample = 2}; enum {lfWithBarbs = 3}; /* Turn on barbs to show direction based on * strand field */ enum {lfSubChain = 4}; enum {lfNoIntronLines = 5}; /* Draw no lines between exon blocks */ enum highlightMode { highlightNone=0, highlightBackground=1, highlightOutline=2 }; struct linkedFeatures /* A linked set of features - drawn as a bunch of boxes (often exons) * connected by horizontal lines (often introns). About 75% of * the browser tracks end up as linkedFeatures. */ { struct linkedFeatures *next; int start, end; /* Start/end in browser coordinates. */ int tallStart, tallEnd; /* Start/end of fat display. */ int grayIx; /* Average of components. */ int filterColor; /* Filter color (-1 for none) */ float score; /* score for this feature */ char *name; /* Accession of query seq. Usually also the label. */ int orientation; /* Orientation. */ struct simpleFeature *components; /* List of component simple features. */ struct simpleFeature *codons; /* If zoomed to CDS or codon level.*/ boolean useItemRgb; /* If true, use rgb from item. */ void *extra; /* Extra info that varies with type. */ void *original; /* The structure that was converted into this (when needed later). */ struct itemAttr *itemAttr; /* itemAttr object for this lf, or NULL */ unsigned highlightColor; /* highlight color,0 if no highlight */ enum highlightMode highlightMode; /* highlight mode,0 if no highlight */ char* mouseOver; /* mouse over text */ char* cds; /* CDS in NCBI format */ #ifdef USE_HAL boolean isHalSnake; struct hal_target_dupe_list_t *dupeList; #endif boolean isBigGenePred; char *label; /* Label for bigBeds. */ int qSize; /* Query size for chain/bigChain */ double squishyPackVal; /* the squishyPoint value for this item. */ struct snakeInfo *snakeInfo; /* if we're in snake mode, here's the deets */ }; struct linkedFeaturesSeries /* series of linked features that are comprised of multiple linked features */ { struct linkedFeaturesSeries *next; char *name; /* name for series of linked features */ int start, end; /* Start/end in browser coordinates. */ int orientation; /* Orientation. */ int grayIx; /* Gray index (average of features) */ boolean noLine; /* if true don't draw line connecting features */ struct linkedFeatures *features; /* linked features for a series */ }; struct knownGenesExtra /* need more than 1 string in linkedFeatures extra field */ { char *hgg_prot; /* protein ID */ char *name; /* name to be used on label */ }; struct gsidSubj /* global GSID subject list */ { struct gsidSubj *next; char *subjId; }; struct gsidSeq /* global GSID sequence list */ { struct gsidSeq *next; char *seqId; char *subjId; }; struct virtRegion /* virtual chromosome structure */ { struct virtRegion *next; char *chrom; int start; int end; char strand[2]; /* + or - for strand */ }; struct virtChromRegionPos /* virtual chromosome region position*/ { long virtPos; struct virtRegion *virtRegion; }; struct positionMatch /* virtual chroom position that matches or overlaps search query chrom,start,end */ { struct positionMatch *next; long virtStart; long virtEnd; }; /* mouseOver business declared in hgTracks.c */ extern boolean enableMouseOver; extern struct tempName *mouseOverJsonFile; extern struct jsonWrite *mouseOverJson; struct wigMouseOver { struct wigMouseOver *next; int x1; /* beginning of a rectangle for this value */ int x2; /* end of the rectangle */ double value; /* data value for this region */ int valueCount; /* number of data values in this rectangle */ }; extern struct virtRegion *virtRegionList; extern struct virtChromRegionPos *virtChrom; // Array extern int virtRegionCount; extern long virtWinStart; // start of virtual window in bases extern long virtWinEnd; // end of virtual window in bases extern long defaultVirtWinStart; // default start of virtual window in bases extern long defaultVirtWinEnd; // default end of virtual window in bases extern long virtWinBaseCount; /* Number of bases in windows, also virtWinEnd - virtWinStart. */ extern long virtSeqBaseCount; // all bases in virt chrom //extern char *virtPosition; /* Name of virtual position. TODO Remove? */ extern char *virtChromName; /* Name of virtual chrom */ extern boolean virtMode; /* Are we in virtual chrom mode? */ extern boolean virtChromChanged; /* Has the virtChrom changed? */ extern boolean emAltHighlight; /* Highlight alternativing regions in virt view? */ extern int emPadding; /* # bases padding for exon-mostly regions */ extern int gmPadding; /* # bases padding for gene-mostly regions */ extern char *emGeneTable; /* Gene table to use for exon mostly */ extern struct track *emGeneTrack; /* Track for gene table for exon mostly */ extern struct rgbColor vertWindowSeparatorColor; /* color for vertical windows separator */ extern char *multiRegionsBedUrl; /* URL to bed regions list */ // is genome RNA? extern boolean genomeIsRna; // demo2 extern int demo2NumWindows; extern int demo2WindowSize; extern int demo2StepSize; // singleTrans (single transcript) extern char *singleTransId; // singleAltHaplos (one alternate haplotype) extern char *singleAltHaploId; extern char *virtModeType; /* virtual chrom mode type */ extern char *lastVirtModeType; extern char *virtModeShortDescr; /* short description of virt mode */ extern char *virtModeExtraState; /* Other settings that affect the virtMode state such as padding or some parameter */ extern char *lastVirtModeExtraState; extern struct cart *lastDbPosCart; /* store settings for use in lastDbPos and hgTracks.js setupHistory */ extern char *excludeVars[]; extern struct trackLayout tl; extern struct jsonElement *jsonForClient; /* multiple windows */ extern struct window *windows; // list of windows in image extern struct window *currentWindow; // current window extern bool trackLoadingInProgress; // flag to delay ss layout until all windows are ready. extern int fullInsideX; // full-image insideX extern int fullInsideWidth; // full-image insideWidth extern struct cart *cart; /* The cart where we keep persistent variables. */ extern struct hash *oldVars; /* List of vars from previous cart. */ extern struct track *trackList; /* List of all tracks. */ extern struct hash *trackHash; /* Hash of the tracks by their name. */ extern char *chromName; /* Name of chromosome sequence . */ extern char *displayChromName; /* Name of chromosome sequence to display . */ extern char *database; /* Name of database we're using. */ extern char *organism; /* Name of organism we're working on. */ extern char *browserName; /* Test or public browser */ extern char *organization; /* UCSC or MGC */ extern int winStart; /* Start of window in sequence. */ extern int winEnd; /* End of window in sequence. */ extern int maxItemsInFullTrack; /* Maximum number of items displayed in full */ extern char *position; /* Name of position. */ extern int gfxBorder; /* Width of graphics border. */ extern int insideWidth; /* Width of area to draw tracks in in pixels. */ extern int insideX; /* Start of area to draw track in in pixels. */ extern int leftLabelX; /* Start of area to draw left labels on. */ extern int leftLabelWidth; /* Width of area to draw left labels on. */ extern boolean withLeftLabels; /* Display left labels? */ extern boolean withCenterLabels; /* Display center labels? */ extern boolean withGuidelines; /* Display guidelines? */ extern boolean withNextExonArrows; /* Display next exon navigation buttons near center labels? */ extern boolean withExonNumbers; /* Display exon and intron numbers in mouseOver instead of item name */ extern struct hvGfx *hvgSide; // An extra pointer to side label image that can be built if needed extern int seqBaseCount; /* Number of bases in sequence. */ extern int winBaseCount; /* Number of bases in window. */ extern float basesPerPixel; /* bases covered by a pixel; a measure of zoom */ extern boolean zoomedToBaseLevel; /* TRUE if zoomed so we can draw bases. */ extern boolean zoomedToCodonLevel; /* TRUE if zoomed so we can print codon text in genePreds*/ extern boolean zoomedToCodonNumberLevel; /* TRUE if zoomed so we can print codons and exon number text in genePreds*/ extern boolean zoomedToCdsColorLevel; /* TRUE if zoomed so we cancolor each codon*/ extern char *ctFileName; /* Custom track file. */ extern struct customTrack *ctList; /* Custom tracks. */ extern struct slName *browserLines; /* Custom track "browser" lines. */ extern int rulerMode; /* on, off, full */ extern boolean withLeftLabels; /* Display left labels? */ extern boolean withCenterLabels; /* Display center labels? */ extern boolean withPriorityOverride; /* enable track reordering? */ extern boolean revCmplDisp; /* reverse-complement display */ extern boolean measureTiming; /* Flip this on to display timing * stats on each track at bottom of page. */ extern struct hash *hgFindMatches; /* The matches found by hgFind that should be highlighted. */ extern int maxShade; /* Highest shade in a color gradient. */ extern Color shadesOfGray[10+1]; /* 10 shades of gray from white to black * Red is put at end to alert overflow. */ extern Color shadesOfBrown[10+1]; /* 10 shades of brown from tan to tar. */ extern struct rgbColor guidelineColor; extern struct rgbColor multiRegionAltColor; extern struct rgbColor undefinedYellowColor; extern Color darkGreenColor; extern Color shadesOfSea[10+1]; /* Ten sea shades. */ /* 16 shades from black to fully saturated of red/green/blue for * expression data. */ #define EXPR_DATA_SHADES 16 extern Color shadesOfGreen[EXPR_DATA_SHADES]; extern Color shadesOfRed[EXPR_DATA_SHADES]; extern Color shadesOfBlue[EXPR_DATA_SHADES]; extern Color shadesOfYellow[EXPR_DATA_SHADES]; extern Color shadesOfGreenOnWhite[EXPR_DATA_SHADES]; extern Color shadesOfRedOnWhite[EXPR_DATA_SHADES]; extern Color shadesOfBlueOnWhite[EXPR_DATA_SHADES]; extern Color shadesOfYellowOnWhite[EXPR_DATA_SHADES]; extern Color shadesOfRedOnYellow[EXPR_DATA_SHADES]; extern Color shadesOfBlueOnYellow[EXPR_DATA_SHADES]; extern boolean chromosomeColorsMade; /* Have the 3 shades of 8 chromosome colors been allocated? */ extern boolean doPliColors; /* Put up the color legend for the gnomAD pLI track */ extern boolean exprBedColorsMade; /* Have the shades of Green, Red, and Blue been allocated? */ extern int maxRGBShade; extern int colorLookup[256]; /* Common to variation.c and rnaPLFoldtrack.c */ extern boolean trackImgOnly; /* caller wants just the track image and track table html */ /* used in MAF display */ #define UNALIGNED_SEQ 'o' #define MAF_DOUBLE_GAP '=' void abbr(char *s, char *fluff); /* Cut out fluff from s. */ struct track *getTrackList(struct group **pGroupList, int vis); /* Return list of all tracks, organizing by groups. * If vis is -1, restore default groups to tracks. * Shared by hgTracks and configure page. */ void groupTrackListAddSuper(struct cart *cart, struct group *group, struct hash *superHash); /* Construct a new track list that includes supertracks, sort by priority, * and determine if supertracks have visible members. * Replace the group track list with this new list. * Shared by hgTracks and configure page to expand track list, * in contexts where no track display functions (which don't understand * supertracks) are invoked. */ void removeTrackFromGroup(struct track *track); /* Remove track from group it is part of. */ struct sqlConnection *remoteTrackConnection(struct track *tg); /* Get a connection to remote database as specified in remoteSql settings... */ int orientFromChar(char c); /* Return 1 or -1 in place of + or - */ enum trackVisibility limitVisibility(struct track *tg); /* Return default visibility limited by number of items. */ char *hgcNameAndSettings(); /* Return path to hgc with variables to store UI settings. */ void mapBoxHc(struct hvGfx *hvg, int start, int end, int x, int y, int width, int height, char *group, char *item, char *statusLine); /* Print out image map rectangle that would invoke the htc (human track click) * program. */ void mapBoxReinvoke(struct hvGfx *hvg, int x, int y, int width, int height, struct track *track, boolean toggle, char *chrom, long start, long end, char *message, char *extra); /* Print out image map rectangle that would invoke this program again. * If track is non-NULL then put that track's id in the map item. * if toggle is true, then toggle track between full and dense. * If chrom is non-null then jump to chrom:start-end. * Add extra string to the URL if it's not NULL */ void mapBoxToggleVis(struct hvGfx *hvg, int x, int y, int width, int height, struct track *curGroup); /* Print out image map rectangle that would invoke this program again. * program with the current track expanded. */ void mapBoxJumpTo(struct hvGfx *hvg, int x, int y, int width, int height, struct track *toggleGroup, char *newChrom, long newStart, long newEnd, char *message); /* Print out image map rectangle that would invoke this program again * at a different window. */ void mapBoxHgcOrHgGene(struct hvGfx *hvg, int start, int end, int x, int y, int width, int height, char *track, char *item, char *statusLine, char *directUrl, boolean withHguid, char *extra); /* Print out image map rectangle that would invoke the hgc (human genome click) * program. */ void genericMapItem(struct track *tg, struct hvGfx *hvg, void *item, char *itemName, char *mapItemName, int start, int end, int x, int y, int width, int height); /* This is meant to be used by genericDrawItems to set to tg->mapItem in */ /* case tg->mapItem isn't set to anything already. */ void mapStatusMessage(char *format, ...) /* Write out stuff that will cause a status message to * appear when the mouse is over this box. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; double scaleForWindow(double width, int seqStart, int seqEnd); /* Return the scale for the window. */ double scaleForPixels(double pixelWidth); /* Return what you need to multiply bases by to * get to scale of pixel coordinates. */ boolean scaledBoxToPixelCoords(int chromStart, int chromEnd, double scale, int xOff, int *pX1, int *pX2); /* Convert chrom coordinates to pixels. Clip to window to prevent integer overflow. * For special case of a SNP insert location with width==0, set width=1. * Returns FALSE if it does not intersect the window, or if it would have a negative width. */ void drawScaledBox(struct hvGfx *hvg, int chromStart, int chromEnd, double scale, int xOff, int y, int height, Color color); /* Draw a box scaled from chromosome to window coordinates. * Get scale first with scaleForPixels. */ void drawScaledBoxLabel(struct hvGfx *hvg, int chromStart, int chromEnd, double scale, int xOff, int y, int height, Color color, MgFont *font, char *label); /* Draw a box scaled from chromosome to window coordinates and draw a label onto it. */ Color whiteIndex(); /* Return index of white. */ Color blackIndex(); /* Return index of black. */ Color grayIndex(); /* Return index of gray. */ Color lightGrayIndex(); /* Return index of light gray. */ Color veryLightGrayIndex(); /* Return index of very light gray. */ int grayInRange(int val, int minVal, int maxVal); /* Return gray shade corresponding to a number from minVal - maxVal */ int pslGrayIx(struct psl *psl, boolean isXeno, int maxShade); /* Figure out gray level for an RNA block. */ Color getSeqColor(char *name, struct hvGfx *hvg); /* Return color index corresponding to chromosome/scaffold name. */ Color darkerColor(struct hvGfx *hvg, Color color); /* Get darker shade of a color - half way between this color and black */ Color somewhatDarkerColor(struct hvGfx *hvg, Color color); /* Get a somewhat lighter shade of a color - 1/3 of the way towards black. */ Color slightlyDarkerColor(struct hvGfx *hvg, Color color); /* Get a slightly darker shade of a color - 1/4 of the way towards black. */ Color lighterColor(struct hvGfx *hvg, Color color); /* Get lighter shade of a color - half way between this color and white */ Color somewhatLighterColor(struct hvGfx *hvg, Color color); /* Get a somewhat lighter shade of a color - 1/3 of the way towards white. */ Color slightlyLighterColor(struct hvGfx *hvg, Color color); /* Get slightly lighter shade of a color - closer to gray actually */ void clippedBarbs(struct hvGfx *hvg, int x, int y, int width, int barbHeight, int barbSpacing, int barbDir, Color color, boolean needDrawMiddle); /* Draw barbed line. Clip it to fit the window first though since * some barbed lines will span almost the whole chromosome, and the * clipping at the lower level is not efficient since we added * PostScript output support. */ void innerLine(struct hvGfx *hvg, int x, int y, int w, Color color); /* Draw a horizontal line of given width minus a pixel on either * end. This pixel is needed for PostScript only, but doesn't * hurt elsewhere. */ void grayThreshold(UBYTE *pt, int count, Color *colors); /* Convert from 0-4 representation to gray scale rep. */ /* Some little functional stubs to fill in track group * function pointers with if we have nothing to do. */ void tgLoadNothing(struct track *tg); void tgDrawNothing(struct track *tg); void tgFreeNothing(struct track *tg); int tgItemNoStart(struct track *tg, void *item); int tgItemNoEnd(struct track *tg, void *item); int tgFixedItemHeight(struct track *tg, void *item); /* Return item height for fixed height track. */ int tgFixedTotalHeightOptionalOverflow(struct track *tg, enum trackVisibility vis, int lineHeight, int heightPer, boolean allowOverflow); /* Most fixed height track groups will use this to figure out the height * they use. */ int tgFixedTotalHeightNoOverflow(struct track *tg, enum trackVisibility vis); /* Most fixed height track groups will use this to figure out the height * they use. */ 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. */ void genericDrawItems(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw generic item list. Features must be fixed height * and tg->drawItemAt has to be filled in. */ void bedDrawSimpleAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis); /* Draw a single simple bed item at position. */ void bedDrawSimple(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw simple Bed items. */ typedef struct slList *(*ItemLoader)(char **row); typedef struct bed *(*bedItemLoader)(char **row); void bedLoadItemByQuery(struct track *tg, char *table, char *query, ItemLoader loader); /* Generic tg->item loader. If query is NULL use generic hRangeQuery(). */ void bedLoadItemWhere(struct track *tg, char *table, char *extraWhere, ItemLoader loader); /* Generic tg->item loader, adding extra clause to hgRangeQuery. */ void bedLoadItem(struct track *tg, char *table, ItemLoader loader); /* Generic tg->item loader. */ boolean simpleBedNextPrevEdge(struct track *tg, struct hvGfx *hvg, void *item, int x, int y, int w, int h, boolean next); /* Like linkedFeaturesNextPrevItem, but for simple bed which has no block structure so * this simply zaps us to the right/left edge of the feature. Arrows have already been * drawn; here we figure out coords and draw a mapBox. */ void loadLinkedFeaturesWithLoaders(struct track *tg, struct slList *(*itemLoader)(char **row), struct linkedFeatures *(*lfFromWhatever)(struct slList *item), char *scoreColumn, char *moreWhere, boolean (*itemFilter)(struct slList *item)); /* Make a linkedFeatures loader by providing three functions: (1) a regular */ /* item loader found in all autoSql modules, (2) a custom myStruct->linkedFeatures */ /* translating function, and (3) a function to free the thing loaded in (1). */ struct linkedFeatures *linkedFeaturesFromGenePred(struct track *tg, struct genePred *gp, boolean extra); /* construct a linkedFeatures object from a genePred */ struct linkedFeatures *bedMungToLinkedFeatures(struct bed **pBed, struct trackDb *tdb, int fieldCount, int scoreMin, int scoreMax, boolean useItemRgb); /* Convert bed to a linkedFeature, destroying bed in the process. */ struct bigBedInterval *bigBedSelectRangeExt(struct track *track, char *chrom, int start, int end, struct lm *lm, int maxItems); /* Return list of intervals in range. */ #define bigBedSelectRange(track, chrom, start, end, lm) \ bigBedSelectRangeExt(track, chrom,start, end, lm, min(BIGBEDMAXIMUMITEMS, maximumTrackItems(track))) /* Return list of intervals in range. */ void bigBedAddLinkedFeaturesFromExt(struct track *track, char *chrom, int start, int end, int scoreMin, int scoreMax, boolean useItemRgb, int fieldCount, struct linkedFeatures **pLfList, int maxItems); /* Read in items in chrom:start-end from bigBed file named in track->bbiFileName, convert * them to linkedFeatures, and add to head of list. */ #define bigBedAddLinkedFeaturesFrom(track, chrom, start, end, scoreMin, scoreMax, useItemRgb, fieldCount, pLfList) \ bigBedAddLinkedFeaturesFromExt(track, chrom, start, end, scoreMin, scoreMax, useItemRgb, fieldCount, pLfList, min(BIGBEDMAXIMUMITEMS, maximumTrackItems(track))) char *bigBedItemName(struct track *tg, void *item) ; // return label for simple beds char *bigLfItemName(struct track *tg, void *item); // return label for linked features char *makeLabel(struct track *track, struct bigBedInterval *bb); // Build a label for a bigBedTrack from the requested label fields. // boolean canDrawBigBedDense(struct track *tg); /* Return TRUE if conditions are such that can do the fast bigBed dense data fetch and * draw. */ void bigBedDrawDense(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color); /* Use big-bed summary data to quickly draw bigBed. */ void adjustBedScoreGrayLevel(struct trackDb *tdb, struct bed *bed, int scoreMin, int scoreMax); /* For each distinct trackName passed in, check cart for trackName.minGrayLevel; if * that is different from the gray level implied by scoreMin's place in [0..scoreMax], * then linearly transform bed->score from the range of [scoreMin,scoreMax] to * [(cartMinGrayLevel*scoreMax)/maxShade,scoreMax]. * Note: this assumes that scoreMin and scoreMax are constant for each track. */ struct linkedFeatures *lfFromBedExtra(struct bed *bed, int scoreMin, int scoreMax); /* Return a linked feature from a (full) bed. */ struct linkedFeatures *lfFromBed(struct bed *bed); /* Return a linked feature from a (full) bed. */ void loadSimpleBedAsLinkedFeaturesPerBase(struct track *tg); /* bed list not freed as pointer to it is stored in 'original' field */ void loadSimpleBed(struct track *tg); /* Load the items in one track - just move beds in window... */ void loadSimpleBedWithLoader(struct track *tg, bedItemLoader loader); /* Load the items in one track using specified loader - just move beds in window... */ void loadBed8(struct track *tg); /* Convert bed 8 info in window to linked feature. */ void loadBed9(struct track *tg); /* Convert bed 9 info in window to linked feature. (to handle itemRgb)*/ void loadGappedBed(struct track *tg); /* Convert bed info in window to linked feature. */ void linkedFeaturesFreeList(struct linkedFeatures **pList); /* Free up a linked features list. */ void freeLinkedFeaturesSeries(struct linkedFeaturesSeries **pList); /* Free up a linked features series list. */ int simpleFeatureCmp(const void *va, const void *vb); /* Compare to sort based on start. */ int linkedFeaturesCmpScore(const void *va, const void *vb); /* Help sort linkedFeatures by score (descending), then by starting pos. */ int linkedFeaturesCmp(const void *va, const void *vb); /* Compare to sort based on chrom,chromStart. */ int linkedFeaturesCmpName(const void *va, const void *vb); /* Help sort linkedFeatures by name. */ int linkedFeaturesCmpStart(const void *va, const void *vb); /* Help sort linkedFeatures by starting pos. */ void linkedFeaturesBoundsAndGrays(struct linkedFeatures *lf); /* Calculate beginning and end of lf from components, etc. */ int lfCalcGrayIx(struct linkedFeatures *lf); /* Calculate gray level from components. */ void linkedFeaturesDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw linked features items. */ void linkedFeaturesAverageDense(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw dense linked features items. */ void linkedFeaturesAverageDenseOrientEst(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw dense linked features items. */ void linkedFeaturesMethods(struct track *tg); /* Fill in track group methods for linked features. * Many other methods routines will call this first * to get a reasonable set of defaults. */ Color lfChromColor(struct track *tg, void *item, struct hvGfx *hvg); /* Return color of chromosome for linked feature type items * where the chromosome is listed somewhere in the lf->name. */ char *lfMapNameFromExtra(struct track *tg, void *item); /* Return map name of item from extra field. */ char *linkedFeaturesName(struct track *tg, void *item); /* Return name of item. */ int getFilterColor(char *type, int colorIx); /* Get color corresponding to type - MG_RED for "red" etc. */ void spreadBasesString(struct hvGfx *hvg, int x, int y, int width, int height, Color color, MgFont *font, char *s, int count, bool isCodon); /* Draw evenly spaced base letters in string. */ void spreadAlignString(struct hvGfx *hvg, int x, int y, int width, int height, Color color, MgFont *font, char *s, char *match, int count, bool dots, bool isCodon); /* Draw evenly spaced letters in string. For multiple alignments, * supply a non-NULL match string, and then matching letters will be colored * with the main color, mismatched letters will have alt color. * Draw a vertical bar in light yellow where sequence lacks gaps that * are in reference sequence (possible insertion) -- this is indicated * by an escaped ('/') insert count in the sequence. * If "dots" is set, matching bases are displayed as a dot. */ void spreadAlignStringProt(struct hvGfx *hvg, int x, int y, int width, int height, Color color, MgFont *font, char *s, char *match, int count, bool dots, bool isCodon, int initialColorIndex, int mafOrigOffset); /* similar to spreadAlignString, but it is used for protein sequences. */ void contigMethods(struct track *tg); /* Make track for contig */ void goldMethods(struct track *tg); /* Make track for golden path (assembly track). */ void cgapSageMethods(struct track *tg); /* Make CGAP SAGE track. */ #define CGAP_SAGE_DENSE_GOVERNOR 3000000 /* Size of browser window to dense the CGAP SAGE track at. */ void coverageMethods(struct track *tg); /* Make track for golden path positions of all frags. */ void cytoBandIdeoMethods(struct track *tg); /* Draw ideogram of chromosome. */ void cytoBandMethods(struct track *tg); /* Make track for simple repeats. */ #ifdef USE_HAL void halSnakeMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Make track group for hal-based snake alignment. */ #endif void longRangeMethods(struct track *track, struct trackDb *tdb); /* Make track group for long range connections . */ void snakeMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Make track group for chain-based snake alignment. */ void chainMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Make track group for chain alignment. */ void netMethods(struct track *tg); /* Make track group for chain/net alignment. */ void mafMethods(struct track *tg); /* Make track group for maf multiple alignment. */ void bamMethods(struct track *track); /* Methods for BAM alignment files. */ void vcfPhasedMethods(struct track *track); /* Load items from a VCF of one individuals phased genotypes */ void vcfTabixMethods(struct track *track); /* Methods for Variant Call Format compressed & indexed by tabix. */ void vcfMethods(struct track *track); /* Methods for Variant Call Format. */ void altGraphXMethods(struct track *tg); /* setup special methods for altGraphX track */ void wabaMethods(struct track *tg); /* Return track with fields shared by waba-based * alignment tracks filled in. */ void axtMethods(struct track *tg, char *otherDb); /* Make track group for axt alignments. */ void repeatMethods(struct track *tg); /* Make track for repeats. */ void affyTransfragsMethods(struct track *tg); /* Substitute a new load method that filters based on score. Also add a new itemColor() method that draws transfrags that overlap dups and pseudoGenes in a different color. */ struct repeatItem /* A repeat track item. */ { struct repeatItem *next; char *class; char *className; int yOffset; Color color; }; void pslMethods(struct track *track, struct trackDb *tdb, int argc, char *argv[]); /* Load up psl type methods. */ void loadXenoPsl(struct track *tg); /* Load a xeno psl */ void loadProteinPsl(struct track *tg); /* Load a protein psl */ struct linkedFeatures *lfFromPslx(struct psl *psl, int sizeMul, boolean isXeno, boolean nameGetsPos, struct track *tg); /* Create a linked feature item from pslx. Pass in sizeMul=1 for DNA, * sizeMul=3 for protein. * Don't free psl afterwards! (may be used by baseColor code) */ struct simpleFeature *sfFromPslX(struct psl *psl,int grayIx, int sizeMul); struct linkedFeatures *lfFromPsl(struct psl *psl, boolean isXeno); /* Create a linked feature item from psl. * Don't free psl afterwards! (may be used by baseColor code) */ struct linkedFeatures *lfFromPslsWScoresInRange(char *table, int start, int end, char *chromName, boolean isXeno, float maxScore); /* Return linked features from range of table with the scores scaled appropriately */ void ctWigLoadItems(struct track *tg); /* load custom wiggle track data */ void wigLoadItems(struct track *tg); /* load wiggle track data from database */ void wigMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Set up wig pointers and do some other precalculations on a wig type track. */ void bedGraphMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); void bigWigMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Make track group for wig - wiggle tracks. */ void mathWigMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* mathWig load and draw methods. */ void bigRmskMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Set up bigRmsk methods. */ void bigBedMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Set up bigBed methods. */ void chromGraphMethods(struct track *tg); /* Fill in chromGraph methods for built in track. */ void chromGraphMethodsCt(struct track *tg); /* Fill in chromGraph methods for custom track. */ void factorSourceMethods(struct track *track); /* Set up special methods for factorSource type tracks. */ void makeItemsMethods(struct track *track); /* Set up special methods for makeItems type tracks. */ void makeItemsJsCommand(char *command, struct track *trackList, struct hash *trackHash); /* Execute some command sent to us from the javaScript. All we know for sure is that * the first word of the command is "makeItems." We expect it to be of format: * makeItems * If it is indeed of this form then we'll create a new makeItemsItem that references this * location and stick it in the named track. */ void wigMafPMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); void wigMafMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); int wigTotalHeight(struct track *tg, enum trackVisibility vis); /* Wiggle track will use this to figure out the height they use as defined in the cart */ /* Make track for wig - wiggle tracks. */ /* Make track group for maf track with wiggle. */ void rnaSecStrMethods(struct track *tg); /* Make track which visualizes RNA secondary structure annotation. */ void sampleMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Load up methods for a generic sample type track. */ int sampleUpdateY( char *name, char *nextName, int lineHeight ); /* only increment height when name root (minus the period if * there is one) is different from previous one. *This assumes that the entries are sorted by name as they would *be if loaded by hgLoadSample*/ void samplePrintYAxisLabel( struct hvGfx *hvg, int y, struct track *track, char *labelString, double min0, double max0 ); /*print a label for a horizontal y-axis line*/ int whichSampleBin( double num, double thisMin, double thisMax, double binCount ); /* Get bin value from num. */ double whichSampleNum( double bin, double thisMin, double thisMax, double binCount ); /* gets range nums. from bin values*/ void humMusLMethods( struct track *tg ); /* Overide the humMusL load function to look for zoomed out tracks. */ void zooMethods( struct track *tg ); /* Overide the zoo sample type load function to look for zoomed out tracks. */ void expRatioMethods(struct track *tg); /* Set up methods for expRatio type tracks in general. */ void expRatioMethodsFromCt(struct track *tg); /* Set up methods for expRatio type tracks from custom track. */ void loweExpRatioMethods(struct track *tg); /* Set up methods for expRatio type tracks in general. */ void affyTranscriptomeMethods(struct track *tg); /* Overide the load function to look for zoomed out tracks. */ void rosettaMethods(struct track *tg); /* methods for Rosetta track using bed track */ void nci60Methods(struct track *tg); /* set up special methods for NCI60 track and tracks with multiple scores in general */ void affyMethods(struct track *tg); /* set up special methods for NCI60 track and tracks with multiple scores in general */ void expRatioMethodsFromDotRa(struct track *tg); /* Special methods for tracks using new microarrayGroups.ra files. */ void affyRatioMethods(struct track *tg); /* set up special methods for NCI60 track and tracks with multiple scores in general */ void affyUclaMethods(struct track *tg); /* set up special methods for affyUcla track and tracks with multiple scores in general */ void affyUclaNormMethods(struct track *tg); /* Set up special methods for the affyUcla normal tissue track scores in general */ void cghNci60Methods(struct track *tg); /* set up special methods for CGH NCI60 track */ char *getOrganism(struct sqlConnection *conn, char *acc); /* lookup the organism for an mrna, or NULL if not found. * WARNING: static return */ char *getOrganismShort(struct sqlConnection *conn, char *acc); /* lookup the organism for an mrna, or NULL if not found. This will * only return the genus, and only the first seven letters of that. * WARNING: static return */ char *getGeneName(struct sqlConnection *conn, char *acc); /* get geneName from refLink or NULL if not found. * WARNING: static return */ char *refGeneName(struct track *tg, void *item); /* Get name to use for refGene item. */ char *refGeneMapName(struct track *tg, void *item); /* Return un-abbreviated gene name. */ #define uglyh printHtmlComment /* Debugging aid. */ int linkedFeaturesSeriesCmp(const void *va, const void *vb); /* Compare to sort based on chrom,chromStart. */ void lfDrawSpecialGaps(struct linkedFeatures *lf, int intronGap, boolean chainLines, int gapFactor, struct track *tg, struct hvGfx *hvg, int xOff, int y, double scale, Color color, Color bColor, enum trackVisibility vis); /* If applicable, draw something special for the gap following this block. * If intronGap has been specified, draw exon arrows only if the target gap * length is at least intronGap. * If chainLines, draw a double-line gap if both target and query have a gap * (mismatching sequence). */ void bamWigMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Set up bamWig methods. */ void bamLinkedFeaturesDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw linked features items. */ void bamLinkedFeaturesSeriesDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw BAM linked features series items. */ void chainDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw chained features. This loads up the simple features from * the chainLink table, calls linkedFeaturesDraw, and then * frees the simple features again. */ void linkedFeaturesSeriesDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis); /* Draw linked features series items. */ struct linkedFeaturesSeries *lfsFromColoredExonBed(struct bed *bed); /* Convert a single BED 14 thing into a special linkedFeaturesSeries */ /* where each linkedFeatures is a colored block. */ void makeRedGreenShades(struct hvGfx *hvg); /* Makes some colors for the typical red/green microarray spectrum. */ void linkedFeaturesSeriesMethods(struct track *tg); void lfsMapItemName(struct track *tg, struct hvGfx *hvg, void *item, char *itemName, char *mapItemName, int start, int end, int x, int y, int width, int height); struct track *trackFromTrackDb(struct trackDb *tdb); /* Create a track based on the tdb */ int spreadStringCharWidth(int width, int count); Color getOrangeColor(); /* Return color used for insert indicators in multiple alignments */ Color getBlueColor(); Color getChromBreakBlueColor(); Color getChromBreakGreenColor(); void linkedFeaturesDrawAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis); /* Draw a single simple bed item at position. */ Color lighterColor(struct hvGfx *hvg, Color color); /* Get lighter shade of a color */ struct track *chromIdeoTrack(struct track *trackList); /* Find chromosome ideogram track */ void setRulerMode(); /* Set the rulerMode variable from cart. */ #define configHideAll "hgt_doConfigHideAll" #define configShowAll "hgt_doConfigShowAll" #define configDefaultAll "hgt_doDefaultShowAll" #define configHideAllGroups "hgt_doConfigHideAllGroups" #define configShowAllGroups "hgt_doConfigShowAllGroups" #define configHideEncodeGroups "hgt_doConfigHideEncodeGroups" #define configShowEncodeGroups "hgt_doConfigShowEncodeGroups" #define configGroupTarget "hgt_configGroupTarget" #define configPriorityOverride "hgt_priorityOverride" #define hgtJsCommand "hgt_doJsCommand" void doMiddle(struct cart *theCart); /* Print the body of html file. */ void initTl(); /* Initialize layout around small font and a picture about 800 pixels * wide. */ void setLayoutGlobals(); /* Figure out basic dimensions of display. */ struct hash *makeGlobalTrackHash(struct track *trackList); /* Create a global track hash and returns a pointer to it. */ void makeActiveImage(struct track *trackList, char *psOutput); /* Make image and image map. */ void configPage(); /* Put up configuration page. */ void configPageSetTrackVis(int vis); /* Do config page after setting track visibility. If vis is -2, then visibility * is unchanged. If -1 then set visibility to default, otherwise it should * be tvHide, tvDense, etc. */ void configMultiRegionPage(); /* Put up multi-region configuration page. */ struct track *trackNew(); /* Allocate track . */ void bedMethods(struct track *tg); /* Fill in methods for (simple) bed tracks. */ void bed9Methods(struct track *tg); /* Fill in methods for bed9 tracks. */ void complexBedMethods(struct track *track, struct trackDb *tdb, boolean isBigBed, int wordCount, char *words[]); /* Fill in methods for more complex bed tracks. */ void makeCompositeTrack(struct track *track, struct trackDb *tdb); /* Construct track subtrack list from trackDb entry. * Sets up color gradient in subtracks if requested */ void makeContainerTrack(struct track *track, struct trackDb *tdb); /* Construct track subtrack list from trackDb entry for container tracks. */ bool isSubtrackVisible(struct track *tg); /* Should this subtrack be displayed? */ void compositeTrackVis(struct track *track); /* set visibilities of subtracks */ boolean isWithCenterLabels(struct track *track); /* Special cases: inhibit center labels of subtracks in dense mode, and * of composite track in non-dense mode. * BUT if track->tdb has a centerLabelDense setting, let subtracks go with * the default and inhibit composite track center labels in all modes. * Otherwise use the global boolean withCenterLabels. */ boolean isCenterLabelConditional(struct track *track); /* Dense subtracks and pack subtracks (when centerLabelsPack off set) * show center labels depending on vis of previous track */ boolean isCenterLabelConditionallySeen(struct track *track); /* Returns FALSE if track and prevTrack have same parent, and are both conditional * i.e. dense subtrack or pack subtrack with centerLabelsPack off set */ boolean isCenterLabelsPackOff(struct track *track); /* Check for trackDb setting to suppress center labels of composite in pack mode */ boolean isCenterLabelIncluded(struct track *track); /* Center labels may be conditionally included */ boolean doHideEmptySubtracks(struct track *track, char **multiBedFile, char **subtrackIdFile); /* Suppress display of empty subtracks. Initial support only for bed's. */ Color maybeDarkerLabels(struct track *track, struct hvGfx *hvg, Color color); /* For tracks having light track display but needing a darker label */ void affyTxnPhase2Methods(struct track *track); /* Methods for dealing with a composite transcriptome tracks. */ void loadGenePred(struct track *tg); /* Convert gene pred in window to linked feature. */ void genePredAssignConfiguredName(struct track *tg); /* Set name on genePred in "extra" field to gene name, accession, or both, * depending, on UI on all items in track */ void loadGenePredWithConfiguredName(struct track *tg); /* Convert gene pred info in window to linked feature. Include name * in "extra" field (gene name, accession, or both, depending on UI) */ boolean highlightItem(struct track *tg, void *item); /* Should this item be highlighted? */ void linkedFeaturesSeriesDrawAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis); /* Draw a linked features series item at position. */ #define NEXT_ITEM_ARROW_BUFFER 1 /* Space around "next item" arrow (in pixels). */ void addWikiTrack(struct track **pGroupList); /* Add wiki track and append to group list. */ void wikiTrackMethods(struct track *tg); /* establish loadItems function for wiki track */ struct bed *wikiTrackGetBedRange(char *mapName, char *chromName, int start, int end); /* fetch wiki track items as simple bed 3 list in given range */ void addVariomeWikiTrack(struct track **pGroupList); /* Add variome wiki track and append to group list. */ void bed8To12(struct bed *bed); /* Turn a bed 8 into a bed 12 by defining one block. */ char *collapseGroupVar(char *name); /* Construct cart variable name for collapsing group */ boolean isCollapsedGroup(struct group *grp); /* Determine if group is collapsed */ void collapseGroupGoodies(boolean isOpen, boolean wantSmallImage, char **img, char **indicator, char **otherState); /* Get image, char representation of image, and 'otherState' (1 or 0) * for a group, based on whether it is collapsed, and whether we want * larger or smaller image for collapse box */ void parseSs(char *ss, char **retPsl, char **retFa); /* Parse out ss variable into components. */ boolean ssFilesExist(char *ss); /* Return TRUE if both files in ss exist. */ int maximumTrackItems(struct track *tg); /* Return the maximum number of items allowed in track. */ int maximumTrackHeight(struct track *tg); /* Return the maximum track height allowed in pixels. */ struct dyString *uiStateUrlPart(struct track *toggleGroup); /* Return a string that contains all the UI state in CGI var * format. If toggleGroup is non-null the visibility of that * track will be toggled in the string. */ boolean nextItemCompatible(struct track *tg); /* Check to see if we draw nextPrev item buttons on a track. */ void linkedFeaturesLabelNextPrevItem(struct track *tg, boolean next); /* Default next-gene function for linkedFeatures. Changes winStart/winEnd * and updates position in cart. */ void createHgFindMatchHash(); /* Read from the cart the string assocated with matches and put the matching items into a hash for highlighting later. */ TrackHandler lookupTrackHandlerClosestToHome(struct trackDb *tdb); /* Lookup handler for track of give name. Try parents if * subtrack has a NULL handler. Return NULL if none. */ void registerTrackHandlers(); /* Register tracks that include some non-standard methods. */ void initColors(struct hvGfx *hvg); /* Initialize the shades of gray etc. */ void findTrackColors(struct hvGfx *hvg, struct track *trackList); /* Find colors to draw in. */ char *getItemDataName(struct track *tg, char *itemName); /* Translate an itemName to its itemDataName, using tg->itemDataName if is not * NULL. The resulting value should *not* be freed, and it should be assumed * that it will only remain valid until the next call of this function.*/ void registerTrackHandler(char *name, TrackHandler handler); /* Register a track handling function. */ void doSearchTracks(struct group *groupList); boolean superTrackHasVisibleMembers(struct trackDb *tdb); enum trackVisibility limitedVisFromComposite(struct track *subtrack); /* returns the subtrack visibility which may be limited by composite with multi-view dropdowns. */ INLINE enum trackVisibility actualVisibility(struct track *track) // return actual visibility for this track (limited to limitedVis if appropriate) { return track->limitedVisSet ? track->limitedVis : track->visibility; } char *getScoreFilterClause(struct cart *cart,struct trackDb *tdb,char *scoreColumn); // Returns "score >= ..." extra where clause if one is needed /* useful for declaring small arrays */ #define SMALLBUF 128 #define LARGEBUF 256 /* and for dyStringNew */ #define SMALLDYBUF 64 char *trackUrl(char *mapName, char *chromName); /* Return hgTrackUi url; chromName is optional. */ void bedDetailCtMethods (struct track *tg, struct customTrack *ct); /* Load bedDetail track from custom tracks as bed or linked features */ void pgSnpMethods (struct track *tg); /* Personal Genome SNPs: show two alleles with stacked color bars for base alleles and * (if available) allele counts in mouseover. */ int pgSnpHeight(struct track *tg, enum trackVisibility vis); void pgSnpCtMethods (struct track *tg); /* Load pgSnp track from custom tracks */ void pgSnpMapItem(struct track *tg, struct hvGfx *hvg, void *item, char *itemName, char *mapItemName, int start, int end, int x, int y, int width, int height); /* create a special map box item with different pop-up statusLine with allele counts */ void gvfMethods(struct track *tg); /* Load GVF variant data. */ void gtexGeneMethods(struct track *tg); /* Gene-Tissue Expression (GTEX) gene track*/ void messageLineMethods(struct track *track); /* Methods for drawing a single-height message line instead of track items, * e.g. if source was compiled without a necessary library. */ void rmskJoinedMethods(struct track *track); /* construct track for detailed repeat visualization */ void lrgMethods(struct track *tg); /* Locus Reference Genomic (bigBed 12 +) handlers. */ void peptideAtlasMethods(struct track *tg); /* PeptideAtlas (bed 12+) handlers */ void barChartMethods(struct track *tg); /* Bar Chart track type: draw fixed width chart of colored bars over a BED item */ void barChartCtMethods(struct track *tg); /* Bar Chart track methods for custom track */ void gtexEqtlClusterMethods(struct track *tg); /* GTEx eQTL Cluster (bigBed 5 +) tracks */ void gtexEqtlTissueMethods(struct track *tg); /* Install handler for GTEx eQTL Tissues track */ void lollyMethods(struct track *track, struct trackDb *tdb, int wordCount, char *words[]); /* Lollipop track type methods */ void interactMethods(struct track *tg); /* Interact track type methods */ void interactCtMethods(struct track *tg); /* Interact track methods for custom track */ void hicMethods(struct track *tg); /* Methods for Hi-C interaction data */ void hicCtMethods(struct track *tg); /* Hi-C track methods for custom track */ void parentChildCartCleanup(struct track *trackList,struct cart *newCart,struct hash *oldVars); /* When composite/view settings changes, remove subtrack specific vis When superTrackChild is found and selected, shape superTrack to match. */ void dontLoadItems(struct track *tg); /* No-op loadItems when we aren't going to try. */ void filterItems(struct track *tg, boolean (*filter)(struct track *tg, void *item), char *filterType); /* Filter out items from track->itemList. */ int gCmpPriority(const void *va, const void *vb); /* Compare groups based on priority. */ int tgCmpPriority(const void *va, const void *vb); /* Compare to sort based on priority; use shortLabel as secondary sort key. */ void printMenuBar(); /* Put up the menu bar. */ boolean winTooBigDoWiggle(struct cart *cart, struct track *tg); /* return true if we wiggle because the window size exceeds a certain threshold */ boolean checkIfWiggling(struct cart *cart, struct track *tg); /* Check to see if a track should be drawing as a wiggle. */ boolean isTypeBedLike(struct track *track); /* Check if track type is BED-like packable thing (but not rmsk or joinedRmsk) */ boolean isTypeUseItemNameAsKey(struct track *track); /* Check if track type is like expRatio and key is just item name. */ boolean isTypeUseMapItemNameAsKey(struct track *track); /* Check if track type is like interact and uses map item name to link across multi regions */ void setEMGeneTrack(); /* Find the track for the gene table to use for exonMostly and geneMostly. */ void findBestEMGeneTable(struct track *trackList); /* Find the best gene table to use for exonMostly */ struct window *makeWindowListFromVirtChrom(long virtWinStart, long virtWinEnd); /* make list of windows from virtual position on virtualChrom */ struct convertRange { struct convertRange *next; char *chrom; int start; int end; long vStart; long vEnd; boolean found; boolean skipIt; }; void linkedFeaturesNextPrevExonFind(struct track *tg, boolean next, struct convertRange *crList); /* Find next-exon function for linkedFeatures. Finds corresponding position on virtual chrom for new winStart/winEnd of exon non-virt position, * and returns it. This function was cloned from linkedFeaturesLabelNextPrevItem and modified. */ boolean virtualSingleChrom(); /* Return TRUE if using virtual single chromosome mode */ void parseVPosition(char *position, char **pChrom, long *pStart, long *pEnd); /* parse Virt position */ char *undisguisePosition(char *position); // UN-DISGUISE VMODE /* Find the virt position * position should be real chrom span. * Limitation: can only convert things in the current windows set. */ char *disguisePositionVirtSingleChrom(char *position); // DISGUISE VMODE /* Hide the virt position, convert to real single chrom span. * position should be virt chrom span. * Can handle anything in the virt single chrom. */ #define measureTime uglyTime #define SUPPORT_CONTENT_TYPE 1 struct bbiFile *fetchBbiForTrack(struct track *track); /* Fetch bbiFile from track, opening it if it is not already open. */ void genericDrawNextItem(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, Color color, enum trackVisibility vis); /* Draw next item buttons and map boxes */ struct spaceSaver *findSpaceSaver(struct track *tg, enum trackVisibility vis); /* Find SpaceSaver in list. Return spaceSaver found or NULL. */ void labelTrackAsFilteredNumber(struct track *tg, unsigned numOut); /* add text to track long label to indicate filter is active and how many items were deleted */ void labelTrackAsFiltered(struct track *tg); /* add text to track long label to indicate filter is active */ void labelTrackAsHideEmpty(struct track *tg); /* add text to track long label to indicate empty subtracks are hidden */ void labelTrackAsDensity(struct track *tg); /* Add text to track long label to indicate density mode */ void labelTrackAsDensityWindowSize(struct track *tg); /* Add text to track long label to indicate density mode because window size exceeds some threshold */ void setupHotkeys(boolean gotExtTools); /* setup keyboard shortcuts and a help dialog for it */ void calcWiggleOrdering(struct cart *cart, struct flatTracks *flatTracks); void bedPlusLabelDrawAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis); /* Draw a single bed item at position. If vis is full, draw the associated label to the left * of the item. */ Color blackItemNameColor(struct track *tg, void *item, struct hvGfx *hvg); /* Force item name (label) color to black */ void linkedFeaturesMapItem(struct track *tg, struct hvGfx *hvg, void *item, char *itemName, char *mapItemName, int start, int end, int x, int y, int width, int height); boolean recTrackSetsEnabled(); /* Return TRUE if feature is available */ boolean recTrackSetsChangeDetectEnabled(); /* Return TRUE if feature is available, in hgConf */ int recTrackSetsForDb(); /* Return number of recommended track sets for this database */ boolean hasRecTrackSet(struct cart *cart); /* Check if currently loaded session is in the recommended track set */ void printRecTrackSets(); /* Create dialog with list of recommended track sets */ Color colorFromSoTerm(enum soTerm term); /* Assign a Color according to soTerm: red for non-synonymous, green for synonymous, blue for * UTR/noncoding, black otherwise. */ void maybeNewFonts(struct hvGfx *hvg); /* Check to see if we want to use the alternate font engine (FreeType2). */ #endif /* HGTRACKS_H */