Consensus and conservation updated in threads
authoramwaterhouse <Andrew Waterhouse>
Tue, 10 Oct 2006 10:26:58 +0000 (10:26 +0000)
committeramwaterhouse <Andrew Waterhouse>
Tue, 10 Oct 2006 10:26:58 +0000 (10:26 +0000)
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/AnnotationPanel.java

index 77f1e41..27503f9 100755 (executable)
@@ -415,6 +415,9 @@ public class AlignFrame
       tabbedPane.addTab(ap.av.viewName==null?"Original":ap.av.viewName, ap);
     }
 
+    ap.av.updateConsensus(ap);
+    ap.av.updateConservation(ap);
+
 
     ap.av.addPropertyChangeListener(new PropertyChangeListener()
     {
@@ -1616,8 +1619,9 @@ public class AlignFrame
 
      if (av.hconsensus != null && av.autoCalculateConsensus)
      {
-       av.updateConsensus();
-       av.updateConservation();
+       av.updateConsensus(ap);
+       av.updateConservation(ap);
+       ap.annotationPanel.repaint();
      }
 
      resetAllColourSchemes();
index 84cbe76..ddb871e 100755 (executable)
@@ -189,8 +189,44 @@ public class AlignViewport
         // as Blosum and Clustal require this to be done
         if(hconsensus==null && !isDataset)
         {
-          updateConservation();
-          updateConsensus();
+          if(!alignment.isNucleotide())
+          {
+            conservation = new AlignmentAnnotation("Conservation",
+                "Conservation of total alignment less than " +
+                ConsPercGaps + "% gaps",
+                new Annotation[1], 0f,
+                11f,
+                AlignmentAnnotation.BAR_GRAPH);
+            conservation.hasText = true;
+
+            if (showConservation)
+            {
+              alignment.addAnnotation(conservation);
+            }
+
+            if (showQuality)
+            {
+              quality = new AlignmentAnnotation("Quality",
+                                                "Alignment Quality based on Blosum62 scores",
+                                                new Annotation[1],
+                                                0f,
+                                                11f,
+                                                AlignmentAnnotation.BAR_GRAPH);
+
+              alignment.addAnnotation(quality);
+            }
+          }
+
+          consensus = new AlignmentAnnotation("Consensus", "PID",
+                                               new Annotation[1], 0f, 100f,
+                                               AlignmentAnnotation.BAR_GRAPH);
+          consensus.hasText = true;
+
+           if (showIdentity)
+           {
+             alignment.addAnnotation(consensus);
+           }
+
         }
 
         if (jalview.bin.Cache.getProperty("DEFAULT_COLOUR") != null)
@@ -228,216 +264,271 @@ public class AlignViewport
       return showSequenceFeatures;
     }
 
-    /**
-     * DOCUMENT ME!
-     */
-    public void updateConservation()
-    {
-      if(alignment.isNucleotide())
-          return;
-
-     // System.out.println("UPDATING CONSERVATION");
-
-      try{
-        Conservation cons = new jalview.analysis.Conservation("All",
-            jalview.schemes.ResidueProperties.propHash, 3,
-            alignment.getSequences(), 0, alignment.getWidth() - 1);
-        cons.calculate();
-        cons.verdict(false, ConsPercGaps);
-        cons.findQuality();
-
-        int alWidth = alignment.getWidth();
-        Annotation[] annotations = new Annotation[alWidth];
-        Annotation[] qannotations = new Annotation[alWidth];
-        String 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 = cons.qualityRange[0].floatValue();
-        float qmax = cons.qualityRange[1].floatValue();
-
-        for (int i = 0; i < alWidth; i++)
+
+
+    class ConservationThread extends Thread
+    {
+      AlignmentPanel ap;
+      public ConservationThread(AlignmentPanel ap)
+      {
+        this.ap = ap;
+      }
+
+      public void run()
+      {
+        try
         {
-          float value = 0;
+          long t = System.currentTimeMillis();
+
+          Conservation cons = new jalview.analysis.Conservation("All",
+              jalview.schemes.ResidueProperties.propHash, 3,
+              alignment.getSequences(), 0, alignment.getWidth() - 1);
+
+          cons.calculate();
+          cons.verdict(false, ConsPercGaps);
 
-          try
+          if (showQuality)
           {
-            value = Integer.parseInt(sequence.charAt(i) + "");
+            cons.findQuality();
           }
-          catch (Exception ex)
+
+          System.out.println("Conservation took " + (System.currentTimeMillis() - t) +
+                             "ms");
+
+          int alWidth = alignment.getWidth();
+          String 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 (showQuality)
           {
-            if (sequence.charAt(i) == '*')
-            {
+            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.charAt(i);
+
+            if (Character.isDigit(c))
+              value = (int) (c - '0');
+            else if (c == '*')
               value = 11;
-            }
+            else if (c == '+')
+              value = 10;
 
-            if (sequence.charAt(i) == '+')
+            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 (showQuality)
             {
-              value = 10;
+              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)));
             }
           }
 
-          float vprop = value - min;
-          vprop /= max;
-          annotations[i] = new Annotation(sequence.charAt(i) + "",
-                                          String.valueOf(value), ' ', value,
-                                          new Color(minR + (maxR * vprop),
-              minG + (maxG * vprop),
-              minB + (maxB * vprop)));
-
-          // Quality calc
-          value = ( (Double) cons.quality.get(i)).floatValue();
-          vprop = value - qmin;
-          vprop /= qmax;
-          qannotations[i] = new Annotation(" ", String.valueOf(value), ' ',
-                                           value,
-                                           new Color(minR + (maxR * vprop),
-              minG + (maxG * vprop),
-              minB + (maxB * vprop)));
+          if (quality != null)
+          {
+            quality.graphMax = cons.qualityRange[1].floatValue();
+          }
         }
-
-        if (conservation == null)
+        catch (OutOfMemoryError error)
         {
-          conservation = new AlignmentAnnotation("Conservation",
-                                                 "Conservation of total alignment less than " +
-                                                 ConsPercGaps + "% gaps",
-                                                 annotations, 0f, // cons.qualityRange[0].floatValue(),
-                                                 11f, // cons.qualityRange[1].floatValue()
-                                                 AlignmentAnnotation.BAR_GRAPH);
-
-          if (showConservation)
+          javax.swing.SwingUtilities.invokeLater(new Runnable()
           {
-            alignment.addAnnotation(conservation);
-          }
+            public void run()
+            {
+              javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
+                  "Out of memory calculating conservation!!"
+                  +
+                  "\nSee help files for increasing Java Virtual Machine memory."
+                  , "Out of memory",
+                  javax.swing.JOptionPane.WARNING_MESSAGE);
+            }
+          });
 
-          quality = new AlignmentAnnotation("Quality",
-                                            "Alignment Quality based on Blosum62 scores",
-                                            qannotations,
-                                            cons.qualityRange[0].floatValue(),
-                                            cons.qualityRange[1].floatValue(),
-                                            AlignmentAnnotation.BAR_GRAPH);
+          System.out.println("Conservation calculation: " + error);
+          System.gc();
 
-          if (showQuality)
-          {
-            alignment.addAnnotation(quality);
-          }
         }
