JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / datamodel / BinarySequence.java
index af10e1d..ed57dce 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[getSequence().charAt(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[getSequence().charAt(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 ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.datamodel;
+
+import jalview.schemes.ResidueProperties;
+import jalview.schemes.ScoreMatrix;
+
+/**
+ * Encode a sequence as a numeric vector using either classic residue binary
+ * encoding or convolved with residue substitution matrix.
+ * 
+ * @author $author$
+ * @version $Revision$
+ */
+public class BinarySequence extends Sequence
+{
+  public class InvalidSequenceTypeException extends Exception
+  {
+
+    public InvalidSequenceTypeException(String string)
+    {
+      super(string);
+    }
+
+  }
+
+  int[] binary;
+
+  double[] dbinary;
+
+  boolean isNa = false;
+
+  /**
+   * Creates a new BinarySequence object.
+   * 
+   * @param s
+   *          DOCUMENT ME!
+   */
+  public BinarySequence(String s, boolean isNa)
+  {
+    super("", s, 0, s.length());
+    this.isNa = isNa;
+  }
+
+  /**
+   * clear the dbinary matrix
+   * 
+   * @return nores - dimension of sequence symbol encoding for this sequence
+   */
+  private int initMatrixGetNoRes()
+  {
+    int nores = (isNa) ? ResidueProperties.maxNucleotideIndex
+            : ResidueProperties.maxProteinIndex;
+    // Set all matrix to 0
+    dbinary = new double[getSequence().length * nores];
+
+    for (int i = 0; i < dbinary.length; i++)
+    {
+      dbinary[i] = 0.0;
+    }
+    return nores;
+  }
+
+  private int[] getSymbolmatrix()
+  {
+    return (isNa) ? ResidueProperties.nucleotideIndex
+            : ResidueProperties.aaIndex;
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public void encode()
+  {
+    int nores = initMatrixGetNoRes();
+    final int[] sindex = getSymbolmatrix();
+    for (int i = 0; i < getSequence().length; i++)
+    {
+      int aanum = nores - 1;
+
+      try
+      {
+        aanum = sindex[getCharAt(i)];
+      } catch (NullPointerException e)
+      {
+        aanum = nores - 1;
+      }
+
+      if (aanum >= nores)
+      {
+        aanum = nores - 1;
+      }
+
+      dbinary[(i * nores) + aanum] = 1.0;
+    }
+  }
+
+  /**
+   * ancode using substitution matrix given in matrix
+   * 
+   * @param matrix
+   */
+  public void matrixEncode(final ScoreMatrix matrix)
+          throws InvalidSequenceTypeException
+  {
+    if (isNa != matrix.isDNA())
+    {
+      throw new InvalidSequenceTypeException("matrix "
+              + matrix.getClass().getCanonicalName()
+              + " is not a valid matrix for "
+              + (isNa ? "nucleotide" : "protein") + "sequences");
+    }
+    matrixEncode(matrix.isDNA() ? ResidueProperties.nucleotideIndex
+            : ResidueProperties.aaIndex, matrix.getMatrix());
+  }
+
+  private void matrixEncode(final int[] aaIndex, final int[][] matrix)
+  {
+    // Set all matrix to 0
+    // dbinary = new double[getSequence().length * 21];
+
+    int nores = initMatrixGetNoRes();
+
+    // for (int i = 0; i < dbinary.length; i++) {
+    // dbinary[i] = 0.0;
+    // }
+    for (int i = 0, iSize = getSequence().length; i < iSize; i++)
+    {
+      int aanum = nores - 1;
+
+      try
+      {
+        aanum = aaIndex[getCharAt(i)];
+      } catch (NullPointerException e)
+      {
+        aanum = nores - 1;
+      }
+
+      if (aanum >= nores)
+      {
+        aanum = nores - 1;
+      }
+
+      // Do the blosum^H^H^H^H^H score matrix summation thing
+
+      for (int j = 0; j < nores; 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;
+  }
+
+}