/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ */ package org.biojava.bio.structure; import java.util.Collections; import java.util.List; import org.biojava.bio.BioError; import org.biojava.bio.symbol.Alphabet; import org.biojava.bio.symbol.AlphabetManager; import org.biojava.bio.symbol.BasisSymbol; import org.biojava.bio.symbol.DoubleAlphabet; import org.biojava.bio.symbol.IllegalAlphabetException; import org.biojava.bio.symbol.IllegalSymbolException; import org.biojava.bio.symbol.Symbol; import org.biojava.utils.ListTools; /** * AlphaCTools is a collection of static convenience methods for dealing with * Alpha Carbon Backbone Phi / Psi angles. In BioJava Phi Psi angles are represented * as Symbols from the ALPHA CARBON ANGLES alphabet. A Backbone could be represented * as a SymbolList. A Ramachandran plot might be represented as a Distribution over * Phi Psi Symbols. * * @author Mark Schreiber * @version 1.0 */ public final class AlphaCTools { /** MAX_ANGLE . */ public static final double MAX_ANGLE = 180.0; /** MIN_ANGLE . */ public static final double MIN_ANGLE = -180.0; private static String ALPHA = "ALPHA CARBON ANGLES"; private static DoubleAlphabet daInstance = DoubleAlphabet.getInstance(); /** * Returns a reference to the Alphabet that contains Symbols that represent PHI, * PSI angles. * * @return a reference to the ALPHA CARBON ANGLES alphabet */ public static Alphabet getAlphaCarbonAngleAlphabet(){ if (AlphabetManager.registered(ALPHA)) { return AlphabetManager.alphabetForName(ALPHA); } else { List l = Collections.nCopies(2, DoubleAlphabet.getInstance()); try { Alphabet a = AlphabetManager.getCrossProductAlphabet(l, ALPHA); AlphabetManager.registerAlphabet(ALPHA, a); return a; } catch (IllegalAlphabetException ex) { throw new BioError( "Cannot construct "+ALPHA+" alphabet",ex); } } } /** * Makes a Phi - Psi Symbol from the ALPHA CARBON ANGLES alphabet. * * @param phiAngle the phi angle between -180.0 and +180.0 * @param psiAngle the psi angle between -180.0 and +180.0 * @return a reference to the 'fly weight' Symbol. * @throws IllegalSymbolException if the bond angles are outside the specified range */ public static Symbol getPhiPsiSymbol(double phiAngle, double psiAngle) throws IllegalSymbolException{ if(phiAngle > MAX_ANGLE || phiAngle < MIN_ANGLE){ throw new IllegalSymbolException("Phi angle must be between -180.0 and +180.0"); } if(psiAngle > MAX_ANGLE || psiAngle < MIN_ANGLE){ throw new IllegalSymbolException("Psi angle must be between -180.0 and +180.0"); } Symbol phi = daInstance.getSymbol(phiAngle); Symbol psi = daInstance.getSymbol(psiAngle); return getAlphaCarbonAngleAlphabet().getSymbol(new ListTools.Doublet(phi, psi)); } /** * extracts the Phi angle from a Symbol. * * @param phiPsiSym a Symbol from the ALPHA CARBON ANGLES * Alphabet * @return a double between -180.0 and +180.0 * @throws IllegalSymbolException if the Symbol is not from * the ALPHA CARBON ANGLES Alphabet */ public static double getPhiAngle(Symbol phiPsiSym) throws IllegalSymbolException{ //validate the Symbol getAlphaCarbonAngleAlphabet().validate(phiPsiSym); //get the phi angle List l = ((BasisSymbol)phiPsiSym).getSymbols(); return ((DoubleAlphabet.DoubleSymbol)l.get(0)).doubleValue(); } /** * extracts the Psi angle from a Symbol. * @param phiPsiSym a Symbol from the ALPHA CARBON ANGLES * Alphabet * @return a double between -180.0 and +180.0 * @throws IllegalSymbolException if the Symbol is not from * the ALPHA CARBON ANGLES Alphabet */ public static double getPsiAngle(Symbol phiPsiSym) throws IllegalSymbolException{ //validate the Symbol getAlphaCarbonAngleAlphabet().validate(phiPsiSym); //get the phi angle List l = ((BasisSymbol)phiPsiSym).getSymbols(); return ((DoubleAlphabet.DoubleSymbol)l.get(1)).doubleValue(); } }