Merge branch 'mmw/bug/JAL-4241-annotation-alignment-fix-slivka' into development...
[jalview.git] / src / jalview / datamodel / Sequence.java
index d52e049..89c55e6 100755 (executable)
@@ -27,6 +27,7 @@ import jalview.util.Comparison;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
 import jalview.util.StringUtils;
+import jalview.workers.InformationThread;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -82,6 +83,9 @@ public class Sequence extends ASequence implements SequenceI
 
   private String vamsasId;
 
+  HiddenMarkovModel hmm;
+
+  boolean isHMMConsensusSequence = false;
   private DBModList<DBRefEntry> dbrefs; // controlled access
 
   /**
@@ -254,6 +258,21 @@ public class Sequence extends ASequence implements SequenceI
   }
 
   /**
+   * Create a new sequence object from a characters array using default values
+   * of 1 and -1 for start and end. The array used to create the sequence is
+   * copied and is not stored internally.
+   * 
+   * @param name
+   *          sequence name
+   * @param sequence
+   *          list of residues
+   */
+  public Sequence(String name, char[] sequence)
+  {
+    this(name, Arrays.copyOf(sequence, sequence.length), 1, -1);
+  }
+
+  /**
    * Creates a new Sequence object with new AlignmentAnnotations but inherits
    * any existing dataset sequence reference. If non exists, everything is
    * copied.
@@ -361,6 +380,10 @@ public class Sequence extends ASequence implements SequenceI
         this.addPDBId(new PDBEntry(pdb));
       }
     }
+    if (seq.getHMM() != null)
+    {
+      this.hmm = new HiddenMarkovModel(seq.getHMM(), this);
+    }
   }
 
   @Override
@@ -571,6 +594,14 @@ public class Sequence extends ASequence implements SequenceI
     return this.sequence.length;
   }
 
+  @Override
+  public void setSequence(char[] seq)
+  {
+    this.sequence = Arrays.copyOf(seq, seq.length);
+    checkValidRange();
+    sequenceChanged();
+  }
+
   /**
    * DOCUMENT ME!
    * 
@@ -1069,7 +1100,8 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public ContiguousI findPositions(int fromColumn, int toColumn)
   {
-    if (toColumn < fromColumn || fromColumn < 1)
+    fromColumn = Math.max(fromColumn, 1);
+    if (toColumn < fromColumn)
     {
       return null;
     }
@@ -1415,6 +1447,7 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public void addDBRef(DBRefEntry entry)
   {
+    // TODO JAL-3980 maintain as sorted list
     if (datasetSequence != null)
     {
       datasetSequence.addDBRef(entry);
@@ -1425,6 +1458,7 @@ public class Sequence extends ASequence implements SequenceI
     {
       dbrefs = new DBModList<>();
     }
+    // TODO JAL-3979 LOOK UP RATHER THAN SWEEP FOR EFFICIENCY
 
     for (int ib = 0, nb = dbrefs.size(); ib < nb; ib++)
     {
@@ -1817,12 +1851,12 @@ public class Sequence extends ASequence implements SequenceI
     {
       for (AlignmentAnnotation ann : annotation)
       {
-        if ((ann.calcId != null && ann.calcId.equals(calcId))
+        String id = ann.getCalcId();
+        if ((id != null && id.equals(calcId))
                 && (ann.label != null && ann.label.equals(label))
                 && ((ignoreDescription && description == null)
                         || (ann.description != null
                                 && ann.description.equals(description))))
-
         {
           result.add(ann);
         }
@@ -1941,6 +1975,33 @@ public class Sequence extends ASequence implements SequenceI
     }
   }
 
+  @Override
+  public HiddenMarkovModel getHMM()
+  {
+    return hmm;
+  }
+
+  @Override
+  public void setHMM(HiddenMarkovModel hmm)
+  {
+    this.hmm = hmm;
+  }
+
+  @Override
+  public boolean hasHMMAnnotation()
+  {
+    if (this.annotation == null) {
+      return false;
+    }
+    for (AlignmentAnnotation ann : annotation)
+    {
+      if (InformationThread.HMM_CALC_ID.equals(ann.getCalcId()))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
   /**
    * {@inheritDoc}
    */
@@ -2105,4 +2166,10 @@ public class Sequence extends ASequence implements SequenceI
     // otherwise, sequence was completely hidden
     return 0;
   }
+
+  @Override
+  public boolean hasHMMProfile()
+  {
+    return hmm != null;
+  }
 }