refactored conservation thread, added showgroupannotation flags
[jalview.git] / src / jalview / gui / AlignViewport.java
index b90d89b..70ca6f2 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
+ * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -142,7 +142,9 @@ public class AlignViewport implements SelectionSource
   AlignmentAnnotation conservation;
 
   AlignmentAnnotation quality;
-
+  AlignmentAnnotation[] groupConsensus;
+  AlignmentAnnotation[] groupConservation;
+  
   boolean autoCalculateConsensus = true;
 
   /** DOCUMENT ME!! */
@@ -184,6 +186,8 @@ public class AlignViewport implements SelectionSource
 
   Hashtable hiddenRepSequences;
 
+  boolean sortByTree;
+
   /**
    * Creates a new AlignViewport object.
    * 
@@ -374,13 +378,14 @@ public class AlignViewport implements SelectionSource
 
     wrapAlignment = jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false);
     showUnconserved = jalview.bin.Cache.getDefault("SHOW_UNCONSERVED", false);
+    sortByTree = jalview.bin.Cache.getDefault("SORT_BY_TREE", false);
   }
 
   /**
-   * DOCUMENT ME!
+   * set the flag
    * 
    * @param b
-   *                DOCUMENT ME!
+   *             features are displayed if true
    */
   public void setShowSequenceFeatures(boolean b)
   {
@@ -392,146 +397,6 @@ public class AlignViewport implements SelectionSource
     return showSequenceFeatures;
   }
 
-  class ConservationThread extends Thread
-  {
-    AlignmentPanel ap;
-
-    public ConservationThread(AlignmentPanel ap)
-    {
-      this.ap = ap;
-    }
-
-    public void run()
-    {
-      try
-      {
-        updatingConservation = true;
-
-        while (UPDATING_CONSERVATION)
-        {
-          try
-          {
-            if (ap != null)
-            {
-              ap.paintAlignment(false);
-            }
-            Thread.sleep(200);
-          } catch (Exception ex)
-          {
-            ex.printStackTrace();
-          }
-        }
-
-        UPDATING_CONSERVATION = true;
-
-        int alWidth = alignment.getWidth();
-        if (alWidth < 0)
-        {
-          return;
-        }
-
-        Conservation cons = new jalview.analysis.Conservation("All",
-                jalview.schemes.ResidueProperties.propHash, 3, alignment
-                        .getSequences(), 0, alWidth - 1);
-
-        cons.calculate();
-        cons.verdict(false, ConsPercGaps);
-
-        if (quality != null)
-        {
-          cons.findQuality();
-        }
-
-        char[] sequence = cons.getConsSequence().getSequence();
-        float minR;
-        float minG;
-        float minB;
-        float maxR;
-        float maxG;
-        float maxB;
-        minR = 0.3f;
-        minG = 0.0f;
-        minB = 0f;
-        maxR = 1.0f - minR;
-        maxG = 0.9f - minG;
-        maxB = 0f - minB; // scalable range for colouring both Conservation and
-                          // Quality
-
-        float min = 0f;
-        float max = 11f;
-        float qmin = 0f;
-        float qmax = 0f;
-
-        char c;
-
-        conservation.annotations = new Annotation[alWidth];
-
-        if (quality != null)
-        {
-          quality.graphMax = cons.qualityRange[1].floatValue();
-          quality.annotations = new Annotation[alWidth];
-          qmin = cons.qualityRange[0].floatValue();
-          qmax = cons.qualityRange[1].floatValue();
-        }
-
-        for (int i = 0; i < alWidth; i++)
-        {
-          float value = 0;
-
-          c = sequence[i];
-
-          if (Character.isDigit(c))
-          {
-            value = (int) (c - '0');
-          }
-          else if (c == '*')
-          {
-            value = 11;
-          }
-          else if (c == '+')
-          {
-            value = 10;
-          }
-
-          float vprop = value - min;
-          vprop /= max;
-          conservation.annotations[i] = new Annotation(String.valueOf(c),
-                  String.valueOf(value), ' ', value, new Color(minR
-                          + (maxR * vprop), minG + (maxG * vprop), minB
-                          + (maxB * vprop)));
-
-          // Quality calc
-          if (quality != null)
-          {
-            value = ((Double) cons.quality.get(i)).floatValue();
-            vprop = value - qmin;
-            vprop /= qmax;
-            quality.annotations[i] = new Annotation(" ", String
-                    .valueOf(value), ' ', value, new Color(minR
-                    + (maxR * vprop), minG + (maxG * vprop), minB
-                    + (maxB * vprop)));
-          }
-        }
-      } catch (OutOfMemoryError error)
-      {
-        new OOMWarning("calculating conservation", error);
-
-        conservation = null;
-        quality = null;
-
-      }
-
-      UPDATING_CONSERVATION = false;
-      updatingConservation = false;
-
-      if (ap != null)
-      {
-        ap.paintAlignment(true);
-      }
-
-    }
-  }
-
   ConservationThread conservationThread;
 
   ConsensusThread consensusThread;
