c47b72480a741cb22f2d0b0d9f0bff9b3dd8809a jcasper Fri Mar 17 09:51:58 2023 -0700 Updating a couple of other minor locations to better reflect transparency code, refs #30569 diff --git src/hg/utils/bedMergeOverlappingBlocks/bedMergeOverlappingBlocks.c src/hg/utils/bedMergeOverlappingBlocks/bedMergeOverlappingBlocks.c index 557f387..2847145 100644 --- src/hg/utils/bedMergeOverlappingBlocks/bedMergeOverlappingBlocks.c +++ src/hg/utils/bedMergeOverlappingBlocks/bedMergeOverlappingBlocks.c @@ -1,142 +1,142 @@ /* bedMergeOverlappingBlocks - Fix faulty BED 12 files with illegal overlapping blocks. Also reports a summary of the changes.. */ /* Copyright (C) 2011 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "jksql.h" #include "bed.h" #include "rangeTree.h" void usage() /* Explain usage and exit. */ { errAbort( "bedMergeOverlappingBlocks - Fix faulty BED 12 files with illegal overlapping blocks.\n" "usage:\n" " bedMergeOverlappingBlocks in.bed out.bed\n" "options:\n" " -report=summary.txt log problems in a file\n" ); } static struct optionSpec options[] = { {"report", OPTION_STRING}, {NULL, 0}, }; void sortAndMergeBlocks(struct bed *oneBed) /* construct a range tree out of blocks, then remake blocks arrays */ /* this should automatically merge everything. */ { struct rbTree *rt = rangeTreeNew(); struct range *rangeList = NULL; struct range *oneRange; int i; for (i = 0; i < oneBed->blockCount; i++) { rangeTreeAdd(rt, oneBed->chromStarts[i], oneBed->chromStarts[i] + oneBed->blockSizes[i]); /* delete old (bad) blocks in bed */ oneBed->chromStarts[i] = oneBed->blockSizes[i] = 0; } rangeList = rangeTreeList(rt); oneBed->blockCount = slCount(rangeList); /* remake bed blocks out of range tree */ i = 0; for (oneRange = rangeList; oneRange != NULL; oneRange = oneRange->next) { oneBed->chromStarts[i] = oneRange->start; oneBed->blockSizes[i] = oneRange->end - oneRange->start; i++; } rangeTreeFree(&rt); } int fixBed(struct bed *oneBed, int lineNum, FILE *log) /* Change bed in place, and log change if made. Return 1 if changed. */ { int i; boolean unsorted = FALSE; boolean overlapping = FALSE; /* Check if it's sorted */ for (i = 0; i < oneBed->blockCount-1; i++) if (oneBed->chromStarts[i] >= oneBed->chromStarts[i+1]) { unsorted = TRUE; if (log) fprintf(log, "line %d: unsorted blocks detected. %d >= %d\n", lineNum, oneBed->chromStarts[i], oneBed->chromStarts[i+1]); } /* Check for overlap. */ for (i = 0; i < oneBed->blockCount-1; i++) { int endI = oneBed->chromStarts[i] + oneBed->blockSizes[i]; if (endI > oneBed->chromStarts[i+1]) { overlapping = TRUE; if (log) fprintf(log, "line %d: overlapping blocks detected. %d + %d > %d\n", lineNum, oneBed->chromStarts[i], oneBed->blockSizes[i], oneBed->chromStarts[i+1]); } } /* Go through with it only if we have to. */ if (unsorted || overlapping) { sortAndMergeBlocks(oneBed); return 1; } return 0; } void bedMergeOverlappingBlocks(char *inBed, char *outBed) /* bedMergeOverlappingBlocks - Fix faulty BED 12 files with illegal overlapping blocks. Also reports a summary of the changes.. */ { int badBeds = 0; FILE *log = NULL; FILE *newBedFile = mustOpen(outBed, "w"); char *logName = optionVal("report", NULL); struct lineFile *lf = lineFileOpen(inBed, TRUE); char *line, *row[12]; boolean isItemRgb = FALSE; if (logName) log = mustOpen(logName, "w"); while (lineFileNext(lf, &line, NULL)) { struct bed *bed; int numFields = chopByWhite(line, row, ArraySize(row)); /* strange it's reading empty lines... whatever */ if (numFields == 0) continue; if (numFields < 12) errAbort("file %s doesn't appear to be in blocked-bed format. At least 12 fields required, got %d", inBed, numFields); - if (bedParseRgb(row[8])) + if (bedParseRgb(row[8]) != -1) isItemRgb = TRUE; bed = bedLoadN(row, numFields); badBeds += fixBed(bed, lf->lineIx, log); if (isItemRgb) bedTabOutNitemRgb(bed, numFields, newBedFile); else bedTabOutN(bed, numFields, newBedFile); } lineFileClose(&lf); if (log) { fprintf(log, "Fixed %d bad beds in all.\n", badBeds); carefulClose(&log); } carefulClose(&newBedFile); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 3) usage(); bedMergeOverlappingBlocks(argv[1], argv[2]); return 0; }