JAL-3291 issue fixed, passing tests added
[jalview.git] / src / jalview / datamodel / HiddenMarkovModel.java
index dd27fa6..e917474 100644 (file)
@@ -82,11 +82,13 @@ public class HiddenMarkovModel
   }
 
   /**
-   * Copy constructor
+   * Copy constructor given a new aligned sequence with which to associate the
+   * HMM profile
    * 
    * @param hmm
+   * @param sq
    */
-  public HiddenMarkovModel(HiddenMarkovModel hmm)
+  public HiddenMarkovModel(HiddenMarkovModel hmm, SequenceI sq)
   {
     super();
     this.fileProperties = new HashMap<>(hmm.fileProperties);
@@ -94,6 +96,18 @@ public class HiddenMarkovModel
     this.nodes = new ArrayList<>(hmm.nodes);
     this.symbolIndexLookup = hmm.symbolIndexLookup;
     this.fileHeader = new String(hmm.fileHeader);
+    this.hmmSeq = sq;
+    if (sq.getDatasetSequence() == hmm.mapToHmmConsensus.getTo())
+    {
+      // same dataset sequence e.g. after realigning search results
+      this.mapToHmmConsensus = hmm.mapToHmmConsensus;
+    }
+    else
+    {
+      // different dataset sequence e.g. after loading HMM from project
+      this.mapToHmmConsensus = new Mapping(sq.getDatasetSequence(),
+              hmm.mapToHmmConsensus.getMap());
+    }
   }
 
   /**
@@ -506,12 +520,18 @@ public class HiddenMarkovModel
     int start = hasMap ? getNode(1).getResidueNumber() : 1;
     int endResNo = hasMap ? getNode(nodes.size() - 1).getResidueNumber()
             : (start + getLength() - 1);
-    char[] sequence = new char[endResNo - start + 1];
+    char[] sequence = new char[endResNo + 1];
 
     int lastResNo = start - 1;
-    int seqOffset = 0;
+    int seqOffset = -1;
     int gapCount = 0;
 
+    for (int seqN = 0; seqN < start; seqN++)
+    {
+      sequence[seqN] = GAP_DASH;
+      seqOffset++;
+    }
+
     for (int nodeNo = 1; nodeNo < nodes.size(); nodeNo++)
     {
       HMMNode node = nodes.get(nodeNo);
@@ -522,7 +542,7 @@ public class HiddenMarkovModel
        */
       while (resNo > lastResNo + 1)
       {
-        sequence[seqOffset++] = '-';
+        sequence[seqOffset++] = GAP_DASH;
         lastResNo++;
         gapCount++;
       }
@@ -549,8 +569,6 @@ public class HiddenMarkovModel
             lastResNo - gapCount);
     seq.createDatasetSequence();
     seq.setHMM(this);
-    seq.setIsHMMConsensusSequence(true);
-
     this.hmmSeq = seq;
 
     /*
@@ -611,5 +629,15 @@ public class HiddenMarkovModel
       buildConsensusSequence();
     }
   }
+
+  /**
+   * Sets the aligned consensus sequence this HMM is the model for
+   * 
+   * @param hmmSeq
+   */
+  public void setHmmSeq(SequenceI hmmSeq)
+  {
+    this.hmmSeq = hmmSeq;
+  }
 }