package aliview.alignment;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.log4j.Logger;
import aliview.GeneticCode;
import utils.nexus.CharSet;
import utils.nexus.CharSets;
import utils.nexus.CodonPos;
import utils.nexus.CodonPositions;
import utils.nexus.Excludes;
public class AlignmentMeta {
private static final Logger logger = Logger.getLogger(AlignmentMeta.class);
private Excludes excludes;
private CodonPositions codonPositions;
private CharSets charsets;
private GeneticCode geneticCode;
private boolean isTranslated;
public AlignmentMeta(){
this(GeneticCode.DEFAULT);
}
public AlignmentMeta(GeneticCode genCode){
this(new Excludes(), new CodonPositions(), new CharSets(), genCode);
}
public AlignmentMeta(Excludes excludes, CodonPositions codonPos, CharSets charsets, GeneticCode genCode) {
this.excludes = excludes;
this.codonPositions = codonPos;
this.charsets = charsets;
this.geneticCode = genCode;
}
public boolean isMetaOutputNeeded(){
boolean isMetaNeeded = false;
if(excludes.containsAnyPosition()){
isMetaNeeded = true;
}
if(codonPositions.isAnythingButDefault()){
isMetaNeeded = true;
}
if(charsets.size() > 0){
isMetaNeeded = true;
}
return isMetaNeeded;
}
public Excludes getExcludes() {
return this.excludes;
}
public CodonPositions getCodonPositions() {
return this.codonPositions;
}
public boolean isFullCodonStartingAt(int x) {
return this.codonPositions.isFullCodonStartingAt(x);
}
public void reverse(int length) {
this.getExcludes().reverse(length);
this.getCodonPositions().reverse(length);
}
public int countIncludedPositionsBefore(int minimumInteger) {
int count = 0;
for(int n = 0; n < minimumInteger; n++){
if(! this.excludes.isExcluded(n)){
count ++;
}
}
return count;
}
public void setReadingFrame(int readingFrame) {
this.codonPositions.setReadingFrame(readingFrame);
}
public boolean isExcluded(int x) {
boolean isExcluded = false;
if(isTranslated){
CodonPos codonPos = codonPositions.getCodonInTranslatedPos(x);
boolean isStartExcluded = this.excludes.isExcluded(codonPos.startPos);
boolean isEndExcluded = this.excludes.isExcluded(codonPos.endPos);
isExcluded = (isStartExcluded || isEndExcluded);
}
else{
isExcluded = this.excludes.isExcluded(x);
}
return isExcluded;
}
public int getCodonPosAt(int x) {
return codonPositions.getPosAt(x);
}
public AlignmentMeta getCopy() {
return new AlignmentMeta(excludes.getCopy(), codonPositions.getCopy(), charsets.getCopy(), this.geneticCode);
}
public ArrayList<Integer> getAllCodonPositions(int wanted, boolean removeExcluded, int startPos, int endPosInclusive) {
ArrayList<Integer> positions = codonPositions.getAllPositions(wanted, startPos, endPosInclusive);
// delete positions from list if they are excluded
if(removeExcluded){
Iterator<Integer> iter = positions.iterator();
while(iter.hasNext()){
Integer pos = iter.next();
if(isExcluded(pos.intValue())){
iter.remove();
}
}
}
return positions;
}
public void deleteFromMask(boolean[] deleteMask) {
// Null check
if(deleteMask == null || deleteMask.length == 0){
return;
}
// remove reverse
for(int n = deleteMask.length - 1; n>= 0; n--){
if(deleteMask[n] == true){
deletePosition(n);
}
}
}
public void deletePosition(int n) {
excludes.deletePosition(n);
codonPositions.deletePosition(n);
charsets.deletePosition(n);
}
public void insertPosition(int n) {
excludes.insertPosition(n);
codonPositions.insertPosition(n);
charsets.insertPosition(n);
}
public void excludePositions(int start, int end) {
for(int n = start; n <= end; n++){
this.excludes.set(n, true);
}
}
public void excludeRange(int start, int stop) {
this.excludes.addRange(start, stop);
}
public void removeExcludeRange(int start, int stop) {
this.excludes.clearRange(start, stop);
}
public boolean excludesIntersectsPositions(int start, int end) {
for(int n = start; n <= end; n++){
if(this.excludes.isExcluded(n)){
return true;
}
}
return false;
}
public CharSets getCharsets() {
return this.charsets;
}
public int[] translatePositions(int[] selection) {
return codonPositions.translatePositions(selection);
}
public int[] reTranslatePositions(int[] selection) {
return codonPositions.reTranslatePositions(selection);
}
public Rectangle reTranslatePositions(Rectangle bounds) {
return codonPositions.reTranslatePositions(bounds);
}
public GeneticCode getGeneticCode() {
return geneticCode;
}
public void setGeneticCode(GeneticCode genCode) {
this.geneticCode = genCode;
}
public void setCharsets(CharSets charsets) {
this.charsets = charsets;
}
public void setTranslation(boolean shouldTrans) {
if(shouldTrans != isTranslated){
isTranslated = shouldTrans;
}
}
}