static void encodePeakDrawAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis) /* Draw the peak from the linkedFeature. Currently this doesn't draw any */ /* sorta shading based on the signalValue/pValue. */ { struct linkedFeatures *lf = item; int heightPer = tg->heightPer; int shortOff = heightPer/4; int shortHeight = heightPer - 2*shortOff; Color rangeColor = shadesOfGray[lf->grayIx]; Color peakColor = (tg->ixColor != blackIndex()) ? tg->ixColor : getOrangeColor();; if (lf->components) { struct simpleFeature *sf; drawScaledBox(hvg, lf->start, lf->end, scale, xOff, y+(heightPer/2), 1, rangeColor); for (sf = lf->components; sf != NULL; sf = sf->next) drawScaledBox(hvg, sf->start, sf->end, scale, xOff, y+shortOff, shortHeight, rangeColor); } else drawScaledBox(hvg, lf->start, lf->end, scale, xOff, y+shortOff, shortHeight, rangeColor); if ((lf->tallEnd > 0) && (lf->tallStart < lf->end)) drawScaledBox(hvg, lf->tallStart, lf->tallEnd, scale, xOff, y, heightPer, peakColor); }
void tigrOperonDrawAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis) /* Draw the operon at position. */ { struct linkedFeatures *lf = item; struct simpleFeature *sf; int heightPer = tg->heightPer; int x1,x2; int s, e; Color *shades = tg->colorShades; int midY = y + (heightPer>>1); int w; color = tg->ixColor; x1 = round((double)((int)lf->start-winStart)*scale) + xOff; x2 = round((double)((int)lf->end-winStart)*scale) + xOff; w = x2-x1; innerLine(hvg, x1, midY, w, color); if (vis == tvFull || vis == tvPack) clippedBarbs(hvg, x1, midY, w, 2, 5, lf->orientation, color, FALSE); for (sf = lf->components; sf != NULL; sf = sf->next) { s = sf->start; e = sf->end; /* shade ORF (exon) based on the grayIx value of the sf */ color = shades[sf->grayIx]; drawScaledBox(hvg, s, e, scale, xOff, y, heightPer, color ); } }
static void wiggleLinkedFeaturesDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis) /* Currently this routine is adapted from Terry's * linkedFeatureSeriesDraw() routine. * It is called for 'sample' tracks as specified in the trackDb.ra. * and it looks at the cart to decide whether to interpolate, fill blocks, * and use anti-aliasing.*/ { int i; struct linkedFeatures *lf; struct simpleFeature *sf; int y = yOff; int heightPer = tg->heightPer; int lineHeight = tg->lineHeight; int x1,x2; boolean isFull = (vis == tvFull); Color bColor = tg->ixAltColor; double scale = scaleForPixels(width); int prevX = -1; int gapPrevX = -1; double prevY = -1; double y1 = -1, y2; int ybase; int sampleX, sampleY; /* A sample in sample coordinates. * Sample X coordinate is chromosome coordinate. * Sample Y coordinate is usually 0-1000 */ int binCount = 1.0/tg->scaleRange; /* Maximum sample Y coordinate. */ int bin; /* Sample Y coordinates are first converted to * bin coordinates, and then to pixels. I'm not * totally sure why. */ int currentX, currentXEnd, currentWidth; int leftSide, rightSide; int noZoom = 1; enum wiggleOptEnum wiggleType; char *interpolate = NULL; char *aa = NULL; boolean antiAlias = FALSE; int fill; int lineGapSize; double min0, max0; char o1[128]; /* Option 1 - linear interp */ char o2[128]; /* Option 2 - anti alias */ char o3[128]; /* Option 3 - fill */ char o4[128]; /* Option 4 - minimum vertical range cutoff of plot */ char o5[128]; /* Option 5 - maximum vertical range cutoff of plot */ char o6[128]; /* Option 6 - max gap where interpolation is still done */ char cartStr[64]; char *fillStr; double hFactor; double minRange, maxRange; double minRangeCutoff, maxRangeCutoff; Color gridColor = hvGfxFindRgb(hvg, &guidelineColor); /* for horizontal lines*/ lf=tg->items; if(lf==NULL) return; //take care of cart options safef( o1, 128,"%s.linear.interp", tg->track); safef( o2, 128, "%s.anti.alias", tg->track); safef( o3, 128,"%s.fill", tg->track); safef( o4, 128,"%s.min.cutoff", tg->track); safef( o5, 128,"%s.max.cutoff", tg->track); safef( o6, 128,"%s.interp.gap", tg->track); interpolate = cartUsualString(cart, o1, "Linear Interpolation"); wiggleType = wiggleStringToEnum(interpolate); aa = cartUsualString(cart, o2, "on"); antiAlias = sameString(aa, "on"); //don't fill gcPercent track by default (but fill others) if(sameString( tg->table, "pGC") && sameString(database,"zooHuman3")) { fillStr = cartUsualString(cart, o3, "0"); } else { fillStr = cartUsualString(cart, o3, "1"); } fill = atoi(fillStr); cartSetString(cart, o3, fillStr ); //the 0.1 is so the label doesn't get truncated with integer valued user input min //display range. minRangeCutoff = max( atof(cartUsualString(cart,o4,"0.0"))-0.1, tg->minRange ); maxRangeCutoff = min( atof(cartUsualString(cart,o5,"1000.0"))+0.1, tg->maxRange); lineGapSize = atoi(cartUsualString(cart, o6, "200")); //update cart settings to reflect truncated range cutoff values cartSetString( cart, "win", "F" ); safef( cartStr, 64, "%g", minRangeCutoff ); cartSetString( cart, o4, cartStr ); safef( cartStr, 64, "%g", maxRangeCutoff ); cartSetString( cart, o5, cartStr ); heightPer = tg->heightPer+1; hFactor = (double)heightPer*tg->scaleRange; //errAbort( "min=%g, max=%g\n", minRangeCutoff, maxRangeCutoff ); if( sameString( tg->table, "zoo" ) || sameString( tg->table, "zooNew" ) ) binCount = binCount - 100; //save some space at top, between each zoo species minRange = whichSampleBin( minRangeCutoff, tg->minRange, tg->maxRange, binCount ); maxRange = whichSampleBin( maxRangeCutoff, tg->minRange, tg->maxRange, binCount ); //errAbort( "(%g,%g) cutoff=(%g,%g)\n", tg->minRange, tg->maxRange, minRangeCutoff, maxRangeCutoff ); if( sameString( tg->table, "zoo" ) || sameString( tg->table, "zooNew" ) ) { /*Always interpolate zoo track (since gaps are explicitly defined*/ lineGapSize = -1; } else if( tg->minRange == 0 && tg->maxRange == 8 ) //range for all L-score tracks { if( isFull ) { min0 = whichSampleNum( minRange, tg->minRange, tg->maxRange, binCount ); max0 = whichSampleNum( maxRange, tg->minRange, tg->maxRange, binCount ); for( i=1; i<=6; i++ ) drawWiggleHorizontalLine(hvg, (double)i, min0, max0, binCount, y, hFactor, heightPer, gridColor ); } } for(lf = tg->items; lf != NULL; lf = lf->next) { gapPrevX = -1; prevX = -1; ybase = (int)((double)y+hFactor+(double)heightPer); for (sf = lf->components; sf != NULL; sf = sf->next) { sampleX = sf->start; sampleY = sf->end - sampleX; // Stange encoding but so it is. // It is to deal with the fact that // for a BED: sf->end = sf->start + length // but in our case length = height (or y-value) // so to recover height we take // height = sf->end - sf->start. // Otherwise another sf variable would // be needed. /*mapping or sequencing gap*/ if (sampleY == 0) { bin = -whichSampleBin( (int)((maxRange - minRange)/5.0+minRange), minRange, maxRange, binCount ); y1 = (int)((double)y+((double)bin)* hFactor+(double)heightPer); if( gapPrevX >= 0 ) drawScaledBox(hvg, sampleX, gapPrevX, scale, xOff, (int)y1, (int)(.10*heightPer), shadesOfGray[2]); gapPrevX = sampleX; prevX = -1; /*connect next point with gray bar too*/ continue; } if (sampleY > maxRange) sampleY = maxRange; if (sampleY < minRange) sampleY = minRange; bin = -whichSampleBin( sampleY, minRange, maxRange, binCount ); x1 = round((double)(sampleX-winStart)*scale) + xOff; y1 = (int)((double)y+((double)bin)* hFactor+(double)heightPer); if (prevX > 0) { y2 = prevY; x2 = round((double)(prevX-winStart)*scale) + xOff; if( wiggleType == wiggleLinearInterpolation ) /*connect samples*/ { if( lineGapSize < 0 || prevX - sampleX <= lineGapSize ) /*don't interpolate over large gaps*/ { if (fill) hvGfxFillUnder(hvg, x1,y1, x2,y2, ybase, bColor); else hvGfxLine(hvg, x1,y1, x2,y2, color); } } } //if( x1 < 0 || x1 > tl.picWidth ) //printf("x1 = %d, sampleX=%d, winStart = %d\n<br>", x1, sampleX, winStart ); if( x1 >= 0 && x1 <= tl.picWidth ) { /* Draw the points themselves*/ drawScaledBox(hvg, sampleX, sampleX+1, scale, xOff, (int)y1-1, 3, color); if( fill ) drawScaledBox(hvg, sampleX, sampleX+1, scale, xOff, (int)y1+2, ybase-y1-2, bColor); } prevX = gapPrevX = sampleX; prevY = y1; } leftSide = max( tg->itemStart(tg,lf), winStart ); rightSide = min( tg->itemEnd(tg,lf), winEnd ); currentX = round((double)((int)leftSide-winStart)*scale) + xOff; currentXEnd = round((double)((int)rightSide-winStart)*scale) + xOff; currentWidth = currentXEnd - currentX; if( noZoom && isFull ) { fprintf(stderr, "mapBoxHc(id: %s;) in wiggleLinkedFeatures\n", tg->track); mapBoxHc(hvg, lf->start, lf->end, currentX ,y, currentWidth, heightPer, tg->track, tg->mapItemName(tg, lf), tg->itemName(tg, lf)); if( lf->next != NULL ) y += sampleUpdateY( lf->name, lf->next->name, lineHeight ); else y += lineHeight; } } }
static void goldDrawDense(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis) /* Draw golden path items. */ { int baseWidth = seqEnd - seqStart; struct agpFrag *frag; struct agpGap *gap; int y = yOff; int heightPer = tg->heightPer; int lineHeight = tg->lineHeight; int x1,x2,w; int midLineOff = heightPer/2; boolean isFull = (vis == tvFull); Color brown = color; Color gold = tg->ixAltColor; Color pink = 0; Color pink1 = hvGfxFindColorIx(hvg, 240, 140, 140); Color pink2 = hvGfxFindColorIx(hvg, 240, 100, 100); int ix = 0; double scale = scaleForPixels(width); /* Draw gaps if any. */ if (!isFull) { int midY = y + midLineOff; for (gap = tg->customPt; gap != NULL; gap = gap->next) { if (!sameWord(gap->bridge, "no")) { drawScaledBox(hvg, gap->chromStart, gap->chromEnd, scale, xOff, midY, 1, brown); } } } for (frag = tg->items; frag != NULL; frag = frag->next) { x1 = round((double)((int)frag->chromStart-winStart)*scale) + xOff; x2 = round((double)((int)frag->chromEnd-winStart)*scale) + xOff; w = x2-x1; color = ((ix&1) ? gold : brown); pink = ((ix&1) ? pink1 : pink2); if (w < 1) w = 1; if (sameString(frag->type, "A")) color = pink; hvGfxBox(hvg, x1, y, w, heightPer, color); if (isFull) y += lineHeight; else if (baseWidth < 10000000) { char status[256]; sprintf(status, "%s:%d-%d %s %s:%d-%d", frag->frag, frag->fragStart, frag->fragEnd, frag->strand, frag->chrom, frag->chromStart, frag->chromEnd); mapBoxHc(hvg, frag->chromStart, frag->chromEnd, x1,y,w,heightPer, tg->track, frag->frag, status); } ++ix; } }
static void altGraphXDrawAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int yOff, double scale, MgFont *font, Color color, enum trackVisibility vis) /* Draw an altGraphX at the specified location. */ { int i = 0; int s =0, e=0; int heightPer = tg->heightPer; int start = 0, end = 0; struct altGraphX *ag = item; int width = 0; int x1, x2; /* Create a link to hgc. */ if(tg->mapsSelf && tg->mapItem) { char name[256]; int nameWidth = 0; int textX = 0; start = max(winStart, ag->tStart); end = min(winEnd, ag->tEnd); width = (end - start) * scale; x1 = round((double)((int) start - winStart)*scale) + xOff; textX = x1; if(width == 0) width = 1; /* If there isn't enough room on before the left edge snap the label to the left edge. */ if(withLeftLabels && tg->limitedVis == tvPack) { safef(name, sizeof(name), "%s", tg->itemName(tg, ag)); nameWidth = mgFontStringWidth(font, name); textX = textX - (nameWidth + tl.nWidth/2); if(textX < insideX) textX = insideX - nameWidth; width = width + (x1 - textX); } tg->mapItem(tg, hvg, ag, "notUsed", "notUsed", ag->tStart, ag->tEnd, textX, yOff, width, heightPer); } /* Draw the edges (exons and introns). */ for(i= 0; i < ag->edgeCount; i++) { Color color2; s = ag->vPositions[ag->edgeStarts[i]]; e = ag->vPositions[ag->edgeEnds[i]]; color2 = MG_BLACK; /* If you want to shade by number of transcripts uncomment next line. */ /* color2 = altGraphXColorForEdge(hvg, ag, i); */ if(isExon(ag, i)) { if(vis == tvPack) drawScaledBox(hvg, s, e, scale, xOff, yOff+heightPer/2, heightPer/2, color2); else drawScaledBox(hvg, s, e, scale, xOff, yOff, heightPer, color2); } else { int midX; s = ag->vPositions[ag->edgeStarts[i]]; e = ag->vPositions[ag->edgeEnds[i]]; x1 = round((double)((int) s - winStart)*scale) + xOff; x2 = round((double)((int) e - winStart)*scale) + xOff; if(vis == tvPack) { midX = (x1+x2)/2; hvGfxLine(hvg, x1, yOff+heightPer/2, midX, yOff, color2); hvGfxLine(hvg, midX, yOff, x2, yOff+heightPer/2, color2); } else hvGfxLine(hvg, x1, yOff+heightPer/2, x2, yOff+heightPer/2, color2); } } }