JAL-2629 add HMM Match Score colour scheme
[jalview.git] / src / jalview / datamodel / HiddenMarkovModel.java
index e3eb160..d50e66d 100644 (file)
@@ -74,6 +74,9 @@ public class HiddenMarkovModel
    */
   private Mapping mapToHmmConsensus;
 
+  // stores background frequencies of alignment from which this model came
+  private Map<Character, Float> backgroundFrequencies;
+
   /**
    * Constructor
    */
@@ -97,6 +100,7 @@ public class HiddenMarkovModel
     this.symbolIndexLookup = hmm.symbolIndexLookup;
     this.fileHeader = new String(hmm.fileHeader);
     this.hmmSeq = sq;
+    this.backgroundFrequencies = hmm.getBackgroundFrequencies();
     if (sq.getDatasetSequence() == hmm.mapToHmmConsensus.getTo())
     {
       // same dataset sequence e.g. after realigning search results
@@ -520,12 +524,19 @@ 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];
 
     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);
@@ -536,7 +547,7 @@ public class HiddenMarkovModel
        */
       while (resNo > lastResNo + 1)
       {
-        sequence[seqOffset++] = '-';
+        sequence[seqOffset++] = GAP_DASH;
         lastResNo++;
         gapCount++;
       }
@@ -633,5 +644,28 @@ public class HiddenMarkovModel
   {
     this.hmmSeq = hmmSeq;
   }
+
+  public void setBackgroundFrequencies(Map<Character, Float> bkgdFreqs)
+  {
+    backgroundFrequencies = bkgdFreqs;
+  }
+
+  public void setBackgroundFrequencies(ResidueCount bkgdFreqs)
+  {
+    backgroundFrequencies = new HashMap<>();
+
+    int total = bkgdFreqs.getTotalResidueCount();
+
+    for (char c : bkgdFreqs.getSymbolCounts().symbols)
+    {
+      backgroundFrequencies.put(c, bkgdFreqs.getCount(c) * 1f / total);
+    }
+
+  }
+
+  public Map<Character, Float> getBackgroundFrequencies()
+  {
+    return backgroundFrequencies;
+  }
 }