c2c780666cf30f764fe4eb81b7fad350b0a7391a kate Thu Mar 8 15:56:39 2018 -0800 Add trackDb setting to indicate if there is a direction to the interaction (interactDirectional). refs #17512 diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c index b9c5228..e92a3ee 100644 --- src/hg/hgTracks/interactTrack.c +++ src/hg/hgTracks/interactTrack.c @@ -43,30 +43,32 @@ MgFont *font, Color color, enum trackVisibility vis) /* Draw a list of interact structures. */ { #define DRAW_LINE 0 #define DRAW_CURVE 1 #define DRAW_ELLIPSE 2 char *drawMode = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, INTERACT_DRAW, INTERACT_DRAW_DEFAULT); int draw = DRAW_LINE; if (sameString(drawMode, INTERACT_DRAW_CURVE)) draw = DRAW_CURVE; else if (sameString(drawMode, INTERACT_DRAW_ELLIPSE)) draw = DRAW_ELLIPSE; +boolean isDirectional = interactUiDirectional(tg->tdb); + double scale = scaleForWindow(width, seqStart, seqEnd); struct interact *inters = tg->items; unsigned int maxWidth = 0; struct interact *inter; char buffer[1024]; char itemBuf[2048]; safef(buffer, sizeof buffer, "%s.%s", tg->tdb->track, INTERACT_MINSCORE); // Determine if there are mixed inter and intra-chromosomal // Suppress interchromosomal labels if they overlap int nSame = 0, nOther = 0; int prevLabelEnd = 0, prevLabelStart = 0; char *prevLabel = 0; boolean doOtherLabels = TRUE; char *otherChrom = NULL; @@ -164,34 +166,36 @@ if (tg->visibility == tvDense) { height = tg->height; } else { height = otherHeight/2; yOffOther = yOff + sameHeight; } yPos = yOffOther + height; // draw the foot hvGfxLine(hvg, sx - sFootWidth, yOffOther, sx + sFootWidth, yOffOther, color); // draw the vertical - if (sameString(inter->chrom, inter->sourceChrom)) - hvGfxLine(hvg, sx, yOffOther, sx, yPos, color); - else + // TODO: modularize directional/non-directional draws + if (differentString(inter->chrom, inter->sourceChrom) && isDirectional) hvGfxDottedLine(hvg, sx, yOffOther, sx, yPos, color, TRUE); + else + hvGfxLine(hvg, sx, yOffOther, sx, yPos, color); + if (tg->visibility == tvFull) { // add map box to foot char *nameBuf = (inter->chromStart == inter->sourceStart ? inter->sourceName : inter->targetName); mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, sx - sFootWidth, yOffOther, sFootWidth * 2, 4, tg->track, itemBuf, nameBuf, NULL, TRUE, NULL); // add map box to vertical mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, sx - 2, yOffOther, 4, height, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); if (doOtherLabels) { safef(buffer, sizeof buffer, "%s", sameString(inter->chrom, inter->sourceChrom) ? @@ -212,45 +216,45 @@ boolean eOnScreen = (e >= seqStart) && (e < seqEnd); double interWidth = e - s; int peakHeight = (sameHeight - 15) * ((double)interWidth / maxWidth) + 10; int peak = yOff + peakHeight; if (tg->visibility == tvDense) peak = yOff + tg->height; if (sOnScreen) { // draw foot of lower region hvGfxLine(hvg, sx - sFootWidth, yOff, sx + sFootWidth, yOff, color); // draw vertical if (!eOnScreen || draw == DRAW_LINE) { - if (inter->chromStart == inter->targetStart) + if (inter->chromStart == inter->targetStart && isDirectional) hvGfxDottedLine(hvg, sx, yOff, sx, peak, color, TRUE); else hvGfxLine(hvg, sx, yOff, sx, peak, color); } } if (eOnScreen) { // draw foot of upper region hvGfxLine(hvg, ex - eFootWidth, yOff, ex + eFootWidth, yOff, color); // draw vertical if (!sOnScreen || draw == DRAW_LINE) { - if (inter->chromStart == inter->targetStart) + if (inter->chromStart == inter->targetStart && isDirectional) hvGfxDottedLine(hvg, ex, yOff, ex, peak, color, TRUE); else hvGfxLine(hvg, ex, yOff, ex, peak, color); } } if (tg->visibility == tvFull) { char *nameBuf = NULL; if (sOnScreen) { /* add mapbox to lower region */ nameBuf = (inter->chromStart == inter->sourceStart ? inter->sourceName : inter->targetName); mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, sx - sFootWidth, yOff, sFootWidth * 2, 4, @@ -286,31 +290,31 @@ int yTop = yOff - peakHeight; hvGfxEllipseDraw(hvg, sx, yLeft, ex, yTop, color, ELLIPSE_BOTTOM, isDashed); // map box on peak // FIXME: not working /*mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, sx - sFootWidth - 2, yOff + peakHeight, 4, 4, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); */ } } else { // draw link horizontal line between regions (dense mode just shows feet ??) unsigned ePeak = eOnScreen ? ex : xOff + width; unsigned sPeak = sOnScreen ? sx : xOff; - if (inter->sourceStart > inter->targetStart) + if (inter->sourceStart > inter->targetStart && isDirectional) hvGfxDottedLine(hvg, sPeak, peak, ePeak, peak, color, TRUE); else hvGfxLine(hvg, sPeak, peak, ePeak, peak, color); // map box on horizontal line mapBoxHgcOrHgGene(hvg, s, e, sPeak, peak-2, ePeak - sPeak, 4, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); // map boxes on verticals if (sOnScreen) mapBoxHgcOrHgGene(hvg, s, e, sx - 2, yOff, 4, peak - yOff, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL); if (eOnScreen) mapBoxHgcOrHgGene(hvg, s, e, ex - 2, yOff, 4, peak - yOff, tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);