JAL-1926 added supporting model changes to enable saving sourceDBRef data for sequences
[jalview.git] / src / jalview / datamodel / Sequence.java
index 7efd4ae..9f65f71 100755 (executable)
  */
 package jalview.datamodel;
 
+import jalview.analysis.AlignSeq;
+import jalview.api.DBRefEntryI;
+import jalview.util.StringUtils;
+
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.List;
@@ -27,9 +31,6 @@ import java.util.Vector;
 
 import fr.orsay.lri.varna.models.rna.RNA;
 
-import jalview.analysis.AlignSeq;
-import jalview.util.StringUtils;
-
 /**
  * 
  * Implements the SequenceI interface for a char[] based sequence object.
@@ -55,6 +56,8 @@ public class Sequence extends ASequence implements SequenceI
 
   String vamsasId;
 
+  DBRefEntryI sourceDBRef;
+
   DBRefEntry[] dbrefs;
 
   RNA rna;
@@ -259,9 +262,9 @@ public class Sequence extends ASequence implements SequenceI
         }
       }
     }
-    if (seq.getPDBId() != null)
+    if (seq.getAllPDBEntries() != null)
     {
-      Vector ids = seq.getPDBId();
+      Vector ids = seq.getAllPDBEntries();
       Enumeration e = ids.elements();
       while (e.hasMoreElements())
       {
@@ -276,11 +279,13 @@ public class Sequence extends ASequence implements SequenceI
    * @param v
    *          DOCUMENT ME!
    */
+  @Override
   public void setSequenceFeatures(SequenceFeature[] features)
   {
     sequenceFeatures = features;
   }
 
+  @Override
   public synchronized void addSequenceFeature(SequenceFeature sf)
   {
     if (sequenceFeatures == null)
@@ -303,6 +308,7 @@ public class Sequence extends ASequence implements SequenceI
     sequenceFeatures = temp;
   }
 
