JAL-4124 decouple mappable contact matrix mapping logic from underlying contact matri...
[jalview.git] / src / jalview / ws / datamodel / alphafold / PAEContactMatrix.java
index 22884f1..0c1f71a 100644 (file)
@@ -13,6 +13,7 @@ import jalview.datamodel.ContactListI;
 import jalview.datamodel.ContactListImpl;
 import jalview.datamodel.ContactListProviderI;
 import jalview.datamodel.ContactMatrixI;
+import jalview.datamodel.FloatContactMatrix;
 import jalview.datamodel.GroupSet;
 import jalview.datamodel.SequenceDummy;
 import jalview.datamodel.SequenceI;
@@ -41,14 +42,6 @@ public class PAEContactMatrix extends
 {
 
 
-  int maxrow = 0, maxcol = 0;
-
-
-  float[][] elements;
-
-  float maxscore;
-
-
   @SuppressWarnings("unchecked")
   public PAEContactMatrix(SequenceI _refSeq, Map<String, Object> pae_obj)
           throws FileFormatException
@@ -75,26 +68,8 @@ public class PAEContactMatrix extends
    */
   public PAEContactMatrix(SequenceI _refSeq, float[][] matrix)
   {
+    mappedMatrix=new FloatContactMatrix(matrix);
     setRefSeq(_refSeq);
-    maxcol = 0;
-    for (float[] row : matrix)
-    {
-      if (row.length > maxcol)
-      {
-        maxcol = row.length;
-      }
-      maxscore = row[0];
-      for (float f : row)
-      {
-        if (maxscore < f)
-        {
-          maxscore = f;
-        }
-      }
-    }
-    maxrow = matrix.length;
-    elements = matrix;
-
   }
 
   /**
@@ -108,20 +83,40 @@ public class PAEContactMatrix extends
   public PAEContactMatrix(SequenceI newRefSeq, MapList newFromMapList,
           float[][] elements2, GroupSet grps2)
   {
-    this(newRefSeq, elements2);
+    this(newRefSeq, new FloatContactMatrix(elements2,grps2));
+    toSeq = newFromMapList;
+  }
+
+  public PAEContactMatrix(SequenceI _refSeq,
+          ContactMatrixI floatContactMatrix)
+  {
+    mappedMatrix = floatContactMatrix;
+    setRefSeq(_refSeq);
+  }
+  public PAEContactMatrix(SequenceI _refSeq, MapList newFromMapList,
+          ContactMatrixI floatContactMatrix)
+  {
+    mappedMatrix = floatContactMatrix;
+    setRefSeq(_refSeq);
     toSeq = newFromMapList;
-    grps = grps2;
+  }
+  
+  @Override
+  protected PAEContactMatrix newMappableContactMatrix(SequenceI newRefSeq,
+          MapList newFromMapList)
+  {
+    return new PAEContactMatrix(newRefSeq, newFromMapList, mappedMatrix);
   }
 
   /**
-   * parse a sane JSON representation of the pAE
+   * parse a sane JSON representation of the pAE and update the mappedMatrix
    * 
    * @param pae_obj
    */
   @SuppressWarnings("unchecked")
   private void parse_version_2_pAE(Map<String, Object> pae_obj)
   {
-    maxscore = -1;
+    float maxscore = -1;
     // look for a maxscore element - if there is one...
     try
     {
@@ -134,7 +129,7 @@ public class PAEContactMatrix extends
     }
     List<List<Long>> scoreRows = ((List<List<Long>>) MapUtils
             .getFirst(pae_obj, "predicted_aligned_error", "pae"));
-    elements = new float[scoreRows.size()][scoreRows.size()];
+    float[][] elements = new float[scoreRows.size()][scoreRows.size()];
     int row = 0, col = 0;
     for (List<Long> scoreRow : scoreRows)
     {
@@ -160,8 +155,7 @@ public class PAEContactMatrix extends
       row++;
       col = 0;
     }
-    maxcol = length;
-    maxrow = length;
+    mappedMatrix=new FloatContactMatrix(elements);
   }
 
   /**
@@ -178,6 +172,8 @@ public class PAEContactMatrix extends
     Iterator<Long> rows = ((List<Long>) pae_obj.get("residue1")).iterator();
     Iterator<Long> cols = ((List<Long>) pae_obj.get("residue2")).iterator();
     // two pass - to allocate the elements array
+    
+    int maxrow=-1,maxcol=-1;
     while (rows.hasNext())
     {
       int row = rows.next().intValue();
@@ -196,7 +192,7 @@ public class PAEContactMatrix extends
     cols = ((List<Long>) pae_obj.get("residue2")).iterator();
     Iterator<Double> scores = ((List<Double>) pae_obj.get("distance"))
             .iterator();
-    elements = new float[maxcol][maxrow];
+    float[][] elements = new float[maxcol][maxrow];
     while (scores.hasNext())
     {
       float escore = scores.next().floatValue();
@@ -213,68 +209,7 @@ public class PAEContactMatrix extends
       elements[col - 1][row-1] = escore;
     }
 
-    maxscore = ((Double) MapUtils.getFirst(pae_obj,
-            "max_predicted_aligned_error", "max_pae")).floatValue();
-  }
-
-  /**
-   * getContactList(column) @returns the vector of predicted alignment errors
-   * for reference position given by column
-   */
-  @Override
-  public ContactListI getContactList(final int column)
-  {
-    if (column < 0 || column >= elements.length)
-    {
-      return null;
-    }
-
-    return new ContactListImpl(new ContactListProviderI()
-    {
-      @Override
-      public int getPosition()
-      {
-        return column;
-      }
-
-      @Override
-      public int getContactHeight()
-      {
-        return maxcol - 1;
-      }
-
-      @Override
-      public double getContactAt(int mcolumn)
-      {
-        if (mcolumn < 0 || mcolumn >= elements[column].length)
-        {
-          return -1;
-        }
-        return elements[column][mcolumn];
-      }
-    });
-  }
-
-  /**
-   * getElementAt(column, i) @returns the predicted superposition error for the
-   * ith position when column is used as reference
-   */
-  @Override
-  protected double getElementAt(int _column, int i)
-  {
-    return elements[_column][i];
-  }
-
-  @Override
-  public float getMin()
-  {
-    return 0;
-  }
-
-  @Override
-  public float getMax()
-  {
-    return maxscore;
+    mappedMatrix=new FloatContactMatrix(elements);
   }
 
   @Override
@@ -303,17 +238,7 @@ public class PAEContactMatrix extends
     return PAEMATRIX;
   }
 
-  @Override
-  public int getWidth()
-  {
-    return maxcol;
-  }
 
-  @Override
-  public int getHeight()
-  {
-    return maxrow;
-  }
   public static void validateContactMatrixFile(String fileName)
           throws FileFormatException, IOException
   {
@@ -343,12 +268,4 @@ public class PAEContactMatrix extends
               "No data in PAE matrix read from '" + fileName + "'");
     }
   }
-  @Override
-  protected PAEContactMatrix newMappableContactMatrix(SequenceI newRefSeq,
-          MapList newFromMapList)
-  {
-    PAEContactMatrix pae = new PAEContactMatrix(newRefSeq, newFromMapList,
-            elements, new GroupSet(grps));
-    return pae;
-  }
 }