efb0bb2e165326bbe6d8c71acd9d2e81cf0dc79a kate Thu Oct 4 14:55:00 2018 -0700 Pack mode for non-directional interactions. And distingush source and target in packed mode with tall drawing. refs #21917 diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c index 2a57034..72652bb 100644 --- src/hg/hgTracks/interactTrack.c +++ src/hg/hgTracks/interactTrack.c @@ -193,33 +193,30 @@ boolean drawUp; // draw interactions with peak up (hill) boolean doOtherLabels; // true to suppress labels on other chrom items (prevent overlap) int maxSize; // longest interaction (midpoint to midpoint) in bp int fontHeight; int sameCount; // number of same chromosome interactions in window int sameHeight; // vertical space for same chromosome interactions int otherCount; // number of other chromosome interactions in window int otherHeight; // vertical space for other chromosome interactions } interactTrackInfo; static void interactGetLayoutInfo(struct track *tg, int seqStart, struct hvGfx *hvg, int xOff, MgFont *font, double scale) /* Get layout info from interact items in window */ { struct interactTrackInfo *tInfo = tg->customPt; tInfo->doOtherLabels = TRUE; -tInfo->isDirectional = interactUiDirectional(tg->tdb); -tInfo->offset = interactUiOffset(tg->tdb); -tInfo->drawUp = trackDbSettingClosestToHomeOn(tg->tdb, INTERACT_UP); char *otherChrom = NULL; int prevLabelEnd = 0, prevLabelStart = 0; char *prevLabel = 0; struct interact *inter; for (inter = (struct interact *)tg->items; inter; inter = inter->next) { otherChrom = interactOtherChrom(inter); if (otherChrom == NULL) { tInfo->sameCount++; // determine maximum interaction size, for later use laying out 'peaks' int size = interactSize(inter); if (size > tInfo->maxSize) @@ -240,36 +237,40 @@ sameString(otherChrom, prevLabel))) tInfo->doOtherLabels = FALSE; prevLabelStart = labelStart; prevLabelEnd = labelEnd; prevLabel = otherChrom; } } tInfo->fontHeight = vgGetFontPixelHeight(hvg->vg, font); tInfo->otherHeight = (tInfo->otherCount) ? 3 * tInfo->fontHeight : 0; tInfo->sameHeight = (tInfo->sameCount) ? tg->height - tInfo->otherHeight : 0; } void interactLoadItems(struct track *tg) /* Load interact items in interact format */ { +loadAndFilterItems(tg); + struct interactTrackInfo *tInfo = NULL; AllocVar(tInfo); -tInfo->clusterMode = interactUiClusterMode(cart, tg->track, tg->tdb); tg->customPt = tInfo; +tInfo->isDirectional = interactUiDirectional(tg->tdb); +tInfo->offset = interactUiOffset(tg->tdb); +tInfo->drawUp = trackDbSettingClosestToHomeOn(tg->tdb, INTERACT_UP); +tInfo->clusterMode = interactUiClusterMode(cart, tg->track, tg->tdb); -loadAndFilterItems(tg); if (tInfo->clusterMode || isLinkedFeaturesMode(tg)) { // convert to BEDs for linked feature display struct interact *inters = tg->items, *inter; struct linkedFeatures *lfs = NULL, *lf; struct hash *intersCluster = hashNew(0); boolean doColor = !tg->colorShades; for (inter = inters; inter; inter = inter->next) { if (tInfo->clusterMode) { boolean byTarget = sameString(tInfo->clusterMode, INTERACT_CLUSTER_TARGET); // hash by source or target name char *name = (byTarget ? inter->targetName : inter->sourceName); lf = (struct linkedFeatures *) hashFindVal(intersCluster, name); @@ -284,42 +285,52 @@ { inter->sourceStart = inter->targetStart = inter->chromStart; inter->sourceEnd = inter->targetEnd = inter->chromEnd; } sf->start = (byTarget ? inter->sourceStart : inter->targetStart); sf->end = (byTarget ? inter->sourceEnd : inter->targetEnd); struct simpleFeature *sfs = lf->components; slAddHead(&sfs, sf); lf->components = sfs; if (lf->filterColor != inter->color) lf->filterColor = MG_GRAY; } else { - // create a linked feature for this target + // create a linked feature for this cluster lf = interactToLf(inter, doColor); lf->orientation = 0; lf->name = (byTarget ? inter->targetName : inter->sourceName); lf->tallStart = (byTarget ? inter->targetStart : inter->sourceStart); lf->tallEnd = (byTarget ? inter->targetEnd : inter->sourceEnd); hashAdd(intersCluster, lf->name, lf); } } else { + // packed or squish mode view of single interaction (not cluster) lf = interactToLf(inter, doColor); + if (tInfo->isDirectional) + { + lf->tallStart = inter->targetStart; + lf->tallEnd = inter->targetEnd; + } + else + { + lf->orientation = 0; + } slAddHead(&lfs, lf); } } if (tInfo->clusterMode) { // sort simplefeatures and adjust bounds of clustered features struct hashEl *el, *els = hashElListHash(intersCluster); for (el = els; el; el = el->next) { lf = (struct linkedFeatures *)el->val; linkedFeaturesSortAndBound(lf); slAddHead(&lfs, lf); } slSort(&lfs, linkedFeaturesCmp); }