X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdatamodel%2Falphafold%2FPAEContactMatrix.java;h=cefdbd21b7a68edc6d24bcd9f2fa5d1d1ef3b9b5;hb=d42b7588a34477b24ce97ba75788536e74e6cf86;hp=3a8e26a0654006453073739ab8cb9c9c1807ba91;hpb=71b8b157747abb849fb50316450a22d4559873da;p=jalview.git diff --git a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java index 3a8e26a..cefdbd2 100644 --- a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java +++ b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java @@ -9,6 +9,7 @@ import jalview.datamodel.ContactListImpl; import jalview.datamodel.ContactListProviderI; import jalview.datamodel.ContactMatrixI; import jalview.datamodel.SequenceI; +import jalview.util.MapUtils; public class PAEContactMatrix implements ContactMatrixI { @@ -28,19 +29,23 @@ public class PAEContactMatrix implements ContactMatrixI float maxscore; - @SuppressWarnings("unchecked") - public PAEContactMatrix(SequenceI _refSeq, Map pae_obj) - throws Exception + private void setRefSeq(SequenceI _refSeq) { refSeq = _refSeq; while (refSeq.getDatasetSequence() != null) { refSeq = refSeq.getDatasetSequence(); } - // convert the lists to primitive arrays and store length = _refSeq.getEnd() - _refSeq.getStart() + 1; + } - if (!pae_obj.containsKey("predicted_aligned_error")) + @SuppressWarnings("unchecked") + public PAEContactMatrix(SequenceI _refSeq, Map pae_obj) + { + setRefSeq(_refSeq); + // convert the lists to primitive arrays and store + + if (!MapUtils.containsAKey(pae_obj, "predicted_aligned_error", "pae")) { parse_version_1_pAE(pae_obj); return; @@ -52,25 +57,60 @@ public class PAEContactMatrix implements ContactMatrixI } /** + * construct a sequence associated PAE matrix directly from a float array + * + * @param _refSeq + * @param matrix + */ + public PAEContactMatrix(SequenceI _refSeq, float[][] 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; + + } + + /** * parse a sane JSON representation of the pAE * * @param pae_obj */ + @SuppressWarnings("unchecked") private void parse_version_2_pAE(Map pae_obj) { - elements = new float[length][length]; // this is never going to be reached by the integer rounding.. or is it ? - maxscore = ((Double) pae_obj.get("max_predicted_aligned_error")) - .floatValue(); - Iterator> scoreRows = ((List>) pae_obj - .get("predicted_aligned_error")).iterator(); + maxscore = ((Double) MapUtils.getFirst(pae_obj, + "max_predicted_aligned_error", "max_pae")).floatValue(); + List> scoreRows = ((List>) MapUtils + .getFirst(pae_obj, "predicted_aligned_error", "pae")); + elements = new float[scoreRows.size()][scoreRows.size()]; int row = 0, col = 0; - while (scoreRows.hasNext()) + for (List scoreRow : scoreRows) { - Iterator scores = scoreRows.next().iterator(); + Iterator scores = scoreRow.iterator(); while (scores.hasNext()) { - elements[row][col++] = scores.next(); + Object d = scores.next(); + if (d instanceof Double) + elements[row][col++] = ((Double) d).longValue(); + else + elements[row][col++] = (float) ((Long) d).longValue(); } row++; col = 0; @@ -85,6 +125,7 @@ public class PAEContactMatrix implements ContactMatrixI * * @param pae_obj */ + @SuppressWarnings("unchecked") private void parse_version_1_pAE(Map pae_obj) { // assume indices are with respect to range defined by _refSeq on the @@ -93,7 +134,7 @@ public class PAEContactMatrix implements ContactMatrixI Iterator cols = ((List) pae_obj.get("residue2")).iterator(); Iterator scores = ((List) pae_obj.get("distance")) .iterator(); - + // assume square matrix elements = new float[length][length]; while (scores.hasNext()) { @@ -111,8 +152,8 @@ public class PAEContactMatrix implements ContactMatrixI elements[row - 1][col - 1] = escore; } - maxscore = ((Double) pae_obj.get("max_predicted_aligned_error")) - .floatValue(); + maxscore = ((Double) MapUtils.getFirst(pae_obj, + "max_predicted_aligned_error", "max_pae")).floatValue(); } @Override @@ -126,6 +167,12 @@ public class PAEContactMatrix implements ContactMatrixI return new ContactListImpl(new ContactListProviderI() { @Override + public int getPosition() + { + return _column; + } + + @Override public int getContactHeight() { return maxcol - 1; @@ -138,7 +185,6 @@ public class PAEContactMatrix implements ContactMatrixI { return -1; } - // TODO Auto-generated method stub return elements[_column][column]; } }); @@ -168,4 +214,38 @@ public class PAEContactMatrix implements ContactMatrixI return refSeq; } + @Override + public String getAnnotDescr() + { + return "Predicted Alignment Error for " + refSeq.getName(); + } + + @Override + public String getAnnotLabel() + { + StringBuilder label = new StringBuilder("pAE Matrix"); + // if (this.getReferenceSeq() != null) + // label.append(":").append(this.getReferenceSeq().getDisplayId(false)); + return label.toString(); + } + + public static final String PAEMATRIX = "PAE_MATRIX"; + + @Override + public String getType() + { + return PAEMATRIX; + } + + @Override + public int getWidth() + { + return length; + } + + @Override + public int getHeight() + { + return length; + } }