/*
* SimpleGenome.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.evolution.wrightfisher;
import dr.evolution.datatype.GeneticCode;
public class SimpleGenome implements Genome {
public SimpleGenome(int size, FitnessFunction fitnessFunction, boolean initializeToFittest) {
this.sequence = new byte[size];
if (initializeToFittest) fitnessFunction.initializeToFittest(sequence);
this.fitness = 1.0;
this.parent = null;
}
private SimpleGenome(byte[] sequence, double fitness, Genome parent, Mutation[] mutations) {
this.sequence = sequence;
this.fitness = fitness;
this.parent = parent;
this.mutations = mutations;
}
public Genome replicate(Mutator mutator, FitnessFunction fitnessFunction) {
byte[] childSequence = new byte[sequence.length];
Mutation[] mutations = mutator.mutate(sequence, childSequence);
double newFitness = fitnessFunction.getFitness(childSequence);
return new SimpleGenome(childSequence, newFitness, this, mutations);
}
public byte[] getSequence() {
return sequence;
}
public int hammingDistance(Genome other) {
int distance = 0;
byte[] otherSequence = other.getSequence();
for (int i = 0; i < sequence.length; i++) {
if (sequence[i] != otherSequence[i]) distance += 1;
}
return distance;
}
public String getDNASequenceString() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < sequence.length; i++) {
switch (sequence[i]) {
case 0: buffer.append('A'); break;
case 1: buffer.append('C'); break;
case 2: buffer.append('G'); break;
case 3: buffer.append('T'); break;
default: buffer.append('N'); break;
}
}
return buffer.toString();
}
public String getAminoAcidSequenceString() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < sequence.length; i+=3) {
int codonState = (sequence[i] * 16) + (sequence[i+1] * 4) + sequence[i+2];
//int codonState = codons.getState(sequence[i], sequence[i+1], sequence[i+2]);
char aminoAcid = GeneticCode.UNIVERSAL.getAminoAcidChar(codonState);
buffer.append(aminoAcid);
}
return buffer.toString();
}
public final void mark() {
marks += 1;
if (parent != null) parent.mark();
}
public final void unmark() {
marks = 0;
if (parent != null) parent.unmark();
}
public final int getMarks() { return marks; }
public final Genome getParent() { return parent; }
public final double getFitness() { return fitness; }
public final Mutation[] getMutations() { return mutations; }
public final int getGenomeLength() { return sequence.length; }
byte[] sequence;
double fitness;
Mutation[] mutations = null;
Genome parent;
int marks = 0;
}