8fdcab346a8b88a6395eecbc5a4925c2572215e1 kate Mon Aug 13 16:35:29 2018 -0700 Support for source or target end offsets. refs #21109 diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c index e667d78..02b0a10 100644 --- src/hg/hgTracks/interactTrack.c +++ src/hg/hgTracks/interactTrack.c @@ -365,87 +365,96 @@ // target region unsigned t = interactRegionCenter(inter->targetStart, inter->targetEnd); int tX = getX(t, seqStart, scale, xOff); int tWidth = regionFootWidth(inter->targetStart,inter->targetEnd, scale); boolean tOnScreen = (t >= seqStart) && (t< seqEnd); boolean isReversed = (tInfo->isDirectional && t < s); int interSize = abs(t - s); int peakHeight = (tInfo->sameHeight - 15) * ((double)interSize / tInfo->maxSize) + 10; int peak = yOff + peakHeight; if (vis == tvDense) peak = yOff + tg->height; // NOTE: until time permits, force to rectangle when in reversed strand mode. + int yTarget = yOff; + int ySource = yOff; + if (tInfo->offset && draw != DRAW_ELLIPSE) + // ellipse code doesn't support assymetrical ends + { + int yOffset = tg->height/20 + 1; + if (sameString(tInfo->offset, INTERACT_OFFSET_TARGET)) + yTarget = yOff + yOffset; + else if (sameString(tInfo->offset, INTERACT_OFFSET_SOURCE)) + ySource = yOff + yOffset; + } if (sOnScreen) { // draw foot of source region (2 pixels high) - hvGfxBox(hvg, sX - sWidth, yOff, sWidth + sWidth + 1, 2, color); + hvGfxBox(hvg, sX - sWidth, ySource, sWidth + sWidth + 1, 2, color); if (vis == tvDense || !tOnScreen || draw == DRAW_LINE || hvg->rc) { // draw vertical if (isReversed) - hvGfxDottedLine(hvg, sX, yOff, sX, peak, color, TRUE); + hvGfxDottedLine(hvg, sX, ySource, sX, peak, color, TRUE); else - hvGfxLine(hvg, sX, yOff, sX, peak, color); + hvGfxLine(hvg, sX, ySource, sX, peak, color); } } - int yOffTarget = (tInfo->offset && sameString(tInfo->offset, INTERACT_OFFSET_TARGET)? - yOff + tg->height/20 + 1 : yOff); if (tOnScreen) { // draw foot of target region (2 pixels high) - hvGfxBox(hvg, tX - tWidth, yOffTarget, tWidth + tWidth + 1, 2, color); + hvGfxBox(hvg, tX - tWidth, yTarget, tWidth + tWidth + 1, 2, color); if (vis == tvDense || !sOnScreen || draw == DRAW_LINE || hvg->rc) { // draw vertical if (isReversed) - hvGfxDottedLine(hvg, tX, yOffTarget, tX, peak, color, TRUE); + hvGfxDottedLine(hvg, tX, yTarget, tX, peak, color, TRUE); else - hvGfxLine(hvg, tX, yOffTarget, tX, peak, color); + hvGfxLine(hvg, tX, yTarget, tX, peak, color); } } if (vis == tvDense) continue; // Full mode: add map boxes and draw interaction int highlightColor = MG_WHITE; int chromStart = inter->chromStart; int chromEnd = inter->chromEnd; char *nameBuf = NULL; if (sOnScreen) { // add map box to source region nameBuf = isEmptyTextField(inter->sourceName) ? statusBuf : inter->sourceName; //hvGfxBox(hvg, sX-1, yOff-1, 3, 3, peakColor); // needed ? - hvGfxBox(hvg, sX-1, yOff, 3, 2, peakColor); - hvGfxBox(hvg, sX, yOff, 1, 1, highlightColor); + hvGfxBox(hvg, sX-1, ySource, 3, 2, peakColor); + hvGfxBox(hvg, sX, ySource, 1, 1, highlightColor); mapBoxHgcOrHgGene(hvg, chromStart, chromEnd, - sX - sWidth, yOff, sWidth * 2, 4, + sX - sWidth, ySource, sWidth * 2, 4, tg->track, itemBuf, nameBuf, NULL, TRUE, NULL); } if (tOnScreen) { // add map box to target region nameBuf = isEmptyTextField(inter->targetName) ? statusBuf : inter->targetName; - //hvGfxBox(hvg, tX-1, yOffTarget-1, 3, 3, tInfo->isDirectional ? MG_MAGENTA : peakColor); - hvGfxBox(hvg, tX-1, yOffTarget, 3, 2, tInfo->isDirectional ? MG_MAGENTA : peakColor); - hvGfxBox(hvg, tX, yOffTarget, 1, 1, highlightColor); + //hvGfxBox(hvg, tX-1, yTarget-1, 3, 3, tInfo->isDirectional ? MG_MAGENTA : peakColor); + hvGfxBox(hvg, tX-1, yTarget, 3, 2, tInfo->isDirectional ? MG_MAGENTA : peakColor); + hvGfxBox(hvg, tX, yTarget, 1, 1, highlightColor); mapBoxHgcOrHgGene(hvg, chromStart, chromEnd, - //tX - tWidth, yOffTarget, tWidth * 2, 4, - tX - tWidth, yOffTarget, tWidth * 2, 3, + //tX - tWidth, yTarget, tWidth * 2, 4, + tX - tWidth, yTarget, tWidth * 2, 3, tg->track, itemBuf, nameBuf, NULL, TRUE, NULL); } if ((s < seqStart && t < seqStart) || (s > seqEnd && t > seqEnd)) continue; // Draw interaction and map boxes int lowerX = 0, upperX = 0; if (s < t) { lowerX = sOnScreen ? sX : xOff; upperX = tOnScreen ? tX : xOff + width; } else { lowerX = tOnScreen ? tX : xOff; @@ -462,46 +471,47 @@ // map box on mid-point of horizontal line int xMap = lowerX + (double)(upperX-lowerX)/2; int yMap = peak-1; hvGfxBox(hvg, xMap-1, peak-1, 3, 3, peakColor); hvGfxBox(hvg, xMap, peak, 1, 1, highlightColor); mapBoxHgcOrHgGene(hvg, chromStart, chromEnd, xMap-1, yMap-1, 3, 3, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); continue; } // Draw curves if (draw == DRAW_CURVE) { int peakX = ((upperX - lowerX + 1) / 2) + lowerX; int peakY = peak + 30; // admittedly a hack (obscure how to define ypeak of curve) int maxY = hvGfxCurve(hvg, lowerX, - (isReversed ? yOffTarget : yOff), peakX, peakY, upperX, - (isReversed ? yOff : yOffTarget), color, isReversed); + (isReversed ? yTarget : ySource), peakX, peakY, upperX, + (isReversed ? ySource : yTarget), color, isReversed); // curve drawer does not use peakY as expected, so it returns actual max Y used // draw map box on peak hvGfxBox(hvg, peakX-1, maxY-1, 3, 3, peakColor); hvGfxBox(hvg, peakX, maxY, 1, 1, highlightColor); mapBoxHgcOrHgGene(hvg, chromStart, chromEnd, peakX-1, maxY-1, 3, 3, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); } else if (draw == DRAW_ELLIPSE) { - int yLeft = yOffTarget + peakHeight; - int yTop = yOffTarget - peakHeight; + // can not support offsets + int yLeft = yOff + peakHeight; + int yTop = yOff - peakHeight; hvGfxEllipseDraw(hvg, lowerX, yLeft, upperX, yTop, color, ELLIPSE_BOTTOM, isReversed); // draw map box on peak - int maxY = peakHeight + yOffTarget; + int maxY = peakHeight + yOff; int peakX = ((upperX - lowerX + 1) / 2) + lowerX; hvGfxBox(hvg, peakX-1, maxY-1, 3, 3, peakColor); hvGfxBox(hvg, peakX, maxY, 1, 1, highlightColor); mapBoxHgcOrHgGene(hvg, chromStart, chromEnd, peakX-1, maxY-1, 3, 3, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); } } } void interactDrawLeftLabels(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) /* Override default */ {