6db4d4f2dcc485622fe4b22f33c796d708c6fdea
kate
  Mon Mar 26 16:28:35 2018 -0700
Fixes to click handling. refs #17512

diff --git src/hg/lib/interact.c src/hg/lib/interact.c
index 214adac..3590cc0 100644
--- src/hg/lib/interact.c
+++ src/hg/lib/interact.c
@@ -275,15 +275,53 @@
 struct asObject *interactAsObj()
 /* Return asObject describing fields of interact object */
 {   
 return asParseText(interactAutoSqlString);
 }   
 
 char *interactOtherChrom(struct interact *inter)
 /* Get other chromosome from an interaaction. Return NULL if same chromosome */
 {
 if (sameString(inter->sourceChrom, inter->targetChrom))
     return NULL;
 if (inter->chromStart == inter->sourceStart)
     return cloneString(inter->targetChrom);
 return cloneString(inter->sourceChrom);
 }
+
+int interactRegionCenter(int start, int end)
+/* Return genomic location of center of region */
+{
+return ((double)(end - start + .5) / 2) + start;
+}
+
+int interactRegionDistance(struct interact *inter)
+/* Return distance between region midpoints. Return -1 for other chromosome */
+{
+if (interactOtherChrom(inter))
+    return -1;
+return abs(interactRegionCenter(inter->sourceStart, inter->sourceEnd) -
+                interactRegionCenter(inter->targetStart, inter->targetEnd));
+}
+
+int interactDistanceCmp(const void *va, const void *vb)
+/* Compare based on distance between region midpoints */
+{
+struct interact *a = *((struct interact **)va);
+struct interact *b = *((struct interact **)vb);
+
+int aDist = interactRegionDistance(a);
+int bDist = interactRegionDistance(b);
+
+// cross chromosome; always larger than same chrom
+if (aDist < 0)
+    {
+    if (bDist < 0)
+        return 0;
+    return 1;
+    }
+if (bDist < 0)
+    return -1;
+
+// same chromosome
+return aDist - bDist;
+}