/* 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 University 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; /** * 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; /** * 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 ModeleStyleBase(), 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 ModeleStyleBase(), 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, ModeleStyleBase 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(ModeleStyleBase 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 ModeleStyleBase(), -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.get_c(), mb .getStyleBase(), mb.getElementStructure(), index); } public ModeleBaseNucleotide(Point2D.Double coords, Point2D.Double center, boolean colorie, String label, ModeleStyleBase mb, int elementStruct, int index) { _colorie = colorie; _c = label; _styleBase = mb; _coords = new VARNAPoint(coords); _center = new VARNAPoint(center); _elementStructure = elementStruct; _index = index; _realIndex = index + 1; _value = 0.0; } public ModeleStyleBase getStyleBase() { if (_colorie) return _styleBase; return new ModeleStyleBase(); } public String get_c() { return decode(_c); } public void set_c(String _s) { this._c = _s; } public Boolean getColorie() { return _colorie; } public void setColorie(Boolean _colorie) { this._colorie = _colorie; } public int getElementStructure() { return _elementStructure; } public String getContent() { return get_c(); } public void setContent(String s) { set_c(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<Character,Character> _subscripts = new HashMap<Character,Character>(); private static HashMap<Character,Character> _superscripts = new HashMap<Character,Character>(); private static HashMap<String,Character> _commands = new HashMap<String,Character>(); { _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<s.length();i++) { char c = s.charAt(i); switch (state) { case NORMAL: { switch(c) { case '_': state = STATE_SPECIAL_CHARS_STATES.SUBSCRIPT; break; case '^': state = STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT; break; case '\\': buffer = ""; state = STATE_SPECIAL_CHARS_STATES.COMMAND; break; default: result += c; state = STATE_SPECIAL_CHARS_STATES.NORMAL; break; } } break; case SUBSCRIPT: case SUPERSCRIPT: { switch(c) { case '_': state = STATE_SPECIAL_CHARS_STATES.SUBSCRIPT; break; case '^': state = STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT; break; case '\\': buffer = ""; state = STATE_SPECIAL_CHARS_STATES.COMMAND; break; default: if ((state==STATE_SPECIAL_CHARS_STATES.SUBSCRIPT) && _subscripts.containsKey(c)) result += _subscripts.get(c); else if ((state==STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT) && _superscripts.containsKey(c)) result += _superscripts.get(c); else result += c; state = STATE_SPECIAL_CHARS_STATES.NORMAL; break; } } break; case COMMAND: { switch(c) { case '_': if (_commands.containsKey(buffer)) { result += _commands.get(buffer); } else { result += buffer; } buffer = ""; state = STATE_SPECIAL_CHARS_STATES.SUBSCRIPT; break; case '^': if (_commands.containsKey(buffer)) { result += _commands.get(buffer); } else { result += buffer; } buffer = ""; state = STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT; break; case '\\': if (_commands.containsKey(buffer)) { result += _commands.get(buffer); } else { result += buffer; } buffer = ""; state = STATE_SPECIAL_CHARS_STATES.COMMAND; break; case ' ': state = STATE_SPECIAL_CHARS_STATES.NORMAL; if (_commands.containsKey(buffer)) { result += _commands.get(buffer); } else { result += buffer; } buffer = ""; break; default: buffer += c; break; } } break; } } if (_commands.containsKey(buffer)) { result += _commands.get(buffer); } else { result += buffer; } return result; } }