Indel also implements Interval interface but has its quirks

git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@109 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
asivache 2009-03-20 05:11:17 +00:00
parent 501e92d441
commit 4badd54216
1 changed files with 155 additions and 0 deletions

View File

@ -0,0 +1,155 @@
package org.broadinstitute.sting.indels;
import org.broadinstitute.sting.utils.Interval;
/** This class represents an indel as an interval with respect to the <i>original</i> reference and, in addition,
* stores the indel type ( (I)nsertion or (D)eletion ) and can return meaningful event size (see below).
* Depending on the indel type, the positions on the reference are:
* <ul>
* <li> Deletion ( e.g. deletion of ACAC from the ref: ACGTT[ACAC]TTTAG to ACGTT[]TTTAG) - start and stop of
* the interval are first and last deleted bases on the original reference (those in square brackets in the
* first sequence in the example)
* <li> Insertion ( e.g. insertion of GTGT into the ref: ACGTT{}TTTAG to ACGTT{GTGT}TTTAG) - start is the first
* position on the original reference <i>after</i> the insertion site (after the '}'), and stop is the last
* position <i>before</i> the insertion site (prior to '{').
* </ul>
*
* Given these definitions, the length of the interval, as returned by getLength() has the meaning of the length of
* the event (affected bases) on the original reference: number of deleted bases for deletion and zero for insertion.
* The length of the indel itself is returned by getIndelLength(), which is equal to getLength() for deletions and to
* the actual number of inserted bases for insertions (while length on the reference, as returned by getLength() is zero).
*
* The overlaps are also meaningful with the above definitions: if an alignment to (or, in general, an interval on)
* the original reference ends prior to <code>start</code>, or starts after <code>stop</code>, it does not overlap
* with the indel event (neither spans over deleted region or contains any of the inserted bases).
*
*/
public class Indel implements Interval {
public static enum IndelType { I, D };
private long mStart;
private long mLength;
private IndelType mType;
/** Creates nBases-long indel at specified start position; the object will be unusable
* until indel type is set.
* @param start start position on the reference
* @param nBases number of inserted or deleted bases
*/
//public Indel(long start, long nBases) {
// mType=null;
// mStart=start;
// mLength=nBases;
// }
/** Creates nBases-long indel of the specified type (insertion or deletion), at specified start position.
* @param start start position on the reference
* @param nBases number of inserted or deleted bases
* @param type Indel type: I or D.
*/
public Indel(long start, long nBases, IndelType type) {
mType=type;
mStart=start;
mLength=nBases;
}
/** Start coordinate on the reference; for deletions it is the position of the first deleted base,
* for insertions it is the first base after the insertion.
* This is the "left boundary" of the event on the original reference: every alignment that ends
* befor this position on the reference does not overlap with the indel.
* @return indel's left boundary
*/
public long getStart() { return mStart; }
/** Sets start position of the interval.
*
* @param s start coordinate
*/
public void setStart(long s) { mStart = s; }
/** Indel's stop coordinate on the reference; for deletions it is the position of the last deleted base,
* for insertions it is the last base before the insertion site (which makes it equal to getStart() - 1).
* This is the "right boundary" of the event: every alignment that starts after
* this position on the reference
* does not overlap with the indel.
* @return indel's right boundary
*/
public long getStop() {
if ( mType == IndelType.I ) return mStart - 1;
else return mStart + mLength - 1;
}
/** This method is not supported in IndelInterval and will throw an exception. Use setIndelLength() instead.
*
* @param s stop coordinate
*/
public void setStop(long s) {
throw new UnsupportedOperationException("Method setStop(long) is not supported in IndelInterval");
}
/** Returns type of this indel ( I or D).
*
* @return I or D enum element
*/
public IndelType getType() { return mType; }
/** Sets the number of bases in this indel (i.e. the actual number of inserted or
* deleted bases). Stop position will be always correctly computed based on the indel length and indel type.
* @param nBases length of the indel (<i>not</i> the length of the event on the original reference!)
*/
public void setIndelLength(long nBases) { mLength = nBases; }
/** Returns actual number of inserted or deleted bases in the indel.
*
* @return number of bases (<i>not</i> the event length on the original reference).
* @see #getLength()
*/
public long getIndelLength() { return mLength; }
/**
* Returns true if this interval overlaps with i as judjed by getStart() and getStop() positions of the
* two interval objects.
*
* @param i Another interval
* @return true iff intervals overlap
*/
@Override
public boolean overlapsP(Interval i) {
return ! disjointP(i); //To change body of implemented methods use File | Settings | File Templates.
}
/**
* Returns true if this interval does not overlap with i as judjed by getStart() and getStop() positions of the
* two interval objects.
*
* @param i Another interval
* @return true iff intervals do not overlap
*/
@Override
public boolean disjointP(Interval i) {
return i.getStop() < this.getStart() || i.getStart() > this.getStop();
}
/** Returns length of the region affected by the indel on the original reference. Note that an insertion
* has length of 0.
* @return length of the event on the original, unmodified reference
*/
@Override
public long getLength() {
if ( mType == IndelType.I ) return 0;
return mLength;
}
@Override
public boolean equals(Object o) {
if ( ! ( o instanceof Indel ) ) return false;
Indel i = (Indel)o;
return this.mType == i.mType && this.mStart == i.mStart && this.mLength == i.mLength ;
}
@Override
public int hashCode() {
return (int)( mStart << 2 + mLength );
}
}