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