general pairwise substitution score models for pairwise alignments and trees.
authorjprocter <Jim Procter>
Wed, 6 Dec 2006 17:09:21 +0000 (17:09 +0000)
committerjprocter <Jim Procter>
Wed, 6 Dec 2006 17:09:21 +0000 (17:09 +0000)
src/jalview/analysis/AlignSeq.java
src/jalview/analysis/NJTree.java
src/jalview/appletgui/PairwiseAlignPanel.java
src/jalview/datamodel/BinarySequence.java
src/jalview/gui/PairwiseAlignPanel.java
src/jalview/schemes/ResidueProperties.java
src/jalview/schemes/ScoreMatrix.java [new file with mode: 0644]

index d0c5869..db549a4 100755 (executable)
-/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
-*/\r
-package jalview.analysis;\r
-\r
-import jalview.datamodel.SequenceI;\r
-\r
-import jalview.schemes.*;\r
-\r
-import jalview.util.*;\r
-\r
-import java.awt.*;\r
-\r
-import java.util.*;\r
-\r
-\r
-/**\r
- *\r
- *\r
- * @author $author$\r
- * @version $Revision$\r
- */\r
-public class AlignSeq\r
-{\r
-    /** DOCUMENT ME!! */\r
-    public static java.util.Hashtable dnaHash = new java.util.Hashtable();\r
-\r
-    static\r
-    {\r
-        dnaHash.put("C", new Integer(0));\r
-        dnaHash.put("T", new Integer(1));\r
-        dnaHash.put("A", new Integer(2));\r
-        dnaHash.put("G", new Integer(3));\r
-        dnaHash.put("-", new Integer(4));\r
-    }\r
-\r
-    static String[] dna = { "C", "T", "A", "G", "-" };\r
-    static String[] pep =\r
-    {\r
-        "A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F",\r
-        "P", "S", "T", "W", "Y", "V", "B", "Z", "X", "-"\r
-    };\r
-    int[][] score;\r
-    int[][] E;\r
-    int[][] F;\r
-    int[][] traceback;\r
-    int[] seq1;\r
-    int[] seq2;\r
-    SequenceI s1;\r
-    SequenceI s2;\r
-    public String s1str;\r
-    public String s2str;\r
-    int maxi;\r
-    int maxj;\r
-    int[] aseq1;\r
-    int[] aseq2;\r
-    public String astr1="";\r
-    public String astr2="";\r
-\r
-    /** DOCUMENT ME!! */\r
-    public int seq1start;\r
-\r
-    /** DOCUMENT ME!! */\r
-    public int seq1end;\r
-\r
-    /** DOCUMENT ME!! */\r
-    public int seq2start;\r
-\r
-    /** DOCUMENT ME!! */\r
-    public int seq2end;\r
-    int count;\r
-\r
-    /** DOCUMENT ME!! */\r
-    public int maxscore;\r
-    float pid;\r
-    int prev = 0;\r
-    int gapOpen = 120;\r
-    int gapExtend = 20;\r
-    int[][] lookup = ResidueProperties.getBLOSUM62();\r
-    String[] intToStr = pep;\r
-    int defInt = 23;\r
-    StringBuffer output = new StringBuffer();\r
-    String type;\r
-\r
-    /**\r
-     * Creates a new AlignSeq object.\r
-     *\r
-     * @param s1 DOCUMENT ME!\r
-     * @param s2 DOCUMENT ME!\r
-     * @param type DOCUMENT ME!\r
-     */\r
-    public AlignSeq(SequenceI s1, SequenceI s2, String type)\r
-    {\r
-        SeqInit(s1, s1.getSequenceAsString(), s2,  s2.getSequenceAsString(), type);\r
-    }\r
-\r
-    /**\r
-     * Creates a new AlignSeq object.\r
-     *\r
-     * @param s1 DOCUMENT ME!\r
-     * @param s2 DOCUMENT ME!\r
-     * @param type DOCUMENT ME!\r
-     */\r
-    public AlignSeq(SequenceI s1,\r
-                    String string1,\r
-                    SequenceI s2,\r
-                    String string2,\r
-                    String type)\r
-    {\r
-        SeqInit(s1, string1, s2,  string2,  type);\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int getMaxScore()\r
-    {\r
-        return maxscore;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int getSeq2Start()\r
-    {\r
-        return seq2start;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int getSeq2End()\r
-    {\r
-        return seq2end;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int getSeq1Start()\r
-    {\r
-        return seq1start;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int getSeq1End()\r
-    {\r
-        return seq1end;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public String getOutput()\r
-    {\r
-        return output.toString();\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public String getAStr1()\r
-    {\r
-        return astr1;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public String getAStr2()\r
-    {\r
-        return astr2;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int[] getASeq1()\r
-    {\r
-        return aseq1;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int[] getASeq2()\r
-    {\r
-        return aseq2;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public SequenceI getS1()\r
-    {\r
-        return s1;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public SequenceI getS2()\r
-    {\r
-        return s2;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param s1 DOCUMENT ME!\r
-     * @param s2 DOCUMENT ME!\r
-     * @param type DOCUMENT ME!\r
-     */\r
-    public void SeqInit(SequenceI s1,\r
-                        String string1,\r
-                        SequenceI s2,\r
-                        String string2,\r
-                        String type)\r
-    {\r
-\r
-        s1str = extractGaps(jalview.util.Comparison.GapChars, string1);\r
-        s2str = extractGaps(jalview.util.Comparison.GapChars, string2);\r
-\r
-        if(s1str.length()==0 || s2str.length()==0)\r
-        {\r
-          System.out.println("ALL GAPS: " +\r
-                             (s1str.length()==0?s1.getName():" ")\r
-                             +(s2str.length()==0?s2.getName():""));\r
-          return;\r
-        }\r
-\r
-        this.s1 = s1;\r
-        this.s2 = s2;\r
-\r
-        this.type = type;\r
-\r
-        if (type.equals("pep"))\r
-        {\r
-            lookup = ResidueProperties.getBLOSUM62();\r
-            intToStr = pep;\r
-            defInt = 23;\r
-        }\r
-        else if (type.equals("dna"))\r
-        {\r
-            lookup = ResidueProperties.getDNA();\r
-            intToStr = dna;\r
-            defInt = 4;\r
-        }\r
-        else\r
-        {\r
-            output.append("Wrong type = dna or pep only");\r
-            System.exit(0);\r
-        }\r
-\r
-        //System.out.println("lookuip " + rt.freeMemory() + " "+  rt.totalMemory());\r
-        seq1 = new int[s1str.length()];\r
-\r
-        //System.out.println("seq1 " + rt.freeMemory() +" "  + rt.totalMemory());\r
-        seq2 = new int[s2str.length()];\r
-\r
-        //System.out.println("seq2 " + rt.freeMemory() + " " + rt.totalMemory());\r
-        score = new int[s1str.length()][s2str.length()];\r
-\r
-        //System.out.println("score " + rt.freeMemory() + " " + rt.totalMemory());\r
-        E = new int[s1str.length()][s2str.length()];\r
-\r
-        //System.out.println("E " + rt.freeMemory() + " " + rt.totalMemory());\r
-        F = new int[s1str.length()][s2str.length()];\r
-        traceback = new int[s1str.length()][s2str.length()];\r
-\r
-        //System.out.println("F " + rt.freeMemory() + " " + rt.totalMemory());\r
-        seq1 = stringToInt(s1str, type);\r
-\r
-        //System.out.println("seq1 " + rt.freeMemory() + " " + rt.totalMemory());\r
-        seq2 = stringToInt(s2str, type);\r
-\r
-        //System.out.println("Seq2 " + rt.freeMemory() + " " + rt.totalMemory());\r
-        //   long tstart = System.currentTimeMillis();\r
-        //    calcScoreMatrix();\r
-        //long tend = System.currentTimeMillis();\r
-        //System.out.println("Time take to calculate score matrix = " + (tend-tstart) + " ms");\r
-        //   printScoreMatrix(score);\r
-        //System.out.println();\r
-        //printScoreMatrix(traceback);\r
-        //System.out.println();\r
-        //  printScoreMatrix(E);\r
-        //System.out.println();\r
-        ///printScoreMatrix(F);\r
-        //System.out.println();\r
-        // tstart = System.currentTimeMillis();\r
-        //traceAlignment();\r
-        //tend = System.currentTimeMillis();\r
-        //System.out.println("Time take to traceback alignment = " + (tend-tstart) + " ms");\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     */\r
-    public void traceAlignment()\r
-    {\r
-        // Find the maximum score along the rhs or bottom row\r
-        int max = -9999;\r
-\r
-        for (int i = 0; i < seq1.length; i++)\r
-        {\r
-            if (score[i][seq2.length - 1] > max)\r
-            {\r
-                max = score[i][seq2.length - 1];\r
-                maxi = i;\r
-                maxj = seq2.length - 1;\r
-            }\r
-        }\r
-\r
-        for (int j = 0; j < seq2.length; j++)\r
-        {\r
-            if (score[seq1.length - 1][j] > max)\r
-            {\r
-                max = score[seq1.length - 1][j];\r
-                maxi = seq1.length - 1;\r
-                maxj = j;\r
-            }\r
-        }\r
-\r
-        //  System.out.println(maxi + " " + maxj + " " + score[maxi][maxj]);\r
-        int i = maxi;\r
-        int j = maxj;\r
-        int trace;\r
-        maxscore = score[i][j] / 10;\r
-\r
-        seq1end = maxi + 1;\r
-        seq2end = maxj + 1;\r
-\r
-        aseq1 = new int[seq1.length + seq2.length];\r
-        aseq2 = new int[seq1.length + seq2.length];\r
-\r
-        count = (seq1.length + seq2.length) - 1;\r
-\r
-        while ((i > 0) && (j > 0))\r
-        {\r
-            if ((aseq1[count] != defInt) && (i >= 0))\r
-            {\r
-                aseq1[count] = seq1[i];\r
-                astr1 = intToStr[seq1[i]] + astr1;\r
-            }\r
-\r
-            if ((aseq2[count] != defInt) && (j > 0))\r
-            {\r
-                aseq2[count] = seq2[j];\r
-                astr2 = intToStr[seq2[j]] + astr2;\r
-            }\r
-\r
-            trace = findTrace(i, j);\r
-\r
-            if (trace == 0)\r
-            {\r
-                i--;\r
-                j--;\r
-            }\r
-            else if (trace == 1)\r
-            {\r
-                j--;\r
-                aseq1[count] = defInt;\r
-                astr1 = "-" + astr1.substring(1);\r
-            }\r
-            else if (trace == -1)\r
-            {\r
-                i--;\r
-                aseq2[count] = defInt;\r
-                astr2 = "-" + astr2.substring(1);\r
-            }\r
-\r
-            count--;\r
-        }\r
-\r
-        seq1start = i + 1;\r
-        seq2start = j + 1;\r
-\r
-        if (aseq1[count] != defInt)\r
-        {\r
-            aseq1[count] = seq1[i];\r
-            astr1 = intToStr[seq1[i]] + astr1;\r
-        }\r
-\r
-        if (aseq2[count] != defInt)\r
-        {\r
-            aseq2[count] = seq2[j];\r
-            astr2 = intToStr[seq2[j]] + astr2;\r
-        }\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     */\r
-    public void printAlignment(java.io.PrintStream os)\r
-    {\r
-        // Find the biggest id length for formatting purposes\r
-        int maxid = s1.getName().length();\r
-\r
-        if (s2.getName().length() > maxid)\r
-        {\r
-            maxid = s2.getName().length();\r
-        }\r
-\r
-        int len = 72 - maxid - 1;\r
-        int nochunks = ((aseq1.length - count) / len) + 1;\r
-        pid = 0;\r
-\r
-        output.append("Score = " + score[maxi][maxj] + "\n");\r
-        output.append("Length of alignment = " + (aseq1.length - count) + "\n");\r
-        output.append("Sequence ");\r
-        output.append(new Format("%" + maxid + "s").form(s1.getName()));\r
-        output.append(" :  " + s1.getStart() + " - " + s1.getEnd() + " (Sequence length = " +\r
-            s1str.length() + ")\n");\r
-        output .append("Sequence ");\r
-        output.append(new Format("%" + maxid + "s").form(s2.getName()));\r
-        output.append(" :  " + s2.getStart() + " - " + s2.getEnd() + " (Sequence length = " +\r
-            s2str.length() + ")\n\n");\r
-\r
-        for (int j = 0; j < nochunks; j++)\r
-        {\r
-            // Print the first aligned sequence\r
-            output.append(new Format("%" + (maxid) + "s").form(s1.getName()) + " ");\r
-\r
-            for (int i = 0; i < len; i++)\r
-            {\r
-                if ((count + i + (j * len)) < aseq1.length)\r
-                {\r
-                    output.append(new Format("%s").form(intToStr[aseq1[count + i +\r
-                            (j * len)]]));\r
-                }\r
-            }\r
-\r
-            output.append("\n");\r
-            output.append(new Format("%" + (maxid) + "s").form(" ") + " ");\r
-\r
-            // Print out the matching chars\r
-            for (int i = 0; i < len; i++)\r
-            {\r
-                if ((count + i + (j * len)) < aseq1.length)\r
-                {\r
-                    if (intToStr[aseq1[count + i + (j * len)]].equals(\r
-                                intToStr[aseq2[count + i + (j * len)]]) &&\r
-                            !intToStr[aseq1[count + i + (j * len)]].equals("-"))\r
-                    {\r
-                        pid++;\r
-                        output.append("|");\r
-                    }\r
-                    else if (type.equals("pep"))\r
-                    {\r
-                        if (ResidueProperties.getPAM250(\r
-                                    intToStr[aseq1[count + i + (j * len)]],\r
-                                    intToStr[aseq2[count + i + (j * len)]]) > 0)\r
-                        {\r
-                            output.append(".");\r
-                        }\r
-                        else\r
-                        {\r
-                            output.append(" ");\r
-                        }\r
-                    }\r
-                    else\r
-                    {\r
-                        output.append(" ");\r
-                    }\r
-                }\r
-            }\r
-\r
-            // Now print the second aligned sequence\r
-            output = output.append("\n");\r
-            output = output.append(new Format("%" + (maxid) + "s").form(s2.getName()) + " ");\r
-\r
-            for (int i = 0; i < len; i++)\r
-            {\r
-                if ((count + i + (j * len)) < aseq1.length)\r
-                {\r
-                    output .append(new Format("%s").form(intToStr[aseq2[count + i +\r
-                            (j * len)]]));\r
-                }\r
-            }\r
-\r
-            output = output .append("\n\n");\r
-        }\r
-\r
-        pid = pid / (float) (aseq1.length - count) * 100;\r
-        output = output.append(new Format("Percentage ID = %2.2f\n\n").form(pid));\r
-\r
-        try{\r
-          os.print(output.toString());\r
-        }catch(Exception ex){}\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param mat DOCUMENT ME!\r
-     */\r
-    public void printScoreMatrix(int[][] mat)\r
-    {\r
-        int n = seq1.length;\r
-        int m = seq2.length;\r
-\r
-        for (int i = 0; i < n; i++)\r
-        {\r
-            // Print the top sequence\r
-            if (i == 0)\r
-            {\r
-                Format.print(System.out, "%8s", s2str.substring(0, 1));\r
-\r
-                for (int jj = 1; jj < m; jj++)\r
-                {\r
-                    Format.print(System.out, "%5s", s2str.substring(jj, jj + 1));\r
-                }\r
-\r
-                System.out.println();\r
-            }\r
-\r
-            for (int j = 0; j < m; j++)\r
-            {\r
-                if (j == 0)\r
-                {\r
-                    Format.print(System.out, "%3s", s1str.substring(i, i + 1));\r
-                }\r
-\r
-                Format.print(System.out, "%3d ", mat[i][j] / 10);\r
-            }\r
-\r
-            System.out.println();\r
-        }\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param i DOCUMENT ME!\r
-     * @param j DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int findTrace(int i, int j)\r
-    {\r
-        int t = 0;\r
-        int max = score[i - 1][j - 1] + (lookup[seq1[i]][seq2[j]] * 10);\r
-\r
-        if (F[i][j] > max)\r
-        {\r
-            max = F[i][j];\r
-            t = -1;\r
-        }\r
-        else if (F[i][j] == max)\r
-        {\r
-            if (prev == -1)\r
-            {\r
-                max = F[i][j];\r
-                t = -1;\r
-            }\r
-        }\r
-\r
-        if (E[i][j] >= max)\r
-        {\r
-            max = E[i][j];\r
-            t = 1;\r
-        }\r
-        else if (E[i][j] == max)\r
-        {\r
-            if (prev == 1)\r
-            {\r
-                max = E[i][j];\r
-                t = 1;\r
-            }\r
-        }\r
-\r
-        prev = t;\r
-\r
-        return t;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     */\r
-    public void calcScoreMatrix()\r
-    {\r
-        int n = seq1.length;\r
-        int m = seq2.length;\r
-\r
-        // top left hand element\r
-        score[0][0] = lookup[seq1[0]][seq2[0]] * 10;\r
-        E[0][0] = -gapExtend;\r
-        F[0][0] = 0;\r
-\r
-        // Calculate the top row first\r
-        for (int j = 1; j < m; j++)\r
-        {\r
-            // What should these values be? 0 maybe\r
-            E[0][j] = max(score[0][j - 1] - gapOpen, E[0][j - 1] - gapExtend);\r
-            F[0][j] = -gapExtend;\r
-\r
-            score[0][j] = max(lookup[seq1[0]][seq2[j]] * 10, -gapOpen,\r
-                    -gapExtend);\r
-\r
-            traceback[0][j] = 1;\r
-        }\r
-\r
-        // Now do the left hand column\r
-        for (int i = 1; i < n; i++)\r
-        {\r
-            E[i][0] = -gapOpen;\r
-            F[i][0] = max(score[i - 1][0] - gapOpen, F[i - 1][0] - gapExtend);\r
-\r
-            score[i][0] = max(lookup[seq1[i]][seq2[0]] * 10, E[i][0], F[i][0]);\r
-            traceback[i][0] = -1;\r
-        }\r
-\r
-        // Now do all the other rows\r
-        for (int i = 1; i < n; i++)\r
-        {\r
-            for (int j = 1; j < m; j++)\r
-            {\r
-                E[i][j] = max(score[i][j - 1] - gapOpen, E[i][j - 1] -\r
-                        gapExtend);\r
-                F[i][j] = max(score[i - 1][j] - gapOpen, F[i - 1][j] -\r
-                        gapExtend);\r
-\r
-                score[i][j] = max(score[i - 1][j - 1] +\r
-                        (lookup[seq1[i]][seq2[j]] * 10), E[i][j], F[i][j]);\r
-                traceback[i][j] = findTrace(i, j);\r
-            }\r
-        }\r
-    }\r
-\r
-\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param gapChar DOCUMENT ME!\r
-     * @param seq DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public static String extractGaps(String gapChar, String seq)\r
-    {\r
-        StringTokenizer str = new StringTokenizer(seq, gapChar);\r
-        StringBuffer newString = new StringBuffer();\r
-\r
-        while (str.hasMoreTokens())\r
-        {\r
-            newString.append( str.nextToken() );\r
-        }\r
-\r
-        return newString.toString();\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param i1 DOCUMENT ME!\r
-     * @param i2 DOCUMENT ME!\r
-     * @param i3 DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int max(int i1, int i2, int i3)\r
-    {\r
-        int max = i1;\r
-\r
-        if (i2 > i1)\r
-        {\r
-            max = i2;\r
-        }\r
-\r
-        if (i3 > max)\r
-        {\r
-            max = i3;\r
-        }\r
-\r
-        return max;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param i1 DOCUMENT ME!\r
-     * @param i2 DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int max(int i1, int i2)\r
-    {\r
-        int max = i1;\r
-\r
-        if (i2 > i1)\r
-        {\r
-            max = i2;\r
-        }\r
-\r
-        return max;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param s DOCUMENT ME!\r
-     * @param type DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int[] stringToInt(String s, String type)\r
-    {\r
-        int[] seq1 = new int[s.length()];\r
-\r
-        for (int i = 0; i < s.length(); i++)\r
-        {\r
-           // String ss = s.substring(i, i + 1).toUpperCase();\r
-            char c = s.charAt(i);\r
-            if ('a' <= c && c <= 'z')\r
-            {\r
-              // TO UPPERCASE !!!\r
-              c -= ('a' - 'A');\r
-            }\r
-\r
-\r
-            try\r
-            {\r
-                if (type.equals("pep"))\r
-                {\r
-                    seq1[i] = ResidueProperties.aaIndex[c];\r
-                }\r
-                else if (type.equals("dna"))\r
-                {\r
-                    seq1[i] = ResidueProperties.nucleotideIndex[c];\r
-                }\r
-\r
-                if (seq1[i] > 23)\r
-                {\r
-                    seq1[i] = 23;\r
-                }\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                if (type.equals("dna"))\r
-                {\r
-                    seq1[i] = 4;\r
-                }\r
-                else\r
-                {\r
-                    seq1[i] = 23;\r
-                }\r
-            }\r
-        }\r
-\r
-        return seq1;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param g DOCUMENT ME!\r
-     * @param mat DOCUMENT ME!\r
-     * @param n DOCUMENT ME!\r
-     * @param m DOCUMENT ME!\r
-     * @param psize DOCUMENT ME!\r
-     */\r
-    public static void displayMatrix(Graphics g, int[][] mat, int n, int m,\r
-        int psize)\r
-    {\r
-        int max = -1000;\r
-        int min = 1000;\r
-\r
-        for (int i = 0; i < n; i++)\r
-        {\r
-            for (int j = 0; j < m; j++)\r
-            {\r
-                if (mat[i][j] >= max)\r
-                {\r
-                    max = mat[i][j];\r
-                }\r
-\r
-                if (mat[i][j] <= min)\r
-                {\r
-                    min = mat[i][j];\r
-                }\r
-            }\r
-        }\r
-\r
-        System.out.println(max + " " + min);\r
-\r
-        for (int i = 0; i < n; i++)\r
-        {\r
-            for (int j = 0; j < m; j++)\r
-            {\r
-                int x = psize * i;\r
-                int y = psize * j;\r
-\r
-                //     System.out.println(mat[i][j]);\r
-                float score = (float) (mat[i][j] - min) / (float) (max - min);\r
-                g.setColor(new Color(score, 0, 0));\r
-                g.fillRect(x, y, psize, psize);\r
-\r
-                //     System.out.println(x + " " + y + " " + score);\r
-            }\r
-        }\r
-    }\r
-}\r
+/*
+* Jalview - A Sequence Alignment Editor and Viewer
+* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+*
+* This program 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 2
+* of the License, or (at your option) any later version.
+*
+* This program 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 this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+*/
+package jalview.analysis;
+
+import jalview.datamodel.SequenceI;
+
+import jalview.schemes.*;
+
+import jalview.util.*;
+
+import java.awt.*;
+
+import java.util.*;
+
+
+/**
+ *
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class AlignSeq
+{
+    public static final String PEP = "pep";
+    public static final String DNA = "dna";
+    /** DOCUMENT ME!! */
+    public static java.util.Hashtable dnaHash = new java.util.Hashtable();
+
+    static
+    {
+        dnaHash.put("C", new Integer(0));
+        dnaHash.put("T", new Integer(1));
+        dnaHash.put("A", new Integer(2));
+        dnaHash.put("G", new Integer(3));
+        dnaHash.put("-", new Integer(4));
+    }
+
+    static String[] dna = { "C", "T", "A", "G", "-" };
+    static String[] pep =
+    {
+        "A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F",
+        "P", "S", "T", "W", "Y", "V", "B", "Z", "X", "-"
+    };
+    int[][] score;
+    int[][] E;
+    int[][] F;
+    int[][] traceback;
+    int[] seq1;
+    int[] seq2;
+    SequenceI s1;
+    SequenceI s2;
+    public String s1str;
+    public String s2str;
+    int maxi;
+    int maxj;
+    int[] aseq1;
+    int[] aseq2;
+    public String astr1="";
+    public String astr2="";
+
+    /** DOCUMENT ME!! */
+    public int seq1start;
+
+    /** DOCUMENT ME!! */
+    public int seq1end;
+
+    /** DOCUMENT ME!! */
+    public int seq2start;
+
+    /** DOCUMENT ME!! */
+    public int seq2end;
+    int count;
+
+    /** DOCUMENT ME!! */
+    public int maxscore;
+    float pid;
+    int prev = 0;
+    int gapOpen = 120;
+    int gapExtend = 20;
+    int[][] lookup = ResidueProperties.getBLOSUM62();
+    String[] intToStr = pep;
+    int defInt = 23;
+    StringBuffer output = new StringBuffer();
+    String type;
+
+    /**
+     * Creates a new AlignSeq object.
+     *
+     * @param s1 DOCUMENT ME!
+     * @param s2 DOCUMENT ME!
+     * @param type DOCUMENT ME!
+     */
+    public AlignSeq(SequenceI s1, SequenceI s2, String type)
+    {
+        SeqInit(s1, s1.getSequenceAsString(), s2,  s2.getSequenceAsString(), type);
+    }
+
+    /**
+     * Creates a new AlignSeq object.
+     *
+     * @param s1 DOCUMENT ME!
+     * @param s2 DOCUMENT ME!
+     * @param type DOCUMENT ME!
+     */
+    public AlignSeq(SequenceI s1,
+                    String string1,
+                    SequenceI s2,
+                    String string2,
+                    String type)
+    {
+        SeqInit(s1, string1, s2,  string2,  type);
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getMaxScore()
+    {
+        return maxscore;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getSeq2Start()
+    {
+        return seq2start;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getSeq2End()
+    {
+        return seq2end;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getSeq1Start()
+    {
+        return seq1start;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getSeq1End()
+    {
+        return seq1end;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public String getOutput()
+    {
+        return output.toString();
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public String getAStr1()
+    {
+        return astr1;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public String getAStr2()
+    {
+        return astr2;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int[] getASeq1()
+    {
+        return aseq1;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int[] getASeq2()
+    {
+        return aseq2;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public SequenceI getS1()
+    {
+        return s1;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public SequenceI getS2()
+    {
+        return s2;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param s1 DOCUMENT ME!
+     * @param string1 -  string to align for sequence1
+     * @param s2 sequence 2
+     * @param string2 -  string to align for sequence2
+     * @param type DNA or PEPTIDE
+     */
+    public void SeqInit(SequenceI s1,
+                        String string1,
+                        SequenceI s2,
+                        String string2,
+                        String type)
+    {
+      this.s1 = s1;
+      this.s2 = s2;
+      setDefaultParams(type);
+      SeqInit(string1,string2);
+    }
+    public void SeqInit(SequenceI s1,
+        String string1,
+        SequenceI s2,
+        String string2,
+        ScoreMatrix scoreMatrix) { 
+      this.s1=s1;
+      this.s2=s2;
+      setType(scoreMatrix.isDNA() ? AlignSeq.DNA : AlignSeq.PEP);
+      lookup=scoreMatrix.getMatrix();
+    }
+    /**
+     * construct score matrix for string1 and string2 (after removing any existing gaps
+     * @param string1
+     * @param string2
+     */
+    private void SeqInit(String string1, String string2) {
+      s1str = extractGaps(jalview.util.Comparison.GapChars, string1);
+      s2str = extractGaps(jalview.util.Comparison.GapChars, string2);
+
+      if(s1str.length()==0 || s2str.length()==0)
+      {
+        output.append("ALL GAPS: " +
+                           (s1str.length()==0?s1.getName():" ")
+                           +(s2str.length()==0?s2.getName():""));
+        return;
+      }
+
+      //System.out.println("lookuip " + rt.freeMemory() + " "+  rt.totalMemory());
+      seq1 = new int[s1str.length()];
+
+      //System.out.println("seq1 " + rt.freeMemory() +" "  + rt.totalMemory());
+      seq2 = new int[s2str.length()];
+
+      //System.out.println("seq2 " + rt.freeMemory() + " " + rt.totalMemory());
+      score = new int[s1str.length()][s2str.length()];
+
+      //System.out.println("score " + rt.freeMemory() + " " + rt.totalMemory());
+      E = new int[s1str.length()][s2str.length()];
+
+      //System.out.println("E " + rt.freeMemory() + " " + rt.totalMemory());
+      F = new int[s1str.length()][s2str.length()];
+      traceback = new int[s1str.length()][s2str.length()];
+
+      //System.out.println("F " + rt.freeMemory() + " " + rt.totalMemory());
+      seq1 = stringToInt(s1str, type);
+
+      //System.out.println("seq1 " + rt.freeMemory() + " " + rt.totalMemory());
+      seq2 = stringToInt(s2str, type);
+
+      //System.out.println("Seq2 " + rt.freeMemory() + " " + rt.totalMemory());
+      //   long tstart = System.currentTimeMillis();
+      //    calcScoreMatrix();
+      //long tend = System.currentTimeMillis();
+      //System.out.println("Time take to calculate score matrix = " + (tend-tstart) + " ms");
+      //   printScoreMatrix(score);
+      //System.out.println();
+      //printScoreMatrix(traceback);
+      //System.out.println();
+      //  printScoreMatrix(E);
+      //System.out.println();
+      ///printScoreMatrix(F);
+      //System.out.println();
+      // tstart = System.currentTimeMillis();
+      //traceAlignment();
+      //tend = System.currentTimeMillis();
+      //System.out.println("Time take to traceback alignment = " + (tend-tstart) + " ms");
+    }
+
+    private void setDefaultParams(String type) {
+        setType(type);
+        
+        if (type.equals(AlignSeq.PEP))
+        {
+            lookup = ResidueProperties.getDefaultPeptideMatrix();
+        }
+        else if (type.equals(AlignSeq.DNA))
+        {
+            lookup = ResidueProperties.getDefaultDnaMatrix();
+        }
+    }
+
+    private void setType(String type2) {
+      this.type = type2;
+      if (type.equals(AlignSeq.PEP))
+      {
+          intToStr = pep;
+          defInt = 23;
+      }
+      else if (type.equals(AlignSeq.DNA))
+      {
+          intToStr = dna;
+          defInt = 4;
+      }
+      else
+      {
+          output.append("Wrong type = dna or pep only");
+          throw new Error("Unknown Type "+type2+" - dna or pep are the only allowed values.");
+      }
+    }
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void traceAlignment()
+    {
+        // Find the maximum score along the rhs or bottom row
+        int max = -9999;
+
+        for (int i = 0; i < seq1.length; i++)
+        {
+            if (score[i][seq2.length - 1] > max)
+            {
+                max = score[i][seq2.length - 1];
+                maxi = i;
+                maxj = seq2.length - 1;
+            }
+        }
+
+        for (int j = 0; j < seq2.length; j++)
+        {
+            if (score[seq1.length - 1][j] > max)
+            {
+                max = score[seq1.length - 1][j];
+                maxi = seq1.length - 1;
+                maxj = j;
+            }
+        }
+
+        //  System.out.println(maxi + " " + maxj + " " + score[maxi][maxj]);
+        int i = maxi;
+        int j = maxj;
+        int trace;
+        maxscore = score[i][j] / 10;
+
+        seq1end = maxi + 1;
+        seq2end = maxj + 1;
+
+        aseq1 = new int[seq1.length + seq2.length];
+        aseq2 = new int[seq1.length + seq2.length];
+
+        count = (seq1.length + seq2.length) - 1;
+
+        while ((i > 0) && (j > 0))
+        {
+            if ((aseq1[count] != defInt) && (i >= 0))
+            {
+                aseq1[count] = seq1[i];
+                astr1 = intToStr[seq1[i]] + astr1;
+            }
+
+            if ((aseq2[count] != defInt) && (j > 0))
+            {
+                aseq2[count] = seq2[j];
+                astr2 = intToStr[seq2[j]] + astr2;
+            }
+
+            trace = findTrace(i, j);
+
+            if (trace == 0)
+            {
+                i--;
+                j--;
+            }
+            else if (trace == 1)
+            {
+                j--;
+                aseq1[count] = defInt;
+                astr1 = "-" + astr1.substring(1);
+            }
+            else if (trace == -1)
+            {
+                i--;
+                aseq2[count] = defInt;
+                astr2 = "-" + astr2.substring(1);
+            }
+
+            count--;
+        }
+
+        seq1start = i + 1;
+        seq2start = j + 1;
+
+        if (aseq1[count] != defInt)
+        {
+            aseq1[count] = seq1[i];
+            astr1 = intToStr[seq1[i]] + astr1;
+        }
+
+        if (aseq2[count] != defInt)
+        {
+            aseq2[count] = seq2[j];
+            astr2 = intToStr[seq2[j]] + astr2;
+        }
+    }
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void printAlignment(java.io.PrintStream os)
+    {
+        // Find the biggest id length for formatting purposes
+        int maxid = s1.getName().length();
+
+        if (s2.getName().length() > maxid)
+        {
+            maxid = s2.getName().length();
+        }
+
+        int len = 72 - maxid - 1;
+        int nochunks = ((aseq1.length - count) / len) + 1;
+        pid = 0;
+
+        output.append("Score = " + score[maxi][maxj] + "\n");
+        output.append("Length of alignment = " + (aseq1.length - count) + "\n");
+        output.append("Sequence ");
+        output.append(new Format("%" + maxid + "s").form(s1.getName()));
+        output.append(" :  " + s1.getStart() + " - " + s1.getEnd() + " (Sequence length = " +
+            s1str.length() + ")\n");
+        output .append("Sequence ");
+        output.append(new Format("%" + maxid + "s").form(s2.getName()));
+        output.append(" :  " + s2.getStart() + " - " + s2.getEnd() + " (Sequence length = " +
+            s2str.length() + ")\n\n");
+
+        for (int j = 0; j < nochunks; j++)
+        {
+            // Print the first aligned sequence
+            output.append(new Format("%" + (maxid) + "s").form(s1.getName()) + " ");
+
+            for (int i = 0; i < len; i++)
+            {
+                if ((count + i + (j * len)) < aseq1.length)
+                {
+                    output.append(new Format("%s").form(intToStr[aseq1[count + i +
+                            (j * len)]]));
+                }
+            }
+
+            output.append("\n");
+            output.append(new Format("%" + (maxid) + "s").form(" ") + " ");
+
+            // Print out the matching chars
+            for (int i = 0; i < len; i++)
+            {
+                if ((count + i + (j * len)) < aseq1.length)
+                {
+                    if (intToStr[aseq1[count + i + (j * len)]].equals(
+                                intToStr[aseq2[count + i + (j * len)]]) &&
+                            !intToStr[aseq1[count + i + (j * len)]].equals("-"))
+                    {
+                        pid++;
+                        output.append("|");
+                    }
+                    else if (type.equals("pep"))
+                    {
+                        if (ResidueProperties.getPAM250(
+                                    intToStr[aseq1[count + i + (j * len)]],
+                                    intToStr[aseq2[count + i + (j * len)]]) > 0)
+                        {
+                            output.append(".");
+                        }
+                        else
+                        {
+                            output.append(" ");
+                        }
+                    }
+                    else
+                    {
+                        output.append(" ");
+                    }
+                }
+            }
+
+            // Now print the second aligned sequence
+            output = output.append("\n");
+            output = output.append(new Format("%" + (maxid) + "s").form(s2.getName()) + " ");
+
+            for (int i = 0; i < len; i++)
+            {
+                if ((count + i + (j * len)) < aseq1.length)
+                {
+                    output .append(new Format("%s").form(intToStr[aseq2[count + i +
+                            (j * len)]]));
+                }
+            }
+
+            output = output .append("\n\n");
+        }
+
+        pid = pid / (float) (aseq1.length - count) * 100;
+        output = output.append(new Format("Percentage ID = %2.2f\n\n").form(pid));
+
+        try{
+          os.print(output.toString());
+        }catch(Exception ex){}
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param mat DOCUMENT ME!
+     */
+    public void printScoreMatrix(int[][] mat)
+    {
+        int n = seq1.length;
+        int m = seq2.length;
+
+        for (int i = 0; i < n; i++)
+        {
+            // Print the top sequence
+            if (i == 0)
+            {
+                Format.print(System.out, "%8s", s2str.substring(0, 1));
+
+                for (int jj = 1; jj < m; jj++)
+                {
+                    Format.print(System.out, "%5s", s2str.substring(jj, jj + 1));
+                }
+
+                System.out.println();
+            }
+
+            for (int j = 0; j < m; j++)
+            {
+                if (j == 0)
+                {
+                    Format.print(System.out, "%3s", s1str.substring(i, i + 1));
+                }
+
+                Format.print(System.out, "%3d ", mat[i][j] / 10);
+            }
+
+            System.out.println();
+        }
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param i DOCUMENT ME!
+     * @param j DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int findTrace(int i, int j)
+    {
+        int t = 0;
+        int max = score[i - 1][j - 1] + (lookup[seq1[i]][seq2[j]] * 10);
+
+        if (F[i][j] > max)
+        {
+            max = F[i][j];
+            t = -1;
+        }
+        else if (F[i][j] == max)
+        {
+            if (prev == -1)
+            {
+                max = F[i][j];
+                t = -1;
+            }
+        }
+
+        if (E[i][j] >= max)
+        {
+            max = E[i][j];
+            t = 1;
+        }
+        else if (E[i][j] == max)
+        {
+            if (prev == 1)
+            {
+                max = E[i][j];
+                t = 1;
+            }
+        }
+
+        prev = t;
+
+        return t;
+    }
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void calcScoreMatrix()
+    {
+        int n = seq1.length;
+        int m = seq2.length;
+
+        // top left hand element
+        score[0][0] = lookup[seq1[0]][seq2[0]] * 10;
+        E[0][0] = -gapExtend;
+        F[0][0] = 0;
+
+        // Calculate the top row first
+        for (int j = 1; j < m; j++)
+        {
+            // What should these values be? 0 maybe
+            E[0][j] = max(score[0][j - 1] - gapOpen, E[0][j - 1] - gapExtend);
+            F[0][j] = -gapExtend;
+
+            score[0][j] = max(lookup[seq1[0]][seq2[j]] * 10, -gapOpen,
+                    -gapExtend);
+
+            traceback[0][j] = 1;
+        }
+
+        // Now do the left hand column
+        for (int i = 1; i < n; i++)
+        {
+            E[i][0] = -gapOpen;
+            F[i][0] = max(score[i - 1][0] - gapOpen, F[i - 1][0] - gapExtend);
+
+            score[i][0] = max(lookup[seq1[i]][seq2[0]] * 10, E[i][0], F[i][0]);
+            traceback[i][0] = -1;
+        }
+
+        // Now do all the other rows
+        for (int i = 1; i < n; i++)
+        {
+            for (int j = 1; j < m; j++)
+            {
+                E[i][j] = max(score[i][j - 1] - gapOpen, E[i][j - 1] -
+                        gapExtend);
+                F[i][j] = max(score[i - 1][j] - gapOpen, F[i - 1][j] -
+                        gapExtend);
+
+                score[i][j] = max(score[i - 1][j - 1] +
+                        (lookup[seq1[i]][seq2[j]] * 10), E[i][j], F[i][j]);
+                traceback[i][j] = findTrace(i, j);
+            }
+        }
+    }
+
+
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param gapChar DOCUMENT ME!
+     * @param seq DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public static String extractGaps(String gapChar, String seq)
+    {
+        StringTokenizer str = new StringTokenizer(seq, gapChar);
+        StringBuffer newString = new StringBuffer();
+
+        while (str.hasMoreTokens())
+        {
+            newString.append( str.nextToken() );
+        }
+
+        return newString.toString();
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param i1 DOCUMENT ME!
+     * @param i2 DOCUMENT ME!
+     * @param i3 DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int max(int i1, int i2, int i3)
+    {
+        int max = i1;
+
+        if (i2 > i1)
+        {
+            max = i2;
+        }
+
+        if (i3 > max)
+        {
+            max = i3;
+        }
+
+        return max;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param i1 DOCUMENT ME!
+     * @param i2 DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int max(int i1, int i2)
+    {
+        int max = i1;
+
+        if (i2 > i1)
+        {
+            max = i2;
+        }
+
+        return max;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param s DOCUMENT ME!
+     * @param type DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int[] stringToInt(String s, String type)
+    {
+        int[] seq1 = new int[s.length()];
+
+        for (int i = 0; i < s.length(); i++)
+        {
+           // String ss = s.substring(i, i + 1).toUpperCase();
+            char c = s.charAt(i);
+            if ('a' <= c && c <= 'z')
+            {
+              // TO UPPERCASE !!!
+              c -= ('a' - 'A');
+            }
+
+
+            try
+            {
+                if (type.equals("pep"))
+                {
+                    seq1[i] = ResidueProperties.aaIndex[c];
+                }
+                else if (type.equals("dna"))
+                {
+                    seq1[i] = ResidueProperties.nucleotideIndex[c];
+                }
+
+                if (seq1[i] > 23)
+                {
+                    seq1[i] = 23;
+                }
+            }
+            catch (Exception e)
+            {
+                if (type.equals("dna"))
+                {
+                    seq1[i] = 4;
+                }
+                else
+                {
+                    seq1[i] = 23;
+                }
+            }
+        }
+
+        return seq1;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param g DOCUMENT ME!
+     * @param mat DOCUMENT ME!
+     * @param n DOCUMENT ME!
+     * @param m DOCUMENT ME!
+     * @param psize DOCUMENT ME!
+     */
+    public static void displayMatrix(Graphics g, int[][] mat, int n, int m,
+        int psize)
+    {
+        int max = -1000;
+        int min = 1000;
+
+        for (int i = 0; i < n; i++)
+        {
+            for (int j = 0; j < m; j++)
+            {
+                if (mat[i][j] >= max)
+                {
+                    max = mat[i][j];
+                }
+
+                if (mat[i][j] <= min)
+                {
+                    min = mat[i][j];
+                }
+            }
+        }
+
+        System.out.println(max + " " + min);
+
+        for (int i = 0; i < n; i++)
+        {
+            for (int j = 0; j < m; j++)
+            {
+                int x = psize * i;
+                int y = psize * j;
+
+                //     System.out.println(mat[i][j]);
+                float score = (float) (mat[i][j] - min) / (float) (max - min);
+                g.setColor(new Color(score, 0, 0));
+                g.fillRect(x, y, psize, psize);
+
+                //     System.out.println(x + " " + y + " " + score);
+            }
+        }
+    }
+}
index 6f89754..b882ba7 100755 (executable)
@@ -23,6 +23,7 @@ import jalview.datamodel.*;
 import jalview.io.NewickFile;
 
 import jalview.schemes.ResidueProperties;
+import jalview.schemes.ScoreMatrix;
 
 import jalview.util.*;
 
@@ -208,7 +209,9 @@ public class NJTree
 
         if (!(pwtype.equals("PID")))
         {
-            type = "BL";
+          if (ResidueProperties.getScoreMatrix(pwtype)==null) {
+            type = "BLOSUM62";
+          }
         }
 
         int i = 0;
@@ -298,7 +301,7 @@ public class NJTree
                         leaf.setElement(new Sequence(leaf.getName(), "THISISAPLACEHLDER"));
                     }
                     leaf.setPlaceholder(true);
-
+                    
                 }
             }
         }
@@ -665,49 +668,56 @@ public class NJTree
                 }
             }
         }
-        else if (pwtype.equals("BL"))
-        {
-            int maxscore = 0;
-            int end = sequenceString[0].length();
-            for (int i = 0; i < (noseqs - 1); i++)
+        else {
+          // Pairwise substitution score (with no gap penalties)
+          ScoreMatrix pwmatrix=ResidueProperties.getScoreMatrix(pwtype);
+          if (pwmatrix==null) {
+            pwmatrix=ResidueProperties.getScoreMatrix("BLOSUM62");
+          }
+          int maxscore = 0;
+          int end = sequenceString[0].length();
+          for (int i = 0; i < (noseqs - 1); i++)
+          {
+            for (int j = i; j < noseqs; j++)
             {
-                for (int j = i; j < noseqs; j++)
+              int score = 0;
+              
+              for (int k = 0; k < end; k++)
+              {
+                try
                 {
-                    int score = 0;
-
-                    for (int k = 0; k < end; k++)
-                    {
-                        try
-                        {
-                            score += ResidueProperties.getBLOSUM62(
-                              sequenceString[i].charAt(k),
-                              sequenceString[j].charAt(k));
-                        }
-                        catch (Exception ex)
-                        {
-                            System.err.println("err creating BLOSUM62 tree");
-                            ex.printStackTrace();
-                        }
-                    }
-
-                    distance[i][j] = (float) score;
-
-                    if (score > maxscore)
-                    {
-                        maxscore = score;
-                    }
+                  score += pwmatrix.getPairwiseScore(sequenceString[i].charAt(k),
+                      sequenceString[j].charAt(k));
                 }
-            }
-
-            for (int i = 0; i < (noseqs - 1); i++)
-            {
-                for (int j = i; j < noseqs; j++)
+                catch (Exception ex)
                 {
-                    distance[i][j] = (float) maxscore - distance[i][j];
-                    distance[j][i] = distance[i][j];
+                  System.err.println("err creating BLOSUM62 tree");
+                  ex.printStackTrace();
                 }
+              }
+              
+              distance[i][j] = (float) score;
+              
+              if (score > maxscore)
+              {
+                maxscore = score;
+              }
+            }
+          }
+          
+          for (int i = 0; i < (noseqs - 1); i++)
+          {
+            for (int j = i; j < noseqs; j++)
+            {
+              distance[i][j] = (float) maxscore - distance[i][j];
+              distance[j][i] = distance[i][j];
             }
+          }
+          
         }
+        return distance;
+    
+          //   else
       /*  else if (pwtype.equals("SW"))
         {
             float max = -1;
@@ -738,8 +748,6 @@ public class NJTree
                 }
             }
         }/*/
-
-        return distance;
     }
 
     /**
index 5e65f1e..792c906 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-\r
-package jalview.appletgui;\r
-\r
-import java.util.*;\r
-\r
-import java.awt.event.*;\r
-\r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-import java.awt.*;\r
-\r
-public class PairwiseAlignPanel\r
-    extends Panel implements ActionListener\r
-{\r
-  Vector sequences = new Vector();\r
-  AlignmentPanel ap;\r
-\r
-  public PairwiseAlignPanel(AlignmentPanel ap)\r
-  {\r
-    try\r
-    {\r
-      jbInit();\r
-    }\r
-    catch (Exception e)\r
-    {\r
-      e.printStackTrace();\r
-    }\r
-    this.ap = ap;\r
-    sequences = new Vector();\r
-\r
-    SequenceI[] seqs;\r
-    String[] seqStrings = ap.av.getViewAsString(true);\r
-\r
-    if (ap.av.getSelectionGroup() == null)\r
-    {\r
-      seqs = ap.av.alignment.getSequencesArray();\r
-    }\r
-    else\r
-    {\r
-      seqs = ap.av.getSelectionGroup().getSequencesInOrder(ap.av.alignment);\r
-    }\r
-\r
-    float scores[][] = new float[seqs.length][seqs.length];\r
-    double totscore = 0;\r
-    int count = ap.av.getSelectionGroup().getSize(false);\r
-\r
-    Sequence seq;\r
-\r
-    for (int i = 1; i < count; i++)\r
-    {\r
-      for (int j = 0; j < i; j++)\r
-      {\r
-\r
-        AlignSeq as = new AlignSeq(seqs[i], seqStrings[i],\r
-                                   seqs[j], seqStrings[j], "pep");\r
-\r
-        if (as.s1str.length() == 0 || as.s2str.length() == 0)\r
-        {\r
-          continue;\r
-        }\r
-\r
-        as.calcScoreMatrix();\r
-        as.traceAlignment();\r
-\r
-        as.printAlignment(System.out);\r
-        scores[i][j] = (float) as.getMaxScore() / (float) as.getASeq1().length;\r
-        totscore = totscore + scores[i][j];\r
-\r
-        textarea.append(as.getOutput());\r
-        seq = new Sequence(as.getS1().getName(),\r
-                           as.getAStr1(),\r
-                           as.getS1().getStart(),\r
-                           as.getS1().getEnd()\r
-            );\r
-        sequences.addElement(seq);\r
-\r
-        seq = new Sequence(as.getS2().getName(),\r
-                           as.getAStr2(),\r
-                           as.getS2().getStart(),\r
-                           as.getS2().getEnd());\r
-        sequences.addElement(seq);\r
-      }\r
-    }\r
-\r
-    if (count > 2)\r
-    {\r
-      System.out.println(\r
-          "Pairwise alignment scaled similarity score matrix\n");\r
-\r
-      for (int i = 0; i < count; i++)\r
-      {\r
-        jalview.util.Format.print(System.out, "%s \n",\r
-                                  ("" + i) + " " +\r
-                                  seqs[i].getName());\r
-      }\r
-\r
-      System.out.println("\n");\r
-\r
-      for (int i = 0; i < count; i++)\r
-      {\r
-        for (int j = 0; j < i; j++)\r
-        {\r
-          jalview.util.Format.print(System.out, "%7.3f",\r
-                                    scores[i][j] / totscore);\r
-        }\r
-      }\r
-\r
-      System.out.println("\n");\r
-    }\r
-  }\r
-  public void actionPerformed(ActionEvent evt)\r
-  {\r
-    if(evt.getSource()==viewInEditorButton)\r
-      viewInEditorButton_actionPerformed();\r
-  }\r
-\r
-  protected void viewInEditorButton_actionPerformed()\r
-  {\r
-\r
-    Sequence[] seq = new Sequence[sequences.size()];\r
-\r
-    for (int i = 0; i < sequences.size(); i++)\r
-    {\r
-      seq[i] = (Sequence) sequences.elementAt(i);\r
-    }\r
-\r
-    new AlignFrame(new Alignment(seq),\r
-                                   ap.av.applet,\r
-                                   "Pairwise Aligned Sequences",\r
-                                   false);\r
-\r
-  }\r
-  protected ScrollPane scrollPane = new ScrollPane();\r
-  protected TextArea textarea = new TextArea();\r
-  protected Button viewInEditorButton = new Button();\r
-  Panel jPanel1 = new Panel();\r
-  BorderLayout borderLayout1 = new BorderLayout();\r
-\r
-  private void jbInit() throws Exception {\r
-      this.setLayout(borderLayout1);\r
-      textarea.setFont(new java.awt.Font("Monospaced", 0, 12));\r
-      textarea.setText("");\r
-      viewInEditorButton.setFont(new java.awt.Font("Verdana", 0, 12));\r
-      viewInEditorButton.setLabel("View in alignment editor");\r
-      viewInEditorButton.addActionListener(this);\r
-      this.add(scrollPane, BorderLayout.CENTER);\r
-      scrollPane.add(textarea);\r
-      this.add(jPanel1, BorderLayout.SOUTH);\r
-      jPanel1.add(viewInEditorButton, null);\r
-  }\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+package jalview.appletgui;
+
+import java.util.*;
+
+import java.awt.event.*;
+
+import jalview.analysis.*;
+import jalview.datamodel.*;
+import java.awt.*;
+
+public class PairwiseAlignPanel
+    extends Panel implements ActionListener
+{
+  Vector sequences = new Vector();
+  AlignmentPanel ap;
+
+  public PairwiseAlignPanel(AlignmentPanel ap)
+  {
+    try
+    {
+      jbInit();
+    }
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+    this.ap = ap;
+    sequences = new Vector();
+
+    SequenceI[] seqs;
+    String[] seqStrings = ap.av.getViewAsString(true);
+
+    if (ap.av.getSelectionGroup() == null)
+    {
+      seqs = ap.av.alignment.getSequencesArray();
+    }
+    else
+    {
+      seqs = ap.av.getSelectionGroup().getSequencesInOrder(ap.av.alignment);
+    }
+
+    float scores[][] = new float[seqs.length][seqs.length];
+    double totscore = 0;
+    int count = ap.av.getSelectionGroup().getSize(false);
+    String type=(ap.av.alignment.isNucleotide()) ? AlignSeq.DNA : AlignSeq.PEP;
+    Sequence seq;
+
+    for (int i = 1; i < count; i++)
+    {
+      for (int j = 0; j < i; j++)
+      {
+
+        AlignSeq as = new AlignSeq(seqs[i], seqStrings[i],
+                                   seqs[j], seqStrings[j], type);
+
+        if (as.s1str.length() == 0 || as.s2str.length() == 0)
+        {
+          continue;
+        }
+
+        as.calcScoreMatrix();
+        as.traceAlignment();
+
+        as.printAlignment(System.out);
+        scores[i][j] = (float) as.getMaxScore() / (float) as.getASeq1().length;
+        totscore = totscore + scores[i][j];
+
+        textarea.append(as.getOutput());
+        seq = new Sequence(as.getS1().getName(),
+                           as.getAStr1(),
+                           as.getS1().getStart(),
+                           as.getS1().getEnd()
+            );
+        sequences.addElement(seq);
+
+        seq = new Sequence(as.getS2().getName(),
+                           as.getAStr2(),
+                           as.getS2().getStart(),
+                           as.getS2().getEnd());
+        sequences.addElement(seq);
+      }
+    }
+
+    if (count > 2)
+    {
+      System.out.println(
+          "Pairwise alignment scaled similarity score matrix\n");
+
+      for (int i = 0; i < count; i++)
+      {
+        jalview.util.Format.print(System.out, "%s \n",
+                                  ("" + i) + " " +
+                                  seqs[i].getName());
+      }
+
+      System.out.println("\n");
+
+      for (int i = 0; i < count; i++)
+      {
+        for (int j = 0; j < i; j++)
+        {
+          jalview.util.Format.print(System.out, "%7.3f",
+                                    scores[i][j] / totscore);
+        }
+      }
+
+      System.out.println("\n");
+    }
+  }
+  public void actionPerformed(ActionEvent evt)
+  {
+    if(evt.getSource()==viewInEditorButton)
+      viewInEditorButton_actionPerformed();
+  }
+
+  protected void viewInEditorButton_actionPerformed()
+  {
+
+    Sequence[] seq = new Sequence[sequences.size()];
+
+    for (int i = 0; i < sequences.size(); i++)
+    {
+      seq[i] = (Sequence) sequences.elementAt(i);
+    }
+
+    new AlignFrame(new Alignment(seq),
+                                   ap.av.applet,
+                                   "Pairwise Aligned Sequences",
+                                   false);
+
+  }
+  protected ScrollPane scrollPane = new ScrollPane();
+  protected TextArea textarea = new TextArea();
+  protected Button viewInEditorButton = new Button();
+  Panel jPanel1 = new Panel();
+  BorderLayout borderLayout1 = new BorderLayout();
+
+  private void jbInit() throws Exception {
+      this.setLayout(borderLayout1);
+      textarea.setFont(new java.awt.Font("Monospaced", 0, 12));
+      textarea.setText("");
+      viewInEditorButton.setFont(new java.awt.Font("Verdana", 0, 12));
+      viewInEditorButton.setLabel("View in alignment editor");
+      viewInEditorButton.addActionListener(this);
+      this.add(scrollPane, BorderLayout.CENTER);
+      scrollPane.add(textarea);
+      this.add(jPanel1, BorderLayout.SOUTH);
+      jPanel1.add(viewInEditorButton, null);
+  }
+
+}
index 49e3543..a9e80b8 100755 (executable)
-/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
-*/\r
-package jalview.datamodel;\r
-\r
-import jalview.schemes.*;\r
-\r
-\r
-\r
-/**\r
- * DOCUMENT ME!\r
- *\r
- * @author $author$\r
- * @version $Revision$\r
- */\r
-public class BinarySequence extends Sequence\r
-{\r
-    int[] binary;\r
-    double[] dbinary;\r
-\r
-    /**\r
-     * Creates a new BinarySequence object.\r
-     *\r
-     * @param s DOCUMENT ME!\r
-     */\r
-    public BinarySequence(String s)\r
-    {\r
-        super("", s, 0, s.length());\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     */\r
-    public void encode()\r
-    {\r
-        // Set all matrix to 0\r
-        dbinary = new double[getSequence().length * 21];\r
-\r
-        int nores = 21;\r
-\r
-        for (int i = 0; i < dbinary.length; i++)\r
-        {\r
-            dbinary[i] = 0.0;\r
-        }\r
-\r
-        for (int i = 0; i < getSequence().length; i++)\r
-        {\r
-            int aanum = 20;\r
-\r
-            try\r
-            {\r
-                aanum = ResidueProperties.aaIndex[getCharAt(i)];\r
-            }\r
-            catch (NullPointerException e)\r
-            {\r
-                aanum = 20;\r
-            }\r
-\r
-            if (aanum > 20)\r
-            {\r
-                aanum = 20;\r
-            }\r
-\r
-            dbinary[(i * nores) + aanum] = 1.0;\r
-        }\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     */\r
-    public void blosumEncode()\r
-    {\r
-        // Set all matrix to 0\r
-        dbinary = new double[getSequence().length * 21];\r
-\r
-        int nores = 21;\r
-\r
-        //for (int i = 0; i < dbinary.length; i++) {\r
-        //  dbinary[i] = 0.0;\r
-        //}\r
-        for (int i = 0; i < getSequence().length; i++)\r
-        {\r
-            int aanum = 20;\r
-\r
-            try\r
-            {\r
-                aanum = ResidueProperties.aaIndex[getCharAt(i)];\r
-            }\r
-            catch (NullPointerException e)\r
-            {\r
-                aanum = 20;\r
-            }\r
-\r
-            if (aanum > 20)\r
-            {\r
-                aanum = 20;\r
-            }\r
-\r
-            // Do the blosum thing\r
-            for (int j = 0; j < 20; j++)\r
-            {\r
-                dbinary[(i * nores) + j] = ResidueProperties.getBLOSUM62()[aanum][j];\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public String toBinaryString()\r
-    {\r
-        String out = "";\r
-\r
-        for (int i = 0; i < binary.length; i++)\r
-        {\r
-            out += (new Integer(binary[i])).toString();\r
-\r
-            if (i < (binary.length - 1))\r
-            {\r
-                out += " ";\r
-            }\r
-        }\r
-\r
-        return out;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public double[] getDBinary()\r
-    {\r
-        return dbinary;\r
-    }\r
-\r
-}\r
+/*
+* Jalview - A Sequence Alignment Editor and Viewer
+* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+*
+* This program 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 2
+* of the License, or (at your option) any later version.
+*
+* This program 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 this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+*/
+package jalview.datamodel;
+
+import jalview.schemes.*;
+
+
+
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class BinarySequence extends Sequence
+{
+    int[] binary;
+    double[] dbinary;
+
+    /**
+     * Creates a new BinarySequence object.
+     *
+     * @param s DOCUMENT ME!
+     */
+    public BinarySequence(String s)
+    {
+        super("", s, 0, s.length());
+    }
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void encode()
+    {
+        // Set all matrix to 0
+        dbinary = new double[getSequence().length * 21];
+
+        int nores = 21;
+
+        for (int i = 0; i < dbinary.length; i++)
+        {
+            dbinary[i] = 0.0;
+        }
+
+        for (int i = 0; i < getSequence().length; i++)
+        {
+            int aanum = 20;
+
+            try
+            {
+                aanum = ResidueProperties.aaIndex[getCharAt(i)];
+            }
+            catch (NullPointerException e)
+            {
+                aanum = 20;
+            }
+
+            if (aanum > 20)
+            {
+                aanum = 20;
+            }
+
+            dbinary[(i * nores) + aanum] = 1.0;
+        }
+    }
+    /**
+     * ancode using substitution matrix given in matrix
+     * @param matrix
+     */
+    public void matrixEncode(ScoreMatrix matrix) {
+      matrixEncode(matrix.isDNA()?ResidueProperties.nucleotideIndex: ResidueProperties.aaIndex, matrix.getMatrix());
+    }
+    /**
+     * DOCUMENT ME!
+     */
+    public void blosumEncode()
+    {
+      matrixEncode(ResidueProperties.aaIndex, ResidueProperties.getBLOSUM62());
+    }
+    private void matrixEncode(int[] aaIndex, int[][] matrix) {
+      // Set all matrix to 0
+        dbinary = new double[getSequence().length * 21];
+
+        int nores = 21;
+
+        //for (int i = 0; i < dbinary.length; i++) {
+        //  dbinary[i] = 0.0;
+        //}
+        for (int i = 0; i < getSequence().length; i++)
+        {
+            int aanum = 20;
+
+            try
+            {
+                aanum = aaIndex[getCharAt(i)];
+            }
+            catch (NullPointerException e)
+            {
+                aanum = 20;
+            }
+
+            if (aanum > 20)
+            {
+                aanum = 20;
+            }
+
+            // Do the blosum thing
+       
+            for (int j = 0; j < 20; j++)
+            {
+                dbinary[(i * nores) + j] = matrix[aanum][j];
+            }
+        }
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public String toBinaryString()
+    {
+        String out = "";
+
+        for (int i = 0; i < binary.length; i++)
+        {
+            out += (new Integer(binary[i])).toString();
+
+            if (i < (binary.length - 1))
+            {
+                out += " ";
+            }
+        }
+
+        return out;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public double[] getDBinary()
+    {
+        return dbinary;
+    }
+
+}
index 248a54c..30effb7 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-package jalview.gui;\r
-\r
-import jalview.analysis.*;\r
-\r
-import jalview.datamodel.*;\r
-\r
-import jalview.jbgui.*;\r
-\r
-import java.awt.event.*;\r
-\r
-import java.util.*;\r
-\r
-\r
-/**\r
- * DOCUMENT ME!\r
- *\r
- * @author $author$\r
- * @version $Revision$\r
- */\r
-public class PairwiseAlignPanel extends GPairwiseAlignPanel\r
-{\r
-\r
-    AlignViewport av;\r
-    Vector sequences;\r
-\r
-    /**\r
-     * Creates a new PairwiseAlignPanel object.\r
-     *\r
-     * @param av DOCUMENT ME!\r
-     */\r
-    public PairwiseAlignPanel(AlignViewport av)\r
-    {\r
-        super();\r
-        this.av = av;\r
-\r
-        sequences = new Vector();\r
-\r
-        SequenceI [] seqs;\r
-        String []  seqStrings = av.getViewAsString(true);\r
-\r
-        if(av.getSelectionGroup()==null)\r
-        {\r
-          seqs = av.alignment.getSequencesArray();\r
-        }\r
-        else\r
-        {\r
-          seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);\r
-        }\r
-\r
-\r
-        float[][] scores = new float[seqs.length][seqs.length];\r
-        double totscore = 0;\r
-        int count = seqs.length;\r
-\r
-        Sequence seq;\r
-\r
-        for (int i = 1; i < count; i++)\r
-        {\r
-            for (int j = 0; j < i; j++)\r
-            {\r
-\r
-                AlignSeq as = new AlignSeq(seqs[i], seqStrings[i],\r
-                        seqs[j], seqStrings[j], "pep");\r
-\r
-                if(as.s1str.length()==0 || as.s2str.length()==0)\r
-                {\r
-                  continue;\r
-                }\r
-\r
-                as.calcScoreMatrix();\r
-                as.traceAlignment();\r
-\r
-\r
-                as.printAlignment(System.out);\r
-                scores[i][j] = (float) as.getMaxScore() / (float) as.getASeq1().length;\r
-                totscore = totscore + scores[i][j];\r
-\r
-                textarea.append(as.getOutput());\r
-                seq = new Sequence(as.getS1().getName(),\r
-                                   as.getAStr1(),\r
-                                   as.getS1().getStart(),\r
-                                   as.getS1().getEnd()\r
-                );\r
-                sequences.add(seq);\r
-\r
-                seq = new Sequence(as.getS2().getName(),\r
-                                   as.getAStr2(),\r
-                                   as.getS2().getStart(),\r
-                                   as.getS2().getEnd() );\r
-                sequences.add(seq);\r
-            }\r
-        }\r
-\r
-        if (count > 2)\r
-        {\r
-            System.out.println(\r
-                "Pairwise alignment scaled similarity score matrix\n");\r
-\r
-            for (int i = 0; i < count; i++)\r
-            {\r
-                jalview.util.Format.print(System.out, "%s \n",\r
-                    ("" + i) + " " +\r
-                    seqs[i].getName());\r
-            }\r
-\r
-            System.out.println("\n");\r
-\r
-            for (int i = 0; i < count; i++)\r
-            {\r
-                for (int j = 0; j < i; j++)\r
-                {\r
-                    jalview.util.Format.print(System.out, "%7.3f",\r
-                        scores[i][j] / totscore);\r
-                }\r
-            }\r
-\r
-            System.out.println("\n");\r
-        }\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param e DOCUMENT ME!\r
-     */\r
-    protected void viewInEditorButton_actionPerformed(ActionEvent e)\r
-    {\r
-        Sequence[] seq = new Sequence[sequences.size()];\r
-\r
-        for (int i = 0; i < sequences.size(); i++)\r
-        {\r
-            seq[i] = (Sequence) sequences.elementAt(i);\r
-        }\r
-\r
-        AlignFrame af = new AlignFrame(new Alignment(seq),\r
-                                           AlignFrame.DEFAULT_WIDTH,\r
-                                           AlignFrame.DEFAULT_HEIGHT);\r
-\r
-        Desktop.addInternalFrame(af, "Pairwise Aligned Sequences",\r
-            AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);\r
-    }\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+package jalview.gui;
+
+import jalview.analysis.*;
+
+import jalview.datamodel.*;
+
+import jalview.jbgui.*;
+
+import java.awt.event.*;
+
+import java.util.*;
+
+
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class PairwiseAlignPanel extends GPairwiseAlignPanel
+{
+
+    AlignViewport av;
+    Vector sequences;
+
+    /**
+     * Creates a new PairwiseAlignPanel object.
+     *
+     * @param av DOCUMENT ME!
+     */
+    public PairwiseAlignPanel(AlignViewport av)
+    {
+        super();
+        this.av = av;
+
+        sequences = new Vector();
+
+        SequenceI [] seqs;
+        String []  seqStrings = av.getViewAsString(true);
+
+        if(av.getSelectionGroup()==null)
+        {
+          seqs = av.alignment.getSequencesArray();
+        }
+        else
+        {
+          seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);
+        }
+
+        String type=(av.alignment.isNucleotide()) ? AlignSeq.DNA : AlignSeq.PEP;
+        
+        float[][] scores = new float[seqs.length][seqs.length];
+        double totscore = 0;
+        int count = seqs.length;
+
+        Sequence seq;
+
+        for (int i = 1; i < count; i++)
+        {
+            for (int j = 0; j < i; j++)
+            {
+
+                AlignSeq as = new AlignSeq(seqs[i], seqStrings[i],
+                        seqs[j], seqStrings[j], type);
+
+                if(as.s1str.length()==0 || as.s2str.length()==0)
+                {
+                  continue;
+                }
+
+                as.calcScoreMatrix();
+                as.traceAlignment();
+
+
+                as.printAlignment(System.out);
+                scores[i][j] = (float) as.getMaxScore() / (float) as.getASeq1().length;
+                totscore = totscore + scores[i][j];
+
+                textarea.append(as.getOutput());
+                seq = new Sequence(as.getS1().getName(),
+                                   as.getAStr1(),
+                                   as.getS1().getStart(),
+                                   as.getS1().getEnd()
+                );
+                sequences.add(seq);
+
+                seq = new Sequence(as.getS2().getName(),
+                                   as.getAStr2(),
+                                   as.getS2().getStart(),
+                                   as.getS2().getEnd() );
+                sequences.add(seq);
+            }
+        }
+
+        if (count > 2)
+        {
+            System.out.println(
+                "Pairwise alignment scaled similarity score matrix\n");
+
+            for (int i = 0; i < count; i++)
+            {
+                jalview.util.Format.print(System.out, "%s \n",
+                    ("" + i) + " " +
+                    seqs[i].getName());
+            }
+
+            System.out.println("\n");
+
+            for (int i = 0; i < count; i++)
+            {
+                for (int j = 0; j < i; j++)
+                {
+                    jalview.util.Format.print(System.out, "%7.3f",
+                        scores[i][j] / totscore);
+                }
+            }
+
+            System.out.println("\n");
+        }
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param e DOCUMENT ME!
+     */
+    protected void viewInEditorButton_actionPerformed(ActionEvent e)
+    {
+        Sequence[] seq = new Sequence[sequences.size()];
+
+        for (int i = 0; i < sequences.size(); i++)
+        {
+            seq[i] = (Sequence) sequences.elementAt(i);
+        }
+
+        AlignFrame af = new AlignFrame(new Alignment(seq),
+                                           AlignFrame.DEFAULT_WIDTH,
+                                           AlignFrame.DEFAULT_HEIGHT);
+
+        Desktop.addInternalFrame(af, "Pairwise Aligned Sequences",
+            AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
+    }
+}
index 1015073..5604ca3 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-package jalview.schemes;\r
-\r
-import java.util.*;\r
-\r
-import java.awt.*;\r
-\r
-public class ResidueProperties\r
-{\r
-  //Stores residue codes/names and colours and other things\r
-  public static final int [] aaIndex; // aaHash version 2.1.1 and below\r
-  public static final int [] nucleotideIndex;\r
-  public static final Hashtable aa3Hash = new Hashtable();\r
-  public static final Hashtable aa2Triplet = new Hashtable();\r
-  public static final Hashtable nucleotideName = new Hashtable();\r
-\r
-\r
-  static\r
-  {\r
-    aaIndex = new int[132];\r
-    for(int i=0; i<132; i++)\r
-      aaIndex[i] = -1;\r
-\r
-    aaIndex['A'] = 0;\r
-    aaIndex['R'] = 1;\r
-    aaIndex['N'] = 2;\r
-    aaIndex['D'] = 3;\r
-    aaIndex['C'] = 4;\r
-    aaIndex['Q'] = 5;\r
-    aaIndex['E'] = 6;\r
-    aaIndex['G'] = 7;\r
-    aaIndex['H'] = 8;\r
-    aaIndex['I'] = 9;\r
-    aaIndex['L'] = 10;\r
-    aaIndex['K'] = 11;\r
-    aaIndex['M'] = 12;\r
-    aaIndex['F'] = 13;\r
-    aaIndex['P'] = 14;\r
-    aaIndex['S'] = 15;\r
-    aaIndex['T'] = 16;\r
-    aaIndex['W'] = 17;\r
-    aaIndex['Y'] = 18;\r
-    aaIndex['V'] = 19;\r
-    aaIndex['B'] = 20;\r
-    aaIndex['Z'] = 21;\r
-    aaIndex['X'] = 22;\r
-    aaIndex['U'] = 22;\r
-    aaIndex['a'] = 0;\r
-    aaIndex['r'] = 1;\r
-    aaIndex['n'] = 2;\r
-    aaIndex['d'] = 3;\r
-    aaIndex['c'] = 4;\r
-    aaIndex['q'] = 5;\r
-    aaIndex['e'] = 6;\r
-    aaIndex['g'] = 7;\r
-    aaIndex['h'] = 8;\r
-    aaIndex['i'] = 9;\r
-    aaIndex['l'] = 10;\r
-    aaIndex['k'] = 11;\r
-    aaIndex['m'] = 12;\r
-    aaIndex['f'] = 13;\r
-    aaIndex['p'] = 14;\r
-    aaIndex['s'] = 15;\r
-    aaIndex['t'] = 16;\r
-    aaIndex['w'] = 17;\r
-    aaIndex['y'] = 18;\r
-    aaIndex['v'] = 19;\r
-    aaIndex['b'] = 20;\r
-    aaIndex['z'] = 21;\r
-    aaIndex['x'] = 22;\r
-    aaIndex['u'] = 22;\r
-    aaIndex['-'] = 23;\r
-    aaIndex['*'] = 23;\r
-    aaIndex['.'] = 23;\r
-    aaIndex[' '] = 23;\r
-  }\r
-\r
-  static\r
-  {\r
-    nucleotideIndex = new int[132];\r
-    for (int i = 0; i < 132; i++)\r
-      nucleotideIndex[i] = -1;\r
-\r
-    nucleotideIndex['A'] = 0;\r
-    nucleotideIndex['a'] = 0;\r
-    nucleotideIndex['C'] = 1;\r
-    nucleotideIndex['c'] = 1;\r
-    nucleotideIndex['G'] = 2;\r
-    nucleotideIndex['g'] = 2;\r
-    nucleotideIndex['T'] = 3;\r
-    nucleotideIndex['t'] = 3;\r
-    nucleotideIndex['U'] = 4;\r
-    nucleotideIndex['u'] = 4;\r
-    nucleotideIndex['I'] = 5;\r
-    nucleotideIndex['i'] = 5;\r
-    nucleotideIndex['X'] = 6;\r
-    nucleotideIndex['x'] = 6;\r
-    nucleotideIndex['R'] = 7;\r
-    nucleotideIndex['r'] = 7;\r
-    nucleotideIndex['Y'] = 8;\r
-    nucleotideIndex['y'] = 8;\r
-    nucleotideIndex['N'] = 9;\r
-    nucleotideIndex['n'] = 9;\r
-\r
-\r
-    nucleotideName.put("A", "Adenine");\r
-    nucleotideName.put("a", "Adenine");\r
-    nucleotideName.put("G", "Guanine");\r
-    nucleotideName.put("g", "Guanine");\r
-    nucleotideName.put("C", "Cytosine");\r
-    nucleotideName.put("c", "Cytosine");\r
-    nucleotideName.put("T", "Thymine");\r
-    nucleotideName.put("t", "Thymine");\r
-    nucleotideName.put("U", "Uracil");\r
-    nucleotideName.put("u", "Uracil");\r
-    nucleotideName.put("I", "Inosine");\r
-    nucleotideName.put("i", "Inosine");\r
-    nucleotideName.put("X", "Xanthine");\r
-    nucleotideName.put("x", "Xanthine");\r
-    nucleotideName.put("R", "Unknown Purine");\r
-    nucleotideName.put("r", "Unknown Purine");\r
-    nucleotideName.put("Y", "Unknown Pyrimidine");\r
-    nucleotideName.put("y", "Unknown Pyrimidine");\r
-    nucleotideName.put("N", "Unknown");\r
-    nucleotideName.put("n", "Unknown");\r
-  }\r
-\r
-\r
-  static\r
-  {\r
-    aa3Hash.put("ALA", new Integer(0));\r
-    aa3Hash.put("ARG", new Integer(1));\r
-    aa3Hash.put("ASN", new Integer(2));\r
-    aa3Hash.put("ASP", new Integer(3)); //D\r
-    aa3Hash.put("CYS", new Integer(4));\r
-    aa3Hash.put("GLN", new Integer(5)); //Q\r
-    aa3Hash.put("GLU", new Integer(6)); // E\r
-    aa3Hash.put("GLY", new Integer(7));\r
-    aa3Hash.put("HIS", new Integer(8));\r
-    aa3Hash.put("ILE", new Integer(9));\r
-    aa3Hash.put("LEU", new Integer(10));\r
-    aa3Hash.put("LYS", new Integer(11));\r
-    aa3Hash.put("MET", new Integer(12));\r
-    aa3Hash.put("PHE", new Integer(13));\r
-    aa3Hash.put("PRO", new Integer(14));\r
-    aa3Hash.put("SER", new Integer(15));\r
-    aa3Hash.put("THR", new Integer(16));\r
-    aa3Hash.put("TRP", new Integer(17));\r
-    aa3Hash.put("TYR", new Integer(18));\r
-    aa3Hash.put("VAL", new Integer(19));\r
-    // IUB Nomenclature for ambiguous peptides\r
-    aa3Hash.put("ASX", new Integer(20)); // "B";\r
-    aa3Hash.put("GLX", new Integer(21)); // X\r
-    aa3Hash.put("XAA", new Integer(22));// X unknown\r
-    aa3Hash.put("-", new Integer(23));\r
-    aa3Hash.put("*", new Integer(23));\r
-    aa3Hash.put(".", new Integer(23));\r
-    aa3Hash.put(" ", new Integer(23));\r
-    aa3Hash.put("Gap", new Integer(23));\r
-  }\r
-\r
-  static\r
-  {\r
-    aa2Triplet.put("A", "ALA");\r
-    aa2Triplet.put("a", "ALA");\r
-    aa2Triplet.put("R", "ARG");\r
-    aa2Triplet.put("r", "ARG");\r
-    aa2Triplet.put("N", "ASN");\r
-    aa2Triplet.put("n", "ASN");\r
-    aa2Triplet.put("D", "ASP");\r
-    aa2Triplet.put("d", "ASP");\r
-    aa2Triplet.put("C", "CYS");\r
-    aa2Triplet.put("c", "CYS");\r
-    aa2Triplet.put("Q", "GLN");\r
-    aa2Triplet.put("q", "GLN");\r
-    aa2Triplet.put("E", "GLU");\r
-    aa2Triplet.put("e", "GLU");\r
-    aa2Triplet.put("G", "GLY");\r
-    aa2Triplet.put("g", "GLY");\r
-    aa2Triplet.put("H", "HIS");\r
-    aa2Triplet.put("h", "HIS");\r
-    aa2Triplet.put("I", "ILE");\r
-    aa2Triplet.put("i", "ILE");\r
-    aa2Triplet.put("L", "LEU");\r
-    aa2Triplet.put("l", "LEU");\r
-    aa2Triplet.put("K", "LYS");\r
-    aa2Triplet.put("k", "LYS");\r
-    aa2Triplet.put("M", "MET");\r
-    aa2Triplet.put("m", "MET");\r
-    aa2Triplet.put("F", "PHE");\r
-    aa2Triplet.put("f", "PHE");\r
-    aa2Triplet.put("P", "PRO");\r
-    aa2Triplet.put("p", "PRO");\r
-    aa2Triplet.put("S", "SER");\r
-    aa2Triplet.put("s", "SER");\r
-    aa2Triplet.put("T", "THR");\r
-    aa2Triplet.put("t", "THR");\r
-    aa2Triplet.put("W", "TRP");\r
-    aa2Triplet.put("w", "TRP");\r
-    aa2Triplet.put("Y", "TYR");\r
-    aa2Triplet.put("y", "TYR");\r
-    aa2Triplet.put("V", "VAL");\r
-    aa2Triplet.put("v", "VAL");\r
-  }\r
-\r
-  public static final String[] aa =\r
-      {\r
-      "A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F",\r
-      "P", "S", "T", "W", "Y", "V", "B", "Z", "X", "_", "*", ".", " "\r
-  };\r
-  public static final Color midBlue = new Color(100, 100, 255);\r
-  public static final Vector scaleColours = new Vector();\r
-\r
-  static\r
-  {\r
-    scaleColours.addElement(new Color(114, 0, 147));\r
-    scaleColours.addElement(new Color(156, 0, 98));\r
-    scaleColours.addElement(new Color(190, 0, 0));\r
-    scaleColours.addElement(Color.red);\r
-    scaleColours.addElement(new Color(255, 125, 0));\r
-    scaleColours.addElement(Color.orange);\r
-    scaleColours.addElement(new Color(255, 194, 85));\r
-    scaleColours.addElement(Color.yellow);\r
-    scaleColours.addElement(new Color(255, 255, 181));\r
-    scaleColours.addElement(Color.white);\r
-  }\r
-\r
-  public static final Color[] taylor =\r
-      {\r
-      new Color(204, 255, 0), // A  Greenish-yellowy-yellow\r
-      new Color(0, 0, 255), // R  Blueish-bluey-blue\r
-      new Color(204, 0, 255), // N  Blueish-reddy-blue\r
-      new Color(255, 0, 0), // D  Reddish-reddy-red\r
-      new Color(255, 255, 0), // C  Yellowish-yellowy-yellow\r
-      new Color(255, 0, 204), // Q  Reddish-bluey-red\r
-      new Color(255, 0, 102), // E  Blueish-reddy-red\r
-      new Color(255, 153, 0), // G  Yellowy-reddy-yellow\r
-      new Color(0, 102, 255), // H  Greenish-bluey-blue\r
-      new Color(102, 255, 0), // I  Greenish-yellowy-green\r
-      new Color(51, 255, 0), // L  Yellowish-greeny-green\r
-      new Color(102, 0, 255), // K  Reddish-bluey-blue\r
-      new Color(0, 255, 0), // M  Greenish-greeny-green\r
-      new Color(0, 255, 102), // F  Blueish-greeny-green\r
-      new Color(255, 204, 0), // P  Reddish-yellowy-yellow\r
-      new Color(255, 51, 0), // S  Yellowish-reddy-red\r
-      new Color(255, 102, 0), // T  Reddish-yellowy-red\r
-      new Color(0, 204, 255), // W  Blueish-greeny-green\r
-      new Color(0, 255, 204), // Y  Greenish-bluey-green\r
-      new Color(153, 255, 0), // V  Yellowish-greeny-yellow\r
-      Color.white, // B\r
-      Color.white, // Z\r
-      Color.white, // X\r
-      Color.white, // -\r
-      Color.white, // *\r
-      Color.white // .\r
-  };\r
-  public static final Color[] nucleotide =\r
-      {\r
-      new Color(100, 247, 63), // A\r
-      new Color(255, 179, 64), // C\r
-      new Color(235, 65, 60), // G\r
-      new Color(60, 136, 238), // T\r
-      new Color(60, 136, 238) // U\r
-  };\r
-  public static final Color[] color =\r
-      {\r
-      Color.pink, // A\r
-      midBlue, // R\r
-      Color.green, // N\r
-      Color.red, // D\r
-      Color.yellow, // C\r
-      Color.green, // Q\r
-      Color.red, // E\r
-      Color.magenta, // G\r
-      Color.red, // H\r
-      Color.pink, // I\r
-      Color.pink, // L\r
-      midBlue, // K\r
-      Color.pink, // M\r
-      Color.orange, // F\r
-      Color.magenta, // P\r
-      Color.green, // S\r
-      Color.green, // T\r
-      Color.orange, // W\r
-      Color.orange, // Y\r
-      Color.pink, // V\r
-      Color.white, // B\r
-      Color.white, // Z\r
-      Color.white, // X\r
-      Color.white, // -\r
-      Color.white, // *\r
-      Color.white, // .\r
-      Color.white // ' '\r
-  };\r
-\r
-  // Dunno where I got these numbers from\r
-  public static final double[] hyd2 =\r
-      {\r
-      0.62, //A\r
-      0.29, //R\r
-      -0.90, //N\r
-      -0.74, //D\r
-      1.19, //C\r
-      0.48, //Q\r
-      -0.40, //E\r
-      1.38, //G\r
-      -1.50, //H\r
-      1.06, //I\r
-      0.64, //L\r
-      -0.78, //K\r
-      0.12, //M\r
-      -0.85, //F\r
-      -2.53, //P\r
-      -0.18, //S\r
-      -0.05, //T\r
-      1.08, //W\r
-      0.81, //Y\r
-      0.0, //V\r
-      0.26, //B\r
-      0.0, //Z\r
-      0.0 //X\r
-  };\r
-  public static final double[] helix =\r
-      {\r
-      1.42, 0.98, 0.67, 1.01, 0.70, 1.11, 1.51, 0.57, 1.00, 1.08, 1.21, 1.16,\r
-      1.45, 1.13, 0.57, 0.77, 0.83, 1.08, 0.69, 1.06, 0.84, 1.31, 1.00, 0.0\r
-  };\r
-  public static final double helixmin = 0.57;\r
-  public static final double helixmax = 1.51;\r
-  public static final double[] strand =\r
-      {\r
-      0.83, 0.93, 0.89, 0.54, 1.19, 1.10, 0.37, 0.75, 0.87, 1.60, 1.30, 0.74,\r
-      1.05, 1.38, 0.55, 0.75, 1.19, 1.37, 1.47, 1.70, 0.72, 0.74, 1.0, 0.0\r
-  };\r
-  public static final double strandmin = 0.37;\r
-  public static final double strandmax = 1.7;\r
-  public static final double[] turn =\r
-      {\r
-      0.66, 0.95, 1.56, 1.46, 1.19, 0.98, 0.74, 1.56, 0.95, 0.47, 0.59, 1.01,\r
-      0.60, 0.60, 1.52, 1.43, 0.96, 0.96, 1.14, 0.50, 1.51, 0.86, 1.00, 0, 0\r
-  };\r
-  public static final double turnmin = 0.47;\r
-  public static final double turnmax = 1.56;\r
-  public static final double[] buried =\r
-      {\r
-      1.7, 0.1, 0.4, 0.4, 4.6, 0.3, 0.3, 1.8, 0.8, 3.1, 2.4, 0.05, 1.9, 2.2,\r
-      0.6, 0.8, 0.7, 1.6, 0.5, 2.9, 0.4, 0.3, 1.358, 0.00\r
-  };\r
-  public static final double buriedmin = 0.05;\r
-  public static final double buriedmax = 4.6;\r
-\r
-  // This is hydropathy index\r
-  // Kyte, J., and Doolittle, R.F., J. Mol. Biol.\r
-  // 1157, 105-132, 1982\r
-  public static final double[] hyd =\r
-      {\r
-      1.8, -4.5, -3.5, -3.5, 2.5, -3.5, -3.5, -0.4, -3.2, 4.5, 3.8, -3.9, 1.9,\r
-      2.8, -1.6, -0.8, -0.7, -0.9, -1.3, 4.2, -3.5, -3.5, -0.49, 0.0\r
-  };\r
-  public static final double hydmax = 4.5;\r
-  public static final double hydmin = -3.9;\r
-\r
-  //public static final double hydmax = 1.38;\r
-  //public static final double hydmin = -2.53;\r
-  static final int[][] BLOSUM62 =\r
-      {\r
-      {\r
-      4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3,\r
-      -2, 0, -2, -1, 0, -4\r
-  },\r
-      {\r
-      -1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2,\r
-      -3, -1, 0, -1, -4\r
-  },\r
-      {\r
-      -2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3,\r
-      3, 0, -1, -4\r
-  },\r
-      {\r
-      -2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4,\r
-      -3, -3, 4, 1, -1, -4\r
-  },\r
-      {\r
-      0, 3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2,\r
-      -2, -1, -3, -3, -2, -4\r
-  },\r
-      {\r
-      -1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1,\r
-      -2, 0, 3, -1, -4\r
-  },\r
-      {\r
-      -1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2,\r
-      -2, 1, 4, -1, -4\r
-  },\r
-      {\r
-      0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2,\r
-      -3, -3, -1, -2, -1, -4\r
-  },\r
-      {\r
-      -2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2,\r
-      -3, 0, 0, -1, -4\r
-  },\r
-      {\r
-      -1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3,\r
-      -1, 3, -3, -3, -1, -4\r
-  },\r
-      {\r
-      -1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2,\r
-      -1, 1, -4, -3, -1, -4\r
-  },\r
-      {\r
-      -1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2,\r
-      -2, 0, 1, -1, -4\r
-  },\r
-      {\r
-      -1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1,\r
-      -1, 1, -3, -1, -1, -4\r
-  },\r
-      {\r
-      -2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3,\r
-      -1, -3, -3, -1, -4\r
-  },\r
-      {\r
-      -1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1,\r
-      -4, -3, -2, -2, -1, -2, -4\r
-  },\r
-      {\r
-      1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2,\r
-      -2, 0, 0, 0, -4\r
-  },\r
-      {\r
-      0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2,\r
-      -2, 0, -1, -1, 0, -4\r
-  },\r
-      {\r
-      -3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2,\r
-      11, 2, -3, -4, -3, -2, -4\r
-  },\r
-      {\r
-      -2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2,\r
-      7, -1, -3, -2, -1, -4\r
-  },\r
-      {\r
-      0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3,\r
-      -1, 4, -3, -2, -1, -4\r
-  },\r
-      {\r
-      -2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3,\r
-      -3, 4, 1, -1, -4\r
-  },\r
-      {\r
-      -1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2,\r
-      -2, 1, 4, -1, -4\r
-  },\r
-      {\r
-      0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2,\r
-      -1, -1, -1, -1, -1, -4\r
-  },\r
-      {\r
-      -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,\r
-      -4, -4, -4, -4, -4, -4, 1\r
-  },\r
-  };\r
-  static final int[][] PAM250 =\r
-      {\r
-      {\r
-      2, -2, 0, 0, -2, 0, 0, 1, -1, -1, -2, -1, -1, -3, 1, 1, 1, -6, -3, 0,\r
-      0, 0, 0, -8\r
-  },\r
-      {\r
-      -2, 6, 0, -1, -4, 1, -1, -3, 2, -2, -3, 3, 0, -4, 0, 0, -1, 2, -4,\r
-      -2, -1, 0, -1, -8\r
-  },\r
-      {\r
-      0, 0, 2, 2, -4, 1, 1, 0, 2, -2, -3, 1, -2, -3, 0, 1, 0, -4, -2, -2,\r
-      2, 1, 0, -8\r
-  },\r
-      {\r
-      0, -1, 2, 4, -5, 2, 3, 1, 1, -2, -4, 0, -3, -6, -1, 0, 0, -7, -4, -2,\r
-      3, 3, -1, -8\r
-  },\r
-      {\r
-      -2, -4, -4, -5, 12, -5, -5, -3, -3, -2, -6, -5, -5, -4, -3, 0, -2,\r
-      -8, 0, -2, -4, -5, -3, -8\r
-  },\r
-      {\r
-      0, 1, 1, 2, -5, 4, 2, -1, 3, -2, -2, 1, -1, -5, 0, -1, -1, -5, -4,\r
-      -2, 1, 3, -1, -8\r
-  },\r
-      {\r
-      0, -1, 1, 3, -5, 2, 4, 0, 1, -2, -3, 0, -2, -5, -1, 0, 0, -7, -4, -2,\r
-      3, 3, -1, -8\r
-  },\r
-      {\r
-      1, -3, 0, 1, -3, -1, 0, 5, -2, -3, -4, -2, -3, -5, 0, 1, 0, -7, -5,\r
-      -1, 0, 0, -1, -8\r
-  },\r
-      {\r
-      -1, 2, 2, 1, -3, 3, 1, -2, 6, -2, -2, 0, -2, -2, 0, -1, -1, -3, 0,\r
-      -2, 1, 2, -1, -8\r
-  },\r
-      {\r
-      -1, -2, -2, -2, -2, -2, -2, -3, -2, 5, 2, -2, 2, 1, -2, -1, 0, -5,\r
-      -1, 4, -2, -2, -1, -8\r
-  },\r
-      {\r
-      -2, -3, -3, -4, -6, -2, -3, -4, -2, 2, 6, -3, 4, 2, -3, -3, -2, -2,\r
-      -1, 2, -3, -3, -1, -8\r
-  },\r
-      {\r
-      -1, 3, 1, 0, -5, 1, 0, -2, 0, -2, -3, 5, 0, -5, -1, 0, 0, -3, -4, -2,\r
-      1, 0, -1, -8\r
-  },\r
-      {\r
-      -1, 0, -2, -3, -5, -1, -2, -3, -2, 2, 4, 0, 6, 0, -2, -2, -1, -4, -2,\r
-      2, -2, -2, -1, -8\r
-  },\r
-      {\r
-      -3, -4, -3, -6, -4, -5, -5, -5, -2, 1, 2, -5, 0, 9, -5, -3, -3, 0, 7,\r
-      -1, -4, -5, -2, -8\r
-  },\r
-      {\r
-      1, 0, 0, -1, -3, 0, -1, 0, 0, -2, -3, -1, -2, -5, 6, 1, 0, -6, -5,\r
-      -1, -1, 0, -1, -8\r
-  },\r
-      {\r
-      1, 0, 1, 0, 0, -1, 0, 1, -1, -1, -3, 0, -2, -3, 1, 2, 1, -2, -3, -1,\r
-      0, 0, 0, -8\r
-  },\r
-      {\r
-      1, -1, 0, 0, -2, -1, 0, 0, -1, 0, -2, 0, -1, -3, 0, 1, 3, -5, -3, 0,\r
-      0, -1, 0, -8\r
-  },\r
-      {\r
-      -6, 2, -4, -7, -8, -5, -7, -7, -3, -5, -2, -3, -4, 0, -6, -2, -5, 17,\r
-      0, -6, -5, -6, -4, -8\r
-  },\r
-      {\r
-      -3, -4, -2, -4, 0, -4, -4, -5, 0, -1, -1, -4, -2, 7, -5, -3, -3, 0,\r
-      10, -2, -3, -4, -2, -8\r
-  },\r
-      {\r
-      0, -2, -2, -2, -2, -2, -2, -1, -2, 4, 2, -2, 2, -1, -1, -1, 0, -6,\r
-      -2, 4, -2, -2, -1, -8\r
-  },\r
-      {\r
-      0, -1, 2, 3, -4, 1, 3, 0, 1, -2, -3, 1, -2, -4, -1, 0, 0, -5, -3, -2,\r
-      3, 2, -1, -8\r
-  },\r
-      {\r
-      0, 0, 1, 3, -5, 3, 3, 0, 2, -2, -3, 0, -2, -5, 0, 0, -1, -6, -4, -2,\r
-      2, 3, -1, -8\r
-  },\r
-      {\r
-      0, -1, 0, -1, -3, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, 0, 0, -4,\r
-      -2, -1, -1, -1, -1, -8\r
-  },\r
-      {\r
-      -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8,\r
-      -8, -8, -8, -8, -8, -8, 1\r
-  },\r
-  };\r
-  public static final Hashtable ssHash = new Hashtable(); // stores the number value of the aa\r
-\r
-  static\r
-  {\r
-    ssHash.put("H", Color.magenta);\r
-    ssHash.put("E", Color.yellow);\r
-    ssHash.put("-", Color.white);\r
-    ssHash.put(".", Color.white);\r
-    ssHash.put("S", Color.cyan);\r
-    ssHash.put("T", Color.blue);\r
-    ssHash.put("G", Color.pink);\r
-    ssHash.put("I", Color.pink);\r
-    ssHash.put("B", Color.yellow);\r
-  }\r
-\r
-  static final int[][] DNA =\r
-      {\r
-      {\r
-      5, -4, -4, -4, 1}, // C\r
-      {\r
-      -4, 5, -4, -4, 1}, // T\r
-      {\r
-      -4, -4, 5, -4, 1}, // A\r
-      {\r
-      -4, -4, -4, 5, 1}, // G\r
-      {\r
-      1, 1, 1, 1, 1}, // -\r
-  };\r
-  public static final Color[] pidColours =\r
-      {\r
-      midBlue, new Color(153, 153, 255),\r
-      //    Color.lightGray,\r
-      new Color(204, 204, 255),\r
-  };\r
-  public static final float[] pidThresholds =\r
-      {\r
-      80, 60, 40, };\r
-  public static Hashtable codonHash = new Hashtable();\r
-  public static Vector Lys = new Vector();\r
-  public static Vector Asn = new Vector();\r
-  public static Vector Gln = new Vector();\r
-  public static Vector His = new Vector();\r
-  public static Vector Glu = new Vector();\r
-  public static Vector Asp = new Vector();\r
-  public static Vector Tyr = new Vector();\r
-  public static Vector Thr = new Vector();\r
-  public static Vector Pro = new Vector();\r
-  public static Vector Ala = new Vector();\r
-  public static Vector Ser = new Vector();\r
-  public static Vector Arg = new Vector();\r
-  public static Vector Gly = new Vector();\r
-  public static Vector Trp = new Vector();\r
-  public static Vector Cys = new Vector();\r
-  public static Vector Ile = new Vector();\r
-  public static Vector Met = new Vector();\r
-  public static Vector Leu = new Vector();\r
-  public static Vector Val = new Vector();\r
-  public static Vector Phe = new Vector();\r
-  public static Vector STOP = new Vector();\r
-\r
-  static\r
-  {\r
-    codonHash.put("K", Lys);\r
-    codonHash.put("N", Asn);\r
-    codonHash.put("Q", Gln);\r
-    codonHash.put("H", His);\r
-    codonHash.put("E", Glu);\r
-    codonHash.put("D", Asp);\r
-    codonHash.put("Y", Tyr);\r
-    codonHash.put("T", Thr);\r
-    codonHash.put("P", Pro);\r
-    codonHash.put("A", Ala);\r
-    codonHash.put("S", Ser);\r
-    codonHash.put("R", Arg);\r
-    codonHash.put("G", Gly);\r
-    codonHash.put("W", Trp);\r
-    codonHash.put("C", Cys);\r
-    codonHash.put("I", Ile);\r
-    codonHash.put("M", Met);\r
-    codonHash.put("L", Leu);\r
-    codonHash.put("V", Val);\r
-    codonHash.put("F", Phe);\r
-    codonHash.put("STOP", STOP);\r
-  }\r
-\r
-  public static Hashtable codonHash2 = new Hashtable();\r
-\r
-  static\r
-  {\r
-    codonHash2.put("AAA", "K");\r
-    codonHash2.put("AAG", "K");\r
-    codonHash2.put("AAC", "N");\r
-    codonHash2.put("AAT", "N");\r
-\r
-    codonHash2.put("CAA", "E");\r
-    codonHash2.put("CAG", "E");\r
-    codonHash2.put("CAC", "H");\r
-    codonHash2.put("CAT", "H");\r
-\r
-    codonHash2.put("GAA", "Q");\r
-    codonHash2.put("GAG", "Q");\r
-    codonHash2.put("GAC", "D");\r
-    codonHash2.put("GAT", "D");\r
-\r
-    codonHash2.put("TAC", "Y");\r
-    codonHash2.put("TAT", "Y");\r
-\r
-    codonHash2.put("ACA", "T");\r
-    codonHash2.put("AAG", "T");\r
-    codonHash2.put("ACC", "T");\r
-    codonHash2.put("ACT", "T");\r
-\r
-    codonHash2.put("CCA", "P");\r
-    codonHash2.put("CCG", "P");\r
-    codonHash2.put("CCC", "P");\r
-    codonHash2.put("CCT", "P");\r
-\r
-    codonHash2.put("GCA", "A");\r
-    codonHash2.put("GCG", "A");\r
-    codonHash2.put("GCC", "A");\r
-    codonHash2.put("GCT", "A");\r
-\r
-    codonHash2.put("TCA", "S");\r
-    codonHash2.put("TCG", "S");\r
-    codonHash2.put("TCC", "S");\r
-    codonHash2.put("TCT", "S");\r
-    codonHash2.put("AGC", "S");\r
-    codonHash2.put("AGT", "S");\r
-\r
-    codonHash2.put("AGA", "R");\r
-    codonHash2.put("AGG", "R");\r
-    codonHash2.put("CGA", "R");\r
-    codonHash2.put("CGG", "R");\r
-    codonHash2.put("CGC", "R");\r
-    codonHash2.put("CGT", "R");\r
-\r
-    codonHash2.put("GGA", "G");\r
-    codonHash2.put("GGG", "G");\r
-    codonHash2.put("GGC", "G");\r
-    codonHash2.put("GGT", "G");\r
-\r
-    codonHash2.put("TGA", "*");\r
-    codonHash2.put("TAA", "*");\r
-    codonHash2.put("TAG", "*");\r
-\r
-    codonHash2.put("TGG", "W");\r
-\r
-    codonHash2.put("TGC", "C");\r
-    codonHash2.put("TGT", "C");\r
-\r
-    codonHash2.put("ATA", "I");\r
-    codonHash2.put("ATC", "I");\r
-    codonHash2.put("ATT", "I");\r
-\r
-    codonHash2.put("ATG", "M");\r
-\r
-    codonHash2.put("CTA", "L");\r
-    codonHash2.put("CTG", "L");\r
-    codonHash2.put("CTC", "L");\r
-    codonHash2.put("CTT", "L");\r
-    codonHash2.put("TTA", "L");\r
-    codonHash2.put("TTG", "L");\r
-\r
-    codonHash2.put("GTA", "V");\r
-    codonHash2.put("GTG", "V");\r
-    codonHash2.put("GTC", "V");\r
-    codonHash2.put("GTT", "V");\r
-\r
-    codonHash2.put("TTC", "F");\r
-    codonHash2.put("TTT", "F");\r
-  }\r
-\r
-  static\r
-  {\r
-    Lys.addElement("AAA");\r
-    Lys.addElement("AAG");\r
-    Asn.addElement("AAC");\r
-    Asn.addElement("AAT");\r
-\r
-    Gln.addElement("CAA");\r
-    Gln.addElement("CAG");\r
-    His.addElement("CAC");\r
-    His.addElement("CAT");\r
-\r
-    Glu.addElement("GAA");\r
-    Glu.addElement("GAG");\r
-    Asp.addElement("GAC");\r
-    Asp.addElement("GAT");\r
-\r
-    Tyr.addElement("TAC");\r
-    Tyr.addElement("TAT");\r
-\r
-    Thr.addElement("ACA");\r
-    Thr.addElement("ACG");\r
-    Thr.addElement("ACC");\r
-    Thr.addElement("ACT");\r
-\r
-    Pro.addElement("CCA");\r
-    Pro.addElement("CCG");\r
-    Pro.addElement("CCC");\r
-    Pro.addElement("CCT");\r
-\r
-    Ala.addElement("GCA");\r
-    Ala.addElement("GCG");\r
-    Ala.addElement("GCC");\r
-    Ala.addElement("GCT");\r
-\r
-    Ser.addElement("TCA");\r
-    Ser.addElement("TCG");\r
-    Ser.addElement("TCC");\r
-    Ser.addElement("TCT");\r
-    Ser.addElement("AGC");\r
-    Ser.addElement("AGT");\r
-\r
-    Arg.addElement("AGA");\r
-    Arg.addElement("AGG");\r
-    Arg.addElement("CGA");\r
-    Arg.addElement("CGG");\r
-    Arg.addElement("CGC");\r
-    Arg.addElement("CGT");\r
-\r
-    Gly.addElement("GGA");\r
-    Gly.addElement("GGG");\r
-    Gly.addElement("GGC");\r
-    Gly.addElement("GGT");\r
-\r
-    STOP.addElement("TGA");\r
-    STOP.addElement("TAA");\r
-    STOP.addElement("TAG");\r
-\r
-    Trp.addElement("TGG");\r
-\r
-    Cys.addElement("TGC");\r
-    Cys.addElement("TGT");\r
-\r
-    Ile.addElement("ATA");\r
-    Ile.addElement("ATC");\r
-    Ile.addElement("ATT");\r
-\r
-    Met.addElement("ATG");\r
-\r
-    Leu.addElement("CTA");\r
-    Leu.addElement("CTG");\r
-    Leu.addElement("CTC");\r
-    Leu.addElement("CTT");\r
-    Leu.addElement("TTA");\r
-    Leu.addElement("TTG");\r
-\r
-    Val.addElement("GTA");\r
-    Val.addElement("GTG");\r
-    Val.addElement("GTC");\r
-    Val.addElement("GTT");\r
-\r
-    Phe.addElement("TTC");\r
-    Phe.addElement("TTT");\r
-  }\r
-\r
-\r
-  //Stores residue codes/names and colours and other things\r
-  public static Hashtable propHash = new Hashtable();\r
-  public static Hashtable hydrophobic = new Hashtable();\r
-  public static Hashtable polar = new Hashtable();\r
-  public static Hashtable small = new Hashtable();\r
-  public static Hashtable positive = new Hashtable();\r
-  public static Hashtable negative = new Hashtable();\r
-  public static Hashtable charged = new Hashtable();\r
-  public static Hashtable aromatic = new Hashtable();\r
-  public static Hashtable aliphatic = new Hashtable();\r
-  public static Hashtable tiny = new Hashtable();\r
-  public static Hashtable proline = new Hashtable();\r
-\r
-  static\r
-  {\r
-    hydrophobic.put("I", new Integer(1));\r
-    hydrophobic.put("L", new Integer(1));\r
-    hydrophobic.put("V", new Integer(1));\r
-    hydrophobic.put("C", new Integer(1));\r
-    hydrophobic.put("A", new Integer(1));\r
-    hydrophobic.put("G", new Integer(1));\r
-    hydrophobic.put("M", new Integer(1));\r
-    hydrophobic.put("F", new Integer(1));\r
-    hydrophobic.put("Y", new Integer(1));\r
-    hydrophobic.put("W", new Integer(1));\r
-    hydrophobic.put("H", new Integer(1));\r
-    hydrophobic.put("K", new Integer(1));\r
-    hydrophobic.put("X", new Integer(1));\r
-    hydrophobic.put("-", new Integer(1));\r
-    hydrophobic.put("*", new Integer(1));\r
-    hydrophobic.put("R", new Integer(0));\r
-    hydrophobic.put("E", new Integer(0));\r
-    hydrophobic.put("Q", new Integer(0));\r
-    hydrophobic.put("D", new Integer(0));\r
-    hydrophobic.put("N", new Integer(0));\r
-    hydrophobic.put("S", new Integer(0));\r
-    hydrophobic.put("T", new Integer(0));\r
-    hydrophobic.put("P", new Integer(0));\r
-  }\r
-\r
-  static\r
-  {\r
-    polar.put("Y", new Integer(1));\r
-    polar.put("W", new Integer(1));\r
-    polar.put("H", new Integer(1));\r
-    polar.put("K", new Integer(1));\r
-    polar.put("R", new Integer(1));\r
-    polar.put("E", new Integer(1));\r
-    polar.put("Q", new Integer(1));\r
-    polar.put("D", new Integer(1));\r
-    polar.put("N", new Integer(1));\r
-    polar.put("S", new Integer(1));\r
-    polar.put("T", new Integer(1));\r
-    polar.put("X", new Integer(1));\r
-    polar.put("-", new Integer(1));\r
-    polar.put("*", new Integer(1));\r
-    polar.put("I", new Integer(0));\r
-    polar.put("L", new Integer(0));\r
-    polar.put("V", new Integer(0));\r
-    polar.put("C", new Integer(0));\r
-    polar.put("A", new Integer(0));\r
-    polar.put("G", new Integer(0));\r
-    polar.put("M", new Integer(0));\r
-    polar.put("F", new Integer(0));\r
-    polar.put("P", new Integer(0));\r
-  }\r
-\r
-  static\r
-  {\r
-    small.put("I", new Integer(0));\r
-    small.put("L", new Integer(0));\r
-    small.put("V", new Integer(1));\r
-    small.put("C", new Integer(1));\r
-    small.put("A", new Integer(1));\r
-    small.put("G", new Integer(1));\r
-    small.put("M", new Integer(0));\r
-    small.put("F", new Integer(0));\r
-    small.put("Y", new Integer(0));\r
-    small.put("W", new Integer(0));\r
-    small.put("H", new Integer(0));\r
-    small.put("K", new Integer(0));\r
-    small.put("R", new Integer(0));\r
-    small.put("E", new Integer(0));\r
-    small.put("Q", new Integer(0));\r
-    small.put("D", new Integer(1));\r
-    small.put("N", new Integer(1));\r
-    small.put("S", new Integer(1));\r
-    small.put("T", new Integer(1));\r
-    small.put("P", new Integer(1));\r
-    small.put("-", new Integer(1));\r
-    small.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    positive.put("I", new Integer(0));\r
-    positive.put("L", new Integer(0));\r
-    positive.put("V", new Integer(0));\r
-    positive.put("C", new Integer(0));\r
-    positive.put("A", new Integer(0));\r
-    positive.put("G", new Integer(0));\r
-    positive.put("M", new Integer(0));\r
-    positive.put("F", new Integer(0));\r
-    positive.put("Y", new Integer(0));\r
-    positive.put("W", new Integer(0));\r
-    positive.put("H", new Integer(1));\r
-    positive.put("K", new Integer(1));\r
-    positive.put("R", new Integer(1));\r
-    positive.put("E", new Integer(0));\r
-    positive.put("Q", new Integer(0));\r
-    positive.put("D", new Integer(0));\r
-    positive.put("N", new Integer(0));\r
-    positive.put("S", new Integer(0));\r
-    positive.put("T", new Integer(0));\r
-    positive.put("P", new Integer(0));\r
-    positive.put("-", new Integer(1));\r
-    positive.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    negative.put("I", new Integer(0));\r
-    negative.put("L", new Integer(0));\r
-    negative.put("V", new Integer(0));\r
-    negative.put("C", new Integer(0));\r
-    negative.put("A", new Integer(0));\r
-    negative.put("G", new Integer(0));\r
-    negative.put("M", new Integer(0));\r
-    negative.put("F", new Integer(0));\r
-    negative.put("Y", new Integer(0));\r
-    negative.put("W", new Integer(0));\r
-    negative.put("H", new Integer(0));\r
-    negative.put("K", new Integer(0));\r
-    negative.put("R", new Integer(0));\r
-    negative.put("E", new Integer(1));\r
-    negative.put("Q", new Integer(0));\r
-    negative.put("D", new Integer(1));\r
-    negative.put("N", new Integer(0));\r
-    negative.put("S", new Integer(0));\r
-    negative.put("T", new Integer(0));\r
-    negative.put("P", new Integer(0));\r
-    negative.put("-", new Integer(1));\r
-    negative.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    charged.put("I", new Integer(0));\r
-    charged.put("L", new Integer(0));\r
-    charged.put("V", new Integer(0));\r
-    charged.put("C", new Integer(0));\r
-    charged.put("A", new Integer(0));\r
-    charged.put("G", new Integer(0));\r
-    charged.put("M", new Integer(0));\r
-    charged.put("F", new Integer(0));\r
-    charged.put("Y", new Integer(0));\r
-    charged.put("W", new Integer(0));\r
-    charged.put("H", new Integer(1));\r
-    charged.put("K", new Integer(1));\r
-    charged.put("R", new Integer(1));\r
-    charged.put("E", new Integer(1));\r
-    charged.put("Q", new Integer(0));\r
-    charged.put("D", new Integer(1));\r
-    charged.put("N", new Integer(1));\r
-    charged.put("S", new Integer(0));\r
-    charged.put("T", new Integer(0));\r
-    charged.put("P", new Integer(0));\r
-    charged.put("-", new Integer(1));\r
-    charged.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    aromatic.put("I", new Integer(0));\r
-    aromatic.put("L", new Integer(0));\r
-    aromatic.put("V", new Integer(0));\r
-    aromatic.put("C", new Integer(0));\r
-    aromatic.put("A", new Integer(0));\r
-    aromatic.put("G", new Integer(0));\r
-    aromatic.put("M", new Integer(0));\r
-    aromatic.put("F", new Integer(1));\r
-    aromatic.put("Y", new Integer(1));\r
-    aromatic.put("W", new Integer(1));\r
-    aromatic.put("H", new Integer(1));\r
-    aromatic.put("K", new Integer(0));\r
-    aromatic.put("R", new Integer(0));\r
-    aromatic.put("E", new Integer(0));\r
-    aromatic.put("Q", new Integer(0));\r
-    aromatic.put("D", new Integer(0));\r
-    aromatic.put("N", new Integer(0));\r
-    aromatic.put("S", new Integer(0));\r
-    aromatic.put("T", new Integer(0));\r
-    aromatic.put("P", new Integer(0));\r
-    aromatic.put("-", new Integer(1));\r
-    aromatic.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    aliphatic.put("I", new Integer(1));\r
-    aliphatic.put("L", new Integer(1));\r
-    aliphatic.put("V", new Integer(1));\r
-    aliphatic.put("C", new Integer(0));\r
-    aliphatic.put("A", new Integer(0));\r
-    aliphatic.put("G", new Integer(0));\r
-    aliphatic.put("M", new Integer(0));\r
-    aliphatic.put("F", new Integer(0));\r
-    aliphatic.put("Y", new Integer(0));\r
-    aliphatic.put("W", new Integer(0));\r
-    aliphatic.put("H", new Integer(0));\r
-    aliphatic.put("K", new Integer(0));\r
-    aliphatic.put("R", new Integer(0));\r
-    aliphatic.put("E", new Integer(0));\r
-    aliphatic.put("Q", new Integer(0));\r
-    aliphatic.put("D", new Integer(0));\r
-    aliphatic.put("N", new Integer(0));\r
-    aliphatic.put("S", new Integer(0));\r
-    aliphatic.put("T", new Integer(0));\r
-    aliphatic.put("P", new Integer(0));\r
-    aliphatic.put("-", new Integer(1));\r
-    aliphatic.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    tiny.put("I", new Integer(0));\r
-    tiny.put("L", new Integer(0));\r
-    tiny.put("V", new Integer(0));\r
-    tiny.put("C", new Integer(0));\r
-    tiny.put("A", new Integer(1));\r
-    tiny.put("G", new Integer(1));\r
-    tiny.put("M", new Integer(0));\r
-    tiny.put("F", new Integer(0));\r
-    tiny.put("Y", new Integer(0));\r
-    tiny.put("W", new Integer(0));\r
-    tiny.put("H", new Integer(0));\r
-    tiny.put("K", new Integer(0));\r
-    tiny.put("R", new Integer(0));\r
-    tiny.put("E", new Integer(0));\r
-    tiny.put("Q", new Integer(0));\r
-    tiny.put("D", new Integer(0));\r
-    tiny.put("N", new Integer(0));\r
-    tiny.put("S", new Integer(1));\r
-    tiny.put("T", new Integer(0));\r
-    tiny.put("P", new Integer(0));\r
-    tiny.put("-", new Integer(1));\r
-    tiny.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    proline.put("I", new Integer(0));\r
-    proline.put("L", new Integer(0));\r
-    proline.put("V", new Integer(0));\r
-    proline.put("C", new Integer(0));\r
-    proline.put("A", new Integer(0));\r
-    proline.put("G", new Integer(0));\r
-    proline.put("M", new Integer(0));\r
-    proline.put("F", new Integer(0));\r
-    proline.put("Y", new Integer(0));\r
-    proline.put("W", new Integer(0));\r
-    proline.put("H", new Integer(0));\r
-    proline.put("K", new Integer(0));\r
-    proline.put("R", new Integer(0));\r
-    proline.put("E", new Integer(0));\r
-    proline.put("Q", new Integer(0));\r
-    proline.put("D", new Integer(0));\r
-    proline.put("N", new Integer(0));\r
-    proline.put("S", new Integer(0));\r
-    proline.put("T", new Integer(0));\r
-    proline.put("P", new Integer(1));\r
-    proline.put("-", new Integer(1));\r
-    proline.put("*", new Integer(1));\r
-  }\r
-\r
-  static\r
-  {\r
-    propHash.put("hydrophobic", hydrophobic);\r
-    propHash.put("small", small);\r
-    propHash.put("positive", positive);\r
-    propHash.put("negative", negative);\r
-    propHash.put("charged", charged);\r
-    propHash.put("aromatic", aromatic);\r
-    propHash.put("aliphatic", aliphatic);\r
-    propHash.put("tiny", tiny);\r
-    propHash.put("proline", proline);\r
-    propHash.put("polar", polar);\r
-  }\r
-\r
-  private ResidueProperties()\r
-  {\r
-  }\r
-\r
-  public static double getHydmax()\r
-  {\r
-    return hydmax;\r
-  }\r
-\r
-  public static double getHydmin()\r
-  {\r
-    return hydmin;\r
-  }\r
-\r
-  public static double[] getHyd()\r
-  {\r
-    return hyd;\r
-  }\r
-\r
-  public static Hashtable getAA3Hash()\r
-  {\r
-    return aa3Hash;\r
-  }\r
-\r
-  public static int[][] getDNA()\r
-  {\r
-    return ResidueProperties.DNA;\r
-  }\r
-\r
-  public static int[][] getBLOSUM62()\r
-  {\r
-    return ResidueProperties.BLOSUM62;\r
-  }\r
-\r
-  public static int getPAM250(String A1, String A2)\r
-  {\r
-    int a = aaIndex[A1.charAt(0)];\r
-    int b = aaIndex[A2.charAt(0)];\r
-\r
-    int pog = ResidueProperties.PAM250[a][b];\r
-\r
-    return pog;\r
-  }\r
-\r
-  public static int getBLOSUM62(char c1, char c2)\r
-  {\r
-    int pog = 0;\r
-\r
-    try\r
-    {\r
-      int a = aaIndex[c1];\r
-      int b = aaIndex[c2];\r
-\r
-      pog = ResidueProperties.BLOSUM62[a][b];\r
-    }\r
-    catch (Exception e)\r
-    {\r
-      //System.out.println("Unknown residue in " + A1 + " " + A2);\r
-    }\r
-\r
-    return pog;\r
-  }\r
-\r
-  public static Vector getCodons(String res)\r
-  {\r
-    if (codonHash.containsKey(res))\r
-    {\r
-      return (Vector) codonHash.get(res);\r
-    }\r
-\r
-    return null;\r
-  }\r
-\r
-  public static String codonTranslate(String codon)\r
-  {\r
-    Enumeration e = codonHash.keys();\r
-\r
-    while (e.hasMoreElements())\r
-    {\r
-      String key = (String) e.nextElement();\r
-      Vector tmp = (Vector) codonHash.get(key);\r
-\r
-      if (tmp.contains(codon.toUpperCase()))\r
-      {\r
-        return key;\r
-      }\r
-    }\r
-\r
-    return null;\r
-  }\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+package jalview.schemes;
+
+import java.util.*;
+
+import java.awt.*;
+
+public class ResidueProperties
+{
+  public static Hashtable scoreMatrices=new Hashtable();
+  //Stores residue codes/names and colours and other things
+  public static final int [] aaIndex; // aaHash version 2.1.1 and below
+  public static final int [] nucleotideIndex;
+  public static final Hashtable aa3Hash = new Hashtable();
+  public static final Hashtable aa2Triplet = new Hashtable();
+  public static final Hashtable nucleotideName = new Hashtable();
+
+
+  static
+  {
+    aaIndex = new int[132];
+    for(int i=0; i<132; i++)
+      aaIndex[i] = -1;
+
+    aaIndex['A'] = 0;
+    aaIndex['R'] = 1;
+    aaIndex['N'] = 2;
+    aaIndex['D'] = 3;
+    aaIndex['C'] = 4;
+    aaIndex['Q'] = 5;
+    aaIndex['E'] = 6;
+    aaIndex['G'] = 7;
+    aaIndex['H'] = 8;
+    aaIndex['I'] = 9;
+    aaIndex['L'] = 10;
+    aaIndex['K'] = 11;
+    aaIndex['M'] = 12;
+    aaIndex['F'] = 13;
+    aaIndex['P'] = 14;
+    aaIndex['S'] = 15;
+    aaIndex['T'] = 16;
+    aaIndex['W'] = 17;
+    aaIndex['Y'] = 18;
+    aaIndex['V'] = 19;
+    aaIndex['B'] = 20;
+    aaIndex['Z'] = 21;
+    aaIndex['X'] = 22;
+    aaIndex['U'] = 22;
+    aaIndex['a'] = 0;
+    aaIndex['r'] = 1;
+    aaIndex['n'] = 2;
+    aaIndex['d'] = 3;
+    aaIndex['c'] = 4;
+    aaIndex['q'] = 5;
+    aaIndex['e'] = 6;
+    aaIndex['g'] = 7;
+    aaIndex['h'] = 8;
+    aaIndex['i'] = 9;
+    aaIndex['l'] = 10;
+    aaIndex['k'] = 11;
+    aaIndex['m'] = 12;
+    aaIndex['f'] = 13;
+    aaIndex['p'] = 14;
+    aaIndex['s'] = 15;
+    aaIndex['t'] = 16;
+    aaIndex['w'] = 17;
+    aaIndex['y'] = 18;
+    aaIndex['v'] = 19;
+    aaIndex['b'] = 20;
+    aaIndex['z'] = 21;
+    aaIndex['x'] = 22;
+    aaIndex['u'] = 22;
+    aaIndex['-'] = 23;
+    aaIndex['*'] = 23;
+    aaIndex['.'] = 23;
+    aaIndex[' '] = 23;
+  }
+
+  static
+  {
+    nucleotideIndex = new int[132];
+    for (int i = 0; i < 132; i++)
+      nucleotideIndex[i] = -1;
+
+    nucleotideIndex['A'] = 0;
+    nucleotideIndex['a'] = 0;
+    nucleotideIndex['C'] = 1;
+    nucleotideIndex['c'] = 1;
+    nucleotideIndex['G'] = 2;
+    nucleotideIndex['g'] = 2;
+    nucleotideIndex['T'] = 3;
+    nucleotideIndex['t'] = 3;
+    nucleotideIndex['U'] = 4;
+    nucleotideIndex['u'] = 4;
+    nucleotideIndex['I'] = 5;
+    nucleotideIndex['i'] = 5;
+    nucleotideIndex['X'] = 6;
+    nucleotideIndex['x'] = 6;
+    nucleotideIndex['R'] = 7;
+    nucleotideIndex['r'] = 7;
+    nucleotideIndex['Y'] = 8;
+    nucleotideIndex['y'] = 8;
+    nucleotideIndex['N'] = 9;
+    nucleotideIndex['n'] = 9;
+
+
+    nucleotideName.put("A", "Adenine");
+    nucleotideName.put("a", "Adenine");
+    nucleotideName.put("G", "Guanine");
+    nucleotideName.put("g", "Guanine");
+    nucleotideName.put("C", "Cytosine");
+    nucleotideName.put("c", "Cytosine");
+    nucleotideName.put("T", "Thymine");
+    nucleotideName.put("t", "Thymine");
+    nucleotideName.put("U", "Uracil");
+    nucleotideName.put("u", "Uracil");
+    nucleotideName.put("I", "Inosine");
+    nucleotideName.put("i", "Inosine");
+    nucleotideName.put("X", "Xanthine");
+    nucleotideName.put("x", "Xanthine");
+    nucleotideName.put("R", "Unknown Purine");
+    nucleotideName.put("r", "Unknown Purine");
+    nucleotideName.put("Y", "Unknown Pyrimidine");
+    nucleotideName.put("y", "Unknown Pyrimidine");
+    nucleotideName.put("N", "Unknown");
+    nucleotideName.put("n", "Unknown");
+  }
+
+
+  static
+  {
+    aa3Hash.put("ALA", new Integer(0));
+    aa3Hash.put("ARG", new Integer(1));
+    aa3Hash.put("ASN", new Integer(2));
+    aa3Hash.put("ASP", new Integer(3)); //D
+    aa3Hash.put("CYS", new Integer(4));
+    aa3Hash.put("GLN", new Integer(5)); //Q
+    aa3Hash.put("GLU", new Integer(6)); // E
+    aa3Hash.put("GLY", new Integer(7));
+    aa3Hash.put("HIS", new Integer(8));
+    aa3Hash.put("ILE", new Integer(9));
+    aa3Hash.put("LEU", new Integer(10));
+    aa3Hash.put("LYS", new Integer(11));
+    aa3Hash.put("MET", new Integer(12));
+    aa3Hash.put("PHE", new Integer(13));
+    aa3Hash.put("PRO", new Integer(14));
+    aa3Hash.put("SER", new Integer(15));
+    aa3Hash.put("THR", new Integer(16));
+    aa3Hash.put("TRP", new Integer(17));
+    aa3Hash.put("TYR", new Integer(18));
+    aa3Hash.put("VAL", new Integer(19));
+    // IUB Nomenclature for ambiguous peptides
+    aa3Hash.put("ASX", new Integer(20)); // "B";
+    aa3Hash.put("GLX", new Integer(21)); // X
+    aa3Hash.put("XAA", new Integer(22));// X unknown
+    aa3Hash.put("-", new Integer(23));
+    aa3Hash.put("*", new Integer(23));
+    aa3Hash.put(".", new Integer(23));
+    aa3Hash.put(" ", new Integer(23));
+    aa3Hash.put("Gap", new Integer(23));
+  }
+
+  static
+  {
+    aa2Triplet.put("A", "ALA");
+    aa2Triplet.put("a", "ALA");
+    aa2Triplet.put("R", "ARG");
+    aa2Triplet.put("r", "ARG");
+    aa2Triplet.put("N", "ASN");
+    aa2Triplet.put("n", "ASN");
+    aa2Triplet.put("D", "ASP");
+    aa2Triplet.put("d", "ASP");
+    aa2Triplet.put("C", "CYS");
+    aa2Triplet.put("c", "CYS");
+    aa2Triplet.put("Q", "GLN");
+    aa2Triplet.put("q", "GLN");
+    aa2Triplet.put("E", "GLU");
+    aa2Triplet.put("e", "GLU");
+    aa2Triplet.put("G", "GLY");
+    aa2Triplet.put("g", "GLY");
+    aa2Triplet.put("H", "HIS");
+    aa2Triplet.put("h", "HIS");
+    aa2Triplet.put("I", "ILE");
+    aa2Triplet.put("i", "ILE");
+    aa2Triplet.put("L", "LEU");
+    aa2Triplet.put("l", "LEU");
+    aa2Triplet.put("K", "LYS");
+    aa2Triplet.put("k", "LYS");
+    aa2Triplet.put("M", "MET");
+    aa2Triplet.put("m", "MET");
+    aa2Triplet.put("F", "PHE");
+    aa2Triplet.put("f", "PHE");
+    aa2Triplet.put("P", "PRO");
+    aa2Triplet.put("p", "PRO");
+    aa2Triplet.put("S", "SER");
+    aa2Triplet.put("s", "SER");
+    aa2Triplet.put("T", "THR");
+    aa2Triplet.put("t", "THR");
+    aa2Triplet.put("W", "TRP");
+    aa2Triplet.put("w", "TRP");
+    aa2Triplet.put("Y", "TYR");
+    aa2Triplet.put("y", "TYR");
+    aa2Triplet.put("V", "VAL");
+    aa2Triplet.put("v", "VAL");
+  }
+
+  public static final String[] aa =
+      {
+      "A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F",
+      "P", "S", "T", "W", "Y", "V", "B", "Z", "X", "_", "*", ".", " "
+  };
+  public static final Color midBlue = new Color(100, 100, 255);
+  public static final Vector scaleColours = new Vector();
+
+  static
+  {
+    scaleColours.addElement(new Color(114, 0, 147));
+    scaleColours.addElement(new Color(156, 0, 98));
+    scaleColours.addElement(new Color(190, 0, 0));
+    scaleColours.addElement(Color.red);
+    scaleColours.addElement(new Color(255, 125, 0));
+    scaleColours.addElement(Color.orange);
+    scaleColours.addElement(new Color(255, 194, 85));
+    scaleColours.addElement(Color.yellow);
+    scaleColours.addElement(new Color(255, 255, 181));
+    scaleColours.addElement(Color.white);
+  }
+
+  public static final Color[] taylor =
+      {
+      new Color(204, 255, 0), // A  Greenish-yellowy-yellow
+      new Color(0, 0, 255), // R  Blueish-bluey-blue
+      new Color(204, 0, 255), // N  Blueish-reddy-blue
+      new Color(255, 0, 0), // D  Reddish-reddy-red
+      new Color(255, 255, 0), // C  Yellowish-yellowy-yellow
+      new Color(255, 0, 204), // Q  Reddish-bluey-red
+      new Color(255, 0, 102), // E  Blueish-reddy-red
+      new Color(255, 153, 0), // G  Yellowy-reddy-yellow
+      new Color(0, 102, 255), // H  Greenish-bluey-blue
+      new Color(102, 255, 0), // I  Greenish-yellowy-green
+      new Color(51, 255, 0), // L  Yellowish-greeny-green
+      new Color(102, 0, 255), // K  Reddish-bluey-blue
+      new Color(0, 255, 0), // M  Greenish-greeny-green
+      new Color(0, 255, 102), // F  Blueish-greeny-green
+      new Color(255, 204, 0), // P  Reddish-yellowy-yellow
+      new Color(255, 51, 0), // S  Yellowish-reddy-red
+      new Color(255, 102, 0), // T  Reddish-yellowy-red
+      new Color(0, 204, 255), // W  Blueish-greeny-green
+      new Color(0, 255, 204), // Y  Greenish-bluey-green
+      new Color(153, 255, 0), // V  Yellowish-greeny-yellow
+      Color.white, // B
+      Color.white, // Z
+      Color.white, // X
+      Color.white, // -
+      Color.white, // *
+      Color.white // .
+  };
+  public static final Color[] nucleotide =
+      {
+      new Color(100, 247, 63), // A
+      new Color(255, 179, 64), // C
+      new Color(235, 65, 60), // G
+      new Color(60, 136, 238), // T
+      new Color(60, 136, 238) // U
+  };
+  public static final Color[] color =
+      {
+      Color.pink, // A
+      midBlue, // R
+      Color.green, // N
+      Color.red, // D
+      Color.yellow, // C
+      Color.green, // Q
+      Color.red, // E
+      Color.magenta, // G
+      Color.red, // H
+      Color.pink, // I
+      Color.pink, // L
+      midBlue, // K
+      Color.pink, // M
+      Color.orange, // F
+      Color.magenta, // P
+      Color.green, // S
+      Color.green, // T
+      Color.orange, // W
+      Color.orange, // Y
+      Color.pink, // V
+      Color.white, // B
+      Color.white, // Z
+      Color.white, // X
+      Color.white, // -
+      Color.white, // *
+      Color.white, // .
+      Color.white // ' '
+  };
+
+  // Dunno where I got these numbers from
+  public static final double[] hyd2 =
+      {
+      0.62, //A
+      0.29, //R
+      -0.90, //N
+      -0.74, //D
+      1.19, //C
+      0.48, //Q
+      -0.40, //E
+      1.38, //G
+      -1.50, //H
+      1.06, //I
+      0.64, //L
+      -0.78, //K
+      0.12, //M
+      -0.85, //F
+      -2.53, //P
+      -0.18, //S
+      -0.05, //T
+      1.08, //W
+      0.81, //Y
+      0.0, //V
+      0.26, //B
+      0.0, //Z
+      0.0 //X
+  };
+  public static final double[] helix =
+      {
+      1.42, 0.98, 0.67, 1.01, 0.70, 1.11, 1.51, 0.57, 1.00, 1.08, 1.21, 1.16,
+      1.45, 1.13, 0.57, 0.77, 0.83, 1.08, 0.69, 1.06, 0.84, 1.31, 1.00, 0.0
+  };
+  public static final double helixmin = 0.57;
+  public static final double helixmax = 1.51;
+  public static final double[] strand =
+      {
+      0.83, 0.93, 0.89, 0.54, 1.19, 1.10, 0.37, 0.75, 0.87, 1.60, 1.30, 0.74,
+      1.05, 1.38, 0.55, 0.75, 1.19, 1.37, 1.47, 1.70, 0.72, 0.74, 1.0, 0.0
+  };
+  public static final double strandmin = 0.37;
+  public static final double strandmax = 1.7;
+  public static final double[] turn =
+      {
+      0.66, 0.95, 1.56, 1.46, 1.19, 0.98, 0.74, 1.56, 0.95, 0.47, 0.59, 1.01,
+      0.60, 0.60, 1.52, 1.43, 0.96, 0.96, 1.14, 0.50, 1.51, 0.86, 1.00, 0, 0
+  };
+  public static final double turnmin = 0.47;
+  public static final double turnmax = 1.56;
+  public static final double[] buried =
+      {
+      1.7, 0.1, 0.4, 0.4, 4.6, 0.3, 0.3, 1.8, 0.8, 3.1, 2.4, 0.05, 1.9, 2.2,
+      0.6, 0.8, 0.7, 1.6, 0.5, 2.9, 0.4, 0.3, 1.358, 0.00
+  };
+  public static final double buriedmin = 0.05;
+  public static final double buriedmax = 4.6;
+
+  // This is hydropathy index
+  // Kyte, J., and Doolittle, R.F., J. Mol. Biol.
+  // 1157, 105-132, 1982
+  public static final double[] hyd =
+      {
+      1.8, -4.5, -3.5, -3.5, 2.5, -3.5, -3.5, -0.4, -3.2, 4.5, 3.8, -3.9, 1.9,
+      2.8, -1.6, -0.8, -0.7, -0.9, -1.3, 4.2, -3.5, -3.5, -0.49, 0.0
+  };
+  public static final double hydmax = 4.5;
+  public static final double hydmin = -3.9;
+
+  //public static final double hydmax = 1.38;
+  //public static final double hydmin = -2.53;
+  private static final int[][] BLOSUM62 =
+      {
+      {
+      4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3,
+      -2, 0, -2, -1, 0, -4
+  },
+      {
+      -1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2,
+      -3, -1, 0, -1, -4
+  },
+      {
+      -2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3,
+      3, 0, -1, -4
+  },
+      {
+      -2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4,
+      -3, -3, 4, 1, -1, -4
+  },
+      {
+      0, 3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2,
+      -2, -1, -3, -3, -2, -4
+  },
+      {
+      -1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1,
+      -2, 0, 3, -1, -4
+  },
+      {
+      -1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2,
+      -2, 1, 4, -1, -4
+  },
+      {
+      0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2,
+      -3, -3, -1, -2, -1, -4
+  },
+      {
+      -2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2,
+      -3, 0, 0, -1, -4
+  },
+      {
+      -1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3,
+      -1, 3, -3, -3, -1, -4
+  },
+      {
+      -1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2,
+      -1, 1, -4, -3, -1, -4
+  },
+      {
+      -1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2,
+      -2, 0, 1, -1, -4
+  },
+      {
+      -1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1,
+      -1, 1, -3, -1, -1, -4
+  },
+      {
+      -2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3,
+      -1, -3, -3, -1, -4
+  },
+      {
+      -1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1,
+      -4, -3, -2, -2, -1, -2, -4
+  },
+      {
+      1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2,
+      -2, 0, 0, 0, -4
+  },
+      {
+      0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2,
+      -2, 0, -1, -1, 0, -4
+  },
+      {
+      -3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2,
+      11, 2, -3, -4, -3, -2, -4
+  },
+      {
+      -2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2,
+      7, -1, -3, -2, -1, -4
+  },
+      {
+      0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3,
+      -1, 4, -3, -2, -1, -4
+  },
+      {
+      -2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3,
+      -3, 4, 1, -1, -4
+  },
+      {
+      -1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2,
+      -2, 1, 4, -1, -4
+  },
+      {
+      0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2,
+      -1, -1, -1, -1, -1, -4
+  },
+      {
+      -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
+      -4, -4, -4, -4, -4, -4, 1
+  },
+  };
+  static final int[][] PAM250 =
+      {
+      {
+      2, -2, 0, 0, -2, 0, 0, 1, -1, -1, -2, -1, -1, -3, 1, 1, 1, -6, -3, 0,
+      0, 0, 0, -8
+  },
+      {
+      -2, 6, 0, -1, -4, 1, -1, -3, 2, -2, -3, 3, 0, -4, 0, 0, -1, 2, -4,
+      -2, -1, 0, -1, -8
+  },
+      {
+      0, 0, 2, 2, -4, 1, 1, 0, 2, -2, -3, 1, -2, -3, 0, 1, 0, -4, -2, -2,
+      2, 1, 0, -8
+  },
+      {
+      0, -1, 2, 4, -5, 2, 3, 1, 1, -2, -4, 0, -3, -6, -1, 0, 0, -7, -4, -2,
+      3, 3, -1, -8
+  },
+      {
+      -2, -4, -4, -5, 12, -5, -5, -3, -3, -2, -6, -5, -5, -4, -3, 0, -2,
+      -8, 0, -2, -4, -5, -3, -8
+  },
+      {
+      0, 1, 1, 2, -5, 4, 2, -1, 3, -2, -2, 1, -1, -5, 0, -1, -1, -5, -4,
+      -2, 1, 3, -1, -8
+  },
+      {
+      0, -1, 1, 3, -5, 2, 4, 0, 1, -2, -3, 0, -2, -5, -1, 0, 0, -7, -4, -2,
+      3, 3, -1, -8
+  },
+      {
+      1, -3, 0, 1, -3, -1, 0, 5, -2, -3, -4, -2, -3, -5, 0, 1, 0, -7, -5,
+      -1, 0, 0, -1, -8
+  },
+      {
+      -1, 2, 2, 1, -3, 3, 1, -2, 6, -2, -2, 0, -2, -2, 0, -1, -1, -3, 0,
+      -2, 1, 2, -1, -8
+  },
+      {
+      -1, -2, -2, -2, -2, -2, -2, -3, -2, 5, 2, -2, 2, 1, -2, -1, 0, -5,
+      -1, 4, -2, -2, -1, -8
+  },
+      {
+      -2, -3, -3, -4, -6, -2, -3, -4, -2, 2, 6, -3, 4, 2, -3, -3, -2, -2,
+      -1, 2, -3, -3, -1, -8
+  },
+      {
+      -1, 3, 1, 0, -5, 1, 0, -2, 0, -2, -3, 5, 0, -5, -1, 0, 0, -3, -4, -2,
+      1, 0, -1, -8
+  },
+      {
+      -1, 0, -2, -3, -5, -1, -2, -3, -2, 2, 4, 0, 6, 0, -2, -2, -1, -4, -2,
+      2, -2, -2, -1, -8
+  },
+      {
+      -3, -4, -3, -6, -4, -5, -5, -5, -2, 1, 2, -5, 0, 9, -5, -3, -3, 0, 7,
+      -1, -4, -5, -2, -8
+  },
+      {
+      1, 0, 0, -1, -3, 0, -1, 0, 0, -2, -3, -1, -2, -5, 6, 1, 0, -6, -5,
+      -1, -1, 0, -1, -8
+  },
+      {
+      1, 0, 1, 0, 0, -1, 0, 1, -1, -1, -3, 0, -2, -3, 1, 2, 1, -2, -3, -1,
+      0, 0, 0, -8
+  },
+      {
+      1, -1, 0, 0, -2, -1, 0, 0, -1, 0, -2, 0, -1, -3, 0, 1, 3, -5, -3, 0,
+      0, -1, 0, -8
+  },
+      {
+      -6, 2, -4, -7, -8, -5, -7, -7, -3, -5, -2, -3, -4, 0, -6, -2, -5, 17,
+      0, -6, -5, -6, -4, -8
+  },
+      {
+      -3, -4, -2, -4, 0, -4, -4, -5, 0, -1, -1, -4, -2, 7, -5, -3, -3, 0,
+      10, -2, -3, -4, -2, -8
+  },
+      {
+      0, -2, -2, -2, -2, -2, -2, -1, -2, 4, 2, -2, 2, -1, -1, -1, 0, -6,
+      -2, 4, -2, -2, -1, -8
+  },
+      {
+      0, -1, 2, 3, -4, 1, 3, 0, 1, -2, -3, 1, -2, -4, -1, 0, 0, -5, -3, -2,
+      3, 2, -1, -8
+  },
+      {
+      0, 0, 1, 3, -5, 3, 3, 0, 2, -2, -3, 0, -2, -5, 0, 0, -1, -6, -4, -2,
+      2, 3, -1, -8
+  },
+      {
+      0, -1, 0, -1, -3, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, 0, 0, -4,
+      -2, -1, -1, -1, -1, -8
+  },
+      {
+      -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8,
+      -8, -8, -8, -8, -8, -8, 1
+  },
+  };
+  public static final Hashtable ssHash = new Hashtable(); // stores the number value of the aa
+
+  static
+  {
+    ssHash.put("H", Color.magenta);
+    ssHash.put("E", Color.yellow);
+    ssHash.put("-", Color.white);
+    ssHash.put(".", Color.white);
+    ssHash.put("S", Color.cyan);
+    ssHash.put("T", Color.blue);
+    ssHash.put("G", Color.pink);
+    ssHash.put("I", Color.pink);
+    ssHash.put("B", Color.yellow);
+  }
+
+  static final int[][] DNA =
+      {
+      {
+      5, -4, -4, -4, 1}, // C
+      {
+      -4, 5, -4, -4, 1}, // T
+      {
+      -4, -4, 5, -4, 1}, // A
+      {
+      -4, -4, -4, 5, 1}, // G
+      {
+      1, 1, 1, 1, 1}, // -
+  };
+  /**
+   * register matrices in list
+   */
+  static {
+    scoreMatrices.put("BLOSUM62", new ScoreMatrix("BLOSUM62",BLOSUM62, 0));
+    scoreMatrices.put("PAM250", new ScoreMatrix("PAM250",PAM250, 0));
+    scoreMatrices.put("DNA", new ScoreMatrix("DNA", DNA, 1));
+  }
+  public static final Color[] pidColours =
+      {
+      midBlue, new Color(153, 153, 255),
+      //    Color.lightGray,
+      new Color(204, 204, 255),
+  };
+  public static final float[] pidThresholds =
+      {
+      80, 60, 40, };
+  public static Hashtable codonHash = new Hashtable();
+  public static Vector Lys = new Vector();
+  public static Vector Asn = new Vector();
+  public static Vector Gln = new Vector();
+  public static Vector His = new Vector();
+  public static Vector Glu = new Vector();
+  public static Vector Asp = new Vector();
+  public static Vector Tyr = new Vector();
+  public static Vector Thr = new Vector();
+  public static Vector Pro = new Vector();
+  public static Vector Ala = new Vector();
+  public static Vector Ser = new Vector();
+  public static Vector Arg = new Vector();
+  public static Vector Gly = new Vector();
+  public static Vector Trp = new Vector();
+  public static Vector Cys = new Vector();
+  public static Vector Ile = new Vector();
+  public static Vector Met = new Vector();
+  public static Vector Leu = new Vector();
+  public static Vector Val = new Vector();
+  public static Vector Phe = new Vector();
+  public static Vector STOP = new Vector();
+
+  static
+  {
+    codonHash.put("K", Lys);
+    codonHash.put("N", Asn);
+    codonHash.put("Q", Gln);
+    codonHash.put("H", His);
+    codonHash.put("E", Glu);
+    codonHash.put("D", Asp);
+    codonHash.put("Y", Tyr);
+    codonHash.put("T", Thr);
+    codonHash.put("P", Pro);
+    codonHash.put("A", Ala);
+    codonHash.put("S", Ser);
+    codonHash.put("R", Arg);
+    codonHash.put("G", Gly);
+    codonHash.put("W", Trp);
+    codonHash.put("C", Cys);
+    codonHash.put("I", Ile);
+    codonHash.put("M", Met);
+    codonHash.put("L", Leu);
+    codonHash.put("V", Val);
+    codonHash.put("F", Phe);
+    codonHash.put("STOP", STOP);
+  }
+
+  public static Hashtable codonHash2 = new Hashtable();
+
+  static
+  {
+    codonHash2.put("AAA", "K");
+    codonHash2.put("AAG", "K");
+    codonHash2.put("AAC", "N");
+    codonHash2.put("AAT", "N");
+
+    codonHash2.put("CAA", "E");
+    codonHash2.put("CAG", "E");
+    codonHash2.put("CAC", "H");
+    codonHash2.put("CAT", "H");
+
+    codonHash2.put("GAA", "Q");
+    codonHash2.put("GAG", "Q");
+    codonHash2.put("GAC", "D");
+    codonHash2.put("GAT", "D");
+
+    codonHash2.put("TAC", "Y");
+    codonHash2.put("TAT", "Y");
+
+    codonHash2.put("ACA", "T");
+    codonHash2.put("AAG", "T");
+    codonHash2.put("ACC", "T");
+    codonHash2.put("ACT", "T");
+
+    codonHash2.put("CCA", "P");
+    codonHash2.put("CCG", "P");
+    codonHash2.put("CCC", "P");
+    codonHash2.put("CCT", "P");
+
+    codonHash2.put("GCA", "A");
+    codonHash2.put("GCG", "A");
+    codonHash2.put("GCC", "A");
+    codonHash2.put("GCT", "A");
+
+    codonHash2.put("TCA", "S");
+    codonHash2.put("TCG", "S");
+    codonHash2.put("TCC", "S");
+    codonHash2.put("TCT", "S");
+    codonHash2.put("AGC", "S");
+    codonHash2.put("AGT", "S");
+
+    codonHash2.put("AGA", "R");
+    codonHash2.put("AGG", "R");
+    codonHash2.put("CGA", "R");
+    codonHash2.put("CGG", "R");
+    codonHash2.put("CGC", "R");
+    codonHash2.put("CGT", "R");
+
+    codonHash2.put("GGA", "G");
+    codonHash2.put("GGG", "G");
+    codonHash2.put("GGC", "G");
+    codonHash2.put("GGT", "G");
+
+    codonHash2.put("TGA", "*");
+    codonHash2.put("TAA", "*");
+    codonHash2.put("TAG", "*");
+
+    codonHash2.put("TGG", "W");
+
+    codonHash2.put("TGC", "C");
+    codonHash2.put("TGT", "C");
+
+    codonHash2.put("ATA", "I");
+    codonHash2.put("ATC", "I");
+    codonHash2.put("ATT", "I");
+
+    codonHash2.put("ATG", "M");
+
+    codonHash2.put("CTA", "L");
+    codonHash2.put("CTG", "L");
+    codonHash2.put("CTC", "L");
+    codonHash2.put("CTT", "L");
+    codonHash2.put("TTA", "L");
+    codonHash2.put("TTG", "L");
+
+    codonHash2.put("GTA", "V");
+    codonHash2.put("GTG", "V");
+    codonHash2.put("GTC", "V");
+    codonHash2.put("GTT", "V");
+
+    codonHash2.put("TTC", "F");
+    codonHash2.put("TTT", "F");
+  }
+
+  static
+  {
+    Lys.addElement("AAA");
+    Lys.addElement("AAG");
+    Asn.addElement("AAC");
+    Asn.addElement("AAT");
+
+    Gln.addElement("CAA");
+    Gln.addElement("CAG");
+    His.addElement("CAC");
+    His.addElement("CAT");
+
+    Glu.addElement("GAA");
+    Glu.addElement("GAG");
+    Asp.addElement("GAC");
+    Asp.addElement("GAT");
+
+    Tyr.addElement("TAC");
+    Tyr.addElement("TAT");
+
+    Thr.addElement("ACA");
+    Thr.addElement("ACG");
+    Thr.addElement("ACC");
+    Thr.addElement("ACT");
+
+    Pro.addElement("CCA");
+    Pro.addElement("CCG");
+    Pro.addElement("CCC");
+    Pro.addElement("CCT");
+
+    Ala.addElement("GCA");
+    Ala.addElement("GCG");
+    Ala.addElement("GCC");
+    Ala.addElement("GCT");
+
+    Ser.addElement("TCA");
+    Ser.addElement("TCG");
+    Ser.addElement("TCC");
+    Ser.addElement("TCT");
+    Ser.addElement("AGC");
+    Ser.addElement("AGT");
+
+    Arg.addElement("AGA");
+    Arg.addElement("AGG");
+    Arg.addElement("CGA");
+    Arg.addElement("CGG");
+    Arg.addElement("CGC");
+    Arg.addElement("CGT");
+
+    Gly.addElement("GGA");
+    Gly.addElement("GGG");
+    Gly.addElement("GGC");
+    Gly.addElement("GGT");
+
+    STOP.addElement("TGA");
+    STOP.addElement("TAA");
+    STOP.addElement("TAG");
+
+    Trp.addElement("TGG");
+
+    Cys.addElement("TGC");
+    Cys.addElement("TGT");
+
+    Ile.addElement("ATA");
+    Ile.addElement("ATC");
+    Ile.addElement("ATT");
+
+    Met.addElement("ATG");
+
+    Leu.addElement("CTA");
+    Leu.addElement("CTG");
+    Leu.addElement("CTC");
+    Leu.addElement("CTT");
+    Leu.addElement("TTA");
+    Leu.addElement("TTG");
+
+    Val.addElement("GTA");
+    Val.addElement("GTG");
+    Val.addElement("GTC");
+    Val.addElement("GTT");
+
+    Phe.addElement("TTC");
+    Phe.addElement("TTT");
+  }
+
+
+  //Stores residue codes/names and colours and other things
+  public static Hashtable propHash = new Hashtable();
+  public static Hashtable hydrophobic = new Hashtable();
+  public static Hashtable polar = new Hashtable();
+  public static Hashtable small = new Hashtable();
+  public static Hashtable positive = new Hashtable();
+  public static Hashtable negative = new Hashtable();
+  public static Hashtable charged = new Hashtable();
+  public static Hashtable aromatic = new Hashtable();
+  public static Hashtable aliphatic = new Hashtable();
+  public static Hashtable tiny = new Hashtable();
+  public static Hashtable proline = new Hashtable();
+
+  static
+  {
+    hydrophobic.put("I", new Integer(1));
+    hydrophobic.put("L", new Integer(1));
+    hydrophobic.put("V", new Integer(1));
+    hydrophobic.put("C", new Integer(1));
+    hydrophobic.put("A", new Integer(1));
+    hydrophobic.put("G", new Integer(1));
+    hydrophobic.put("M", new Integer(1));
+    hydrophobic.put("F", new Integer(1));
+    hydrophobic.put("Y", new Integer(1));
+    hydrophobic.put("W", new Integer(1));
+    hydrophobic.put("H", new Integer(1));
+    hydrophobic.put("K", new Integer(1));
+    hydrophobic.put("X", new Integer(1));
+    hydrophobic.put("-", new Integer(1));
+    hydrophobic.put("*", new Integer(1));
+    hydrophobic.put("R", new Integer(0));
+    hydrophobic.put("E", new Integer(0));
+    hydrophobic.put("Q", new Integer(0));
+    hydrophobic.put("D", new Integer(0));
+    hydrophobic.put("N", new Integer(0));
+    hydrophobic.put("S", new Integer(0));
+    hydrophobic.put("T", new Integer(0));
+    hydrophobic.put("P", new Integer(0));
+  }
+
+  static
+  {
+    polar.put("Y", new Integer(1));
+    polar.put("W", new Integer(1));
+    polar.put("H", new Integer(1));
+    polar.put("K", new Integer(1));
+    polar.put("R", new Integer(1));
+    polar.put("E", new Integer(1));
+    polar.put("Q", new Integer(1));
+    polar.put("D", new Integer(1));
+    polar.put("N", new Integer(1));
+    polar.put("S", new Integer(1));
+    polar.put("T", new Integer(1));
+    polar.put("X", new Integer(1));
+    polar.put("-", new Integer(1));
+    polar.put("*", new Integer(1));
+    polar.put("I", new Integer(0));
+    polar.put("L", new Integer(0));
+    polar.put("V", new Integer(0));
+    polar.put("C", new Integer(0));
+    polar.put("A", new Integer(0));
+    polar.put("G", new Integer(0));
+    polar.put("M", new Integer(0));
+    polar.put("F", new Integer(0));
+    polar.put("P", new Integer(0));
+  }
+
+  static
+  {
+    small.put("I", new Integer(0));
+    small.put("L", new Integer(0));
+    small.put("V", new Integer(1));
+    small.put("C", new Integer(1));
+    small.put("A", new Integer(1));
+    small.put("G", new Integer(1));
+    small.put("M", new Integer(0));
+    small.put("F", new Integer(0));
+    small.put("Y", new Integer(0));
+    small.put("W", new Integer(0));
+    small.put("H", new Integer(0));
+    small.put("K", new Integer(0));
+    small.put("R", new Integer(0));
+    small.put("E", new Integer(0));
+    small.put("Q", new Integer(0));
+    small.put("D", new Integer(1));
+    small.put("N", new Integer(1));
+    small.put("S", new Integer(1));
+    small.put("T", new Integer(1));
+    small.put("P", new Integer(1));
+    small.put("-", new Integer(1));
+    small.put("*", new Integer(1));
+  }
+
+  static
+  {
+    positive.put("I", new Integer(0));
+    positive.put("L", new Integer(0));
+    positive.put("V", new Integer(0));
+    positive.put("C", new Integer(0));
+    positive.put("A", new Integer(0));
+    positive.put("G", new Integer(0));
+    positive.put("M", new Integer(0));
+    positive.put("F", new Integer(0));
+    positive.put("Y", new Integer(0));
+    positive.put("W", new Integer(0));
+    positive.put("H", new Integer(1));
+    positive.put("K", new Integer(1));
+    positive.put("R", new Integer(1));
+    positive.put("E", new Integer(0));
+    positive.put("Q", new Integer(0));
+    positive.put("D", new Integer(0));
+    positive.put("N", new Integer(0));
+    positive.put("S", new Integer(0));
+    positive.put("T", new Integer(0));
+    positive.put("P", new Integer(0));
+    positive.put("-", new Integer(1));
+    positive.put("*", new Integer(1));
+  }
+
+  static
+  {
+    negative.put("I", new Integer(0));
+    negative.put("L", new Integer(0));
+    negative.put("V", new Integer(0));
+    negative.put("C", new Integer(0));
+    negative.put("A", new Integer(0));
+    negative.put("G", new Integer(0));
+    negative.put("M", new Integer(0));
+    negative.put("F", new Integer(0));
+    negative.put("Y", new Integer(0));
+    negative.put("W", new Integer(0));
+    negative.put("H", new Integer(0));
+    negative.put("K", new Integer(0));
+    negative.put("R", new Integer(0));
+    negative.put("E", new Integer(1));
+    negative.put("Q", new Integer(0));
+    negative.put("D", new Integer(1));
+    negative.put("N", new Integer(0));
+    negative.put("S", new Integer(0));
+    negative.put("T", new Integer(0));
+    negative.put("P", new Integer(0));
+    negative.put("-", new Integer(1));
+    negative.put("*", new Integer(1));
+  }
+
+  static
+  {
+    charged.put("I", new Integer(0));
+    charged.put("L", new Integer(0));
+    charged.put("V", new Integer(0));
+    charged.put("C", new Integer(0));
+    charged.put("A", new Integer(0));
+    charged.put("G", new Integer(0));
+    charged.put("M", new Integer(0));
+    charged.put("F", new Integer(0));
+    charged.put("Y", new Integer(0));
+    charged.put("W", new Integer(0));
+    charged.put("H", new Integer(1));
+    charged.put("K", new Integer(1));
+    charged.put("R", new Integer(1));
+    charged.put("E", new Integer(1));
+    charged.put("Q", new Integer(0));
+    charged.put("D", new Integer(1));
+    charged.put("N", new Integer(1));
+    charged.put("S", new Integer(0));
+    charged.put("T", new Integer(0));
+    charged.put("P", new Integer(0));
+    charged.put("-", new Integer(1));
+    charged.put("*", new Integer(1));
+  }
+
+  static
+  {
+    aromatic.put("I", new Integer(0));
+    aromatic.put("L", new Integer(0));
+    aromatic.put("V", new Integer(0));
+    aromatic.put("C", new Integer(0));
+    aromatic.put("A", new Integer(0));
+    aromatic.put("G", new Integer(0));
+    aromatic.put("M", new Integer(0));
+    aromatic.put("F", new Integer(1));
+    aromatic.put("Y", new Integer(1));
+    aromatic.put("W", new Integer(1));
+    aromatic.put("H", new Integer(1));
+    aromatic.put("K", new Integer(0));
+    aromatic.put("R", new Integer(0));
+    aromatic.put("E", new Integer(0));
+    aromatic.put("Q", new Integer(0));
+    aromatic.put("D", new Integer(0));
+    aromatic.put("N", new Integer(0));
+    aromatic.put("S", new Integer(0));
+    aromatic.put("T", new Integer(0));
+    aromatic.put("P", new Integer(0));
+    aromatic.put("-", new Integer(1));
+    aromatic.put("*", new Integer(1));
+  }
+
+  static
+  {
+    aliphatic.put("I", new Integer(1));
+    aliphatic.put("L", new Integer(1));
+    aliphatic.put("V", new Integer(1));
+    aliphatic.put("C", new Integer(0));
+    aliphatic.put("A", new Integer(0));
+    aliphatic.put("G", new Integer(0));
+    aliphatic.put("M", new Integer(0));
+    aliphatic.put("F", new Integer(0));
+    aliphatic.put("Y", new Integer(0));
+    aliphatic.put("W", new Integer(0));
+    aliphatic.put("H", new Integer(0));
+    aliphatic.put("K", new Integer(0));
+    aliphatic.put("R", new Integer(0));
+    aliphatic.put("E", new Integer(0));
+    aliphatic.put("Q", new Integer(0));
+    aliphatic.put("D", new Integer(0));
+    aliphatic.put("N", new Integer(0));
+    aliphatic.put("S", new Integer(0));
+    aliphatic.put("T", new Integer(0));
+    aliphatic.put("P", new Integer(0));
+    aliphatic.put("-", new Integer(1));
+    aliphatic.put("*", new Integer(1));
+  }
+
+  static
+  {
+    tiny.put("I", new Integer(0));
+    tiny.put("L", new Integer(0));
+    tiny.put("V", new Integer(0));
+    tiny.put("C", new Integer(0));
+    tiny.put("A", new Integer(1));
+    tiny.put("G", new Integer(1));
+    tiny.put("M", new Integer(0));
+    tiny.put("F", new Integer(0));
+    tiny.put("Y", new Integer(0));
+    tiny.put("W", new Integer(0));
+    tiny.put("H", new Integer(0));
+    tiny.put("K", new Integer(0));
+    tiny.put("R", new Integer(0));
+    tiny.put("E", new Integer(0));
+    tiny.put("Q", new Integer(0));
+    tiny.put("D", new Integer(0));
+    tiny.put("N", new Integer(0));
+    tiny.put("S", new Integer(1));
+    tiny.put("T", new Integer(0));
+    tiny.put("P", new Integer(0));
+    tiny.put("-", new Integer(1));
+    tiny.put("*", new Integer(1));
+  }
+
+  static
+  {
+    proline.put("I", new Integer(0));
+    proline.put("L", new Integer(0));
+    proline.put("V", new Integer(0));
+    proline.put("C", new Integer(0));
+    proline.put("A", new Integer(0));
+    proline.put("G", new Integer(0));
+    proline.put("M", new Integer(0));
+    proline.put("F", new Integer(0));
+    proline.put("Y", new Integer(0));
+    proline.put("W", new Integer(0));
+    proline.put("H", new Integer(0));
+    proline.put("K", new Integer(0));
+    proline.put("R", new Integer(0));
+    proline.put("E", new Integer(0));
+    proline.put("Q", new Integer(0));
+    proline.put("D", new Integer(0));
+    proline.put("N", new Integer(0));
+    proline.put("S", new Integer(0));
+    proline.put("T", new Integer(0));
+    proline.put("P", new Integer(1));
+    proline.put("-", new Integer(1));
+    proline.put("*", new Integer(1));
+  }
+
+  static
+  {
+    propHash.put("hydrophobic", hydrophobic);
+    propHash.put("small", small);
+    propHash.put("positive", positive);
+    propHash.put("negative", negative);
+    propHash.put("charged", charged);
+    propHash.put("aromatic", aromatic);
+    propHash.put("aliphatic", aliphatic);
+    propHash.put("tiny", tiny);
+    propHash.put("proline", proline);
+    propHash.put("polar", polar);
+  }
+
+  private ResidueProperties()
+  {
+  }
+
+  public static double getHydmax()
+  {
+    return hydmax;
+  }
+
+  public static double getHydmin()
+  {
+    return hydmin;
+  }
+
+  public static double[] getHyd()
+  {
+    return hyd;
+  }
+
+  public static Hashtable getAA3Hash()
+  {
+    return aa3Hash;
+  }
+
+  public static int[][] getDNA()
+  {
+    return ResidueProperties.DNA;
+  }
+
+  public static int[][] getBLOSUM62()
+  {
+    return ResidueProperties.BLOSUM62;
+  }
+
+  public static int getPAM250(String A1, String A2)
+  {
+    int a = aaIndex[A1.charAt(0)];
+    int b = aaIndex[A2.charAt(0)];
+
+    int pog = ResidueProperties.PAM250[a][b];
+
+    return pog;
+  }
+
+  public static int getBLOSUM62(char c1, char c2)
+  {
+    int pog = 0;
+
+    try
+    {
+      int a = aaIndex[c1];
+      int b = aaIndex[c2];
+
+      pog = ResidueProperties.BLOSUM62[a][b];
+    }
+    catch (Exception e)
+    {
+      //System.out.println("Unknown residue in " + A1 + " " + A2);
+    }
+
+    return pog;
+  }
+
+  public static Vector getCodons(String res)
+  {
+    if (codonHash.containsKey(res))
+    {
+      return (Vector) codonHash.get(res);
+    }
+
+    return null;
+  }
+
+  public static String codonTranslate(String codon)
+  {
+    Enumeration e = codonHash.keys();
+
+    while (e.hasMoreElements())
+    {
+      String key = (String) e.nextElement();
+      Vector tmp = (Vector) codonHash.get(key);
+
+      if (tmp.contains(codon.toUpperCase()))
+      {
+        return key;
+      }
+    }
+
+    return null;
+  }
+
+  public static int[][] getDefaultPeptideMatrix() {
+    return ResidueProperties.getBLOSUM62();
+  }
+  public static int[][] getDefaultDnaMatrix() {
+    return ResidueProperties.getDNA();
+  }
+
+  /**
+   * get a ScoreMatrix based on its string name
+   * @param pwtype
+   * @return matrix in scoreMatrices with key pwtype or null
+   */
+  public static ScoreMatrix getScoreMatrix(String pwtype) {
+    Object val=scoreMatrices.get(pwtype);
+    if (val!=null)
+      return (ScoreMatrix) val;
+    return null;
+  }
+}
diff --git a/src/jalview/schemes/ScoreMatrix.java b/src/jalview/schemes/ScoreMatrix.java
new file mode 100644 (file)
index 0000000..03b6778
--- /dev/null
@@ -0,0 +1,54 @@
+package jalview.schemes;\r
+\r
+public class ScoreMatrix {\r
+  String name;\r
+  /**\r
+   * reference to integer score matrix\r
+   */\r
+  int[][] matrix;\r
+  /**\r
+   * 0 for Protein Score matrix. 1 for dna score matrix\r
+   */\r
+  int type;\r
+  ScoreMatrix(String name, int[][] matrix, int type) {\r
+    this.matrix=matrix;\r
+    this.type=type;\r
+  }\r
+  public boolean isDNA() {\r
+    return type==1;\r
+  }\r
+  public boolean isProtein() {\r
+    return type==0;\r
+  }\r
+  public int[][] getMatrix() {\r
+    return matrix;\r
+  }\r
+  /**\r
+   * \r
+   * @param A1\r
+   * @param A2\r
+   * @return score for substituting first char in A1 with first char in A2\r
+   */\r
+  public int getPairwiseScore(String A1, String A2)\r
+  {\r
+    return getPairwiseScore(A1.charAt(0),A2.charAt(0));\r
+  }\r
+  public int getPairwiseScore(char c, char d) {\r
+    int pog = 0;\r
+\r
+    try\r
+    {\r
+      int a = (type==0) ? ResidueProperties.aaIndex[c] : ResidueProperties.nucleotideIndex[c];\r
+      int b = (type==0) ? ResidueProperties.aaIndex[d] : ResidueProperties.nucleotideIndex[d];\r
+\r
+      pog = matrix[a][b];\r
+    }\r
+    catch (Exception e)\r
+    {\r
+      //System.out.println("Unknown residue in " + A1 + " " + A2);\r
+    }\r
+\r
+    return pog;\r
+  }\r
+\r
+}\r