Don't parse input id, leave it as it is
[jalview.git] / src / jalview / datamodel / Alignment.java
index b3cf890..3a1b44a 100755 (executable)
@@ -1,21 +1,21 @@
 /*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 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
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2005 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.analysis.*;\r
@@ -27,33 +27,68 @@ import java.util.*;
 \r
 /** Data structure to hold and manipulate a multiple sequence alignment\r
  */\r
-public class Alignment implements AlignmentI {\r
+public class Alignment implements AlignmentI\r
+{\r
+    protected Alignment dataset;\r
     protected Vector sequences;\r
     protected Vector groups = new Vector();\r
     protected Vector superGroup = new Vector();\r
     protected char gapCharacter = '-';\r
+    protected Provenance provenance;\r
+    protected int type = NUCLEOTIDE;\r
+    public static final int PROTEIN = 0;\r
+    public static final int NUCLEOTIDE = 1;\r
+\r
+    /** DOCUMENT ME!! */\r
     public AlignmentAnnotation[] annotations;\r
+\r
+    /** DOCUMENT ME!! */\r
     public boolean featuresAdded = false;\r
 \r
     /** Make an alignment from an array of Sequences.\r
-    *\r
-    * @param sequences\r
-    */\r
-    public Alignment(SequenceI[] seqs) {\r
+     *\r
+     * @param sequences\r
+     */\r
+    public Alignment(SequenceI[] seqs)\r
+    {\r
+        int i=0;\r
+\r
+        if( jalview.util.Comparison.isNucleotide(seqs))\r
+          type = NUCLEOTIDE;\r
+        else\r
+          type = PROTEIN;\r
+\r
         sequences = new Vector();\r
 \r
-        for (int i = 0; i < seqs.length; i++)\r
+        for (i = 0; i < seqs.length; i++)\r
+        {\r
             sequences.addElement(seqs[i]);\r
+        }\r
 \r
         getWidth();\r
     }\r
 \r
-    public Vector getSequences() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public Vector getSequences()\r
+    {\r
         return sequences;\r
     }\r
 \r
-    public SequenceI getSequenceAt(int i) {\r
-        if (i < sequences.size()) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param i DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public SequenceI getSequenceAt(int i)\r
+    {\r
+        if (i < sequences.size())\r
+        {\r
             return (SequenceI) sequences.elementAt(i);\r
         }\r
 \r
@@ -64,75 +99,73 @@ public class Alignment implements AlignmentI {
      *\r
      * @param snew\r
      */\r
-    public void addSequence(SequenceI snew) {\r
+    public void addSequence(SequenceI snew)\r
+    {\r
         sequences.addElement(snew);\r
     }\r
 \r
-    public void addSequence(SequenceI[] seq) {\r
-        for (int i = 0; i < seq.length; i++) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param seq DOCUMENT ME!\r
+     */\r
+    public void addSequence(SequenceI[] seq)\r
+    {\r
+        for (int i = 0; i < seq.length; i++)\r
+        {\r
             addSequence(seq[i]);\r
         }\r
     }\r
 \r
     /** Adds a sequence to the alignment.  Recalculates maxLength and size.\r
-      *\r
+     *\r
      * @param snew\r
      */\r
-    public void setSequenceAt(int i, SequenceI snew) {\r
+    public void setSequenceAt(int i, SequenceI snew)\r
+    {\r
         SequenceI oldseq = getSequenceAt(i);\r
         deleteSequence(oldseq);\r
 \r
         sequences.setElementAt(snew, i);\r
     }\r
 \r
-    public Vector getGroups() {\r
-        return groups;\r
-    }\r
-\r
-    /** Sorts the sequences by sequence group size - largest to smallest.\r
-     * Uses QuickSort.\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
      */\r
-    public void sortGroups() {\r
-        float[] arr = new float[groups.size()];\r
-        Object[] s = new Object[groups.size()];\r
-\r
-        for (int i = 0; i < groups.size(); i++) {\r
-            arr[i] = ((SequenceGroup) groups.elementAt(i)).sequences.size();\r
-            s[i] = groups.elementAt(i);\r
-        }\r
-\r
-        QuickSort.sort(arr, s);\r
-\r
-        Vector newg = new Vector(groups.size());\r
-\r
-        for (int i = groups.size() - 1; i >= 0; i--) {\r
-            newg.addElement(s[i]);\r
-        }\r
-\r
-        groups = newg;\r
+    public Vector getGroups()\r
+    {\r
+        return groups;\r
     }\r
 \r
     /** Takes out columns consisting entirely of gaps (-,.," ")\r
      */\r
-    public void removeGaps() {\r
+    public void removeGaps()\r
+    {\r
         SequenceI current;\r
         int iSize = getWidth();\r
 \r
-        for (int i = 0; i < iSize; i++) {\r
+        for (int i = 0; i < iSize; i++)\r
+        {\r
             boolean delete = true;\r
 \r
-            for (int j = 0; j < getHeight(); j++) {\r
+            for (int j = 0; j < getHeight(); j++)\r
+            {\r
                 current = getSequenceAt(j);\r
 \r
-                if (current.getLength() > i) {\r
+                if (current.getLength() > i)\r
+                {\r
                     /* MC Should move this to a method somewhere */\r
-                    if (!jalview.util.Comparison.isGap(current.getCharAt(i))) {\r
+                    if (!jalview.util.Comparison.isGap(current.getCharAt(i)))\r
+                    {\r
                         delete = false;\r
                     }\r
                 }\r
             }\r
 \r
-            if (delete) {\r
+            if (delete)\r
+            {\r
                 deleteColumns(i, i);\r
                 iSize--;\r
                 i--;\r
@@ -140,59 +173,44 @@ public class Alignment implements AlignmentI {
         }\r
     }\r
 \r
-    /** Returns an array of Sequences containing columns\r
-     * start to end (inclusive) only.\r
-     *\r
-     * @param start start column to fetch\r
-     * @param end end column to fetch\r
-     * @return Array of Sequences, ready to put into a new Alignment\r
-     */\r
-    public SequenceI[] getColumns(int start, int end) {\r
-        return getColumns(0, getHeight() - 1, start, end);\r
-    }\r
-\r
     /** Removes a range of columns (start to end inclusive).\r
      *\r
      * @param start Start column in the alignment\r
      * @param end End column in the alignment\r
      */\r
-    public void deleteColumns(int start, int end) {\r
+    public void deleteColumns(int start, int end)\r
+    {\r
         deleteColumns(0, getHeight() - 1, start, end);\r
     }\r
 \r
-    public void deleteColumns(int seq1, int seq2, int start, int end) {\r
-        for (int i = 0; i <= (end - start); i++) {\r
-            for (int j = seq1; j <= seq2; j++) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param seq1 DOCUMENT ME!\r
+     * @param seq2 DOCUMENT ME!\r
+     * @param start DOCUMENT ME!\r
+     * @param end DOCUMENT ME!\r
+     */\r
+    public void deleteColumns(int seq1, int seq2, int start, int end)\r
+    {\r
+        for (int i = 0; i <= (end - start); i++)\r
+        {\r
+            for (int j = seq1; j <= seq2; j++)\r
+            {\r
                 getSequenceAt(j).deleteCharAt(start);\r
             }\r
         }\r
     }\r
 \r
-    public void insertColumns(SequenceI[] seqs, int pos) {\r
-        if (seqs.length == getHeight()) {\r
-            for (int i = 0; i < getHeight(); i++) {\r
-                String tmp = new String(getSequenceAt(i).getSequence());\r
-                getSequenceAt(i).setSequence(tmp.substring(0, pos) +\r
-                    seqs[i].getSequence() + tmp.substring(pos));\r
-            }\r
-        }\r
-    }\r
-\r
-    public SequenceI[] getColumns(int seq1, int seq2, int start, int end) {\r
-        SequenceI[] seqs = new Sequence[(seq2 - seq1) + 1];\r
-\r
-        for (int i = seq1; i <= seq2; i++) {\r
-            seqs[i] = new Sequence(getSequenceAt(i).getName(),\r
-                    getSequenceAt(i).getSequence().substring(start, end),\r
-                    getSequenceAt(i).findPosition(start),\r
-                    getSequenceAt(i).findPosition(end));\r
-        }\r
-\r
-        return seqs;\r
-    }\r
-\r
-    public void trimLeft(int i) {\r
-        for (int j = 0; j < getHeight(); j++) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param i DOCUMENT ME!\r
+     */\r
+    public void trimLeft(int i)\r
+    {\r
+        for (int j = 0; j < getHeight(); j++)\r
+        {\r
             SequenceI s = getSequenceAt(j);\r
             int newstart = s.findPosition(i);\r
 \r
@@ -201,8 +219,15 @@ public class Alignment implements AlignmentI {
         }\r
     }\r
 \r
-    public void trimRight(int i) {\r
-        for (int j = 0; j < getHeight(); j++) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param i DOCUMENT ME!\r
+     */\r
+    public void trimRight(int i)\r
+    {\r
+        for (int j = 0; j < getHeight(); j++)\r
+        {\r
             SequenceI s = getSequenceAt(j);\r
             int newend = s.findPosition(i);\r
 \r
@@ -211,36 +236,67 @@ public class Alignment implements AlignmentI {
         }\r
     }\r
 \r
-    public void deleteSequence(SequenceI s) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param s DOCUMENT ME!\r
+     */\r
+    public void deleteSequence(SequenceI s)\r
+    {\r
         for (int i = 0; i < getHeight(); i++)\r
-            if (getSequenceAt(i) == s) {\r
+        {\r
+            if (getSequenceAt(i) == s)\r
+            {\r
                 deleteSequence(i);\r
             }\r
+        }\r
     }\r
 \r
-    public void deleteSequence(int i) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param i DOCUMENT ME!\r
+     */\r
+    public void deleteSequence(int i)\r
+    {\r
         sequences.removeElementAt(i);\r
     }\r
 \r
-    public Vector removeRedundancy(float threshold, Vector sel) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param threshold DOCUMENT ME!\r
+     * @param sel DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public Vector removeRedundancy(float threshold, Vector sel)\r
+    {\r
         Vector del = new Vector();\r
 \r
-        for (int i = 1; i < sel.size(); i++) {\r
-            for (int j = 0; j < i; j++) {\r
+        for (int i = 1; i < sel.size(); i++)\r
+        {\r
+            for (int j = 0; j < i; j++)\r
+            {\r
                 // Only do the comparison if either have not been deleted\r
                 if (!del.contains((SequenceI) sel.elementAt(i)) ||\r
-                        !del.contains((SequenceI) sel.elementAt(j))) {\r
+                        !del.contains((SequenceI) sel.elementAt(j)))\r
+                {\r
                     // use PID instead of Comparison (which is really not pleasant)\r
                     float pid = Comparison.PID((SequenceI) sel.elementAt(j),\r
                             (SequenceI) sel.elementAt(i));\r
 \r
-                    if (pid >= threshold) {\r
+                    if (pid >= threshold)\r
+                    {\r
                         // Delete the shortest one\r
                         if (((SequenceI) sel.elementAt(j)).getSequence().length() > ((SequenceI) sel\r
                                                                                          .elementAt(\r
-                                    i)).getSequence().length()) {\r
+                                    i)).getSequence().length())\r
+                        {\r
                             del.addElement(sel.elementAt(i));\r
-                        } else {\r
+                        }\r
+                        else\r
+                        {\r
                             del.addElement(sel.elementAt(i));\r
                         }\r
                     }\r
@@ -250,78 +306,28 @@ public class Alignment implements AlignmentI {
 \r
         // Now delete the sequences\r
         for (int i = 0; i < del.size(); i++)\r
+        {\r
             deleteSequence((SequenceI) del.elementAt(i));\r
-\r
-        return del;\r
-    }\r
-\r
-    public void sortByPID(SequenceI s) {\r
-        float[] scores = new float[getHeight()];\r
-        SequenceI[] seqs = new SequenceI[getHeight()];\r
-\r
-        for (int i = 0; i < getHeight(); i++) {\r
-            scores[i] = Comparison.compare(getSequenceAt(i), s);\r
-            seqs[i] = getSequenceAt(i);\r
-        }\r
-\r
-        QuickSort.sort(scores, 0, scores.length - 1, seqs);\r
-\r
-        int len = 0;\r
-\r
-        if ((getHeight() % 2) == 0) {\r
-            len = getHeight() / 2;\r
-        } else {\r
-            len = (getHeight() + 1) / 2;\r
-        }\r
-\r
-        for (int i = 0; i < len; i++) {\r
-            SequenceI tmp = seqs[i];\r
-            sequences.setElementAt(seqs[getHeight() - i - 1], i);\r
-            sequences.setElementAt(tmp, getHeight() - i - 1);\r
         }\r
-    }\r
-\r
-    public void sortByID() {\r
-        String[] ids = new String[getHeight()];\r
-        SequenceI[] seqs = new SequenceI[getHeight()];\r
 \r
-        for (int i = 0; i < getHeight(); i++) {\r
-            ids[i] = getSequenceAt(i).getName();\r
-            seqs[i] = getSequenceAt(i);\r
-        }\r
-\r
-        QuickSort.sort(ids, seqs);\r
-\r
-        int len = 0;\r
-\r
-        if ((getHeight() % 2) == 0) {\r
-            len = getHeight() / 2;\r
-        } else {\r
-            len = (getHeight() + 1) / 2;\r
-            System.out.println("DEBUG:Sort len is odd = " + len); // log.\r
-        }\r
-\r
-        for (int i = 0; i < len; i++) {\r
-            System.out.println("DEBUG:Swapping " + seqs[i].getName() + " and " +\r
-                seqs[getHeight() - i - 1].getName()); // log.\r
-\r
-            SequenceI tmp = seqs[i];\r
-            sequences.setElementAt(seqs[getHeight() - i - 1], i);\r
-            sequences.setElementAt(tmp, getHeight() - i - 1);\r
-        }\r
+        return del;\r
     }\r
 \r
     /**    */\r
-    public SequenceGroup findGroup(int i) {\r
+    public SequenceGroup findGroup(int i)\r
+    {\r
         return findGroup(getSequenceAt(i));\r
     }\r
 \r
     /**    */\r
-    public SequenceGroup findGroup(SequenceI s) {\r
-        for (int i = 0; i < this.groups.size(); i++) {\r
+    public SequenceGroup findGroup(SequenceI s)\r
+    {\r
+        for (int i = 0; i < this.groups.size(); i++)\r
+        {\r
             SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
 \r
-            if (sg.sequences.contains(s)) {\r
+            if (sg.sequences.contains(s))\r
+            {\r
                 return sg;\r
             }\r
         }\r
@@ -329,13 +335,30 @@ public class Alignment implements AlignmentI {
         return null;\r
     }\r
 \r
-    public SequenceGroup[] findAllGroups(SequenceI s) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param s DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public SequenceGroup[] findAllGroups(SequenceI s)\r
+    {\r
         Vector temp = new Vector();\r
 \r
-        for (int i = 0; i < this.groups.size(); i++) {\r
+        int gSize = groups.size();\r
+        for (int i = 0; i < gSize; i++)\r
+        {\r
             SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
+            if(sg==null || sg.sequences==null)\r
+            {\r
+              this.deleteGroup(sg);\r
+              gSize--;\r
+              continue;\r
+            }\r
 \r
-            if (sg.sequences.contains(s)) {\r
+            if (sg.sequences.contains(s))\r
+            {\r
                 temp.addElement(sg);\r
             }\r
         }\r
@@ -343,44 +366,48 @@ public class Alignment implements AlignmentI {
         SequenceGroup[] ret = new SequenceGroup[temp.size()];\r
 \r
         for (int i = 0; i < temp.size(); i++)\r
+        {\r
             ret[i] = (SequenceGroup) temp.elementAt(i);\r
-\r
-        return ret;\r
-    }\r
-\r
-    /**    */\r
-    public void addToGroup(SequenceGroup g, SequenceI s) {\r
-        if (!(g.sequences.contains(s))) {\r
-            g.sequences.addElement(s);\r
         }\r
-    }\r
 \r
-    /**    */\r
-    public void removeFromGroup(SequenceGroup g, SequenceI s) {\r
-        if ((g != null) && (g.sequences != null)) {\r
-            if (g.sequences.contains(s)) {\r
-                g.sequences.removeElement(s);\r
-\r
-                if (g.sequences.size() == 0) {\r
-                    groups.removeElement(g);\r
-                }\r
-            }\r
-        }\r
+        return ret;\r
     }\r
 \r
-    public void addSuperGroup(SuperGroup sg) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param sg DOCUMENT ME!\r
+     */\r
+    public void addSuperGroup(SuperGroup sg)\r
+    {\r
         superGroup.addElement(sg);\r
     }\r
 \r
-    public void removeSuperGroup(SuperGroup sg) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param sg DOCUMENT ME!\r
+     */\r
+    public void removeSuperGroup(SuperGroup sg)\r
+    {\r
         superGroup.removeElement(sg);\r
     }\r
 \r
-    public SuperGroup getSuperGroup(SequenceGroup sg) {\r
-        for (int i = 0; i < this.superGroup.size(); i++) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param sg DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public SuperGroup getSuperGroup(SequenceGroup sg)\r
+    {\r
+        for (int i = 0; i < this.superGroup.size(); i++)\r
+        {\r
             SuperGroup temp = (SuperGroup) superGroup.elementAt(i);\r
 \r
-            if (temp.sequenceGroups.contains(sg)) {\r
+            if (temp.sequenceGroups.contains(sg))\r
+            {\r
                 return temp;\r
             }\r
         }\r
@@ -389,19 +416,26 @@ public class Alignment implements AlignmentI {
     }\r
 \r
     /**    */\r
-    public void addGroup(SequenceGroup sg) {\r
-        if (!groups.contains(sg)) {\r
+    public void addGroup(SequenceGroup sg)\r
+    {\r
+        if (!groups.contains(sg))\r
+        {\r
             groups.addElement(sg);\r
         }\r
     }\r
 \r
-    public void deleteAllGroups() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     */\r
+    public void deleteAllGroups()\r
+    {\r
         groups.removeAllElements();\r
         superGroup.removeAllElements();\r
 \r
         int i = 0;\r
 \r
-        while (i < sequences.size()) {\r
+        while (i < sequences.size())\r
+        {\r
             SequenceI s = getSequenceAt(i);\r
             s.setColor(java.awt.Color.white);\r
             i++;\r
@@ -409,21 +443,24 @@ public class Alignment implements AlignmentI {
     }\r
 \r
     /**    */\r
-    public void deleteGroup(SequenceGroup g) {\r
-        if (groups.contains(g)) {\r
+    public void deleteGroup(SequenceGroup g)\r
+    {\r
+        if (groups.contains(g))\r
+        {\r
             groups.removeElement(g);\r
         }\r
     }\r
 \r
     /**    */\r
-    public SequenceI findName(String name) {\r
+    public SequenceI findName(String name)\r
+    {\r
         int i = 0;\r
 \r
-        while (i < sequences.size()) {\r
-            SequenceI s = getSequenceAt(i);\r
-\r
-            if (s.getName().equals(name)) {\r
-                return s;\r
+        while (i < sequences.size())\r
+        {\r
+            if (getSequenceAt(i).getName().equals(name))\r
+            {\r
+                return getSequenceAt(i);\r
             }\r
 \r
             i++;\r
@@ -432,29 +469,16 @@ public class Alignment implements AlignmentI {
         return null;\r
     }\r
 \r
-    /**    */\r
-    public SequenceI findbyDisplayId(String name) {\r
-        int i = 0;\r
-\r
-        while (i < sequences.size()) {\r
-            SequenceI s = getSequenceAt(i);\r
-\r
-            if (s.getDisplayId().equals(name)) {\r
-                return s;\r
-            }\r
-\r
-            i++;\r
-        }\r
-\r
-        return null;\r
-    }\r
 \r
     /**    */\r
-    public int findIndex(SequenceI s) {\r
+    public int findIndex(SequenceI s)\r
+    {\r
         int i = 0;\r
 \r
-        while (i < sequences.size()) {\r
-            if (s == getSequenceAt(i)) {\r
+        while (i < sequences.size())\r
+        {\r
+            if (s == getSequenceAt(i))\r
+            {\r
                 return i;\r
             }\r
 \r
@@ -464,15 +488,29 @@ public class Alignment implements AlignmentI {
         return -1;\r
     }\r
 \r
-    public int getHeight() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public int getHeight()\r
+    {\r
         return sequences.size();\r
     }\r
 \r
-    public int getWidth() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public int getWidth()\r
+    {\r
         int maxLength = -1;\r
 \r
-        for (int i = 0; i < sequences.size(); i++) {\r
-            if (getSequenceAt(i).getLength() > maxLength) {\r
+        for (int i = 0; i < sequences.size(); i++)\r
+        {\r
+            if (getSequenceAt(i).getLength() > maxLength)\r
+            {\r
                 maxLength = getSequenceAt(i).getLength();\r
             }\r
         }\r
@@ -480,16 +518,24 @@ public class Alignment implements AlignmentI {
         return maxLength;\r
     }\r
 \r
-    public int getMaxIdLength() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public int getMaxIdLength()\r
+    {\r
         int max = 0;\r
         int i = 0;\r
 \r
-        while (i < sequences.size()) {\r
+        while (i < sequences.size())\r
+        {\r
             SequenceI seq = getSequenceAt(i);\r
             String tmp = seq.getName() + "/" + seq.getStart() + "-" +\r
                 seq.getEnd();\r
 \r
-            if (tmp.length() > max) {\r
+            if (tmp.length() > max)\r
+            {\r
                 max = tmp.length();\r
             }\r
 \r
@@ -499,39 +545,75 @@ public class Alignment implements AlignmentI {
         return max;\r
     }\r
 \r
-    public void setGapCharacter(char gc) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param gc DOCUMENT ME!\r
+     */\r
+    public void setGapCharacter(char gc)\r
+    {\r
         gapCharacter = gc;\r
 \r
-        for (int i = 0; i < sequences.size(); i++) {\r
+        for (int i = 0; i < sequences.size(); i++)\r
+        {\r
             Sequence seq = (Sequence) sequences.elementAt(i);\r
             seq.sequence = seq.sequence.replace('.', gc);\r
             seq.sequence = seq.sequence.replace('-', gc);\r
+            seq.sequence = seq.sequence.replace(' ', gc);\r
         }\r
     }\r
 \r
-    public char getGapCharacter() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public char getGapCharacter()\r
+    {\r
         return gapCharacter;\r
     }\r
 \r
-    public Vector getAAFrequency() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public Vector getAAFrequency()\r
+    {\r
         return AAFrequency.calculate(sequences, 0, getWidth());\r
     }\r
 \r
-    public boolean isAligned() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public boolean isAligned()\r
+    {\r
         int width = getWidth();\r
 \r
         for (int i = 0; i < sequences.size(); i++)\r
-            if (getSequenceAt(i).getLength() != width) {\r
+        {\r
+            if (getSequenceAt(i).getLength() != width)\r
+            {\r
                 return false;\r
             }\r
+        }\r
 \r
         return true;\r
     }\r
 \r
-    public void deleteAnnotation(AlignmentAnnotation aa) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param aa DOCUMENT ME!\r
+     */\r
+    public void deleteAnnotation(AlignmentAnnotation aa)\r
+    {\r
         int aSize = 1;\r
 \r
-        if (annotations != null) {\r
+        if (annotations != null)\r
+        {\r
             aSize = annotations.length;\r
         }\r
 \r
@@ -539,8 +621,10 @@ public class Alignment implements AlignmentI {
 \r
         int tIndex = 0;\r
 \r
-        for (int i = 0; i < aSize; i++) {\r
-            if (annotations[i] == aa) {\r
+        for (int i = 0; i < aSize; i++)\r
+        {\r
+            if (annotations[i] == aa)\r
+            {\r
                 continue;\r
             }\r
 \r
@@ -551,19 +635,30 @@ public class Alignment implements AlignmentI {
         annotations = temp;\r
     }\r
 \r
-    public void addAnnotation(AlignmentAnnotation aa) {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @param aa DOCUMENT ME!\r
+     */\r
+    public void addAnnotation(AlignmentAnnotation aa)\r
+    {\r
         int aSize = 1;\r
 \r
-        if (annotations != null) {\r
+        if (annotations != null)\r
+        {\r
             aSize = annotations.length + 1;\r
         }\r
 \r
+\r
         AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];\r
         int i = 0;\r
 \r
-        if (aSize > 1) {\r
+        if (aSize > 1)\r
+        {\r
             for (i = 0; i < (aSize - 1); i++)\r
+            {\r
                 temp[i] = annotations[i];\r
+            }\r
         }\r
 \r
         temp[i] = aa;\r
@@ -571,7 +666,73 @@ public class Alignment implements AlignmentI {
         annotations = temp;\r
     }\r
 \r
-    public AlignmentAnnotation[] getAlignmentAnnotation() {\r
+    /**\r
+     * DOCUMENT ME!\r
+     *\r
+     * @return DOCUMENT ME!\r
+     */\r
+    public AlignmentAnnotation[] getAlignmentAnnotation()\r
+    {\r
         return annotations;\r
     }\r
+\r
+    public void setNucleotide(boolean b)\r
+    {\r
+      if(b)\r
+        type = NUCLEOTIDE;\r
+      else\r
+        type = PROTEIN;\r
+    }\r
+\r
+    public boolean isNucleotide()\r
+    {\r
+      if(type==NUCLEOTIDE)\r
+        return true;\r
+      else\r
+        return false;\r
+    }\r
+\r
+    public void setDataset(Alignment data)\r
+    {\r
+      if(dataset==null && data==null)\r
+      {\r
+        // Create a new dataset for this alignment.\r
+        // Can only be done once, if dataset is not null\r
+        // This will not be performed\r
+        Sequence[] seqs = new Sequence[getHeight()];\r
+        for (int i = 0; i < getHeight(); i++)\r
+        {\r
+\r
+          seqs[i] = new Sequence(getSequenceAt(i).getDisplayId(true),\r
+                                 AlignSeq.extractGaps(\r
+                                     jalview.util.Comparison.GapChars,\r
+                                     getSequenceAt(i).getSequence()\r
+                                 ),\r
+                                 getSequenceAt(i).getStart(),\r
+                                 getSequenceAt(i).getEnd());\r
+\r
+          getSequenceAt(i).setDatasetSequence(seqs[i]);\r
+        }\r
+\r
+        dataset = new Alignment(seqs);\r
+      }\r
+      else if(dataset==null && data!=null)\r
+      {\r
+        dataset = data;\r
+      }\r
+    }\r
+\r
+    public Alignment getDataset()\r
+    {\r
+      return dataset;\r
+    }\r
+\r
+    public void setProvenance(Provenance prov)\r
+    {\r
+      provenance = prov;\r
+    }\r
+    public Provenance getProvenance()\r
+    {\r
+      return provenance;\r
+    }\r
 }\r