JAL-1492 JAL-1397 make AnnotatedCollectionI context aware so groups can be coloured...
[jalview.git] / src / jalview / datamodel / SequenceGroup.java
index ed21f60..1df45a2 100755 (executable)
@@ -1,19 +1,20 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+ * Copyright (C) 2014 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- * 
+ *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.datamodel;
 
@@ -92,12 +93,12 @@ public class SequenceGroup implements AnnotatedCollectionI
    * consensus calculation property
    */
   private boolean showSequenceLogo = false;
+
   /**
    * flag indicating if logo should be rendered normalised
    */
   private boolean normaliseSequenceLogo;
 
-
   /**
    * @return the includeAllConsSymbols
    */
@@ -285,11 +286,14 @@ public class SequenceGroup implements AnnotatedCollectionI
 
     return eres;
   }
+
   public List<SequenceI> getSequences()
   {
     return sequences;
   }
-  public List<SequenceI> getSequences(Map<SequenceI, SequenceCollectionI> hiddenReps)
+
+  public List<SequenceI> getSequences(
+          Map<SequenceI, SequenceCollectionI> hiddenReps)
   {
     if (hiddenReps == null)
     {
@@ -306,7 +310,7 @@ public class SequenceGroup implements AnnotatedCollectionI
         if (hiddenReps.containsKey(seq))
         {
           SequenceCollectionI hsg = hiddenReps.get(seq);
-          for (SequenceI seq2:hsg.getSequences())
+          for (SequenceI seq2 : hsg.getSequences())
           {
             if (seq2 != seq && !allSequences.contains(seq2))
             {
@@ -320,10 +324,11 @@ public class SequenceGroup implements AnnotatedCollectionI
     }
   }
 
-  public SequenceI[] getSequencesAsArray(Map<SequenceI, SequenceCollectionI> map)
+  public SequenceI[] getSequencesAsArray(
+          Map<SequenceI, SequenceCollectionI> map)
   {
     List<SequenceI> tmp = getSequences(map);
-    if (tmp==null)
+    if (tmp == null)
     {
       return null;
     }
@@ -465,12 +470,28 @@ public class SequenceGroup implements AnnotatedCollectionI
   }
 
   /**
-   * Max Gaps Threshold for performing a conservation calculation TODO: make
-   * this a configurable property - or global to an alignment view
+   * Max Gaps Threshold (percent) for performing a conservation calculation 
    */
   private int consPercGaps = 25;
 
   /**
+   * @return Max Gaps Threshold for performing a conservation calculation
+   */
+  public int getConsPercGaps()
+  {
+    return consPercGaps;
+  }
+
+  /**
+   * set Max Gaps Threshold (percent) for performing a conservation calculation
+   * @param consPercGaps 
+   */
+  public void setConsPercGaps(int consPercGaps)
+  {
+    this.consPercGaps = consPercGaps;
+  }
+
+  /**
    * calculate residue conservation for group - but only if necessary.
    */
   public void recalcConservation()
@@ -479,22 +500,17 @@ public class SequenceGroup implements AnnotatedCollectionI
     {
       return;
     }
-    if (cs!=null)
-    {
-      cs.alignmentChanged(this,null);
-    }
     try
     {
       Hashtable cnsns[] = AAFrequency.calculate(sequences, startRes,
               endRes + 1, showSequenceLogo);
       if (consensus != null)
       {
-        _updateConsensusRow(cnsns);
+        _updateConsensusRow(cnsns, sequences.size());
       }
       if (cs != null)
       {
         cs.setConsensus(cnsns);
-        cs.alignmentChanged(this,null);
       }
 
       if ((conservation != null)
@@ -514,10 +530,13 @@ public class SequenceGroup implements AnnotatedCollectionI
           if (cs.conservationApplied())
           {
             cs.setConservation(c);
-            cs.alignmentChanged(this,null);
           }
         }
       }
+      if (cs != null)
+      {
+        cs.alignmentChanged(context!=null ? context : this, null);
+      }
     } catch (java.lang.OutOfMemoryError err)
     {
       // TODO: catch OOM
@@ -548,7 +567,7 @@ public class SequenceGroup implements AnnotatedCollectionI
 
   public Hashtable[] consensusData = null;
 
-  private void _updateConsensusRow(Hashtable[] cnsns)
+  private void _updateConsensusRow(Hashtable[] cnsns, long nseq)
   {
     if (consensus == null)
     {
@@ -565,7 +584,7 @@ public class SequenceGroup implements AnnotatedCollectionI
     consensus.annotations = new Annotation[aWidth]; // should be alignment width
 
     AAFrequency.completeConsensus(consensus, cnsns, startRes, endRes + 1,
-            ignoreGapsInConsensus, showSequenceLogo); // TODO: setting container
+            ignoreGapsInConsensus, showSequenceLogo, nseq); // TODO: setting container
                                                       // for
                                                       // ignoreGapsInConsensusCalculation);
   }
@@ -608,9 +627,9 @@ public class SequenceGroup implements AnnotatedCollectionI
   }
 
   /**
-   * DOCUMENT ME!
    * 
-   * @return DOCUMENT ME!
+   * 
+   * @return the first column selected by this group. Runs from 0<=i<N_cols
    */
   public int getStartRes()
   {
@@ -618,9 +637,8 @@ public class SequenceGroup implements AnnotatedCollectionI
   }
 
   /**
-   * DOCUMENT ME!
    * 
-   * @return DOCUMENT ME!
+   * @return the groups last selected column. Runs from 0<=i<N_cols
    */
   public int getEndRes()
   {
@@ -948,7 +966,8 @@ public class SequenceGroup implements AnnotatedCollectionI
    *          (may be null)
    * @return new group containing sequences common to this group and alignment
    */
-  public SequenceGroup intersect(AlignmentI alignment, Map<SequenceI, SequenceCollectionI> map)
+  public SequenceGroup intersect(AlignmentI alignment,
+          Map<SequenceI, SequenceCollectionI> map)
   {
     SequenceGroup sgroup = new SequenceGroup(this);
     SequenceI[] insect = getSequencesInOrder(alignment);
@@ -1029,12 +1048,12 @@ public class SequenceGroup implements AnnotatedCollectionI
     {
       consensus = new AlignmentAnnotation("", "", new Annotation[1], 0f,
               100f, AlignmentAnnotation.BAR_GRAPH);
+      consensus.hasText = true;
+      consensus.autoCalculated = true;
+      consensus.groupRef = this;
+      consensus.label = "Consensus for " + getName();
+      consensus.description = "Percent Identity";
     }
-    consensus.hasText = true;
-    consensus.autoCalculated = true;
-    consensus.groupRef = this;
-    consensus.label = "Consensus for " + getName();
-    consensus.description = "Percent Identity";
     return consensus;
   }
 
@@ -1166,51 +1185,56 @@ public class SequenceGroup implements AnnotatedCollectionI
 
   /**
    * set flag indicating if logo should be normalised when rendered
+   * 
    * @param norm
    */
   public void setNormaliseSequenceLogo(boolean norm)
   {
-    normaliseSequenceLogo=norm;
+    normaliseSequenceLogo = norm;
   }
+
   public boolean isNormaliseSequenceLogo()
   {
     return normaliseSequenceLogo;
   }
+
   @Override
   /**
    * returns a new array with all annotation involving this group
    */
   public AlignmentAnnotation[] getAlignmentAnnotation()
   {
-    // TODO add in other methods like 'getAlignmentAnnotation(String label), etc'
+    // TODO add in other methods like 'getAlignmentAnnotation(String label),
+    // etc'
     ArrayList<AlignmentAnnotation> annot = new ArrayList<AlignmentAnnotation>();
-    for (SequenceI seq:(Vector<SequenceI>)sequences)
+    for (SequenceI seq : (Vector<SequenceI>) sequences)
     {
-      for (AlignmentAnnotation al: seq.getAnnotation())
+      for (AlignmentAnnotation al : seq.getAnnotation())
       {
-        if (al.groupRef==this)
+        if (al.groupRef == this)
         {
           annot.add(al);
         }
       }
     }
-    if (consensus!=null)
+    if (consensus != null)
     {
       annot.add(consensus);
     }
-    if (conservation!=null)
+    if (conservation != null)
     {
       annot.add(conservation);
     }
     return annot.toArray(new AlignmentAnnotation[0]);
   }
+
   @Override
   public Iterable<AlignmentAnnotation> findAnnotation(String calcId)
   {
-    ArrayList<AlignmentAnnotation> aa=new ArrayList<AlignmentAnnotation>();
-    for (AlignmentAnnotation a:getAlignmentAnnotation())
+    ArrayList<AlignmentAnnotation> aa = new ArrayList<AlignmentAnnotation>();
+    for (AlignmentAnnotation a : getAlignmentAnnotation())
     {
-      if (a.getCalcId()==calcId)
+      if (a.getCalcId() == calcId)
       {
         aa.add(a);
       }
@@ -1222,4 +1246,21 @@ public class SequenceGroup implements AnnotatedCollectionI
   {
     sequences.clear();
   }
+  private AnnotatedCollectionI context;
+  /**
+   * set the alignment or group context for this group
+   * @param context
+   */
+  public void setContext(AnnotatedCollectionI context)
+  {
+    this.context = context; 
+  }
+  /* (non-Javadoc)
+   * @see jalview.datamodel.AnnotatedCollectionI#getContext()
+   */
+  @Override
+  public AnnotatedCollectionI getContext()
+  {
+    return context;
+  }
 }