Merge branch 'develop' into features/hmmer
[jalview.git] / src / jalview / datamodel / SequenceGroup.java
index 6964b53..179880e 100755 (executable)
@@ -100,6 +100,8 @@ public class SequenceGroup implements AnnotatedCollectionI
    */
   private boolean ignoreGapsInConsensus = true;
 
+  private boolean ignoreBelowBackground = true;
+
   /**
    * consensus calculation property
    */
@@ -124,10 +126,18 @@ public class SequenceGroup implements AnnotatedCollectionI
 
   AlignmentAnnotation conservation = null;
 
+  AlignmentAnnotation information = null;
+
   private boolean showConsensusHistogram;
 
   private AnnotatedCollectionI context;
 
+  private boolean showHMMSequenceLogo;
+
+  private boolean normaliseHMMSequenceLogo;
+
+  private boolean showInformationHistogram;
+
   /**
    * Creates a new SequenceGroup object.
    */
@@ -199,6 +209,9 @@ public class SequenceGroup implements AnnotatedCollectionI
       showSequenceLogo = seqsel.showSequenceLogo;
       normaliseSequenceLogo = seqsel.normaliseSequenceLogo;
       showConsensusHistogram = seqsel.showConsensusHistogram;
+      showHMMSequenceLogo = seqsel.showHMMSequenceLogo;
+      normaliseHMMSequenceLogo = seqsel.normaliseHMMSequenceLogo;
+      showInformationHistogram = seqsel.showInformationHistogram;
       idColour = seqsel.idColour;
       outlineColour = seqsel.outlineColour;
       seqrep = seqsel.seqrep;
@@ -207,6 +220,7 @@ public class SequenceGroup implements AnnotatedCollectionI
       thresholdTextColour = seqsel.thresholdTextColour;
       width = seqsel.width;
       ignoreGapsInConsensus = seqsel.ignoreGapsInConsensus;
+      ignoreBelowBackground = seqsel.ignoreBelowBackground;
       if (seqsel.conserve != null)
       {
         recalcConservation(); // safer than
@@ -548,7 +562,8 @@ public class SequenceGroup implements AnnotatedCollectionI
    */
   public boolean recalcConservation(boolean defer)
   {
-    if (cs == null && consensus == null && conservation == null)
+    if (cs == null && consensus == null && conservation == null
+            && information == null)
     {
       return false;
     }
@@ -559,6 +574,16 @@ public class SequenceGroup implements AnnotatedCollectionI
     {
       ProfilesI cnsns = AAFrequency.calculate(sequences, startRes,
               endRes + 1, showSequenceLogo);
+      if (information != null)
+      {
+        HiddenMarkovModel hmm = information.sequenceRef.getHMM();
+
+        ProfilesI info = AAFrequency.calculateHMMProfiles(hmm,
+                (endRes + 1) - startRes, startRes, endRes + 1,
+                showHMMSequenceLogo, ignoreBelowBackground);
+        _updateInformationRow(info, sequences.size());
+        upd = true;
+      }
       if (consensus != null)
       {
         _updateConsensusRow(cnsns, sequences.size());
@@ -633,6 +658,8 @@ public class SequenceGroup implements AnnotatedCollectionI
 
   public ProfilesI consensusData = null;
 
+  public ProfilesI informationData = null;
+
   private void _updateConsensusRow(ProfilesI cnsns, long nseq)
   {
     if (consensus == null)
@@ -659,6 +686,38 @@ public class SequenceGroup implements AnnotatedCollectionI
   }
 
   /**
+   * Recalculates the information content on the HMM annotation.
+   * 
+   * @param cnsns
+   * @param nseq
+   */
+  private void _updateInformationRow(ProfilesI cnsns, long nseq)
+  {
+    if (information == null)
+    {
+      getInformation();
+    }
+    information.label = "Information for " + getName();
+    information.description = "Percent Identity";
+    informationData = cnsns;
+    // preserve width if already set
+    int aWidth = (information.annotations != null)
+            ? (endRes < information.annotations.length
+                    ? information.annotations.length : endRes + 1)
+            : endRes + 1;
+    information.annotations = null;
+    information.annotations = new Annotation[aWidth]; // should be alignment
+                                                      // width
+
+    AAFrequency.completeInformation(information, cnsns, startRes,
+            endRes + 1, ignoreBelowBackground, showSequenceLogo, nseq); // TODO:
+                                                                        // setting
+                                                            // container
+    // for
+    // ignoreGapsInInformationCalculation);
+  }
+
+  /**
    * @param s
    *          sequence to either add or remove from group
    * @param recalc
@@ -1106,6 +1165,34 @@ public class SequenceGroup implements AnnotatedCollectionI
   }
 
   /**
+   * 
+   * @return information content annotation.
+   */
+  public AlignmentAnnotation getInformation()
+  {
+    // TODO get or calculate and get information annotation row for this group
+    int aWidth = this.getWidth();
+    // pointer
+    // possibility
+    // here.
+    if (aWidth < 0)
+    {
+      return null;
+    }
+    if (information == null)
+    {
+      information = new AlignmentAnnotation("", "", new Annotation[1], 0f,
+              6.25f, AlignmentAnnotation.BAR_GRAPH);
+      information.hasText = true;
+      information.autoCalculated = false;
+      information.groupRef = this;
+      information.label = getName() + "_HMM";
+      information.description = "Information content, measured in bits";
+    }
+    return information;
+  }
+
+  /**
    * set this alignmentAnnotation object as the one used to render consensus
    * annotation
    * 
@@ -1191,6 +1278,20 @@ public class SequenceGroup implements AnnotatedCollectionI
     return ignoreGapsInConsensus;
   }
 
+  public void setIgnoreBelowBackground(boolean state)
+  {
+    if (this.ignoreBelowBackground != state)
+    {
+      ignoreBelowBackground = state;
+    }
+    ignoreBelowBackground = state;
+  }
+
+  public boolean getIgnoreBelowBackground()
+  {
+    return true;
+  }
+
   /**
    * @param showSequenceLogo
    *          indicates if a sequence logo is shown for consensus annotation
@@ -1463,4 +1564,44 @@ public class SequenceGroup implements AnnotatedCollectionI
   {
     return (startRes <= apos && endRes >= apos) && sequences.contains(seq);
   }
+
+  public boolean isShowInformationHistogram()
+  {
+    return showInformationHistogram;
+  }
+
+  public void setShowInformationHistogram(boolean state)
+  {
+    if (showInformationHistogram != state && information != null)
+    {
+      this.showInformationHistogram = state;
+      // recalcConservation(); TODO don't know what to do here next
+    }
+    this.showInformationHistogram = state;
+
+  }
+
+  public boolean isShowHMMSequenceLogo()
+  {
+    // TODO Auto-generated method stub
+    return showHMMSequenceLogo;
+  }
+
+  public void setshowHMMSequenceLogo(boolean state)
+  {
+    showHMMSequenceLogo = state;
+
+  }
+
+  public boolean isNormaliseHMMSequenceLogo()
+  {
+    // TODO Auto-generated method stub
+    return normaliseHMMSequenceLogo;
+  }
+
+  public void setNormaliseHMMSequenceLogo(boolean state)
+  {
+    normaliseSequenceLogo = state;
+  }
+
 }