/* VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases. Copyright (C) 2008 Kevin Darty, Alain Denise and Yann Ponty. electronic mail : Yann.Ponty@lri.fr paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France This file is part of VARNA version 3.1. VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. VARNA version 3.1 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 General Public License for more details. You should have received a copy of the GNU General Public License along with VARNA version 3.1. If not, see http://www.gnu.org/licenses. */ package fr.orsay.lri.varna.models.rna; import java.awt.geom.Point2D; import java.util.HashMap; import javax.xml.transform.sax.TransformerHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import fr.orsay.lri.varna.utils.XMLUtils; /** * The rna base model with the first character of the nitrogenous base and it * display * * @author darty * */ public class ModeleBaseNucleotide extends ModeleBase { /** * */ private static final long serialVersionUID = -5493938366569588113L; private String _c; private int _index; public static String XML_ELEMENT_NAME = "nt"; public static String XML_VAR_CONTENT_NAME = "base"; public void toXML(TransformerHandler hd) throws SAXException { AttributesImpl atts = new AttributesImpl(); atts.addAttribute("","",XML_VAR_INDEX_NAME,"CDATA",""+_index); atts.addAttribute("","",XML_VAR_NUMBER_NAME,"CDATA",""+_realIndex); atts.addAttribute("","",XML_VAR_CUSTOM_DRAWN_NAME,"CDATA",""+_colorie); atts.addAttribute("","",XML_VAR_VALUE_NAME,"CDATA",""+_value); atts.addAttribute("","",XML_VAR_LABEL_NAME,"CDATA",""+_label); hd.startElement("","",XML_ELEMENT_NAME,atts); atts.clear(); hd.startElement("","",XML_VAR_CONTENT_NAME,atts); XMLUtils.exportCDATAString(hd, _c); hd.endElement("","",XML_VAR_CONTENT_NAME); _coords.toXML(hd,XML_VAR_POSITION_NAME); _center.toXML(hd,XML_VAR_CENTER_NAME); if (_colorie) { _styleBase.toXML(hd); } hd.endElement("","",XML_ELEMENT_NAME); } /** * Creates a new rna base with the default display style and a space as * nitrogenous base * @param index The index of this base */ public ModeleBaseNucleotide(int index) { this(" ", index); } /** * Creates a new rna base with the nitrogenous base * * @param s * The code of this base * @param index The index of this base */ public ModeleBaseNucleotide(String s, int index) { this(s, new ModelBaseStyle(), index); } /** * Creates a new rna base with the nitrogenous base * * @param s * The full label, potentially requiring further decoding * @param index The index of this base * @param baseNumber The number of this base, which may differ from the index (e.g. discontinuous numbering) */ public ModeleBaseNucleotide(String s, int index, int baseNumber) { this(s, new ModelBaseStyle(), index); _realIndex = baseNumber; } /** * Creates a new rna base with the nitrogenous base and the display style * * @param s * The full label, potentially requiring further decoding * @param msb * The display style * @param index The index of this base */ public ModeleBaseNucleotide(String s, ModelBaseStyle msb, int index) { this(new Point2D.Double(), new Point2D.Double(), true, s, msb, -1, index); } /** * Creates a new rna base with a display style * * @param msb * The display style */ public ModeleBaseNucleotide(ModelBaseStyle msb, int index, int baseNumber) { this("", msb, index); _realIndex = baseNumber; } /** * Creates a new rna base with a space as the nitrogenous base and the * display style * * @param coord * @param index */ public ModeleBaseNucleotide(Point2D.Double coord, int index) { this(new Point2D.Double(coord.getX(), coord.getY()), new Point2D.Double(), true, "", new ModelBaseStyle(), -1, index); } /** * Creates a new rna base from another one with the same attributes * * @param mb * The base to copy */ public ModeleBaseNucleotide(ModeleBaseNucleotide mb, int index) { this( new Point2D.Double(mb.getCoords().getX(), mb.getCoords() .getY()), new Point2D.Double(mb.getCenter().getX(), mb .getCenter().getY()), true, mb.getBase(), mb .getStyleBase(), mb.getElementStructure(), index); } public ModeleBaseNucleotide(Point2D.Double coords, Point2D.Double center, boolean colorie, String label, ModelBaseStyle mb, int elementStruct, int index) { _colorie = colorie; _c = label; _styleBase = mb; _coords = new VARNAPoint(coords); _center = new VARNAPoint(center); _index = index; _realIndex = index + 1; _value = 0.0; } public ModelBaseStyle getStyleBase() { if (_colorie) return _styleBase; return new ModelBaseStyle(); } public String getBase() { return decode(_c); } public void setBase(String _s) { this._c = _s; } public String getContent() { return getBase(); } public void setContent(String s) { setBase(s); } public int getIndex() { return _index; } public String toString() { return ""+this._realIndex+" ("+_index+") (x,y):"+this._coords +" C:"+_center; } private enum STATE_SPECIAL_CHARS_STATES{ NORMAL,SUBSCRIPT, SUPERSCRIPT, COMMAND}; private static HashMap _subscripts = new HashMap(); private static HashMap _superscripts = new HashMap(); private static HashMap _commands = new HashMap(); { _subscripts.put('0', '\u2080'); _subscripts.put('1', '\u2081'); _subscripts.put('2', '\u2082'); _subscripts.put('3', '\u2083'); _subscripts.put('4', '\u2084'); _subscripts.put('5', '\u2085'); _subscripts.put('6', '\u2086'); _subscripts.put('7', '\u2087'); _subscripts.put('8', '\u2088'); _subscripts.put('9', '\u2089'); _subscripts.put('+', '\u208A'); _subscripts.put('-', '\u208B'); _subscripts.put('a', '\u2090'); _subscripts.put('e', '\u2091'); _subscripts.put('o', '\u2092'); _subscripts.put('i', '\u1D62'); _subscripts.put('r', '\u1D63'); _subscripts.put('u', '\u1D64'); _subscripts.put('v', '\u1D65'); _subscripts.put('x', '\u2093'); _superscripts.put('0', '\u2070'); _superscripts.put('1', '\u00B9'); _superscripts.put('2', '\u00B2'); _superscripts.put('3', '\u00B3'); _superscripts.put('4', '\u2074'); _superscripts.put('5', '\u2075'); _superscripts.put('6', '\u2076'); _superscripts.put('7', '\u2077'); _superscripts.put('8', '\u2078'); _superscripts.put('9', '\u2079'); _superscripts.put('+', '\u207A'); _superscripts.put('-', '\u207B'); _superscripts.put('i', '\u2071'); _superscripts.put('n', '\u207F'); _commands.put("alpha", '\u03B1'); _commands.put("beta", '\u03B2'); _commands.put("gamma", '\u03B3'); _commands.put("delta", '\u03B4'); _commands.put("epsilon",'\u03B5'); _commands.put("zeta", '\u03B6'); _commands.put("eta", '\u03B7'); _commands.put("theta", '\u03B8'); _commands.put("iota", '\u03B9'); _commands.put("kappa", '\u03BA'); _commands.put("lambda", '\u03BB'); _commands.put("mu", '\u03BC'); _commands.put("nu", '\u03BD'); _commands.put("xi", '\u03BE'); _commands.put("omicron",'\u03BF'); _commands.put("pi", '\u03C1'); _commands.put("rho", '\u03C2'); _commands.put("sigma", '\u03C3'); _commands.put("tau", '\u03C4'); _commands.put("upsilon",'\u03C5'); _commands.put("phi", '\u03C6'); _commands.put("chi", '\u03C7'); _commands.put("psi", '\u03C8'); _commands.put("omega", '\u03C9'); _commands.put("Psi", '\u03A8'); _commands.put("Phi", '\u03A6'); _commands.put("Sigma", '\u03A3'); _commands.put("Pi", '\u03A0'); _commands.put("Theta", '\u0398'); _commands.put("Omega", '\u03A9'); _commands.put("Gamma", '\u0393'); _commands.put("Delta", '\u0394'); _commands.put("Lambda", '\u039B'); } private static String decode(String s) { if (s.length()<=1) { return s; } STATE_SPECIAL_CHARS_STATES state = STATE_SPECIAL_CHARS_STATES.NORMAL; String result = ""; String buffer = ""; for(int i=0;i