-        else
+
+        if(ap!=null)
         {
-          conservation.annotations = annotations;
-          quality.annotations = qannotations;
-          quality.graphMax = cons.qualityRange[1].floatValue();
+          ap.annotationPanel.repaint();
         }
+        updatingConservation = false;
       }
-      catch (OutOfMemoryError error)
-      {
-        javax.swing.SwingUtilities.invokeLater(new Runnable()
-        {
-          public void run()
-          {
-            javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
-                "Out of memory calculating conservation!!"
-                +
-                "\nSee help files for increasing Java Virtual Machine memory."
-                , "Out of memory",
-                javax.swing.JOptionPane.WARNING_MESSAGE);
-          }
-        });
+    }
+
+
+    ConservationThread conservationThread;
+
+    ConsensusThread consensusThread;
+
+    boolean consUpdateNeeded = false;
+
+    boolean updatingConsensus = false;
+
+    boolean updatingConservation = false;
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void updateConservation(AlignmentPanel ap)
+    {
+      if (alignment.isNucleotide())
+        return;
 
-        System.out.println("Conservation calculation: " + error);
-        System.gc();
+      updatingConservation = true;
 
+      if (conservationThread == null || !conservationThread.isAlive())
+      {
+        conservationThread = new ConservationThread(ap);
+        conservationThread.start();
+      }
+      else
+      {
+        consUpdateNeeded = true;
+        System.out.println("come back later");
       }
     }
 
