alignment from seqCigars will correctly mark deleted residues as
[jalview.git] / src / jalview / datamodel / Sequence.java
index 65537ae..562440f 100755 (executable)
@@ -33,18 +33,26 @@ public class Sequence implements SequenceI
 {\r
     SequenceI datasetSequence;\r
     String name;\r
-    String sequence;\r
+    private String sequence;\r
     String description;\r
     int start;\r
     int end;\r
     Color color = Color.white;\r
     Vector pdbIds;\r
     String vamsasId;\r
-    Vector dbrefs;\r
+    DBRefEntry [] dbrefs;\r
 \r
+    /** This annotation is displayed below the alignment but the\r
+     * positions are tied to the residues of this sequence */\r
+    Vector annotation;\r
 \r
     /** DOCUMENT ME!! */\r
-    public Vector sequenceFeatures;\r
+    public SequenceFeature [] sequenceFeatures;\r
+\r
+    /** This array holds hidden sequences\r
+     * of which this sequence is the representitive member of a group\r
+     */\r
+    SequenceGroup hiddenSequences;\r
 \r
     /**\r
      * Creates a new Sequence object.\r
@@ -133,25 +141,40 @@ public class Sequence implements SequenceI
      *\r
      * @param v DOCUMENT ME!\r
      */\r
-    public void setSequenceFeatures(Vector v)\r
+    public void setSequenceFeatures(SequenceFeature [] features)\r
     {\r
-        sequenceFeatures = v;\r
+        sequenceFeatures = features;\r
     }\r
 \r
-    public void addSequenceFeature(SequenceFeature sf)\r
+    public synchronized void addSequenceFeature(SequenceFeature sf)\r
     {\r
       if(sequenceFeatures==null)\r
-        sequenceFeatures = new Vector();\r
+      {\r
+        sequenceFeatures = new SequenceFeature[0];\r
+      }\r
+\r
+      for(int i=0; i<sequenceFeatures.length; i++)\r
+      {\r
+        if(sequenceFeatures[i].equals(sf))\r
+        {\r
+          return;\r
+        }\r
+      }\r
 \r
-      sequenceFeatures.addElement(sf);\r
+      SequenceFeature [] temp = new SequenceFeature[sequenceFeatures.length+1];\r
+      System.arraycopy(sequenceFeatures, 0, temp, 0, sequenceFeatures.length);\r
+      temp[sequenceFeatures.length] = sf;\r
+\r
+      sequenceFeatures = temp;\r
     }\r
 \r
+\r
     /**\r
      * DOCUMENT ME!\r
      *\r
      * @return DOCUMENT ME!\r
      */\r
-    public Vector getSequenceFeatures()\r
+    public SequenceFeature [] getSequenceFeatures()\r
     {\r
         return sequenceFeatures;\r
     }\r
@@ -422,7 +445,7 @@ public class Sequence implements SequenceI
     public int[] gapMap()\r
     {\r
         // Returns an int array giving the position of each residue in the sequence in the alignment\r
-        String seq = jalview.analysis.AlignSeq.extractGaps("-. ", sequence);\r
+        String seq = jalview.analysis.AlignSeq.extractGaps(jalview.util.Comparison.GapChars, sequence);\r
         int[] map = new int[seq.length()];\r
         int j = 0;\r
         int p = 0;\r
@@ -478,16 +501,6 @@ public class Sequence implements SequenceI
         }\r
     }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param i DOCUMENT ME!\r
-     * @param c DOCUMENT ME!\r
-     */\r
-    public void insertCharAt(int i, char c)\r
-    {\r
-        insertCharAt(i, c, true);\r
-    }\r
 \r
     /**\r
      * DOCUMENT ME!\r
@@ -496,7 +509,7 @@ public class Sequence implements SequenceI
      * @param c DOCUMENT ME!\r
      * @param chop DOCUMENT ME!\r
      */\r
-    public void insertCharAt(int i, char c, boolean chop)\r
+    public void insertCharAt(int i, char c)\r
     {\r
         String tmp = new String(sequence);\r
 \r
@@ -547,11 +560,12 @@ public class Sequence implements SequenceI
       vamsasId = id;\r
     }\r
 \r