@@ -567,7 +432,7 @@ public class AlignViewport implements SelectionSource
       return;
     }
 
-    conservationThread = new ConservationThread(ap);
+    conservationThread = new ConservationThread(this, ap);
     conservationThread.start();
   }
 
@@ -632,37 +497,8 @@ public class AlignViewport implements SelectionSource
         hconsensus = new Hashtable[aWidth];
         AAFrequency.calculate(alignment.getSequencesArray(), 0, alignment
                 .getWidth(), hconsensus);
-
-        for (int i = 0; i < aWidth; i++)
-        {
-          float value = 0;
-          if (ignoreGapsInConsensusCalculation)
-          {
-            value = ((Float) hconsensus[i].get(AAFrequency.PID_NOGAPS))
-                    .floatValue();
-          }
-          else
-          {
-            value = ((Float) hconsensus[i].get(AAFrequency.PID_GAPS))
-                    .floatValue();
-          }
-
-          String maxRes = hconsensus[i].get(AAFrequency.MAXRESIDUE)
-                  .toString();
-          String mouseOver = hconsensus[i].get(AAFrequency.MAXRESIDUE)
-                  + " ";
-
-          if (maxRes.length() > 1)
-          {
-            mouseOver = "[" + maxRes + "] ";
-            maxRes = "+";
-          }
-
-          mouseOver += ((int) value + "%");
-          consensus.annotations[i] = new Annotation(maxRes, mouseOver, ' ',
-                  value);
-        }
-
+        AAFrequency.completeConsensus(consensus,hconsensus,0,aWidth,ignoreGapsInConsensusCalculation);
+        
         if (globalColourScheme != null)
         {
           globalColourScheme.setConsensus(hconsensus);
@@ -2207,4 +2043,68 @@ public class AlignViewport implements SelectionSource
   {
     showUnconserved=showunconserved;
   }
+  /**
+   * return the alignPanel containing the given viewport. Use this to get the
+   * components currently handling the given viewport.
+   * @param av
+   * @return null or an alignPanel guaranteed to have non-null alignFrame reference
+   */
+  public AlignmentPanel getAlignPanel()
+  {
+    AlignmentPanel[] aps = PaintRefresher.getAssociatedPanels(this.getSequenceSetId());
+    AlignmentPanel ap=null;
+    for (int p=0;aps!=null && p<aps.length; p++)
+    {
+      if (aps[p].av == this)
+      {
+        return aps[p];
+      }
+    }
+    return null;
+  }
+  public boolean getSortByTree()
+  {
+    return sortByTree;
+  }
+  public void setSortByTree(boolean sort) {
+    sortByTree = sort;
+  }
+  /**
+   * should conservation rows be shown for groups
+   */
+  boolean showGroupConservation = false;
+  /**
+   * should consensus rows be shown for groups
+   */
+  boolean showGroupConsensus = false;
+
+  /**
+   * @return the showGroupConservation
+   */
+  public boolean isShowGroupConservation()
+  {
+    return showGroupConservation;
+  }
+  /**
+   * @param showGroupConservation the showGroupConservation to set
+   */
+  public void setShowGroupConservation(boolean showGroupConservation)
+  {
+    this.showGroupConservation = showGroupConservation;
+  }
+  /**
+   * @return the showGroupConsensus
+   */
+  public boolean isShowGroupConsensus()
+  {
+    return showGroupConsensus;
+  }
+  /**
+   * @param showGroupConsensus the showGroupConsensus to set
+   */
+  public void setShowGroupConsensus(boolean showGroupConsensus)
+  {
+    this.showGroupConsensus = showGroupConsensus;
+  }
+  
 }