X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdatamodel%2Falphafold%2FPAEContactMatrix.java;fp=src%2Fjalview%2Fws%2Fdatamodel%2Falphafold%2FPAEContactMatrix.java;h=ce072e06a0477b8b3245154dae6548758618a568;hb=beb2fee66dde629e3bbb7febb38d0116e1a64df2;hp=1ec856b67ac49045550cd5f0279008e17b19d4c1;hpb=4b7d3640209c4434d569c746672cf9eed4250ace;p=jalview.git diff --git a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java index 1ec856b..ce072e0 100644 --- a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java +++ b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java @@ -1,53 +1,56 @@ 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; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; + +import org.json.simple.JSONObject; import jalview.analysis.AverageDistanceEngine; import jalview.bin.Console; +import jalview.datamodel.Annotation; import jalview.datamodel.BinaryNode; import jalview.datamodel.ContactListI; import jalview.datamodel.ContactListImpl; import jalview.datamodel.ContactListProviderI; import jalview.datamodel.ContactMatrixI; +import jalview.datamodel.GroupSet; +import jalview.datamodel.GroupSetI; +import jalview.datamodel.Mapping; +import jalview.datamodel.SequenceDummy; import jalview.datamodel.SequenceI; +import jalview.io.DataSourceType; +import jalview.io.FileFormatException; +import jalview.io.FileParse; +import jalview.util.MapList; import jalview.util.MapUtils; +import jalview.ws.dbsources.EBIAlfaFold; -public class PAEContactMatrix implements ContactMatrixI +public class PAEContactMatrix extends + MappableContactMatrix implements ContactMatrixI { - SequenceI refSeq = null; - - /** - * the length that refSeq is expected to be (excluding gaps, of course) - */ - int length; int maxrow = 0, maxcol = 0; - int[] indices1, indices2; float[][] elements; float maxscore; - private void setRefSeq(SequenceI _refSeq) - { - refSeq = _refSeq; - while (refSeq.getDatasetSequence() != null) - { - refSeq = refSeq.getDatasetSequence(); - } - length = _refSeq.getEnd() - _refSeq.getStart() + 1; - } @SuppressWarnings("unchecked") public PAEContactMatrix(SequenceI _refSeq, Map pae_obj) + throws FileFormatException { setRefSeq(_refSeq); // convert the lists to primitive arrays and store @@ -94,6 +97,22 @@ public class PAEContactMatrix implements ContactMatrixI } /** + * new matrix with specific mapping to a reference sequence + * + * @param newRefSeq + * @param newFromMapList + * @param elements2 + * @param grps2 + */ + public PAEContactMatrix(SequenceI newRefSeq, MapList newFromMapList, + float[][] elements2, GroupSet grps2) + { + this(newRefSeq, elements2); + toSeq = newFromMapList; + grps = grps2; + } + + /** * parse a sane JSON representation of the pAE * * @param pae_obj @@ -101,9 +120,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()]; @@ -115,9 +142,18 @@ public class PAEContactMatrix implements ContactMatrixI { 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 +175,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(); @@ -164,9 +216,9 @@ public class PAEContactMatrix implements ContactMatrixI } @Override - public ContactListI getContactList(final int _column) + public ContactListI getContactList(final int column) { - if (_column < 0 || _column >= elements.length) + if (column < 0 || column >= elements.length) { return null; } @@ -176,7 +228,7 @@ public class PAEContactMatrix implements ContactMatrixI @Override public int getPosition() { - return _column; + return column; } @Override @@ -186,39 +238,33 @@ public class PAEContactMatrix implements ContactMatrixI } @Override - public double getContactAt(int column) + public double getContactAt(int mcolumn) { - if (column < 0 || column >= elements[_column].length) + if (mcolumn < 0 || mcolumn >= elements[column].length) { return -1; } - return elements[_column][column]; + return elements[column][mcolumn]; } }); } @Override - public float getMin() + protected double getElementAt(int _column, int i) { - return 0; + return elements[_column][i]; } @Override - public float getMax() - { - return maxscore; - } - - @Override - public boolean hasReferenceSeq() + public float getMin() { - return (refSeq != null); + return 0; } @Override - public SequenceI getReferenceSeq() + public float getMax() { - return refSeq; + return maxscore; } @Override @@ -258,142 +304,41 @@ public class PAEContactMatrix implements ContactMatrixI { return length; } - - List groups = null; - - @Override - public boolean hasGroups() - { - return groups != null; - } - - String newick = null; - - @Override - public String getNewick() - { - return newick; - } - - @Override - public boolean hasTree() - { - return newick != null && newick.length() > 0; - } - - boolean abs; - - double thresh; - - String treeType = null; - - public void makeGroups(float thresh, boolean abs) + public static void validateContactMatrixFile(String fileName) + throws FileFormatException, IOException { - AverageDistanceEngine clusterer = new AverageDistanceEngine(null, null, - this); - double height = clusterer.findHeight(clusterer.getTopNode()); - newick = new jalview.io.NewickFile(clusterer.getTopNode(), false, true) - .print(); - treeType = "UPGMA"; - Console.trace("Newick string\n" + newick); - - List nodegroups; - if (abs ? height > thresh : 0 < thresh && thresh < 1) + FileInputStream infile = null; + try { - float cut = abs ? (float) (thresh / height) : thresh; - Console.debug("Threshold " + cut + " for height=" + height); - - nodegroups = clusterer.groupNodes(cut); - } - else + infile = new FileInputStream(new File(fileName)); + } catch (Throwable t) { - nodegroups = new ArrayList(); - nodegroups.add(clusterer.getTopNode()); + new IOException("Couldn't open " + fileName, t); } - this.abs = abs; - this.thresh = thresh; - groups = new ArrayList<>(); - for (BinaryNode root : nodegroups) + JSONObject paeDict = null; + try { - BitSet gpset = new BitSet(); - for (BinaryNode leaf : clusterer.findLeaves(root)) - { - gpset.set((Integer) leaf.element()); - } - groups.add(gpset); - } - } - - @Override - public void updateGroups(List colGroups) - { - if (colGroups != null) + paeDict = EBIAlfaFold.parseJSONtoPAEContactMatrix(infile); + } catch (Throwable t) { - groups = colGroups; + new FileFormatException("Couldn't parse " + fileName + + " as a JSON dict or array containing a dict"); } - } - @Override - public BitSet getGroupsFor(int column) - { - for (BitSet gp : groups) + PAEContactMatrix matrix = new PAEContactMatrix( + new SequenceDummy("Predicted"), (Map) paeDict); + if (matrix.getWidth() <= 0) { - if (gp.get(column)) - { - return gp; - } - } - return ContactMatrixI.super.getGroupsFor(column); - } - - HashMap colorMap = new HashMap<>(); - - @Override - public Color getColourForGroup(BitSet bs) - { - if (bs == null) - { - return Color.white; - } - Color groupCol = colorMap.get(bs); - if (groupCol == null) - { - return Color.white; + throw new FileFormatException( + "No data in PAE matrix read from '" + fileName + "'"); } - return groupCol; - } - - @Override - public void setColorForGroup(BitSet bs, Color color) - { - colorMap.put(bs, color); } - - public void restoreGroups(List newgroups, String treeMethod, - String tree, double thresh2) - { - treeType = treeMethod; - groups = newgroups; - thresh = thresh2; - newick = tree; - - } - - @Override - public boolean hasCutHeight() - { - return groups != null && thresh != 0; - } - - @Override - public double getCutHeight() - { - return thresh; - } - @Override - public String getTreeMethod() + protected PAEContactMatrix newMappableContactMatrix(SequenceI newRefSeq, + MapList newFromMapList) { - return treeType; + PAEContactMatrix pae = new PAEContactMatrix(newRefSeq, newFromMapList, + elements, new GroupSet(grps)); + return pae; } }