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);
         }