package org.nexml.model.impl; import java.util.HashSet; import java.util.Set; import org.nexml.model.CharacterState; import org.nexml.model.CharacterStateSet; import org.nexml.model.MolecularMatrix; import org.nexml.model.UncertainCharacterState; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * * @author pmidford * created Mar 12, 2009 * */ class MolecularCharacterStateSetImpl extends CharacterStateSetImpl{ private boolean isFilled = false; protected MolecularCharacterStateSetImpl(Document document) { super(document); } protected MolecularCharacterStateSetImpl(Document document, String type) { super(document); if ( MolecularMatrix.DNA.equals(type) ) { getDNAStateSet(); } else if ( MolecularMatrix.RNA.equals(type) ) { getRNAStateSet(); } else if ( MolecularMatrix.Protein.equals(type) ) { getProteinStateSet(); } } protected MolecularCharacterStateSetImpl(Document document,Element element) { super(document,element); } /* * (non-Javadoc) * @see org.nexml.model.impl.CharacterStateSetImpl#getCharacterStates() */ public Set<CharacterState> getCharacterStates() { return mCharacterStates; } /* * (non-Javadoc) * @see org.nexml.model.impl.CharacterStateSetImpl#setCharacterStates(java.util.Set) */ /** * @param characterStates * @throws Error Always throws an error as molecular states can not be changed. * */ public void setCharacterStates(Set<CharacterState> characterStates) { throw new Error("MolecularStates can not be set"); } /** * * @return returns the singleton DNAStateSet * * It is uninitialized, since it seems to interact better with generation of format * elements to separate generation from initialization. * This separation might not work as expected if we have multiple matrices of the * same molecular type. * TODO: Test this */ CharacterStateSet getDNAStateSet(){ if ( ! isFilled ) { fillDNAStateSet(); isFilled = true; } return this; } /** * fills the preexisting DNAStateSet. See comments above. */ private void fillDNAStateSet(){ mCharacterStates = new HashSet<CharacterState>(); // A CharacterState aState = createCharacterState("A"); getCharacterStates().add(aState); // C CharacterState cState = createCharacterState("C"); getCharacterStates().add(cState); // G CharacterState gState = createCharacterState("G"); getCharacterStates().add(gState); // T CharacterState tState = createCharacterState("T"); getCharacterStates().add(tState); // K => (G,T) Set<CharacterState> kSet = new HashSet<CharacterState>(2); kSet.add(gState); kSet.add(tState); getCharacterStates().add(createUncertainCharacterState("K", kSet)); // M => (A,C) Set<CharacterState> mSet = new HashSet<CharacterState>(2); mSet.add(aState); mSet.add(cState); getCharacterStates().add(createUncertainCharacterState("M", mSet)); // R => (A,G) Set<CharacterState> rSet = new HashSet<CharacterState>(2); rSet.add(aState); rSet.add(gState); getCharacterStates().add(createUncertainCharacterState("R", rSet)); // S => (C,G) Set<CharacterState> sSet = new HashSet<CharacterState>(2); sSet.add(cState); sSet.add(gState); getCharacterStates().add(createUncertainCharacterState("S", sSet)); // W => (A,T) Set<CharacterState> wSet = new HashSet<CharacterState>(2); wSet.add(aState); wSet.add(tState); getCharacterStates().add(createUncertainCharacterState("W", wSet)); // Y => (A,T) Set<CharacterState> ySet = new HashSet<CharacterState>(2); ySet.add(cState); ySet.add(tState); getCharacterStates().add(createUncertainCharacterState("Y",ySet)); // B => (C,G,T) Set<CharacterState> bSet = new HashSet<CharacterState>(3); bSet.add(cState); bSet.add(gState); bSet.add(tState); getCharacterStates().add(createUncertainCharacterState("B",bSet)); // D => (A,G,T) Set<CharacterState> dSet = new HashSet<CharacterState>(3); dSet.add(aState); dSet.add(gState); dSet.add(tState); getCharacterStates().add(createUncertainCharacterState("D",dSet)); // H => (A,C,T) Set<CharacterState> hSet = new HashSet<CharacterState>(3); hSet.add(aState); hSet.add(cState); hSet.add(tState); getCharacterStates().add(createUncertainCharacterState("H",dSet)); // V => (A,C,G) Set<CharacterState> vSet = new HashSet<CharacterState>(3); vSet.add(aState); vSet.add(cState); vSet.add(gState); getCharacterStates().add(createUncertainCharacterState("V",vSet)); // N => (A,C,G,T) Set<CharacterState> nSet = new HashSet<CharacterState>(4); nSet.add(aState); nSet.add(cState); nSet.add(gState); nSet.add(tState); UncertainCharacterState nState = this.createUncertainCharacterState("N",nSet); getCharacterStates().add(nState); // X => (A,C,G,T) getCharacterStates().add(createUncertainCharacterState("X",nSet)); // - => () Set <CharacterState> gapSet = new HashSet<CharacterState>(); UncertainCharacterState gapState = createUncertainCharacterState("-",gapSet); getCharacterStates().add(gapState); // ? => (A,C,G,T,-) Set <CharacterState> unKnownSet = new HashSet<CharacterState>(); unKnownSet.add(aState); unKnownSet.add(cState); unKnownSet.add(gState); unKnownSet.add(tState); unKnownSet.add(gapState); getCharacterStates().add(createUncertainCharacterState("?",unKnownSet)); } /** * * @return returns the singleton RNAStateSet * * See above comments for DNAStateSet */ CharacterStateSet getRNAStateSet(){ if ( ! isFilled ) { fillRNAStateSet(); isFilled = true; } return this; } /** * Fills the preexisting RNAStateSet * * See the comments for DNAStateSet. * @note copying from the DNAStateSet and changing T -> U, and in all the uncertain sets * seems more trouble than the cut and paste. */ private void fillRNAStateSet(){ mCharacterStates = new HashSet<CharacterState>(); // A CharacterState aState = createCharacterState("A"); getCharacterStates().add(aState); // C CharacterState cState = createCharacterState("C"); getCharacterStates().add(cState); // G CharacterState gState = createCharacterState("G"); getCharacterStates().add(gState); // U CharacterState uState = createCharacterState("U"); getCharacterStates().add(uState); // K => (G,U) Set<CharacterState> kSet = new HashSet<CharacterState>(2); kSet.add(gState); kSet.add(uState); getCharacterStates().add(createUncertainCharacterState("K", kSet)); // M => (A,C) Set<CharacterState> mSet = new HashSet<CharacterState>(2); mSet.add(aState); mSet.add(cState); getCharacterStates().add(createUncertainCharacterState("M", mSet)); // R => (A,G) Set<CharacterState> rSet = new HashSet<CharacterState>(2); rSet.add(aState); rSet.add(gState); getCharacterStates().add(createUncertainCharacterState("R", rSet)); // S => (C,G) Set<CharacterState> sSet = new HashSet<CharacterState>(2); sSet.add(cState); sSet.add(gState); getCharacterStates().add(createUncertainCharacterState("S", sSet)); // W => (A,U) Set<CharacterState> wSet = new HashSet<CharacterState>(2); wSet.add(aState); wSet.add(uState); getCharacterStates().add(createUncertainCharacterState("W", wSet)); // Y => (C,U) Set<CharacterState> ySet = new HashSet<CharacterState>(2); ySet.add(cState); ySet.add(uState); getCharacterStates().add(createUncertainCharacterState("Y",ySet)); // B => (C,G,U) Set<CharacterState> bSet = new HashSet<CharacterState>(3); bSet.add(cState); bSet.add(gState); bSet.add(uState); getCharacterStates().add(createUncertainCharacterState("B",bSet)); // D => (A,G,U) Set<CharacterState> dSet = new HashSet<CharacterState>(3); dSet.add(aState); dSet.add(gState); dSet.add(uState); getCharacterStates().add(createUncertainCharacterState("D",dSet)); // H => (A,C,U) Set<CharacterState> hSet = new HashSet<CharacterState>(3); hSet.add(aState); hSet.add(cState); hSet.add(uState); getCharacterStates().add(createUncertainCharacterState("H",dSet)); // V => (A,C,G) Set<CharacterState> vSet = new HashSet<CharacterState>(3); vSet.add(aState); vSet.add(cState); vSet.add(gState); getCharacterStates().add(createUncertainCharacterState("V",vSet)); // N => (A,C,G,U) Set<CharacterState> nSet = new HashSet<CharacterState>(4); nSet.add(aState); nSet.add(cState); nSet.add(gState); nSet.add(uState); UncertainCharacterState nState = createUncertainCharacterState("N",nSet); getCharacterStates().add(nState); // X => (A,C,G,U) getCharacterStates().add(createUncertainCharacterState("X",nSet)); // - => () Set <CharacterState> gapSet = new HashSet<CharacterState>(); UncertainCharacterState gapState = createUncertainCharacterState("-",gapSet); getCharacterStates().add(gapState); // ? => (A,C,G,U,-) Set <CharacterState> unKnownSet = new HashSet<CharacterState>(); unKnownSet.add(aState); unKnownSet.add(cState); unKnownSet.add(gState); unKnownSet.add(uState); unKnownSet.add(gapState); UncertainCharacterState unKnownState = createUncertainCharacterState("?",unKnownSet); getCharacterStates().add(unKnownState); } /** * * @return returns the singleton ProteinStateSet * * See above comments for DNAStateSet */ public CharacterStateSet getProteinStateSet(){ if ( ! isFilled ) { fillProteinStateSet(); isFilled = true; } return this; } /** * Fills the pre-existing ProteinStateSet * * See the comments for DNAStateSet. */ private void fillProteinStateSet(){ mCharacterStates = new HashSet<CharacterState>(); Set <CharacterState> xStateSet = new HashSet<CharacterState>(); // Alanine CharacterState aState = createCharacterState("A"); getCharacterStates().add(aState); xStateSet.add(aState); // Aspartic acid or asparagine CharacterState bState = createCharacterState("B"); getCharacterStates().add(bState); xStateSet.add(bState); // Cysteine CharacterState cState = createCharacterState("C"); getCharacterStates().add(cState); xStateSet.add(cState); // Aspartic acid CharacterState dState = createCharacterState("D"); getCharacterStates().add(dState); xStateSet.add(dState); // Glutamic acid CharacterState eState = createCharacterState("E"); getCharacterStates().add(eState); xStateSet.add(eState); // Phenylanine CharacterState fState = createCharacterState("F"); getCharacterStates().add(fState); xStateSet.add(fState); // Glycine CharacterState gState = createCharacterState("G"); getCharacterStates().add(gState); xStateSet.add(gState); // Histidine CharacterState hState = createCharacterState("H"); getCharacterStates().add(hState); xStateSet.add(hState); // Isoleucine CharacterState iState = createCharacterState("I"); getCharacterStates().add(iState); xStateSet.add(iState); // Lysine CharacterState kState = createCharacterState("K"); getCharacterStates().add(kState); xStateSet.add(kState); // Leucine CharacterState lState = createCharacterState("L"); getCharacterStates().add(lState); xStateSet.add(lState); // Methionine CharacterState mState = createCharacterState("M"); getCharacterStates().add(mState); xStateSet.add(mState); // Asparagine CharacterState nState = createCharacterState("N"); getCharacterStates().add(nState); xStateSet.add(nState); // Proline CharacterState pState = createCharacterState("P"); getCharacterStates().add(pState); xStateSet.add(pState); // Glutamine CharacterState qState = createCharacterState("Q"); getCharacterStates().add(qState); xStateSet.add(qState); // Arginine CharacterState rState = createCharacterState("R"); getCharacterStates().add(rState); xStateSet.add(rState); // Serine CharacterState sState = createCharacterState("S"); getCharacterStates().add(sState); xStateSet.add(sState); // Threonine CharacterState tState = createCharacterState("T"); getCharacterStates().add(tState); xStateSet.add(tState); // Selenocysteine CharacterState uState = createCharacterState("U"); getCharacterStates().add(uState); xStateSet.add(uState); // Valine CharacterState vState = createCharacterState("V"); getCharacterStates().add(vState); xStateSet.add(vState); // Tryptophan CharacterState wState = createCharacterState("W"); getCharacterStates().add(wState); xStateSet.add(wState); // Tyrosine CharacterState yState = createCharacterState("Y"); getCharacterStates().add(yState); xStateSet.add(yState); // Glutamic acid or glutamine CharacterState zState = createCharacterState("Z"); getCharacterStates().add(zState); xStateSet.add(zState); UncertainCharacterState xState = createUncertainCharacterState("X",xStateSet); getCharacterStates().add(xState); } /** * Makes working with predefined sets, (e.g. molecular) easier by allowing searching for states * @author rvos */ public CharacterState lookupCharacterStateBySymbol(String symbol){ if (symbol == null){ return null; } for (CharacterState cs : getCharacterStates()){ if (symbol.equals(cs.getSymbol())){ return cs; } } throw new Error("Symbol "+symbol+" not allowed in predefined state set"); } }