/*
* SimpleCodons.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.datatype;
/**
* Implements DataType for codons
*
* Codons have tree different representations:
* State numbers - 0-63 + 64, 65 as unknown and gap
* State chars - the above converted into chars, starting at 'A'
* and '?' + '-' for unknown and gap
* Strings or chars of three nucleotide characters
*
* @version $Id: SimpleCodons.java,v 1.1 2005/06/28 11:51:50 rambaut Exp $
*
* @author Andrew Rambaut
* @author Alexei Drummond
*/
public class SimpleCodons extends DataType {
/**
* Name of data type. For XML and human reading of data type.
*/
public static final String DESCRIPTION = "simpleCodon";
public static final int TYPE = CODONS;
public static final SimpleCodons UNIVERSAL = new SimpleCodons(GeneticCode.UNIVERSAL);
public static final SimpleCodons VERTEBRATE_MT = new SimpleCodons(GeneticCode.VERTEBRATE_MT);
public static final SimpleCodons YEAST = new SimpleCodons(GeneticCode.YEAST);
public static final SimpleCodons MOLD_PROTOZOAN_MT = new SimpleCodons(GeneticCode.MOLD_PROTOZOAN_MT);
public static final SimpleCodons MYCOPLASMA = new SimpleCodons(GeneticCode.MYCOPLASMA);
public static final SimpleCodons INVERTEBRATE_MT = new SimpleCodons(GeneticCode.INVERTEBRATE_MT);
public static final SimpleCodons CILIATE = new SimpleCodons(GeneticCode.CILIATE);
public static final SimpleCodons ECHINODERM_MT = new SimpleCodons(GeneticCode.ECHINODERM_MT);
public static final SimpleCodons EUPLOTID_NUC = new SimpleCodons(GeneticCode.EUPLOTID_NUC);
public static final SimpleCodons BACTERIAL = new SimpleCodons(GeneticCode.BACTERIAL);
public static final SimpleCodons ALT_YEAST = new SimpleCodons(GeneticCode.ALT_YEAST);
public static final SimpleCodons ASCIDIAN_MT = new SimpleCodons(GeneticCode.ASCIDIAN_MT);
public static final SimpleCodons FLATWORM_MT = new SimpleCodons(GeneticCode.FLATWORM_MT);
public static final SimpleCodons BLEPHARISMA_NUC = new SimpleCodons(GeneticCode.BLEPHARISMA_NUC);
public static final int UNKNOWN_STATE = 64;
public static final int GAP_STATE = 65;
public static final String[] CODON_TRIPLETS = {
"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG","ACT",
"AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG","ATT",
"CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG","CCT",
"CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG","CTT",
"GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG","GCT",
"GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG","GTT",
"TAA", "TAC", "TAG", "TAT", "TCA", "TCC", "TCG","TCT",
"TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG","TTT",
"???", "---"
};
/**
* Private constructor - DEFAULT_INSTANCE provides the only instance
*/
private SimpleCodons(GeneticCode geneticCode) {
this.geneticCode = geneticCode;
stateCount = 64;
ambiguousStateCount = 66;
}
@Override
public char[] getValidChars() {
return null;
}
/**
* Get state corresponding to a character
*
* @param c character
*
* @return state
*/
public final int getState(char c)
{
throw new IllegalArgumentException("Codons datatype cannot be expressed as char");
}
/**
* Get state corresponding to an unknown
*
* @return state
*/
public int getUnknownState() {
return UNKNOWN_STATE;
}
/**
* Get state corresponding to a gap
*
* @return state
*/
public int getGapState() {
return GAP_STATE;
}
/**
* Get state corresponding to a nucleotide triplet
*
* @param nuc1 the codon triplet as chars
* @param nuc2 the codon triplet as chars
* @param nuc3 the codon triplet as chars
*
* @return state
*/
public final int getState(char nuc1, char nuc2, char nuc3)
{
return getState(Nucleotides.INSTANCE.getState(nuc1),
Nucleotides.INSTANCE.getState(nuc2),
Nucleotides.INSTANCE.getState(nuc3));
}
/**
* Get state corresponding to a nucleotide triplet
*
* @param nuc1 the codon triplet as states
* @param nuc2 the codon triplet as states
* @param nuc3 the codon triplet as states
*
* @return state
*/
public final int getState(int nuc1, int nuc2, int nuc3)
{
if (Nucleotides.INSTANCE.isGapState(nuc1) ||
Nucleotides.INSTANCE.isGapState(nuc2) ||
Nucleotides.INSTANCE.isGapState(nuc3)) {
return GAP_STATE;
}
if (Nucleotides.INSTANCE.isAmbiguousState(nuc1) ||
Nucleotides.INSTANCE.isAmbiguousState(nuc2) ||
Nucleotides.INSTANCE.isAmbiguousState(nuc3)) {
return UNKNOWN_STATE;
}
return (nuc1 * 16) + (nuc2 * 4) + nuc3;
}
/**
* Get character corresponding to a given state
*
* @param state state
*
* return corresponding character
*/
public final char getChar(int state)
{
throw new IllegalArgumentException("Codons datatype cannot be expressed as char");
}
/**
* Get triplet string corresponding to a given state
*
* @param state state
*
* return corresponding triplet string
*/
public final String getTriplet(int state)
{
return CODON_TRIPLETS[state];
}
/**
* Get an array of three nucleotide states making this codon state
*
* @param state state
*
* return corresponding triplet string
*/
public final int[] getTripletStates(int state)
{
int[] triplet = new int[3];
triplet[0] = Nucleotides.INSTANCE.getState(CODON_TRIPLETS[state].charAt(0));
triplet[1] = Nucleotides.INSTANCE.getState(CODON_TRIPLETS[state].charAt(1));
triplet[2] = Nucleotides.INSTANCE.getState(CODON_TRIPLETS[state].charAt(2));
return triplet;
}
/**
* description of data type
*
* @return string describing the data type
*/
public String getDescription() {
return DESCRIPTION;
}
/**
* type of data type
*
* @return integer code for the data type
*/
public int getType() {
return TYPE;
}
/**
* @return the genetic code
*/
public GeneticCode getGeneticCode() {
return geneticCode;
}
/**
* Takes non-canonical state and returns true if it represents stop codon
* @param state
* @return true if the given state represents a stop codon
*/
public final boolean isStopCodon(int state) {
return geneticCode.isStopCodon(state);
}
// Private members
private GeneticCode geneticCode;
}