JAL-1767 save PCA D and E vectors instead of 'details' text
[jalview.git] / src / jalview / gui / Jalview2XML.java
index 2b3e5ce..c725db8 100644 (file)
@@ -70,7 +70,6 @@ import jalview.schemabinding.version2.DBRef;
 import jalview.schemabinding.version2.DoubleMatrix;
 import jalview.schemabinding.version2.EigenMatrix;
 import jalview.schemabinding.version2.EigenMatrixD;
-import jalview.schemabinding.version2.EigenMatrixE;
 import jalview.schemabinding.version2.Features;
 import jalview.schemabinding.version2.Group;
 import jalview.schemabinding.version2.HiddenColumns;
@@ -104,6 +103,9 @@ import jalview.schemabinding.version2.Setting;
 import jalview.schemabinding.version2.StructureState;
 import jalview.schemabinding.version2.ThresholdLine;
 import jalview.schemabinding.version2.Tree;
+import jalview.schemabinding.version2.TridiagonalD;
+import jalview.schemabinding.version2.TridiagonalE;
+import jalview.schemabinding.version2.TridiagonalMatrix;
 import jalview.schemabinding.version2.UserColours;
 import jalview.schemabinding.version2.Viewport;
 import jalview.schemabinding.version2.types.ColourThreshTypeType;
@@ -1622,42 +1624,30 @@ public class Jalview2XML
       PcaData data = new PcaData();
       viewer.setPcaData(data);
       PCA pca = pcaModel.getPcaData();
-      data.setDetails(pca.getDetails());
-      MatrixI m = pca.getEigenmatrix();
-      EigenMatrix eigenMatrix = new EigenMatrix();
-      eigenMatrix.setRows(m.height());
-      eigenMatrix.setColumns(m.width());
-      data.setEigenMatrix(eigenMatrix);
-      for (int i = 0; i < m.height(); i++)
-      {
-        Row row = new Row();
-        for (int j = 0; j < m.width(); j++)
-        {
-          row.addD(m.getValue(i, j));
-        }
-        eigenMatrix.addRow(row);
-      }
-      EigenMatrixD eigenMatrixD = new EigenMatrixD();
-      eigenMatrixD.setD(m.getD());
-      data.setEigenMatrixD(eigenMatrixD);
-      EigenMatrixE eigenMatrixE = new EigenMatrixE();
-      eigenMatrixE.setD(m.getE());
-      data.setEigenMatrixE(eigenMatrixE);
 
       PairwiseMatrix pm = new PairwiseMatrix();
-      m = pca.getPairwiseScores();
-      pm.setRows(m.height());
-      pm.setColumns(m.width());
+      MatrixI m = pca.getPairwiseScores();
+      saveDoubleMatrix(m, pm);
       data.setPairwiseMatrix(pm);
-      for (int i = 0; i < m.height(); i++)
-      {
-        Row row = new Row();
-        for (int j = 0; j < m.width(); j++)
-        {
-          row.addD(m.getValue(i, j));
-        }
-        pm.addRow(row);
-      }
+
+      TridiagonalMatrix tm = new TridiagonalMatrix();
+      m = pca.getTridiagonal();
+      saveDoubleMatrix(m, tm);
+      data.setTridiagonalMatrix(tm);
+      TridiagonalD tridiagonalD = new TridiagonalD();
+      tridiagonalD.setD(m.getD());
+      data.setTridiagonalD(tridiagonalD);
+      TridiagonalE tridiagonalE = new TridiagonalE();
+      tridiagonalE.setD(m.getE());
+      data.setTridiagonalE(tridiagonalE);
+
+      m = pca.getEigenmatrix();
+      EigenMatrix eigenMatrix = new EigenMatrix();
+      data.setEigenMatrix(eigenMatrix);
+      saveDoubleMatrix(m, eigenMatrix);
+      EigenMatrixD eigenmatrixD = new EigenMatrixD();
+      eigenmatrixD.setD(m.getD());
+      data.setEigenMatrixD(eigenmatrixD);
 
       jms.addPcaViewer(viewer);
     } catch (Throwable t)
@@ -1667,6 +1657,49 @@ public class Jalview2XML
   }
 
   /**
+   * Stores values from a matrix into an XML element
+   * 
+   * @param m
+   * @param xmlMatrix
+   * @see #loadDoubleMatrix(DoubleMatrix)
+   */
+  protected void saveDoubleMatrix(MatrixI m, DoubleMatrix xmlMatrix)
+  {
+    xmlMatrix.setRows(m.height());
+    xmlMatrix.setColumns(m.width());
+    for (int i = 0; i < m.height(); i++)
+    {
+      Row row = new Row();
+      for (int j = 0; j < m.width(); j++)
+      {
+        row.addD(m.getValue(i, j));
+      }
+      xmlMatrix.addRow(row);
+    }
+  }
+
+  /**
+   * Loads XML matrix data into a new Matrix object
+   * 
+   * @param mData
+   * @return
+   * @see Jalview2XML#saveDoubleMatrix(MatrixI, DoubleMatrix)
+   */
+  protected MatrixI loadDoubleMatrix(DoubleMatrix mData)
+  {
+    int rows = mData.getRows();
+    double[][] vals = new double[rows][];
+
+    for (int i = 0; i < rows; i++)
+    {
+      vals[i] = mData.getRow(i).getD();
+    }
+
+    MatrixI m = new Matrix(vals);
+    return m;
+  }
+
+  /**
    * Save any Varna viewers linked to this sequence. Writes an rnaViewer element
    * for each viewer, with
    * <ul>
@@ -5912,13 +5945,19 @@ public class Jalview2XML
                 .getScoreModel(modelName, ap);
         PCA pca = new PCA(null, scoreModel, params);
         PcaData pcaData = viewer.getPcaData();
-        pca.setDetails(pcaData.getDetails());
-        MatrixI pairwise = loadMatrix(pcaData.getPairwiseMatrix());
+
+        MatrixI pairwise = loadDoubleMatrix(pcaData.getPairwiseMatrix());
         pca.setPairwiseScores(pairwise);
-        MatrixI result = loadMatrix(pcaData.getEigenMatrix());
+
+        MatrixI triDiag = loadDoubleMatrix(pcaData.getTridiagonalMatrix());
+        triDiag.setD(pcaData.getTridiagonalD().getD());
+        triDiag.setE(pcaData.getTridiagonalE().getD());
+        pca.setTridiagonal(triDiag);
+
+        MatrixI result = loadDoubleMatrix(pcaData.getEigenMatrix());
         result.setD(pcaData.getEigenMatrixD().getD());
-        result.setE(pcaData.getEigenMatrixE().getD());
         pca.setEigenmatrix(result);
+
         panel.pcaModel.setPCA(pca);
 
         /*
@@ -5984,26 +6023,6 @@ public class Jalview2XML
   }
 
   /**
-   * Loads XML matrix data into a new Matrix object
-   * 
-   * @param mData
-   * @return
-   */
-  protected MatrixI loadMatrix(DoubleMatrix mData)
-  {
-    int rows = mData.getRows();
-    double[][] vals = new double[rows][];
-
-    for (int i = 0; i < rows; i++)
-    {
-      vals[i] = mData.getRow(i).getD();
-    }
-
-    MatrixI m = new Matrix(vals);
-    return m;
-  }
-
-  /**
    * Populates an XML model of the feature colour scheme for one feature type
    * 
    * @param featureType