src/hg/bedItemOverlapCount/bedItemOverlapCount.c 1.14
1.14 2009/05/01 00:25:57 tdreszer
Fixed bug where last chr could be truncated if the previous one was smaller
Index: src/hg/bedItemOverlapCount/bedItemOverlapCount.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/bedItemOverlapCount/bedItemOverlapCount.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -b -B -U 4 -r1.13 -r1.14
--- src/hg/bedItemOverlapCount/bedItemOverlapCount.c 23 Apr 2009 00:31:12 -0000 1.13
+++ src/hg/bedItemOverlapCount/bedItemOverlapCount.c 1 May 2009 00:25:57 -0000 1.14
@@ -150,11 +150,8 @@
{
unsigned maxChromSize = 0;
int i;
unsigned short *counts = (unsigned short *)NULL;
-char *prevChrom = (char *)NULL;
-boolean outputToDo = FALSE;
-unsigned chromSize = 0;
if (chromSizes != NULL)
{
chromHash = newHash(0);
@@ -184,55 +181,49 @@
/* Reset the array to be zero to be reused */
memset((void *)counts, 0, sizeof(unsigned short)*(size_t)maxChromSize);
+unsigned chromSize = 0;
+char *prevChrom = (char *)NULL;
+boolean outputToDo = FALSE;
for (i=0; i<fileCount; ++i)
{
struct lineFile *bf = lineFileOpen(fileList[i] , TRUE);
- unsigned thisChromSize = 0;
struct bed *bed = (struct bed *)NULL;
char *row[3];
while (lineFileNextRow(bf,row,ArraySize(row)))
{
int i;
bed = bedLoadN(row, 3);
verbose(3,"#\t%s\t%d\t%d\n",bed->chrom,bed->chromStart, bed->chromEnd);
- if (prevChrom && differentWord(bed->chrom,prevChrom))
+ if (prevChrom && differentWord(bed->chrom,prevChrom)) // End a chr
{
- chromSize = chromosomeSize(prevChrom);
verbose(2,"#\tchrom %s done, size %d\n", prevChrom, chromSize);
if (outputToDo)
outputCounts(counts, prevChrom, chromSize);
outputToDo = FALSE;
memset((void *)counts, 0,
sizeof(unsigned short)*(size_t)maxChromSize); /* zero counts */
- freeMem(prevChrom);
- prevChrom = cloneString(bed->chrom);
- thisChromSize = chromosomeSize(prevChrom);
- verbose(2,"#\tchrom %s starting, size %d\n", prevChrom,
- thisChromSize);
+ freez(&prevChrom); // pointer is now NULL so it will be caught by next if!
}
- else if ((char *)NULL == prevChrom)
+ if ((char *)NULL == prevChrom) // begin a chr
{
prevChrom = cloneString(bed->chrom);
chromSize = chromosomeSize(prevChrom);
- thisChromSize = chromosomeSize(prevChrom);
- verbose(2,"#\tchrom %s starting, size %d\n", prevChrom,
- thisChromSize);
+ verbose(2,"#\tchrom %s starting, size %d\n", prevChrom,chromSize);
}
- if (bed->chromEnd > thisChromSize)
+ if (bed->chromEnd > chromSize)
{
- if (bed->chromStart >= thisChromSize || differentWord(bed->chrom,"chrM")) // circular chrom
+ if (bed->chromStart >= chromSize || differentWord(bed->chrom,"chrM")) // circular chrom
{
warn("ERROR: %s\t%d\t%d", bed->chrom, bed->chromStart,
bed->chromEnd);
- errAbort("chromEnd > chromSize ? %d > %d", bed->chromEnd,
- thisChromSize);
+ errAbort("chromEnd > chromSize ? %d > %d", bed->chromEnd,chromSize);
}
- for (i = bed->chromStart; i < thisChromSize; ++i)
+ for (i = bed->chromStart; i < chromSize; ++i)
counts[i]++;
- for (i = 0; i < (bed->chromEnd - thisChromSize); ++i)
+ for (i = 0; i < (bed->chromEnd - chromSize); ++i)
counts[i]++;
}
else
{
@@ -241,10 +232,11 @@
}
outputToDo = TRUE;
bedFree(&bed); // plug the memory leak
}
- verbose(2,"#\tchrom %s done, size %d\n", prevChrom, thisChromSize);
+ verbose(2,"#\tchrom %s done, size %d\n", prevChrom, chromSize);
lineFileClose(&bf);
+ // Note, next file could be on same chr!
}
if (outputToDo)
outputCounts(counts, prevChrom, chromSize);
}