001/*
002 *                    BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 *      http://www.biojava.org/
019 *
020 */
021package org.biojava.nbio.structure.align.gui.jmol;
022
023import org.biojava.nbio.structure.*;
024
025import java.util.regex.Matcher;
026import java.util.regex.Pattern;
027
028public class JmolTools {
029
030        /** get jmol style info:
031         *  jmol style: [MET]508:A.CA/1 #3918
032         *  insertion code: [ASP]1^A:A.CA/1 #2
033         * @param a .. the Atom
034         *
035         * @return a String representation in Jmol style of the PDB information of this atom
036         */
037        public static final String getPdbInfo(Atom a){
038                return getPdbInfo(a,true);
039        }
040
041        private static Pattern inscodePatter ;
042        static {
043                inscodePatter = Pattern.compile("([0-9]+)([a-zA-Z]*)?");
044        }
045        public static void main(String[] args){
046
047                Chain c = new ChainImpl();
048                c.setId("X");
049
050                Group g = new AminoAcidImpl();
051                g.setResidueNumber(ResidueNumber.fromString("1A"));
052                try {
053                        g.setPDBName("ALA");
054                } catch (Exception e){}
055                Atom a = new AtomImpl();
056                a.setName("CA");
057                g.addAtom(a);
058                c.addGroup(g);
059
060                System.out.println(getPdbInfo(a));
061        }
062
063
064        // TODO: move this to AtomInfo class
065
066        public static final String getPdbInfo(Atom a, boolean printResName){
067                String aa3 = "";
068
069                String chain1 ="";
070                String res1 = "";
071
072                if ( a != null){
073                        Group g1 = a.getGroup();
074                        if ( g1 != null){
075                                aa3 = g1.getPDBName();
076                                res1 = g1.getResidueNumber().toString();
077                                Chain ch1 = g1.getChain();
078                                if (ch1 != null)
079                                        chain1 = ch1.getId();
080                        }
081                }
082
083                StringBuffer buf = new StringBuffer();
084                if ( printResName) {
085                        if ( !aa3.equals("")){
086                                buf.append("[");
087                                buf.append(aa3);
088                                buf.append("]");
089                        }
090                }
091                if ( ! res1.equals("")) {
092
093                        // let's check if there is an insertion code...
094                        Matcher matcher = inscodePatter.matcher(res1);
095
096                        boolean found = matcher.find();
097                        if ( ! found) {
098                                System.err.println("JmolTools: could not parse the residue number string " + res1);
099                                buf.append(res1);
100                        } else {
101                                String residueNumber = matcher.group(1);
102                                String insCode = matcher.group(2);
103                                buf.append(residueNumber);
104                                if ( insCode != null && ! ( insCode.equals(""))) {
105                                        buf.append("^");
106                                        buf.append(insCode);
107                                }
108                        }
109
110                }
111
112
113
114
115                if ( ! chain1.equals("")){
116                        buf.append(":");
117                        buf.append(chain1);
118                }
119                return buf.toString();
120        }
121}