/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
- * Copyright (C) 2010 J Procter, AM Waterhouse, 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 file is part of Jalview.
*
*/
public class PCAPanel extends GPCAPanel implements Runnable
{
+
PCA pca;
int top;
SequenceI[] seqs;
/**
+ * use the identity matrix for calculating similarity between sequences.
+ */
+ private boolean nucleotide=false;
+
+ /**
* Creates a new PCAPanel object.
*
* @param av
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();
return;
}
- Desktop
- .addInternalFrame(this, "Principal component analysis", 400,
- 400);
-
PaintRefresher.Register(this, av.getSequenceSetId());
rc = new RotatableCanvas(ap);
{
try
{
- pca = new PCA(seqstrings.getSequenceStrings(' '));
+ calcSettings.setEnabled(false);
+ pca = new PCA(seqstrings.getSequenceStrings(' '), nucleotide);
pca.run();
// Now find the component coordinates
}
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!
*/
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)
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)
}
+ /*
+ * (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();
+ }
+ }
+
}