-
     /**
      * DOCUMENT ME!
      */
-    public void updateConsensus()
+    public void updateConsensus(AlignmentPanel ap)
     {
-      try{
-        int aWidth = alignment.getWidth();
+      updatingConsensus = true;
 
-        Annotation[] annotations = new Annotation[aWidth];
+      if (consensusThread == null || !consensusThread.isAlive())
+      {
+        consensusThread = new ConsensusThread(ap);
+        consensusThread.start();
+      }
+      else
+      {
+        consUpdateNeeded = true;
+        System.out.println("come back later");
+      }
+    }
 
-        hconsensus = new Hashtable[aWidth];
-        AAFrequency.calculate(alignment.getSequencesArray(),
-                              0,
-                              alignment.getWidth(),
-                              hconsensus);
 
-        for (int  i = 0; i < aWidth; i++)
+    class ConsensusThread extends Thread
+    {
+      AlignmentPanel ap;
+      public ConsensusThread(AlignmentPanel ap)
+      {
+        this.ap = ap;
+      }
+      public void run()
+      {
+        try
         {
-          float value = 0;
-          if (ignoreGapsInConsensusCalculation)
-            value = ( (Float) hconsensus[i].get("pid_nogaps")).floatValue();
-          else
-            value = ( (Float) hconsensus[i].get("pid_gaps")).floatValue();
+          int aWidth = alignment.getWidth();
 
-          String maxRes = hconsensus[i].get("maxResidue").toString();
-          String mouseOver = hconsensus[i].get("maxResidue") + " ";
+          consensus.annotations = null;
+          consensus.annotations = new Annotation[aWidth];
 
-          if (maxRes.length() > 1)
+          long t = System.currentTimeMillis();
+          hconsensus = new Hashtable[aWidth];
+          AAFrequency.calculate(alignment.getSequencesArray(),
+                                0,
+                                alignment.getWidth(),
+                                hconsensus);
+
+          System.out.println("Consensus took " +
+                             (System.currentTimeMillis() - t) + "ms");
+
+          for (int i = 0; i < aWidth; i++)
           {
-            mouseOver = "[" + maxRes + "] ";
-            maxRes = "+";
+            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);
           }
 
-          mouseOver += ( (int) value + "%");
-          annotations[i] = new Annotation(maxRes, mouseOver, ' ', value);
-        }
 
-        if (consensus == null)
-        {
-          consensus = new AlignmentAnnotation("Consensus", "PID",
-                                              annotations, 0f, 100f,AlignmentAnnotation.BAR_GRAPH);
+          if (globalColourScheme != null)
+            globalColourScheme.setConsensus(hconsensus);
 
-          if (showIdentity)
-          {
-            alignment.addAnnotation(consensus);
-          }
         }
-        else
+        catch (OutOfMemoryError error)
         {
-          consensus.annotations = annotations;
-        }
+          javax.swing.SwingUtilities.invokeLater(new Runnable()
+          {
+            public void run()
+            {
+              javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
+                  "Out of memory calculating consensus!!"
+                  +
+                  "\nSee help files for increasing Java Virtual Machine memory."
+                  , "Out of memory",
+                  javax.swing.JOptionPane.WARNING_MESSAGE);
+            }
+          });
 
-        if (globalColourScheme != null)
-          globalColourScheme.setConsensus(hconsensus);
+          System.out.println("Consensus calculation: " + error);
+          System.gc();
+        }
 
