Optimized interval iteration

Using a TreedSet to manipulate getToolkit.getIntervals() and being smart about which intervals to test makes interval clipping O(1) instead of O(n).
This commit is contained in:
Mauricio Carneiro 2011-09-28 14:41:30 -04:00
parent 5c9b659c02
commit 3c7b7f74ef
1 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,56 @@
package org.broadinstitute.sting.utils;
import com.google.java.contract.Ensures;
import com.google.java.contract.Requires;
import java.util.Comparator;
/**
*
* @author Mauricio Carneiro
* @since 9/28/11
*/
public class GenomeLocComparator implements Comparator<GenomeLoc> {
/**
* compares genomeLoc's contigs
*
* @param gl1 the genome loc to compare contigs
* @param gl2 the genome loc to compare contigs
* @return 0 if equal, -1 if gl2.contig is greater, 1 if gl1.contig is greater
*/
@Requires("gl2 != null")
@Ensures("result == 0 || result == 1 || result == -1")
public final int compareContigs( GenomeLoc gl1, GenomeLoc gl2 ) {
if (gl1.contigIndex == gl2.contigIndex)
return 0;
else if (gl1.contigIndex > gl2.contigIndex)
return 1;
return -1;
}
@Requires("gl2 != null")
@Ensures("result == 0 || result == 1 || result == -1")
public int compare ( GenomeLoc gl1, GenomeLoc gl2 ) {
int result = 0;
if ( gl1 == gl2 ) {
result = 0;
}
else if(GenomeLoc.isUnmapped(gl1))
result = 1;
else if(GenomeLoc.isUnmapped(gl2))
result = -1;
else {
final int cmpContig = compareContigs(gl1, gl2);
if ( cmpContig != 0 ) {
result = cmpContig;
} else {
if ( gl1.getStart() < gl2.getStart() ) result = -1;
if ( gl1.getStart() > gl2.getStart() ) result = 1;
}
}
return result;
}
}