package utils.nexus;
import org.apache.log4j.Logger;
public class CodonRanges{
private static final Logger logger = Logger.getLogger(CodonRanges.class);
private Ranges backend = new Ranges();
public CodonRanges() {
logger.info("new");
backend.addRange(CodonRange.newDefaultRange());
}
private CodonRanges(Ranges ranges) {
backend = ranges;
}
public int getPosVal(int pos){
CodonRange range = (CodonRange) backend.getRange(pos);
if(range != null){
return range.getPosVal(pos);
}else{
return 0;
}
}
public CodonRanges getCopy() {
Ranges copy = new Ranges();
for(Range range: backend){
CodonRange codonRange = (CodonRange) range;
copy.addRange(codonRange.getCopy());
}
return new CodonRanges(copy);
}
public void addRange(CodonRange range){
logger.info("addRange");
backend.addRange(range);
}
private boolean isBackendAnythingBut123(){
return backend.size() != 1;
}
public boolean isAnythingButDefault() {
return backend.size() != 1;
}
public void reverse(int length) {
backend.reverse(length);
}
public void removePosition(int n) {
backend.deletePosition(n);
}
public void insert(int n) {
backend.insertPosition(n);
}
public void setBackend(Ranges allRanges) {
backend = allRanges;
}
//
//
// CodonRanges
//
//
public int nucPosFromAAPos(int codonPos, int readingFrame) {
int codonOffset = 0;
int nucPos = -1;
for(Range range: backend){
CodonRange codonRange = (CodonRange) range;
if(codonRange.containsCodonPos(codonPos, codonOffset, readingFrame)){
nucPos = codonRange.getPosAtCodonPos(codonPos - codonOffset, readingFrame);
break;
}else{
codonOffset = codonOffset + codonRange.countAllCodons(readingFrame);
}
}
return nucPos;
}
public int aaPosFromNucPos(int pos, int readingFrame) {
int aaPosCount = 0;
for(Range range: backend){
CodonRange codonRange = (CodonRange) range;
if(range.contains(pos)){
aaPosCount = aaPosCount + codonRange.countCodonsUntil(pos, readingFrame);
break;
}else{
aaPosCount = aaPosCount + codonRange.countAllCodons(readingFrame);
}
}
return aaPosCount - 1; // because first pos is 0 and position is one less than count
}
public int size() {
return backend.size();
}
}