4898794edd81be5285ea6e544acbedeaeb31bf78 max Tue Nov 23 08:10:57 2021 -0800 Fixing pointers to README file for license in all source code files. refs #27614 diff --git src/hg/regulate/regChromiaMergeWindows/regChromiaMergeWindows.c src/hg/regulate/regChromiaMergeWindows/regChromiaMergeWindows.c index 90dc884..ba88589 100644 --- src/hg/regulate/regChromiaMergeWindows/regChromiaMergeWindows.c +++ src/hg/regulate/regChromiaMergeWindows/regChromiaMergeWindows.c @@ -1,165 +1,165 @@ /* regChromiaMergeWindows - Merge adjacent identically labeled windows in BED file generated by * Chromia.. */ /* Copyright (C) 2011 The Regents of the University of California - * See README in this or parent directory for licensing information. */ + * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" int scoreColumn = 4; int labelColumn = 3; int maxGap = 1200; double minSumScore = 10.0; double scoreNormFactor = 10000.0; double inNoiseThreshold = 0.0; void usage() /* Explain usage and exit. */ { errAbort( "regChromiaMergeWindows - Merge adjacent identically labeled windows in BED file \n" "generated by Chromia.\n" "usage:\n" " regChromiaMergeWindows chromiaInput output.bed\n" "where chromiaInput is tab-separated with the following columns:\n" " <chrom> <start> <end> <label> <score>\n" "options:\n" " -maxGap=N - maximum number of bases between merged windows. Default %d\n" " -minSumScore=N.N - minimum sum of scores in region to output. Default %g\n" " -scoreNormFactor=N.N - normalization factor to get scores in 0-1000. Default %g\n" " -inNoiseThreshold=N.N - input lines scoring below this threshold are ignored\n" , maxGap, minSumScore, scoreNormFactor ); } static struct optionSpec options[] = { {"maxGap", OPTION_INT}, {"minSumScore", OPTION_DOUBLE}, {"scoreNormFactor", OPTION_DOUBLE}, {"inNoiseThreshold", OPTION_INT}, {NULL, 0}, }; void outputRegion(FILE *f, char *chrom, int start, int end, char *label, double sumOfScores) /* Output region to file. */ { if (sumOfScores > minSumScore) fprintf(f, "%s\t%d\t%d\t%s\t%d\n", chrom, start, end, label, round(scoreNormFactor*sumOfScores/(end-start))); } void regChromiaMergeWindows(char *input, char *output) /* regChromiaMergeWindows - Merge adjacent identically labeled windows in BED file generated * by Chromia.. */ { struct lineFile *lf = lineFileOpen(input, TRUE); char *row[32]; int rowSize = 0; FILE *f = mustOpen(output, "w"); char lastLabel[128]; lastLabel[0] = 0; char lastChrom[128]; lastChrom[0] = 0; int lastChromStart = 0, lastChromEnd = 0; int regionStart = 0, regionEnd = 0; double sumOfScores = 0.0; for (;;) { /* Get next line chopped into words. Break at end of file. Check to make sure * all lines have same number of words. */ int thisRowSize = lineFileChop(lf, row); if (thisRowSize == 0) break; if (rowSize == 0) rowSize = thisRowSize; else if (rowSize != thisRowSize) { errAbort("First line of %s has %d words, but there are %d words in line %d", lf->fileName, rowSize, thisRowSize, lf->lineIx); } /* Convert row into local variables. */ char *chrom = row[0]; int chromStart = lineFileNeedNum(lf, row, 1); int chromEnd = lineFileNeedNum(lf, row, 2); char *label = row[labelColumn]; double score = lineFileNeedDouble(lf, row, scoreColumn); /* Make sure file is sorted with no overlap.*/ if (sameString(chrom, lastChrom)) { int gapSize = chromStart - lastChromEnd; if (gapSize < 0) { if (chromStart < lastChromStart) errAbort("%s is not sorted. %s %d %d followed by %s %d %d line %d", lf->fileName, lastChrom, lastChromStart, lastChromEnd, chrom, chromStart, chromEnd, lf->lineIx); else errAbort("%s has overlaps. %s %d %d followed by %s %d %d line %d", lf->fileName, lastChrom, lastChromStart, lastChromEnd, chrom, chromStart, chromEnd, lf->lineIx); } } /* Subtract noise threshold from score, and if not still positive just ignore line. */ score -= inNoiseThreshold; if (score > 0) { /* See if we have entered a new region. */ boolean newRegion = FALSE; if (sameString(chrom, lastChrom)) { int gapSize = chromStart - lastChromEnd; if (gapSize > maxGap) newRegion = TRUE; } else newRegion = TRUE; if (!sameString(label, lastLabel)) newRegion = TRUE; /* Got new region. Output old region if any, and initialize new region. */ if (newRegion) { if (regionStart != regionEnd) outputRegion(f, lastChrom, regionStart, regionEnd, lastLabel, sumOfScores); regionStart = chromStart; sumOfScores = 0; } /* Update region. */ regionEnd = chromEnd; sumOfScores += score; /* Keep track of this row so can compare it to next row. */ safecpy(lastChrom, sizeof(lastChrom), chrom); safecpy(lastLabel, sizeof(lastLabel), label); lastChromStart = chromStart; lastChromEnd = chromEnd; } } outputRegion(f, lastChrom, regionStart, regionEnd, lastLabel, sumOfScores); carefulClose(&f); lineFileClose(&lf); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); maxGap = optionInt("maxGap", maxGap); minSumScore = optionDouble("minSumScore", minSumScore); scoreNormFactor = optionDouble("scoreNormFactor", scoreNormFactor); inNoiseThreshold = optionDouble("inNoiseThreshold", inNoiseThreshold); if (argc != 3) usage(); regChromiaMergeWindows(argv[1], argv[2]); return 0; }