-      }catch(OutOfMemoryError error)
-      {
-        javax.swing.SwingUtilities.invokeLater(new Runnable()
+        if (ap != null)
         {
-          public void run()
-          {
-            javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
-                "Out of memory calculating consensus!!"
-                +
-                "\nSee help files for increasing Java Virtual Machine memory."
-                , "Out of memory",
-                javax.swing.JOptionPane.WARNING_MESSAGE);
-          }
-        });
+          ap.annotationPanel.repaint();
+        }
 
 
-        System.out.println("Consensus calculation: " + error);
-        System.gc();
+        updatingConsensus = false;
       }
-
     }
     /**
      * get the consensus sequence as displayed under the PID consensus annotation row.
@@ -445,7 +536,7 @@ public class AlignViewport
      */
     public SequenceI getConsensusSeq() {
       if (consensus==null)
-        updateConsensus();
+        updateConsensus(null);
       if (consensus==null)
         return null;
       StringBuffer seqs=new StringBuffer();
@@ -1090,10 +1181,10 @@ public class AlignViewport
         changeSupport.firePropertyChange(prop, oldvalue, newvalue);
     }
 
-    public void setIgnoreGapsConsensus(boolean b)
+    public void setIgnoreGapsConsensus(boolean b, AlignmentPanel ap)
     {
       ignoreGapsInConsensusCalculation = b;
-      updateConsensus();
+      updateConsensus(ap);
       if(globalColourScheme!=null)
       {
         globalColourScheme.setThreshold(globalColourScheme.getThreshold(), ignoreGapsInConsensusCalculation);
index 63d7c53..f32a350 100755 (executable)
@@ -217,7 +217,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
           SequenceI cons=av.getConsensusSeq();
           if (cons!=null)
             copy_annotseqtoclipboard(cons);
-          
+
         }
 
         ap.annotationPanel.adjustPanelHeight();
@@ -387,8 +387,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
           cbmi.addActionListener(new ActionListener()
               {public void actionPerformed(ActionEvent e)
                {
-                 ap.av.setIgnoreGapsConsensus(cbmi.getState());
-                 ap.repaint();
+                 ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
                }
               });
           pop.add(cbmi);
@@ -442,7 +441,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
                             region[1]});
         }
       }
-      
+
       Desktop.jalviewClipboard = new Object[]{ seqs,
           ds, // what is the dataset of a consensus sequence ? need to flag sequence as special.
           hiddenColumns};
index fb48794..dbc1c92 100755 (executable)
@@ -667,6 +667,7 @@ public class AnnotationPanel extends JPanel implements MouseListener,
             return;\r
         }\r
 \r
+\r
         AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
 \r
         int x = 0, y = 0;\r
@@ -689,6 +690,7 @@ public class AnnotationPanel extends JPanel implements MouseListener,
                 continue;\r
             }\r
 \r
+\r
             lastSS = ' ';\r
             lastSSX = 0;\r
 \r
@@ -706,6 +708,28 @@ public class AnnotationPanel extends JPanel implements MouseListener,
                 }\r
             }\r
 \r
+            if (av.updatingConsensus && aa[i].label.equals("Consensus"))\r
+            {\r
+              g.setColor(Color.darkGray);\r
+              g.drawString("Recalculating Consensus....", 20, y - 5);\r
+              y += av.charHeight;\r
+              continue;\r
+            }\r
+            else if (av.updatingConservation && aa[i].label.equals("Conservation"))\r
+            {\r
+              g.setColor(Color.darkGray);\r
+              g.drawString("Recalculating Conservation.....", 20, y - 5);\r
+              y += av.charHeight;\r
+              continue;\r
+            }\r
+            else if (av.updatingConservation && aa[i].label.equals("Quality"))\r
+            {\r
+              g.setColor(Color.darkGray);\r
+              g.drawString("Recalculating Quality....", 20, y - 5);\r
+              continue;\r
+            }\r
+\r
+\r
             if (row.hasText)\r
             {\r
                 iconOffset = av.charHeight / 2 + 4;\r