JAL-1114 - refactor methods handling Vectors and Hashtables to Lists and Maps, and...
[jalview.git] / src / jalview / datamodel / Alignment.java
index 7fb4659..23fe057 100755 (executable)
@@ -1,20 +1,19 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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 file is part of Jalview.
  * 
- * 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.
+ * 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.
  * 
- * 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
+ * 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/>.
  */
 package jalview.datamodel;
 
@@ -44,6 +43,8 @@ public class Alignment implements AlignmentI
   public static final int PROTEIN = 0;
 
   public static final int NUCLEOTIDE = 1;
+  
+  public boolean hasRNAStructure = false;
 
   /** DOCUMENT ME!! */
   public AlignmentAnnotation[] annotations;
@@ -121,6 +122,13 @@ public class Alignment implements AlignmentI
   {
     return sequences;
   }
+  @Override
+  public List<SequenceI> getSequences(
+          Map<SequenceI, SequenceCollectionI> hiddenReps)
+  {
+    // TODO: in jalview 2.8 we don't do anything with hiddenreps - fix design to work on this.
+    return sequences;
+  }
 
   public SequenceI[] getSequencesArray()
   {
@@ -144,7 +152,7 @@ public class Alignment implements AlignmentI
    */
   public SequenceI getSequenceAt(int i)
   {
-    if (i < sequences.size())
+    if (i>-1 && i < sequences.size())
     {
       return (SequenceI) sequences.elementAt(i);
     }
@@ -345,11 +353,13 @@ public class Alignment implements AlignmentI
 
   /**
    * remove any annotation that references gp
-   * @param gp (if null, removes all group associated annotation)
+   * 
+   * @param gp
+   *          (if null, removes all group associated annotation)
    */
   private void removeAnnotationForGroup(SequenceGroup gp)
   {
-    if (annotations==null || annotations.length==0)
+    if (annotations == null || annotations.length == 0)
     {
       return;
     }
@@ -592,8 +602,8 @@ public class Alignment implements AlignmentI
     for (int i = 0; i < sequences.size(); i++)
     {
       Sequence seq = (Sequence) sequences.elementAt(i);
-      seq.setSequence(seq.getSequenceAsString().replace('.', gc).replace(
-              '-', gc).replace(' ', gc));
+      seq.setSequence(seq.getSequenceAsString().replace('.', gc)
+              .replace('-', gc).replace(' ', gc));
     }
   }
 
@@ -607,19 +617,26 @@ public class Alignment implements AlignmentI
     return gapCharacter;
   }
 
-  /* (non-Javadoc)
+  /*
+   * (non-Javadoc)
+   * 
    * @see jalview.datamodel.AlignmentI#isAligned()
    */
   public boolean isAligned()
   {
     return isAligned(false);
   }
-  /* (non-Javadoc)
+
+  /*
+   * (non-Javadoc)
+   * 
    * @see jalview.datamodel.AlignmentI#isAligned(boolean)
    */
-  public boolean isAligned(boolean includeHidden) {
+  public boolean isAligned(boolean includeHidden)
+  {
     int width = getWidth();
-    if (hiddenSequences==null || hiddenSequences.getSize()==0) {
+    if (hiddenSequences == null || hiddenSequences.getSize() == 0)
+    {
       includeHidden = true; // no hidden sequences to check against.
     }
     for (int i = 0; i < sequences.size(); i++)
@@ -644,6 +661,11 @@ public class Alignment implements AlignmentI
    */
   public boolean deleteAnnotation(AlignmentAnnotation aa)
   {
+    return deleteAnnotation(aa, true);
+  }
+  
+  public boolean deleteAnnotation(AlignmentAnnotation aa, boolean unhook)
+  {
     int aSize = 1;
 
     if (annotations != null)
@@ -675,7 +697,9 @@ public class Alignment implements AlignmentI
     if (swap)
     {
       annotations = temp;
-      unhookAnnotation(aa);
+      if (unhook) {
+        unhookAnnotation(aa);
+      }
     }
     return swap;
   }
@@ -717,6 +741,10 @@ public class Alignment implements AlignmentI
    */
   public void addAnnotation(AlignmentAnnotation aa, int pos)
   {
+    if(aa.getRNAStruc()!= null){
+      hasRNAStructure=true;
+    }
+    
     int aSize = 1;
     if (annotations != null)
     {
@@ -784,10 +812,9 @@ public class Alignment implements AlignmentI
     annotations = temp;
   }
 
+  @Override
   /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
+   * returns all annotation on the alignment
    */
   public AlignmentAnnotation[] getAlignmentAnnotation()
   {
@@ -817,6 +844,11 @@ public class Alignment implements AlignmentI
       return false;
     }
   }
+  
+  public boolean hasRNAStructure(){
+    //TODO can it happen that structure is removed from alignment?
+    return hasRNAStructure;
+  }
 
   public void setDataset(Alignment data)
   {
@@ -1194,13 +1226,12 @@ public class Alignment implements AlignmentI
     {
       this.addCodonFrame(acod[a]);
     }
-    Vector sg = toappend.getGroups();
+    List<SequenceGroup> sg = toappend.getGroups();
     if (sg != null)
     {
-      Enumeration el = sg.elements();
-      while (el.hasMoreElements())
+      for (SequenceGroup _sg:sg)
       {
-        addGroup((SequenceGroup) el.nextElement());
+        addGroup(_sg);
       }
     }
     if (toappend.getHiddenSequences() != null)
@@ -1267,4 +1298,47 @@ public class Alignment implements AlignmentI
     }
   }
 
+  @Override
+  public AlignmentAnnotation findOrCreateAnnotation(String name, boolean autoCalc,
+          SequenceI seqRef, SequenceGroup groupRef)
+  {
+    for (AlignmentAnnotation annot : 
+            getAlignmentAnnotation())
+    {
+      if (annot.autoCalculated == autoCalc
+              && annot.getCalcId().equals(name)
+              && annot.sequenceRef == seqRef && annot.groupRef == groupRef)
+      {
+        return annot;
+      }
+    }
+    AlignmentAnnotation annot = new AlignmentAnnotation(name, name,
+            new Annotation[1], 0f, 0f, AlignmentAnnotation.BAR_GRAPH);
+    annot.hasText = false;
+    annot.setCalcId(new String(name));
+    annot.autoCalculated = autoCalc;
+    if (seqRef != null)
+    {
+      annot.setSequenceRef(seqRef);
+    }
+    annot.groupRef = groupRef;
+    addAnnotation(annot);
+
+    return annot;
+  }
+
+  @Override
+  public Iterable<AlignmentAnnotation> findAnnotation(String calcId)
+  {
+    ArrayList<AlignmentAnnotation> aa=new ArrayList<AlignmentAnnotation>();
+    for (AlignmentAnnotation a:getAlignmentAnnotation())
+    {
+      if (a.getCalcId()==calcId || (a.getCalcId()!=null && calcId!=null && a.getCalcId().equals(calcId)))
+      {
+        aa.add(a);
+      }
+    }
+    return aa;
+  }
+
 }