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