package utils.nexus;
import java.util.ArrayList;
import org.apache.log4j.Logger;
public class CodonRange extends Range{
private static final Logger logger = Logger.getLogger(CodonRange.class);
public CodonRange(int start, int end, int startVal) {
super(start, end, startVal);
// TODO Auto-generated constructor stub
}
public CodonRange getCopy() {
return new CodonRange(start, end, startVal);
}
//
//
// CodonRange
//
//
public static CodonRange newDefaultRange() {
return new CodonRange(0, Integer.MAX_VALUE - 1000, 1); // - 1000 on MaxVal to make sure there is room for adding one or two
}
// includes partial at front and end as a position
public int countAllCodons(int readingFrame){
return countCodonsUntil(this.end, readingFrame);
}
// includes partial at front and end as a position
public int countCodonsUntil(int endPos, int readingFrame){
if(startVal == 0){
// don't bother about reading frame and startVal
int positions = end - start;
int retVal = (int) Math.ceil( (double)(endPos - start + 1) / 3 ); // +1 extra because end is inclusive
//logger.info("retVal" + retVal);
return retVal;
}
int startCorrected = getFirstFullFrameStartPos(readingFrame);
// logger.info("startCorrected");
int count = 0;
// add one orfan at start
if(start != startCorrected){
count ++;
}
count = count + (int) Math.ceil( (double)(endPos - startCorrected + 1) / 3 ); // +1 extra because end is inclusive
// logger.info("endPos=" + endPos + " count=" + count);
return count;
}
public boolean containsCodonPos(int pos, int offset, int readingFrame) {
int maxPos = offset + countAllCodons(readingFrame) - 1; // minus 1 because we start at 0
if(pos <= maxPos){
return true;
}
return false;
}
public int getPosAtCodonPos(int codonPos, int readingFrame) {
if(codonPos == 0){
return start;
}
int correctedStart = getFirstFullFrameStartPos(readingFrame);
int pos;
// add one orfan at start
if(start == correctedStart){
pos = start + codonPos * 3;
}
else{
pos = correctedStart + (codonPos - 1) * 3;
}
return pos;
}
private int getFirstFullFrameStartPos(int readingFrame) {
if(startVal == 0){
return start;
}
int startCorrected = start;
if(readingFrame - startVal != 0){
int codonStartOffset = readingFrame - startVal;
if(codonStartOffset < 0){
codonStartOffset = 3 + codonStartOffset;
}
startCorrected = start + codonStartOffset;
}
return startCorrected;
}
}