/* * HiddenNucleotides.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 nucleotides with hidden state(s) * * @author Alexei Drummond * @version $Id: HiddenNucleotides.java,v 1.4 2005/05/24 20:25:56 rambaut Exp $ */ @Deprecated public class OldHiddenNucleotides extends DataType { public static final String DESCRIPTION = "hiddenNucleotide"; public static final OldHiddenNucleotides INSTANCE = new OldHiddenNucleotides(2); public OldHiddenNucleotides(int numHiddenStates) { hiddenClassCount = numHiddenStates; stateCount = 4 * hiddenClassCount; ambiguousStateCount = stateCount + 6; } @Override public char[] getValidChars() { return null; } /** * Get state corresponding to a character * * @param c character * @return state */ public int getState(char c) { switch (c) { case'A': case'a': return stateCount; case'C': case'c': return stateCount + 1; case'G': case'g': return stateCount + 2; case'T': case't': case'U': case'u': return stateCount + 3; case'-': case'?': return getGapState(); default: { int state = (int) c - '0'; if (c > '?') state -= 1; if (c > 'A') state -= 1; if (c > 'C') state -= 1; if (c > 'G') state -= 1; if (c > 'T') state -= 1; if (c > 'U') state -= 1; if (c > 'a') state -= 1; if (c > 'g') state -= 1; if (c > 'c') state -= 1; if (c > 't') state -= 1; if (c > 'u') state -= 1; return state; } } } /** * Get character corresponding to a given state * * @param state state * <p/> * return corresponding character */ public char getChar(int state) { if (state >= stateCount) { switch (state - stateCount) { case 0: return 'A'; case 1: return 'C'; case 2: return 'G'; case 3: return 'T'; default: return '-'; } } else { char c = (char) (state + '0'); if (c >= '?') c += 1; if (c >= 'A') c += 1; if (c >= 'C') c += 1; if (c >= 'G') c += 1; if (c >= 'T') c += 1; if (c >= 'U') c += 1; if (c >= 'a') c += 1; if (c >= 'g') c += 1; if (c >= 'c') c += 1; if (c >= 't') c += 1; if (c >= 'u') c += 1; return c; } } public int[] getStates(int state) { if (state >= stateCount && state <= stateCount + 3) { int[] states = new int[hiddenClassCount]; for (int i = 0; i < hiddenClassCount; i++) { states[i] = state % 4 + (i * 4); } return states; } else throw new IllegalArgumentException(); } /** * returns an array containing the non-ambiguous states that this state represents. */ public boolean[] getStateSet(int state) { boolean[] stateSet = new boolean[stateCount]; for (int i = 0; i < stateCount; i++) { stateSet[i] = false; } if (!isAmbiguousState(state)) { stateSet[state] = true; } else if (state < (stateCount + 4)) { for (int i = 0; i < stateCount; i++) { if ((i % 4) == (state % 4)) { stateSet[i] = true; } } } else { for (int i = 0; i < stateCount; i++) { stateSet[i] = true; } } return stateSet; } /** * Get state corresponding to an unknown * * @return state */ public int getUnknownState() { return stateCount + 4; } /** * Get state corresponding to a gap * * @return state */ public int getGapState() { return stateCount + 5; } /** * @return true if this character is an ambiguous state */ public boolean isAmbiguousChar(char c) { return isAmbiguousState(getState(c)); } /** * @return true if this character is a gap */ public boolean isUnknownChar(char c) { return isUnknownState(getState(c)); } /** * @return true if this character is a gap */ public boolean isGapChar(char c) { return isGapState(getState(c)); } /** * returns true if this state is an ambiguous state. */ public boolean isAmbiguousState(int state) { return (state >= stateCount); } /** * @return true if this state is an unknown state */ public boolean isUnknownState(int state) { return (state == getUnknownState()); } /** * @return true if this state is a gap */ public boolean isGapState(int state) { return (state == getGapState()); } public int getType() { return 999; } public String getDescription() { return "Hidden-state Nucleotides"; } private int hiddenClassCount; public int getHiddenClassCount() { return hiddenClassCount; } }