X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdatamodel%2Falphafold%2FPAEContactMatrix.java;h=30c77d287ac150b74eb65fdbda054cd6c8f68427;hb=7420ce36f2b43280ef610e3743960207e4c2dbe3;hp=272d21d1f8d766fca9a3d50fb9da324bc05e8f62;hpb=01f8ff469a507604ed961418f7c80f9b245e60ca;p=jalview.git diff --git a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java index 272d21d..30c77d2 100644 --- a/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java +++ b/src/jalview/ws/datamodel/alphafold/PAEContactMatrix.java @@ -1,9 +1,14 @@ package jalview.ws.datamodel.alphafold; +import java.util.ArrayList; +import java.util.BitSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import jalview.analysis.AverageDistanceEngine; +import jalview.bin.Console; +import jalview.datamodel.BinaryNode; import jalview.datamodel.ContactListI; import jalview.datamodel.ContactListImpl; import jalview.datamodel.ContactListProviderI; @@ -29,17 +34,21 @@ public class PAEContactMatrix implements ContactMatrixI float maxscore; - @SuppressWarnings("unchecked") - public PAEContactMatrix(SequenceI _refSeq, Map pae_obj) + 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; - + } + @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); @@ -50,28 +59,60 @@ public class PAEContactMatrix implements ContactMatrixI parse_version_2_pAE(pae_obj); } } + /** + * 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 pae_obj) { - elements = new float[length][length]; // 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(); - Iterator> scoreRows = ((List>) MapUtils + List> scoreRows = ((List>) MapUtils .getFirst(pae_obj, "predicted_aligned_error", "pae")) - .iterator(); + ; + 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; @@ -86,6 +127,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 @@ -94,7 +136,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()) { @@ -135,7 +177,7 @@ public class PAEContactMatrix implements ContactMatrixI @Override public int getContactHeight() { - return maxcol - 1; + return maxcol-1; } @Override @@ -145,7 +187,6 @@ public class PAEContactMatrix implements ContactMatrixI { return -1; } - // TODO Auto-generated method stub return elements[_column][column]; } }); @@ -186,4 +227,77 @@ public class PAEContactMatrix implements ContactMatrixI { return "pAE Matrix"; } + + 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; + } + List groups=null; + @Override + public boolean hasGroups() + { + return groups!=null; + } + String newick=null; + public String getNewickString() + { + return newick; + } + public void makeGroups(float thresh,boolean abs) + { + AverageDistanceEngine clusterer = new AverageDistanceEngine(null, null, this); + double height = clusterer.findHeight(clusterer.getTopNode()); + newick = new jalview.io.NewickFile(clusterer.getTopNode(),false,true).print(); + + Console.trace("Newick string\n"+newick); + + List nodegroups; + if (abs ? height > thresh : 0 < thresh && thresh < 1) + { + float cut = abs ? (float) (thresh / height) : thresh; + Console.debug("Threshold "+cut+" for height="+height); + + nodegroups = clusterer.groupNodes(cut); + } + else + { + nodegroups = new ArrayList(); + nodegroups.add(clusterer.getTopNode()); + } + + groups = new ArrayList<>(); + for (BinaryNode root:nodegroups) + { + BitSet gpset=new BitSet(); + for (BinaryNode leaf:clusterer.findLeaves(root)) + { + gpset.set((Integer)leaf.element()); + } + groups.add(gpset); + } + } + + @Override + public BitSet getGroupsFor(int column) + { + for (BitSet gp:groups) { + if (gp.get(column)) + { + return gp; + } + } + return ContactMatrixI.super.getGroupsFor(column); + } }