X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdatamodel%2Falphafold%2FPAEContactMatrix.java;h=22dd7fbe591a83509b5855bcf303f46789670857;hb=0c08a3e1a37eca3a7c011a56f0c353258b0e8020;hp=41e677a6322897fe4b8032f0da665b191f2ac7dd;hpb=366c4eed3d8a0bee653f9d4c0f16eebb9ff3cbb6;p=jalview.git diff --git a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java index 41e677a..22dd7fb 100644 --- a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java +++ b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java @@ -1,6 +1,10 @@ package jalview.ws.datamodel.alphafold; import java.awt.Color; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.BitSet; import java.util.HashMap; @@ -8,6 +12,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.json.simple.JSONObject; + import jalview.analysis.AverageDistanceEngine; import jalview.bin.Console; import jalview.datamodel.BinaryNode; @@ -15,8 +21,13 @@ import jalview.datamodel.ContactListI; import jalview.datamodel.ContactListImpl; import jalview.datamodel.ContactListProviderI; import jalview.datamodel.ContactMatrixI; +import jalview.datamodel.SequenceDummy; import jalview.datamodel.SequenceI; +import jalview.io.DataSourceType; +import jalview.io.FileFormatException; +import jalview.io.FileParse; import jalview.util.MapUtils; +import jalview.ws.dbsources.EBIAlfaFold; public class PAEContactMatrix implements ContactMatrixI { @@ -47,7 +58,7 @@ public class PAEContactMatrix implements ContactMatrixI } @SuppressWarnings("unchecked") - public PAEContactMatrix(SequenceI _refSeq, Map pae_obj) + public PAEContactMatrix(SequenceI _refSeq, Map pae_obj) throws FileFormatException { setRefSeq(_refSeq); // convert the lists to primitive arrays and store @@ -101,9 +112,17 @@ public class PAEContactMatrix implements ContactMatrixI @SuppressWarnings("unchecked") private void parse_version_2_pAE(Map pae_obj) { - // this is never going to be reached by the integer rounding.. or is it ? - maxscore = ((Double) MapUtils.getFirst(pae_obj, - "max_predicted_aligned_error", "max_pae")).floatValue(); + maxscore = -1; + // look for a maxscore element - if there is one... + try + { + // this is never going to be reached by the integer rounding.. or is it ? + maxscore = ((Double) MapUtils.getFirst(pae_obj, + "max_predicted_aligned_error", "max_pae")).floatValue(); + } catch (Throwable t) + { + // ignore if a key is not found. + } List> scoreRows = ((List>) MapUtils .getFirst(pae_obj, "predicted_aligned_error", "pae")); elements = new float[scoreRows.size()][scoreRows.size()]; @@ -114,10 +133,20 @@ public class PAEContactMatrix implements ContactMatrixI while (scores.hasNext()) { Object d = scores.next(); + if (d instanceof Double) + { elements[row][col++] = ((Double) d).longValue(); + } else + { elements[row][col++] = (float) ((Long) d).longValue(); + } + + if (maxscore < elements[row][col - 1]) + { + maxscore = elements[row][col - 1]; + } } row++; col = 0; @@ -139,10 +168,26 @@ public class PAEContactMatrix implements ContactMatrixI // dataset refSeq Iterator rows = ((List) pae_obj.get("residue1")).iterator(); Iterator cols = ((List) pae_obj.get("residue2")).iterator(); + // two pass - to allocate the elements array + while (rows.hasNext()) + { + int row = rows.next().intValue(); + int col = cols.next().intValue(); + if (maxrow < row) + { + maxrow = row; + } + if (maxcol < col) + { + maxcol = col; + } + + } + rows = ((List) pae_obj.get("residue1")).iterator(); + cols = ((List) pae_obj.get("residue2")).iterator(); Iterator scores = ((List) pae_obj.get("distance")) .iterator(); - // assume square matrix - elements = new float[length][length]; + elements = new float[maxrow][maxcol]; while (scores.hasNext()) { float escore = scores.next().floatValue(); @@ -373,4 +418,30 @@ public class PAEContactMatrix implements ContactMatrixI { return treeType; } + + public static void validateContactMatrixFile(String fileName) throws FileFormatException,IOException + { + FileInputStream infile=null; + try { + infile = new FileInputStream(new File(fileName)); + } catch (Throwable t) + { + new IOException("Couldn't open "+fileName,t); + } + + + JSONObject paeDict=null; + try { + paeDict = EBIAlfaFold.parseJSONtoPAEContactMatrix(infile); + } catch (Throwable t) + { + new FileFormatException("Couldn't parse "+fileName+" as a JSON dict or array containing a dict"); + } + + PAEContactMatrix matrix = new PAEContactMatrix(new SequenceDummy("Predicted"), (Map)paeDict); + if (matrix.getWidth()<=0) + { + throw new FileFormatException("No data in PAE matrix read from '"+fileName+"'"); + } + } }