Init PCA in thread
authoramwaterhouse <Andrew Waterhouse>
Thu, 8 Sep 2005 16:04:11 +0000 (16:04 +0000)
committeramwaterhouse <Andrew Waterhouse>
Thu, 8 Sep 2005 16:04:11 +0000 (16:04 +0000)
src/jalview/appletgui/PCAPanel.java
src/jalview/appletgui/RotatableCanvas.java
src/jalview/gui/PCAPanel.java
src/jalview/gui/RotatableCanvas.java

index 1dd05e0..f470ffc 100755 (executable)
@@ -35,11 +35,8 @@ public class PCAPanel
   int top;\r
   RotatableCanvas rc;\r
   AlignViewport av;\r
+  SequenceI [] seqs;\r
 \r
-  public void run()\r
-  {\r
-    // do stuff\r
-  }\r
 \r
   public PCAPanel(AlignViewport av, SequenceI[] s)\r
   {\r
@@ -47,65 +44,72 @@ public class PCAPanel
     this.av = av;\r
     if (av.getSelectionGroup().getSize() > 3)\r
     {\r
-      s = new Sequence[av.getSelectionGroup().getSize()];\r
+      seqs = new Sequence[av.getSelectionGroup().getSize()];\r
       for (int i = 0; i < s.length; i++)\r
       {\r
-        s[i] = av.getSelectionGroup().getSequenceAt(i);\r
+        seqs[i] = av.getSelectionGroup().getSequenceAt(i);\r
       }\r
     }\r
 \r
-    if (s == null)\r
+    if (seqs == null)\r
     {\r
-      s = new Sequence[av.getAlignment().getHeight()];\r
+      seqs = new Sequence[av.getAlignment().getHeight()];\r
       for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
       {\r
-        s[i] = av.getAlignment().getSequenceAt(i);\r
-      }\r
-    }\r
-\r
-//////////////////////This part was done in PCATHread originally. Is it too slow???\r
-    pca = new PCA(s);\r
-    pca.run();\r
-\r
-    // Now find the component coordinates\r
-    int ii = 0;\r
-    while (ii < s.length && s[ii] != null)\r
-    {\r
-      ii++;\r
-    }\r
-\r
-    double[][] comps = new double[ii][ii];\r
-\r
-    for (int i = 0; i < ii; i++)\r
-    {\r
-      if (pca.getEigenvalue(i) > 1e-4)\r
-      {\r
-        comps[i] = pca.component(i);\r
+        seqs[i] = av.getAlignment().getSequenceAt(i);\r
       }\r
     }\r
-\r
-    //////////////////\r
-\r
-    xCombobox.select(0);\r
-    yCombobox.select(1);\r
-    zCombobox.select(2);\r
-\r
-    top = pca.getM().rows - 1;\r
-\r
-    Vector points = new Vector();\r
-    float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
-\r
-    for (int i = 0; i < pca.getM().rows; i++)\r
-    {\r
-      SequencePoint sp = new SequencePoint(s[i], scores[i]);\r
-      points.addElement(sp);\r
-    }\r
-\r
-    rc = new RotatableCanvas(av, points, pca.getM().rows);\r
-\r
-    //rc.printPoints();\r
-\r
+    rc = new RotatableCanvas(av);\r
     add(rc, BorderLayout.CENTER);\r
+    Thread worker = new Thread(this);\r
+    worker.start();\r
+  }\r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   */\r
+  public void run()\r
+  {\r
+              pca = new PCA(seqs);\r
+              pca.run();\r
+\r
+              // Now find the component coordinates\r
+              int ii = 0;\r
+\r
+              while ((ii < seqs.length) && (seqs[ii] != null))\r
+              {\r
+                  ii++;\r
+              }\r
+\r
+              double[][] comps = new double[ii][ii];\r
+\r
+              for (int i = 0; i < ii; i++)\r
+              {\r
+                  if (pca.getEigenvalue(i) > 1e-4)\r
+                  {\r
+                      comps[i] = pca.component(i);\r
+                  }\r
+              }\r
+\r
+              //////////////////\r
+              xCombobox.select(0);\r
+              yCombobox.select(1);\r
+              zCombobox.select(2);\r
+\r
+              top = pca.getM().rows - 1;\r
+\r
+              Vector points = new Vector();\r
+              float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
+\r
+              for (int i = 0; i < pca.getM().rows; i++)\r
+              {\r
+                  SequencePoint sp = new SequencePoint(seqs[i], scores[i]);\r
+                  points.addElement(sp);\r
+              }\r
+\r
+              rc.setPoints(points, pca.getM().rows);\r
+              rc.repaint();\r
+              seqs = null;\r
   }\r
 \r
   void doDimensionChange()\r