+  @Override
   public void deleteFeature(SequenceFeature sf)
   {
     if (sequenceFeatures == null)
@@ -352,6 +358,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return
    */
+  @Override
   public SequenceFeature[] getSequenceFeatures()
   {
     SequenceFeature[] features = sequenceFeatures;
@@ -367,6 +374,7 @@ public class Sequence extends ASequence implements SequenceI
     return features;
   }
 
+  @Override
   public void addPDBId(PDBEntry entry)
   {
     if (pdbIds == null)
@@ -409,7 +417,7 @@ public class Sequence extends ASequence implements SequenceI
    * @return DOCUMENT ME!
    */
   @Override
-  public Vector<PDBEntry> getPDBId()
+  public Vector<PDBEntry> getAllPDBEntries()
   {
     return pdbIds;
   }
@@ -419,6 +427,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public String getDisplayId(boolean jvsuffix)
   {
     StringBuffer result = new StringBuffer(name);
@@ -436,6 +445,7 @@ public class Sequence extends ASequence implements SequenceI
    * @param name
    *          DOCUMENT ME!
    */
+  @Override
   public void setName(String name)
   {
     this.name = name;
@@ -447,6 +457,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public String getName()
   {
     return this.name;
@@ -458,6 +469,7 @@ public class Sequence extends ASequence implements SequenceI
    * @param start
    *          DOCUMENT ME!
    */
+  @Override
   public void setStart(int start)
   {
     this.start = start;
@@ -468,6 +480,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public int getStart()
   {
     return this.start;
@@ -479,6 +492,7 @@ public class Sequence extends ASequence implements SequenceI
    * @param end
    *          DOCUMENT ME!
    */
+  @Override
   public void setEnd(int end)
   {
     this.end = end;
@@ -489,6 +503,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public int getEnd()
   {
     return this.end;
@@ -499,6 +514,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public int getLength()
   {
     return this.sequence.length;
@@ -510,22 +526,26 @@ public class Sequence extends ASequence implements SequenceI
    * @param seq
    *          DOCUMENT ME!
    */
+  @Override
   public void setSequence(String seq)
   {
     this.sequence = seq.toCharArray();
     checkValidRange();
   }
 
+  @Override
   public String getSequenceAsString()
   {
     return new String(sequence);
   }
 
+  @Override
   public String getSequenceAsString(int start, int end)
   {
     return new String(getSequence(start, end));
   }
 
+  @Override
   public char[] getSequence()
   {
     return sequence;
@@ -536,6 +556,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @see jalview.datamodel.SequenceI#getSequence(int, int)
    */
+  @Override
   public char[] getSequence(int start, int end)
   {
     if (start < 0)
@@ -596,6 +617,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public char getCharAt(int i)
   {
     if (i < sequence.length)
@@ -614,6 +636,7 @@ public class Sequence extends ASequence implements SequenceI
    * @param desc
    *          DOCUMENT ME!
    */
+  @Override
   public void setDescription(String desc)
   {
     this.description = desc;
@@ -624,6 +647,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public String getDescription()
   {
     return this.description;
@@ -634,6 +658,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @see jalview.datamodel.SequenceI#findIndex(int)
    */
+  @Override
   public int findIndex(int pos)
   {
     // returns the alignment position for a residue
@@ -686,6 +711,7 @@ public class Sequence extends ASequence implements SequenceI
    * @return int[SequenceI.getEnd()-SequenceI.getStart()+1] or null if no
    *         residues in SequenceI object
    */
+  @Override
   public int[] gapMap()
   {
     String seq = jalview.analysis.AlignSeq.extractGaps(
@@ -747,8 +773,7 @@ public class Sequence extends ASequence implements SequenceI
       {
         if (lastj != -1)
         {
-          map.add(new int[]
-          { lastj, j - 1 });
+          map.add(new int[] { lastj, j - 1 });
           lastj = -1;
         }
       }
@@ -756,8 +781,7 @@ public class Sequence extends ASequence implements SequenceI
     }
     if (lastj != -1)
     {
-      map.add(new int[]
-      { lastj, j - 1 });
+      map.add(new int[] { lastj, j - 1 });
       lastj = -1;
     }
     return map;
@@ -767,7 +791,7 @@ public class Sequence extends ASequence implements SequenceI
   public void deleteChars(int i, int j)
   {
     int newstart = start, newend = end;
-    if (i >= sequence.length)
+    if (i >= sequence.length || i < 0)
     {
       return;
     }
@@ -955,7 +979,6 @@ public class Sequence extends ASequence implements SequenceI
             .toArray(new AlignmentAnnotation[annotation.size()]);
   }
 
-
   @Override
   public boolean hasAnnotation(AlignmentAnnotation ann)
   {
@@ -976,6 +999,7 @@ public class Sequence extends ASequence implements SequenceI
     annotation.setSequenceRef(this);
   }
 
+  @Override
   public void removeAlignmentAnnotation(AlignmentAnnotation annotation)
   {
     if (this.annotation != null)
@@ -1043,6 +1067,7 @@ public class Sequence extends ASequence implements SequenceI
    * 
    * @see jalview.datamodel.SequenceI#createDatasetSequence()
    */
+  @Override
   public SequenceI createDatasetSequence()
   {
     if (datasetSequence == null)
@@ -1056,7 +1081,7 @@ public class Sequence extends ASequence implements SequenceI
       // move database references onto dataset sequence
       datasetSequence.setDBRef(getDBRef());
       setDBRef(null);
-      datasetSequence.setPDBId(getPDBId());
+      datasetSequence.setPDBId(getAllPDBEntries());
       setPDBId(null);
       datasetSequence.updatePDBIds();
       if (annotation != null)
@@ -1081,6 +1106,7 @@ public class Sequence extends ASequence implements SequenceI
    * jalview.datamodel.SequenceI#setAlignmentAnnotation(AlignmmentAnnotation[]
    * annotations)
    */
+  @Override
   public void setAlignmentAnnotation(AlignmentAnnotation[] annotations)
   {
     if (annotation != null)
@@ -1207,8 +1233,7 @@ public class Sequence extends ASequence implements SequenceI
       for (int si = 0; si < sfs.length; si++)
       {
         SequenceFeature sf[] = (mp != null) ? mp.locateFeature(sfs[si])
-                : new SequenceFeature[]
-                { new SequenceFeature(sfs[si]) };
+                : new SequenceFeature[] { new SequenceFeature(sfs[si]) };
         if (sf != null && sf.length > 0)
         {
           for (int sfi = 0; sfi < sf.length; sfi++)
@@ -1220,9 +1245,9 @@ public class Sequence extends ASequence implements SequenceI
     }
 
     // transfer PDB entries
-    if (entry.getPDBId() != null)
+    if (entry.getAllPDBEntries() != null)
     {
-      Enumeration e = entry.getPDBId().elements();
+      Enumeration e = entry.getAllPDBEntries().elements();
       while (e.hasMoreElements())
       {
         PDBEntry pdb = (PDBEntry) e.nextElement();
@@ -1254,6 +1279,7 @@ public class Sequence extends ASequence implements SequenceI
    * @return The index (zero-based) on this sequence in the MSA. It returns
    *         {@code -1} if this information is not available.
    */
+  @Override
   public int getIndex()
   {
     return index;
@@ -1267,16 +1293,19 @@ public class Sequence extends ASequence implements SequenceI
    *          position for this sequence. This value is zero-based (zero for
    *          this first sequence)
    */
+  @Override
   public void setIndex(int value)
   {
     index = value;
   }
 
+  @Override
   public void setRNA(RNA r)
   {
     rna = r;
   }
 
+  @Override
   public RNA getRNA()
   {
     return rna;
@@ -1301,4 +1330,41 @@ public class Sequence extends ASequence implements SequenceI
     return result;
   }
 
+  @Override
+  public String toString()
+  {
+    return getDisplayId(false);
+  }
+
+  @Override
+  public PDBEntry getPDBEntry(String pdbIdStr)
+  {
+    if (getDatasetSequence() == null
+            || getDatasetSequence().getAllPDBEntries() == null)
+    {
+      return null;
+    }
+    List<PDBEntry> entries = getDatasetSequence().getAllPDBEntries();
+    for (PDBEntry entry : entries)
+    {
+      if (entry.getId().equalsIgnoreCase(pdbIdStr))
+      {
+        return entry;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public void setSourceDBRef(DBRefEntryI dbRef)
+  {
+    this.sourceDBRef = dbRef;
+  }
+
+  @Override
+  public DBRefEntryI getSourceDBRef()
+  {
+    return this.sourceDBRef;
+  }
+
 }