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