sequence groups carry their own conservation and consensus annotation rows
authorjprocter <Jim Procter>
Fri, 24 Jul 2009 15:07:10 +0000 (15:07 +0000)
committerjprocter <Jim Procter>
Fri, 24 Jul 2009 15:07:10 +0000 (15:07 +0000)
src/jalview/datamodel/SequenceGroup.java

index c0d8f5e..9236712 100755 (executable)
@@ -79,6 +79,8 @@ public class SequenceGroup
 
   public Color textColour2 = Color.white;
 
+  private boolean ignoreGapsInConsensusCalculation=true;
+
   /**
    * Creates a new SequenceGroup object.
    */
@@ -149,6 +151,7 @@ public class SequenceGroup
       textColour2 = seqsel.textColour2;
       thresholdTextColour = seqsel.thresholdTextColour;
       width = seqsel.width;
+      ignoreGapsInConsensusCalculation = seqsel.ignoreGapsInConsensusCalculation;
       if (seqsel.conserve!=null)
       {
         recalcConservation(); // safer than 
@@ -438,35 +441,48 @@ public class SequenceGroup
    */
   public void recalcConservation()
   {
-    if (cs == null)
+    if (cs == null && consensus == null && conservation == null)
     {
       return;
     }
-
+    
     try
     {
-      cs.setConsensus(AAFrequency
-              .calculate(sequences, startRes, endRes + 1));
-
+      Hashtable cnsns[] = AAFrequency.calculate(sequences, startRes, endRes + 1);
+      if (consensus != null)
+      {
+        _updateConsensusRow(cnsns);
+      }
+      if (cs!=null)
+      {
+        cs.setConsensus(cnsns);
+      
       if (cs instanceof ClustalxColourScheme)
       {
         ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
       }
+      }
 
-      if (cs.conservationApplied())
+      if ((conservation!=null) || (cs!=null && cs.conservationApplied()))
       {
         Conservation c = new Conservation(groupName,
                 ResidueProperties.propHash, 3, sequences, startRes,
                 endRes + 1);
         c.calculate();
         c.verdict(false, 25);
-
-        cs.setConservation(c);
-
+        if (conservation!=null)
+        {
+          _updateConservationRow(c);
+        }
+        if (cs!=null)
+        {
+          cs.setConservation(c);
+        
         if (cs instanceof ClustalxColourScheme)
         {
           ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
         }
+        }
       }
     } catch (java.lang.OutOfMemoryError err)
     {
@@ -476,6 +492,31 @@ public class SequenceGroup
 
   }
 
+  private void _updateConservationRow(Conservation c)
+  {
+    if (conservation==null)
+    {
+      getConservation();
+    }
+    // preserve width if already set
+    int aWidth = (conservation.annotations!=null) ? (endRes<conservation.annotations.length ? conservation.annotations.length : endRes+1) : endRes+1;
+    c.completeAnnotations(conservation,null, aWidth);
+  }
+
+  private void _updateConsensusRow(Hashtable[] cnsns)
+  {
+    if (consensus==null)
+    {
+      getConsensus();
+    }
+    // preserve width if already set
+    int aWidth = (consensus.annotations!=null) ? (endRes<consensus.annotations.length ? consensus.annotations.length : endRes+1) : endRes+1;
+    consensus.annotations = null;
+    consensus.annotations = new Annotation[aWidth]; // should be alignment width
+
+    AAFrequency.completeConsensus(consensus,cnsns,startRes,endRes,ignoreGapsInConsensusCalculation); // TODO: setting container for ignoreGapsInConsensusCalculation);
+  }
+
   /**
    * DOCUMENT ME!
    * 
@@ -858,11 +899,92 @@ public class SequenceGroup
   {
     this.showUnconserved = displayNonconserved;
   }
-
+  AlignmentAnnotation consensus=null,conservation=null;
+  /**
+   * 
+   * @return automatically calculated consensus row
+   */
   public AlignmentAnnotation getConsensus()
   {
     // TODO get or calculate and get consensus annotation row for this group
-    this.conserve.getConsSequence();
-    return null;
+    int aWidth = this.getWidth();
+    // pointer
+    // possibility
+    // here.
+    if (aWidth < 0)
+    {
+      return null;
+    }
+    if (consensus==null)
+    {
+       consensus = new AlignmentAnnotation("Consensus for "+getName(), "PID",
+              new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
+      consensus.hasText = true;
+      consensus.autoCalculated = true;
+      consensus.groupRef = this;
+    }
+    return consensus;
+  }
+    /**
+   * get the conservation annotation row for this group
+   * @return autoCalculated annotation row
+   */
+  public AlignmentAnnotation getConservationRow() {
+    int ConsPercGaps = 25;
+    if (conservation == null) {
+      conservation = new AlignmentAnnotation("Conservation",
+            "Conservation of total alignment less than " + ConsPercGaps
+                    + "% gaps", new Annotation[1], 0f, 11f,
+            AlignmentAnnotation.BAR_GRAPH);
+    conservation.hasText = true;
+    conservation.autoCalculated = true;
+    conservation.groupRef = this;
+      }
+    
+    return conservation;
+  }
+
+  /**
+   * 
+   * @return true if annotation rows have been instantiated for this group
+   */
+    public boolean hasAnnotationRows()
+    {
+      return consensus!=null || conservation!=null;
+    }
+
+  public SequenceI getConsensusSeq()
+  {
+    getConsensus();
+    StringBuffer seqs = new StringBuffer();
+    for (int i = 0; i < consensus.annotations.length; i++)
+    {
+      if (consensus.annotations[i] != null)
+      {
+        if (consensus.annotations[i].description.charAt(0) == '[')
+        {
+          seqs.append(consensus.annotations[i].description.charAt(1));
+        }
+        else
+        {
+          seqs.append(consensus.annotations[i].displayCharacter);
+        }
+      }
+    }
+
+    SequenceI sq = new Sequence("Group"+getName()+" Consensus", seqs.toString());
+    sq.setDescription("Percentage Identity Consensus "
+            + ((ignoreGapsInConsensusCalculation) ? " without gaps" : ""));
+    return sq;    
+  }
+
+  public void setIgnoreGapsConsensus(boolean state)
+  {
+    if (this.ignoreGapsInConsensusCalculation!=state && consensus!=null)
+    {
+      ignoreGapsInConsensusCalculation = state;
+      recalcConservation();
+    }
+    ignoreGapsInConsensusCalculation = state;
   }
 }