X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FPCAPanel.java;h=9dc73b7702b7cfac5e23a319c67c74b86504c253;hb=9793a4e49836be392513c2a51e9fc71a0b0eb417;hp=1a9f466f84081fbfc0a329ba632dc28a1ec74a67;hpb=2de8acfae59aced665e4c37ad0f7dcc2ed68818e;p=jalview.git diff --git a/src/jalview/gui/PCAPanel.java b/src/jalview/gui/PCAPanel.java index 1a9f466..9dc73b7 100755 --- a/src/jalview/gui/PCAPanel.java +++ b/src/jalview/gui/PCAPanel.java @@ -1,20 +1,19 @@ /* - * 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 + * 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 * - * This program 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 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program 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. + * 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. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * 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 . */ package jalview.gui; @@ -37,6 +36,7 @@ import jalview.jbgui.*; */ public class PCAPanel extends GPCAPanel implements Runnable { + PCA pca; int top; @@ -52,12 +52,17 @@ public class PCAPanel extends GPCAPanel implements Runnable SequenceI[] seqs; /** + * use the identity matrix for calculating similarity between sequences. + */ + private boolean nucleotide=false; + + /** * Creates a new PCAPanel object. * * @param av - * DOCUMENT ME! + * DOCUMENT ME! * @param s - * DOCUMENT ME! + * DOCUMENT ME! */ public PCAPanel(AlignmentPanel ap) { @@ -67,13 +72,14 @@ public class PCAPanel extends GPCAPanel implements Runnable boolean sameLength = true; seqstrings = av.getAlignmentView(av.getSelectionGroup() != null); + nucleotide=av.getAlignment().isNucleotide(); if (av.getSelectionGroup() == null) { - seqs = av.alignment.getSequencesArray(); + seqs = av.getAlignment().getSequencesArray(); } else { - seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment); + seqs = av.getSelectionGroup().getSequencesInOrder(av.getAlignment()); } SeqCigar sq[] = seqstrings.getSequences(); int length = sq[0].getWidth(); @@ -100,10 +106,6 @@ public class PCAPanel extends GPCAPanel implements Runnable return; } - Desktop - .addInternalFrame(this, "Principal component analysis", 400, - 400); - PaintRefresher.Register(this, av.getSequenceSetId()); rc = new RotatableCanvas(ap); @@ -131,7 +133,8 @@ public class PCAPanel extends GPCAPanel implements Runnable { try { - pca = new PCA(seqstrings.getSequenceStrings(' ')); + calcSettings.setEnabled(false); + pca = new PCA(seqstrings.getSequenceStrings(' '), nucleotide); pca.run(); // Now find the component coordinates @@ -169,18 +172,37 @@ public class PCAPanel extends GPCAPanel implements Runnable } rc.setPoints(points, pca.getM().rows); - rc.repaint(); - - addKeyListener(rc); + // rc.invalidate(); + nuclSetting.setSelected(nucleotide); + protSetting.setSelected(!nucleotide); } catch (OutOfMemoryError er) { new OOMWarning("calculating PCA", er); - + return; + } + calcSettings.setEnabled(true); + repaint(); + if (getParent()==null) + { + addKeyListener(rc); + Desktop.addInternalFrame(this, "Principal component analysis", 400, 400); } - } - + @Override + protected void nuclSetting_actionPerfomed(ActionEvent arg0) + { + nucleotide=true; + Thread worker = new Thread(this); + worker.start(); + } + @Override + protected void protSetting_actionPerfomed(ActionEvent arg0) + { + nucleotide=false; + Thread worker = new Thread(this); + worker.start(); + } /** * DOCUMENT ME! */ @@ -212,7 +234,7 @@ public class PCAPanel extends GPCAPanel implements Runnable * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void xCombobox_actionPerformed(ActionEvent e) { @@ -223,7 +245,7 @@ public class PCAPanel extends GPCAPanel implements Runnable * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void yCombobox_actionPerformed(ActionEvent e) { @@ -234,7 +256,7 @@ public class PCAPanel extends GPCAPanel implements Runnable * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void zCombobox_actionPerformed(ActionEvent e) { @@ -244,9 +266,15 @@ public class PCAPanel extends GPCAPanel implements Runnable public void outputValues_actionPerformed(ActionEvent e) { CutAndPasteTransfer cap = new CutAndPasteTransfer(); - Desktop.addInternalFrame(cap, "PCA details", 500, 500); - - cap.setText(pca.getDetails()); + try + { + cap.setText(pca.getDetails()); + Desktop.addInternalFrame(cap, "PCA details", 500, 500); + } catch (OutOfMemoryError oom) + { + new OOMWarning("opening PCA details", oom); + cap.dispose(); + } } public void showLabels_actionPerformed(ActionEvent e) @@ -322,8 +350,7 @@ public class PCAPanel extends GPCAPanel implements Runnable * CutAndPasteTransfer cap = new CutAndPasteTransfer(); for (int i = 0; i < * seqs.length; i++) { cap.appendText(new jalview.util.Format("%-" + 15 + * "s").form( seqs[i].getName())); cap.appendText(" " + seqstrings[i] + - * "\n"); - * } + * "\n"); } * * Desktop.addInternalFrame(cap, "Original Data", 400, 400); */ @@ -377,7 +404,7 @@ public class PCAPanel extends GPCAPanel implements Runnable * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void eps_actionPerformed(ActionEvent e) { @@ -388,7 +415,7 @@ public class PCAPanel extends GPCAPanel implements Runnable * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void png_actionPerformed(ActionEvent e) { @@ -410,8 +437,8 @@ public class PCAPanel extends GPCAPanel implements Runnable else { im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.EPS, - "Make EPS file from PCA", width, height, null, this - .getTitle()); + "Make EPS file from PCA", width, height, null, + this.getTitle()); } if (im.getGraphics() != null) @@ -489,4 +516,97 @@ public class PCAPanel extends GPCAPanel implements Runnable } + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GPCAPanel#outputPoints_actionPerformed(java.awt.event.ActionEvent + * ) + */ + protected void outputPoints_actionPerformed(ActionEvent e) + { + CutAndPasteTransfer cap = new CutAndPasteTransfer(); + try + { + cap.setText(getPointsasCsv(false)); + Desktop.addInternalFrame(cap, "Points for " + getTitle(), 500, 500); + } catch (OutOfMemoryError oom) + { + new OOMWarning("exporting PCA points", oom); + cap.dispose(); + } + } + + private String getPointsasCsv(boolean transformed) + { + StringBuffer csv = new StringBuffer(); + csv.append("\"Sequence\""); + if (transformed) + { + csv.append(","); + csv.append(xCombobox.getSelectedIndex()); + csv.append(","); + csv.append(yCombobox.getSelectedIndex()); + csv.append(","); + csv.append(zCombobox.getSelectedIndex()); + } + else + { + for (int d = 1, dmax = pca.component(1).length; d <= dmax; d++) + { + csv.append("," + d); + } + } + csv.append("\n"); + for (int s = 0; s < seqs.length; s++) + { + csv.append("\"" + seqs[s].getName() + "\""); + double fl[]; + if (!transformed) + { + // output pca in correct order + fl = pca.component(s); + for (int d = fl.length - 1; d >= 0; d--) + { + csv.append(","); + csv.append(fl[d]); + } + } + else + { + // output current x,y,z coords for points + fl = rc.getPointPosition(s); + for (int d = 0; d < fl.length; d++) + { + csv.append(","); + csv.append(fl[d]); + } + } + csv.append("\n"); + } + return csv.toString(); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GPCAPanel#outputProjPoints_actionPerformed(java.awt.event + * .ActionEvent) + */ + protected void outputProjPoints_actionPerformed(ActionEvent e) + { + CutAndPasteTransfer cap = new CutAndPasteTransfer(); + try + { + cap.setText(getPointsasCsv(true)); + Desktop.addInternalFrame(cap, "Transformed points for " + getTitle(), + 500, 500); + } catch (OutOfMemoryError oom) + { + new OOMWarning("exporting transformed PCA points", oom); + cap.dispose(); + } + } + }