index 25754cd..9fa7491 100755 (executable)
@@ -32,8 +32,6 @@ public class RotatableCanvas
     extends Panel implements MouseListener,\r
     MouseMotionListener,\r
     KeyListener\r
-//RubberbandListener,\r
-//SequenceSelectionListener\r
 {\r
   RotatableMatrix idmat = new RotatableMatrix(3, 3);\r
   RotatableMatrix objmat = new RotatableMatrix(3, 3);\r
@@ -82,17 +80,19 @@ public class RotatableCanvas
   float scalefactor = 1;\r
 \r
   AlignViewport av;\r
-//  Controller    controller;\r
 \r
+  public RotatableCanvas(AlignViewport av)\r
+  {\r
+    this.av = av;\r
+  }\r
 \r
-  public RotatableCanvas(AlignViewport av,\r
-                         Vector points, int npoint)\r
+  public void setPoints(Vector points, int npoint)\r
   {\r
     this.points = points;\r
     this.npoint = npoint;\r
     this.av = av;\r
     PaintRefresher.Register(this, av.alignment);\r
-//\r
+\r
     prefsize = getPreferredSize();\r
     orig = new float[npoint][3];\r
 \r
@@ -287,29 +287,38 @@ public class RotatableCanvas
 \r
   public void paint(Graphics g)\r
   {\r
-    //Only create the image at the beginning -\r
-    if ( (img == null) || (prefsize.width != getSize().width) ||\r
-        (prefsize.height != getSize().height))\r
+    if (points == null)\r
+    {\r
+      g.setFont(new Font("Verdana", Font.PLAIN, 18));\r
+      g.drawString("Calculating PCA....", 20, getSize().height / 2);\r
+    }\r
+    else\r
     {\r
-      prefsize.width = getSize().width;\r
-      prefsize.height = getSize().height;\r
 \r
-      scale = findScale();\r
+      //Only create the image at the beginning -\r
+      if ( (img == null) || (prefsize.width != getSize().width) ||\r
+          (prefsize.height != getSize().height))\r
+      {\r
+        prefsize.width = getSize().width;\r
+        prefsize.height = getSize().height;\r
 \r
-      //      System.out.println("New scale = " + scale);\r
-      img = createImage(getSize().width, getSize().height);\r
-      ig = img.getGraphics();\r
+        scale = findScale();\r
 \r
-    }\r
+        //      System.out.println("New scale = " + scale);\r
+        img = createImage(getSize().width, getSize().height);\r
+        ig = img.getGraphics();\r
 \r
-    drawBackground(ig, Color.black);\r
-    drawScene(ig);\r
-    if (drawAxes == true)\r
-    {\r
-      drawAxes(ig);\r
-    }\r
+      }\r
 \r
-    g.drawImage(img, 0, 0, this);\r
+      drawBackground(ig, Color.black);\r
+      drawScene(ig);\r
+      if (drawAxes == true)\r
+      {\r
+        drawAxes(ig);\r
+      }\r
+\r
+      g.drawImage(img, 0, 0, this);\r
+    }\r
   }\r
 \r
   public void drawAxes(Graphics g)\r
index 7bda65a..474a158 100755 (executable)
@@ -42,6 +42,7 @@ public class PCAPanel extends GPCAPanel implements Runnable
     int top;\r
     RotatableCanvas rc;\r
     AlignViewport av;\r
+    SequenceI [] seqs;\r
 \r
     /**\r
      * Creates a new PCAPanel object.\r
@@ -56,74 +57,78 @@ public class PCAPanel extends GPCAPanel implements Runnable
         if ((av.getSelectionGroup() != null) &&\r
                 (av.getSelectionGroup().getSize() > 3))\r
         {\r
-            s = new Sequence[av.getSelectionGroup().getSize()];\r
+            seqs = new Sequence[av.getSelectionGroup().getSize()];\r
 \r
             for (int i = 0; i < s.length; i++)\r
             {\r
-                s[i] = av.getSelectionGroup().getSequenceAt(i);\r
+                seqs[i] = av.getSelectionGroup().getSequenceAt(i);\r
             }\r
         }\r
 \r
         if (s == null)\r
         {\r
-            s = new Sequence[av.getAlignment().getHeight()];\r
+            seqs = new Sequence[av.getAlignment().getHeight()];\r
 \r
             for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
             {\r
-                s[i] = av.getAlignment().getSequenceAt(i);\r
+                seqs[i] = av.getAlignment().getSequenceAt(i);\r
             }\r
         }\r
 \r
-        //////////////////////This part was done in PCATHread originally. Is it too slow???\r
-        pca = new PCA(s);\r
-        pca.run();\r
 \r
-        // Now find the component coordinates\r
-        int ii = 0;\r
-\r
-        while ((ii < s.length) && (s[ii] != null))\r
-        {\r
-            ii++;\r
-        }\r
-\r
-        double[][] comps = new double[ii][ii];\r
-\r
-        for (int i = 0; i < ii; i++)\r
-        {\r
-            if (pca.getEigenvalue(i) > 1e-4)\r
-            {\r
-                comps[i] = pca.component(i);\r
-            }\r
-        }\r
-\r
-        //////////////////\r
-        xCombobox.setSelectedIndex(0);\r
-        yCombobox.setSelectedIndex(1);\r
-        zCombobox.setSelectedIndex(2);\r
-\r
-        top = pca.getM().rows - 1;\r
-\r
-        Vector points = new Vector();\r
-        float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
-\r
-        for (int i = 0; i < pca.getM().rows; i++)\r
-        {\r
-            SequencePoint sp = new SequencePoint(s[i], scores[i]);\r
-            points.addElement(sp);\r
-        }\r
-\r
-        rc = new RotatableCanvas(av, points, pca.getM().rows);\r
-\r
-        //rc.printPoints();\r
+        rc = new RotatableCanvas(av);\r
         add(rc, BorderLayout.CENTER);\r
+        Thread worker = new Thread(this);\r
+        worker.start();\r
     }\r
 \r
+\r
+\r
     /**\r
      * DOCUMENT ME!\r
      */\r
     public void run()\r
     {\r
-        // do stuff\r
+                pca = new PCA(seqs);\r
+                pca.run();\r
+\r
+                // Now find the component coordinates\r
+                int ii = 0;\r
+\r
+                while ((ii < seqs.length) && (seqs[ii] != null))\r
+                {\r
+                    ii++;\r
+                }\r
+\r
+                double[][] comps = new double[ii][ii];\r
+\r
+                for (int i = 0; i < ii; i++)\r
+                {\r
+                    if (pca.getEigenvalue(i) > 1e-4)\r
+                    {\r
+                        comps[i] = pca.component(i);\r
+                    }\r
+                }\r
+\r
+                //////////////////\r
+                xCombobox.setSelectedIndex(0);\r
+                yCombobox.setSelectedIndex(1);\r
+                zCombobox.setSelectedIndex(2);\r
+\r
+                top = pca.getM().rows - 1;\r
+\r
+                Vector points = new Vector();\r
+                float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
+\r
+                for (int i = 0; i < pca.getM().rows; i++)\r
+                {\r
+                    SequencePoint sp = new SequencePoint(seqs[i], scores[i]);\r
+                    points.addElement(sp);\r
+                }\r
+\r
+                rc.setPoints(points, pca.getM().rows);\r
+                rc.repaint();\r
+                seqs = null;\r
     }\r
 \r
     /**\r
index 460a99f..3fcfd3d 100755 (executable)
@@ -40,8 +40,6 @@ import javax.swing.*;
  */\r
 public class RotatableCanvas extends JPanel implements MouseListener,\r
     MouseMotionListener, KeyListener\r
-//RubberbandListener,\r
-//SequenceSelectionListener\r
 {\r
     RotatableMatrix idmat = new RotatableMatrix(3, 3);\r
     RotatableMatrix objmat = new RotatableMatrix(3, 3);\r
@@ -78,11 +76,15 @@ public class RotatableCanvas extends JPanel implements MouseListener,
     AlignViewport av;\r
 \r
     //  Controller    controller;\r
-    public RotatableCanvas(AlignViewport av, Vector points, int npoint)\r
+    public RotatableCanvas(AlignViewport av)\r
+    {\r
+      this.av = av;\r
+    }\r
+\r
+    public void setPoints(Vector points, int npoint)\r
     {\r
         this.points = points;\r
         this.npoint = npoint;\r
-        this.av = av;\r
         ToolTipManager.sharedInstance().registerComponent(this);\r
         ToolTipManager.sharedInstance().setInitialDelay(0);\r
         ToolTipManager.sharedInstance().setDismissDelay(10000);\r
@@ -129,31 +131,13 @@ public class RotatableCanvas extends JPanel implements MouseListener,
 \r
         scale = findScale();\r
 \r
-        //    System.out.println("Scale factor = " + scale);\r
         addMouseListener(this);\r
         addKeyListener(this);\r
 \r
-        // if (getParent() != null) {\r
-        //   getParent().addKeyListener(this);\r
-        //}\r
         addMouseMotionListener(this);\r
 \r
-        // Add rubberband\r
-        //   rubberband  = new RubberbandRectangle(this);\r
-        //  rubberband.setActive(true);\r
-        //   rubberband.addListener(this);\r
     }\r
 \r
-    /* public boolean handleSequenceSelectionEvent(SequenceSelectionEvent evt) {\r
-       redrawneeded = true;\r
-       repaint();\r
-       return true;\r
-     }\r
-\r
-     public void removeNotify() {\r
-       controller.removeListener(this);\r
-       super.removeNotify();\r
-     }*/\r
     public void initAxes()\r
     {\r
         for (int i = 0; i < 3; i++)\r
@@ -313,18 +297,25 @@ public class RotatableCanvas extends JPanel implements MouseListener,
      */\r
     public void paintComponent(Graphics g)\r
     {\r
+      if(points==null)\r
+      {\r
+        g.setFont(new Font("Verdana", Font.PLAIN, 18));\r
+        g.drawString("Calculating PCA....", 20, getHeight()/2);\r
+      }\r
+      else\r
+      {\r
         //Only create the image at the beginning -\r
-        if ((img == null) || (prefsize.width != getWidth()) ||\r
-                (prefsize.height != getHeight()))\r
+        if ( (img == null) || (prefsize.width != getWidth()) ||\r
+            (prefsize.height != getHeight()))\r
         {\r
-            prefsize.width = getWidth();\r
-            prefsize.height = getHeight();\r
+          prefsize.width = getWidth();\r
+          prefsize.height = getHeight();\r
 \r
-            scale = findScale();\r
+          scale = findScale();\r
 \r
-            //      System.out.println("New scale = " + scale);\r
-            img = createImage(getWidth(), getHeight());\r
-            ig = img.getGraphics();\r
+          //      System.out.println("New scale = " + scale);\r
+          img = createImage(getWidth(), getHeight());\r
+          ig = img.getGraphics();\r
         }\r
 \r
         drawBackground(ig, Color.black);\r
@@ -332,10 +323,11 @@ public class RotatableCanvas extends JPanel implements MouseListener,
 \r
         if (drawAxes == true)\r
         {\r
-            drawAxes(ig);\r
+          drawAxes(ig);\r
         }\r
 \r
         g.drawImage(img, 0, 0, this);\r
+      }\r
     }\r
 \r
     /**\r