7f7b1d915bb9dd28229092ea4f2de80c3646a131
kate
  Tue Sep 18 17:17:38 2018 -0700
Additional validation for interact coords, and a tool to correct them. refs #21917

diff --git src/hg/lib/interact.c src/hg/lib/interact.c
index 78bbbcc..d054a22 100644
--- src/hg/lib/interact.c
+++ src/hg/lib/interact.c
@@ -359,15 +359,49 @@
 ret->value = sqlDouble(row[5]);
 ret->exp = cloneString(row[6]);
 ret->color = bedParseColor(row[7]);
 ret->sourceChrom = cloneString(row[8]);
 ret->sourceStart = sqlUnsigned(row[9]);
 ret->sourceEnd = sqlUnsigned(row[10]);
 ret->sourceName = cloneString(row[11]);
 ret->sourceStrand = cloneString(row[12]);
 ret->targetChrom = cloneString(row[13]);
 ret->targetStart = sqlUnsigned(row[14]);
 ret->targetEnd = sqlUnsigned(row[15]);
 ret->targetName = cloneString(row[16]);
 ret->targetStrand = cloneString(row[17]);
 return ret;
 }
+
+struct interact *interactLoadAllAndValidate(char *fileName) 
+/* Load all interact from a whitespace-separated file.
+ * Dispose of this with interactFreeList(). */
+{
+struct interact *list = NULL, *el;
+struct lineFile *lf = lineFileOpen(fileName, TRUE);
+char *row[18];
+while (lineFileRow(lf, row))
+    {
+    el = interactLoadAndValidate(row);
+    slAddHead(&list, el);
+    }
+lineFileClose(&lf);
+slReverse(&list);
+return list;
+}
+
+void interactFixRange(struct interact *inter)
+/* Set values for chromStart/chromEnd based on source and target start/ends */
+{
+int chromStart = min(inter->sourceStart, inter->targetStart);
+int chromEnd = max(inter->sourceEnd, inter->targetEnd);
+if (inter->chromStart != chromStart)
+    {
+    warn("Fixed chromStart: %d to %d. ", inter->chromStart, chromStart); 
+    inter->chromStart = chromStart;
+    }
+if (inter->chromEnd != chromEnd)
+    {
+    warn("Fixed chromEnd: %d to %d. ", inter->chromEnd, chromEnd); 
+    inter->chromEnd = chromEnd;
+    }
+}