-    public void setDBRef(Vector dbref)\r
+    public void setDBRef(DBRefEntry [] dbref)\r
     {\r
       dbrefs = dbref;\r
     }\r
-    public Vector getDBRef()\r
+\r
+    public DBRefEntry [] getDBRef()\r
     {\r
       return dbrefs;\r
     }\r
@@ -559,9 +573,14 @@ public class Sequence implements SequenceI
     public void addDBRef(DBRefEntry entry)\r
     {\r
       if(dbrefs == null)\r
-        dbrefs = new Vector();\r
+        dbrefs = new DBRefEntry[0];\r
+\r
+      DBRefEntry [] temp = new DBRefEntry[dbrefs.length+1];\r
+      System.arraycopy(dbrefs, 0, temp, 0, dbrefs.length);\r
 \r
-      dbrefs.addElement(entry);\r
+      temp[temp.length-1] = entry;\r
+\r
+      dbrefs = temp;\r
     }\r
 \r
     public void setDatasetSequence(SequenceI seq)\r
@@ -574,4 +593,104 @@ public class Sequence implements SequenceI
       return datasetSequence;\r
     }\r
 \r
+    public AlignmentAnnotation [] getAnnotation()\r
+    {\r
+      if(annotation==null)\r
+        return null;\r
+\r
+      AlignmentAnnotation [] ret = new AlignmentAnnotation[annotation.size()];\r
+      for(int r = 0; r<ret.length; r++)\r
+        ret[r] = (AlignmentAnnotation)annotation.elementAt(r);\r
+\r
+      return ret;\r
+    }\r
+\r
+    public void addAlignmentAnnotation(AlignmentAnnotation annotation)\r
+    {\r
+      if(this.annotation==null)\r
+        this.annotation = new Vector();\r
+\r
+      this.annotation.addElement( annotation );\r
+    }\r
+\r
+    public SequenceGroup getHiddenSequences()\r
+    {\r
+      return hiddenSequences;\r
+    }\r
+\r
+    public void addHiddenSequence(SequenceI seq)\r
+    {\r
+      if(hiddenSequences==null)\r
+      {\r
+        hiddenSequences = new SequenceGroup();\r
+      }\r
+      hiddenSequences.addSequence(seq, false);\r
+    }\r
+\r
+    public void showHiddenSequence(SequenceI seq)\r
+    {\r
+      hiddenSequences.deleteSequence(seq, false);\r
+      if (hiddenSequences.getSize(false) < 1)\r
+      {\r
+        hiddenSequences = null;\r
+      }\r
+    }\r
+\r
+    public void changeCase(boolean toUpper, int start, int end)\r
+    {\r
+      StringBuffer newSeq = new StringBuffer();\r
+\r
+      if(end>sequence.length())\r
+        end = sequence.length();\r
+\r
+      if (start > 0)\r
+      {\r
+        newSeq.append(sequence.substring(0, start));\r
+      }\r
+\r
+      if (toUpper)\r
+        newSeq.append(sequence.substring(start, end).toUpperCase());\r
+      else\r
+        newSeq.append(sequence.substring(start, end).toLowerCase());\r
+\r
+      if (end < sequence.length())\r
+        newSeq.append(sequence.substring(end));\r
+\r
+      sequence = newSeq.toString();\r
+    }\r
+\r
+    public void toggleCase(int start, int end)\r
+    {\r
+      StringBuffer newSeq = new StringBuffer();\r
+\r
+     if(end>sequence.length())\r
+       end = sequence.length();\r
+\r
+     if (start > 0)\r
+     {\r
+       newSeq.append(sequence.substring(0, start));\r
+     }\r
+\r
+     char nextChar;\r
+     for(int c=start; c<end; c++)\r
+     {\r
+       nextChar = sequence.charAt(c);\r
+       if(Character.isLetter(nextChar))\r
+       {\r
+         if(Character.isUpperCase(nextChar))\r
+           nextChar = Character.toLowerCase(nextChar);\r
+         else\r
+           nextChar = Character.toUpperCase(nextChar);\r
+       }\r
+\r
+\r
+       newSeq.append(nextChar);\r
+     }\r
+\r
+     if (end < sequence.length())\r
+       newSeq.append(sequence.substring(end));\r
+\r
+     sequence = newSeq.toString();\r
+    }\r
+\r
 }\r